waf, waflib: import unpacked waf 1.7.13
[pd-aubio.git] / waflib / Tools / c_tests.py
diff --git a/waflib/Tools/c_tests.py b/waflib/Tools/c_tests.py
new file mode 100644 (file)
index 0000000..f275977
--- /dev/null
@@ -0,0 +1,153 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Task
+from waflib.Configure import conf
+from waflib.TaskGen import feature,before_method,after_method
+import sys
+LIB_CODE='''
+#ifdef _MSC_VER
+#define testEXPORT __declspec(dllexport)
+#else
+#define testEXPORT
+#endif
+testEXPORT int lib_func(void) { return 9; }
+'''
+MAIN_CODE='''
+#ifdef _MSC_VER
+#define testEXPORT __declspec(dllimport)
+#else
+#define testEXPORT
+#endif
+testEXPORT int lib_func(void);
+int main(int argc, char **argv) {
+       (void)argc; (void)argv;
+       return !(lib_func() == 9);
+}
+'''
+@feature('link_lib_test')
+@before_method('process_source')
+def link_lib_test_fun(self):
+       def write_test_file(task):
+               task.outputs[0].write(task.generator.code)
+       rpath=[]
+       if getattr(self,'add_rpath',False):
+               rpath=[self.bld.path.get_bld().abspath()]
+       mode=self.mode
+       m='%s %s'%(mode,mode)
+       ex=self.test_exec and'test_exec'or''
+       bld=self.bld
+       bld(rule=write_test_file,target='test.'+mode,code=LIB_CODE)
+       bld(rule=write_test_file,target='main.'+mode,code=MAIN_CODE)
+       bld(features='%sshlib'%m,source='test.'+mode,target='test')
+       bld(features='%sprogram %s'%(m,ex),source='main.'+mode,target='app',use='test',rpath=rpath)
+@conf
+def check_library(self,mode=None,test_exec=True):
+       if not mode:
+               mode='c'
+               if self.env.CXX:
+                       mode='cxx'
+       self.check(compile_filename=[],features='link_lib_test',msg='Checking for libraries',mode=mode,test_exec=test_exec,)
+INLINE_CODE='''
+typedef int foo_t;
+static %s foo_t static_foo () {return 0; }
+%s foo_t foo () {
+       return 0;
+}
+'''
+INLINE_VALUES=['inline','__inline__','__inline']
+@conf
+def check_inline(self,**kw):
+       self.start_msg('Checking for inline')
+       if not'define_name'in kw:
+               kw['define_name']='INLINE_MACRO'
+       if not'features'in kw:
+               if self.env.CXX:
+                       kw['features']=['cxx']
+               else:
+                       kw['features']=['c']
+       for x in INLINE_VALUES:
+               kw['fragment']=INLINE_CODE%(x,x)
+               try:
+                       self.check(**kw)
+               except self.errors.ConfigurationError:
+                       continue
+               else:
+                       self.end_msg(x)
+                       if x!='inline':
+                               self.define('inline',x,quote=False)
+                       return x
+       self.fatal('could not use inline functions')
+LARGE_FRAGMENT='''#include <unistd.h>
+int main(int argc, char **argv) {
+       (void)argc; (void)argv;
+       return !(sizeof(off_t) >= 8);
+}
+'''
+@conf
+def check_large_file(self,**kw):
+       if not'define_name'in kw:
+               kw['define_name']='HAVE_LARGEFILE'
+       if not'execute'in kw:
+               kw['execute']=True
+       if not'features'in kw:
+               if self.env.CXX:
+                       kw['features']=['cxx','cxxprogram']
+               else:
+                       kw['features']=['c','cprogram']
+       kw['fragment']=LARGE_FRAGMENT
+       kw['msg']='Checking for large file support'
+       ret=True
+       try:
+               if self.env.DEST_BINFMT!='pe':
+                       ret=self.check(**kw)
+       except self.errors.ConfigurationError:
+               pass
+       else:
+               if ret:
+                       return True
+       kw['msg']='Checking for -D_FILE_OFFSET_BITS=64'
+       kw['defines']=['_FILE_OFFSET_BITS=64']
+       try:
+               ret=self.check(**kw)
+       except self.errors.ConfigurationError:
+               pass
+       else:
+               self.define('_FILE_OFFSET_BITS',64)
+               return ret
+       self.fatal('There is no support for large files')
+ENDIAN_FRAGMENT='''
+short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+int use_ascii (int i) {
+       return ascii_mm[i] + ascii_ii[i];
+}
+short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+int use_ebcdic (int i) {
+       return ebcdic_mm[i] + ebcdic_ii[i];
+}
+extern int foo;
+'''
+class grep_for_endianness(Task.Task):
+       color='PINK'
+       def run(self):
+               txt=self.inputs[0].read(flags='rb').decode('iso8859-1')
+               if txt.find('LiTTleEnDian')>-1:
+                       self.generator.tmp.append('little')
+               elif txt.find('BIGenDianSyS')>-1:
+                       self.generator.tmp.append('big')
+               else:
+                       return-1
+@feature('grep_for_endianness')
+@after_method('process_source')
+def grep_for_endianness_fun(self):
+       self.create_task('grep_for_endianness',self.compiled_tasks[0].outputs[0])
+@conf
+def check_endianness(self):
+       tmp=[]
+       def check_msg(self):
+               return tmp[0]
+       self.check(fragment=ENDIAN_FRAGMENT,features='c grep_for_endianness',msg="Checking for endianness",define='ENDIANNESS',tmp=tmp,okmsg=check_msg)
+       return tmp[0]