Include waf as an extracted source directory, rather than as a one-in-a-file script.
[ira/wip.git] / buildtools / wafadmin / Tools / cc.py
diff --git a/buildtools/wafadmin/Tools/cc.py b/buildtools/wafadmin/Tools/cc.py
new file mode 100644 (file)
index 0000000..903a1c5
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+# encoding: utf-8
+# Thomas Nagy, 2006 (ita)
+
+"Base for c programs/libraries"
+
+import os
+import TaskGen, Build, Utils, Task
+from Logs import debug
+import ccroot
+from TaskGen import feature, before, extension, after
+
+g_cc_flag_vars = [
+'CCDEPS', 'FRAMEWORK', 'FRAMEWORKPATH',
+'STATICLIB', 'LIB', 'LIBPATH', 'LINKFLAGS', 'RPATH',
+'CCFLAGS', 'CPPPATH', 'CPPFLAGS', 'CCDEFINES']
+
+EXT_CC = ['.c']
+
+g_cc_type_vars = ['CCFLAGS', 'LINKFLAGS']
+
+# TODO remove in waf 1.6
+class cc_taskgen(ccroot.ccroot_abstract):
+       pass
+
+@feature('cc')
+@before('apply_type_vars')
+@after('default_cc')
+def init_cc(self):
+       self.p_flag_vars = set(self.p_flag_vars).union(g_cc_flag_vars)
+       self.p_type_vars = set(self.p_type_vars).union(g_cc_type_vars)
+
+       if not self.env['CC_NAME']:
+               raise Utils.WafError("At least one compiler (gcc, ..) must be selected")
+
+@feature('cc')
+@after('apply_incpaths')
+def apply_obj_vars_cc(self):
+       """after apply_incpaths for INC_PATHS"""
+       env = self.env
+       app = env.append_unique
+       cpppath_st = env['CPPPATH_ST']
+
+       # local flags come first
+       # set the user-defined includes paths
+       for i in env['INC_PATHS']:
+               app('_CCINCFLAGS', cpppath_st % i.bldpath(env))
+               app('_CCINCFLAGS', cpppath_st % i.srcpath(env))
+
+       # set the library include paths
+       for i in env['CPPPATH']:
+               app('_CCINCFLAGS', cpppath_st % i)
+
+@feature('cc')
+@after('apply_lib_vars')
+def apply_defines_cc(self):
+       """after uselib is set for CCDEFINES"""
+       self.defines = getattr(self, 'defines', [])
+       lst = self.to_list(self.defines) + self.to_list(self.env['CCDEFINES'])
+       milst = []
+
+       # now process the local defines
+       for defi in lst:
+               if not defi in milst:
+                       milst.append(defi)
+
+       # CCDEFINES_
+       libs = self.to_list(self.uselib)
+       for l in libs:
+               val = self.env['CCDEFINES_'+l]
+               if val: milst += val
+       self.env['DEFLINES'] = ["%s %s" % (x[0], Utils.trimquotes('='.join(x[1:]))) for x in [y.split('=') for y in milst]]
+       y = self.env['CCDEFINES_ST']
+       self.env.append_unique('_CCDEFFLAGS', [y%x for x in milst])
+
+@extension(EXT_CC)
+def c_hook(self, node):
+       # create the compilation task: cpp or cc
+       if getattr(self, 'obj_ext', None):
+               obj_ext = self.obj_ext
+       else:
+               obj_ext = '_%d.o' % self.idx
+
+       task = self.create_task('cc', node, node.change_ext(obj_ext))
+       try:
+               self.compiled_tasks.append(task)
+       except AttributeError:
+               raise Utils.WafError('Have you forgotten to set the feature "cc" on %s?' % str(self))
+       return task
+
+cc_str = '${CC} ${CCFLAGS} ${CPPFLAGS} ${_CCINCFLAGS} ${_CCDEFFLAGS} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT}'
+cls = Task.simple_task_type('cc', cc_str, 'GREEN', ext_out='.o', ext_in='.c', shell=False)
+cls.scan = ccroot.scan
+cls.vars.append('CCDEPS')
+
+link_str = '${LINK_CC} ${CCLNK_SRC_F}${SRC} ${CCLNK_TGT_F}${TGT[0].abspath(env)} ${LINKFLAGS}'
+cls = Task.simple_task_type('cc_link', link_str, color='YELLOW', ext_in='.o', ext_out='.bin', shell=False)
+cls.maxjobs = 1
+cls.install = Utils.nada
+