73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
## -*- python -*-
|
|
import Action
|
|
import Object
|
|
import Params
|
|
import Task
|
|
|
|
import os, sys
|
|
sys.path.insert(0, os.getcwd()) # to work with uninstalled pybindgen
|
|
|
|
from pybindgen import (ReturnValue, Parameter, Module, Function, FileCodeSink)
|
|
|
|
|
|
def _pybindgen_action(task):
|
|
target, = task.m_outputs
|
|
out_file = file(target.bldpath(task.m_env), "w")
|
|
task.function(out_file)
|
|
out_file.close()
|
|
|
|
class PyBindGen(Object.genobj):
|
|
def __init__(self, env=None):
|
|
Object.genobj.__init__(self, 'other')
|
|
self.install_var = 0
|
|
self.env = env
|
|
if not self.env:
|
|
self.env = Params.g_build.m_allenvs['default'].copy()
|
|
self.function = None
|
|
self.target = None
|
|
self.prio = 5
|
|
def apply(self):
|
|
function = self.function
|
|
task = self.create_task('pybindgen', self.env, self.prio)
|
|
task.function = self.function
|
|
target = self.path.find_build(self.target)
|
|
task.set_outputs([target])
|
|
task.set_inputs([self.path.find_source('wscript')])
|
|
def install(self):
|
|
pass
|
|
|
|
|
|
|
|
def my_module_gen(out_file):
|
|
print >> out_file, "#include <Python.h>"
|
|
print >> out_file, "#include \"foo.h\""
|
|
|
|
mod = Module('foo')
|
|
|
|
mod.add_function(Function(ReturnValue('int'), 'print_something',
|
|
[Parameter('const char*', 'message')]))
|
|
|
|
mod.add_function(Function(ReturnValue('int'), 'print_something_else',
|
|
[Parameter('const char*', 'message2')]))
|
|
|
|
mod.generate(FileCodeSink(out_file))
|
|
|
|
|
|
|
|
def build(bld):
|
|
Object.register('pybindgen', PyBindGen)
|
|
Action.Action('pybindgen', func=_pybindgen_action, color='BLUE')
|
|
|
|
bindgen = bld.create_obj('pybindgen')
|
|
bindgen.target = 'foomodule.cc'
|
|
bindgen.function = my_module_gen
|
|
|
|
obj = bld.create_obj('cpp', 'shlib', 'pyext')
|
|
obj.source = [
|
|
'foo.cc',
|
|
'foomodule.cc'
|
|
]
|
|
obj.target = 'foo'
|
|
obj.post()
|
|
|