## -*- python -*- #import Action #import Object #import Params import Task import sys import os.path import os import pproc as subprocess # uncomment to enable profiling information # epydoc uses the profile data to generate call graphs #os.environ["PYBINDGEN_ENABLE_PROFILING"] = "" if 0: DEPRECATION_ERRORS = '-Werror::DeprecationWarning' # deprecations become errors else: DEPRECATION_ERRORS = '-Wdefault::DeprecationWarning' # normal python behaviour def build(bld): env = bld.env env['TOP_SRCDIR'] = bld.srcnode.abspath() gen = bld.new_task_gen( features='command', source='test-generation.py', target='test.cc', command='${PYTHON} ${SRC[0]} ${TOP_SRCDIR} > ${TGT[0]}') if env['CXX']: obj = bld.new_task_gen(features='cxx pyext') obj.source = 'test.cc' if env['CXX_NAME'] == 'gcc': obj.env.append_value('CXXFLAGS', ['-Werror', '-Wno-unused']) ## manual code generation using simple pybindgen API calls bindgen = bld.new_task_gen( features='command', source='foomodulegen.py', target='foomodule.cc', command='${PYTHON} %s ${SRC[0]} ${TOP_SRCDIR} > ${TGT[0]}' % (DEPRECATION_ERRORS,)) if env['CXX']: obj = bld.new_task_gen(features='cxx cshlib pyext') obj.source = [ 'foo.cc', 'foomodule.cc' ] obj.target = 'foo' obj.install_path = None obj.includes = '.' ## automatic code scanning using gccxml if env['ENABLE_PYGCCXML']: ### Same thing, but using gccxml autoscanning bld.new_task_gen( features='command', source='foomodulegen-auto.py foo.h', target='foomodule2.cc foomodulegen_generated.py', command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[1]} > ${TGT[0]}' % (DEPRECATION_ERRORS,), variables=dict(cpp_path_repr=repr(bindgen.env['CPPPATH']+bindgen.env['CPPPATH_PYEXT']))) obj = bld.new_task_gen(features='cxx cshlib pyext') obj.source = [ 'foo.cc', 'foomodule2.cc' ] obj.target = 'foo2' obj.install_path = None obj.includes = '.' ### Now using the generated python script bld.new_task_gen( features='command', source='foomodulegen3.py foomodulegen_generated.py', target='foomodule3.cc', command='${PYTHON} %s ${SRC[0]} ${TGT[0]} > ${TGT[0]}' % (DEPRECATION_ERRORS,)) ## yes, this global manipulation of PYTHONPATH is kind of evil :-/ ## TODO: add WAF command-output support for customising command OS environment os.environ["PYTHONPATH"] = os.pathsep.join([os.environ.get("PYTHONPATH", ''), bindgen.path.abspath(bindgen.env)]) obj = bld.new_task_gen(features='cxx cshlib pyext') obj.source = [ 'foo.cc', 'foomodule3.cc' ] obj.target = 'foo3' obj.install_path = None # do not install obj.includes = '.' ## --- bld.new_task_gen( features='command', source='foomodulegen-auto-split.py foo.h', target='foomodulegen_split.py foomodulegen_module1.py foomodulegen_module2.py', command='${PYTHON} %s ${SRC[0]} ${SRC[1]} ${cpp_path_repr} ${TGT[0]} ${TGT[1]} ${TGT[2]}' % (DEPRECATION_ERRORS,), variables=dict(cpp_path_repr=repr(bindgen.env['CPPPATH']+bindgen.env['CPPPATH_PYEXT']))) bld.new_task_gen( features='command', source=[ 'foomodulegen4.py', 'foomodulegen_split.py', 'foomodulegen_module1.py', 'foomodulegen_module2.py', ], target=[ 'foomodule4.cc', 'foomodule4.h', 'foomodulegen_module1.cc', 'foomodulegen_module2.cc', ], command='${PYTHON} %s ${SRC[0]} ${TGT[0]}' % (DEPRECATION_ERRORS,)) obj = bld.new_task_gen(features='cxx cshlib pyext') obj.source = [ 'foo.cc', 'foomodule4.cc', 'foomodulegen_module1.cc', 'foomodulegen_module2.cc', ] obj.target = 'foo4' obj.install_path = None # do not install obj.includes = '.' ## pure C tests bld.add_subdirs('c-hello')