## -*- python -*-
#import Action
#import Object
#import Params
#from waflib import Task

import sys
import os.path
import os
import 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()

    if 0:
        gen = bld(
            features='command',
            source='test-generation.py',
            target='test.cc',
            command='${PYTHON} ${SRC[0]} ${TOP_SRCDIR} > ${TGT[0]}')

        if env['CXX']:
            obj = bld(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(
        features='command',
        source='foomodulegen.py',
        target='foomodule.cc',
        command='${PYTHON} %s ${SRC[0]} ${TOP_SRCDIR} > ${TGT[0]}' % (DEPRECATION_ERRORS,))

    if env['CXX']:
        obj = bld(features='cxx cxxshlib pyext')
        obj.source = [
            'foo.cc',
            'foomodule.cc'
            ]
        obj.target = 'foo'
        obj.install_path = None
        obj.env.append_value("INCLUDES", '.')

    ## automatic code scanning using gccxml
    if env['ENABLE_PYGCCXML']:
        ### Same thing, but using gccxml autoscanning

        bld(
            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['INCLUDES']+bindgen.env['INCLUDES_PYEXT'])))

        obj = bld(features='cxx cxxshlib pyext')
        obj.source = [
            'foo.cc',
            'foomodule2.cc'
            ]
        obj.target = 'foo2'
        obj.install_path = None
        obj.env.append_value("INCLUDES", '.')

        ### Now using the generated python script

        bld(
            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.get_bld().abspath()])

        obj = bld(features='cxx cxxshlib pyext')
        obj.source = [
            'foo.cc',
            'foomodule3.cc'
            ]
        obj.target = 'foo3'
        obj.install_path = None # do not install
        obj.env.append_value("INCLUDES", '.')

        ## ---

        bld(
            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['INCLUDES']+bindgen.env['INCLUDES_PYEXT'])))

        bld(
            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(features='cxx cxxshlib pyext')
        obj.source = [
            'foo.cc',
            'foomodule4.cc',
            'foomodulegen_module1.cc',
            'foomodulegen_module2.cc',
            ]
        obj.target = 'foo4'
        obj.install_path = None # do not install
        obj.env.append_value("INCLUDES", '.')

    ## pure C tests
    bld.recurse('c-hello')

    ## boost tests
    bld.recurse('boost')
