mirror of
https://gitlab.com/ita1024/waf.git
synced 2024-11-22 01:46:15 +01:00
151 lines
4.0 KiB
Python
151 lines
4.0 KiB
Python
#! /usr/bin/env python
|
|
# encoding: UTF-8
|
|
# Peter Forai
|
|
# Thomas Nagy, 2008
|
|
|
|
"""
|
|
Demonstrates how to create a c++ app that runs python scripts
|
|
|
|
Useful for apps providing script extensions
|
|
"""
|
|
|
|
VERSION='0.0.1'
|
|
APPNAME='swig_test'
|
|
top = '.'
|
|
out = 'build'
|
|
|
|
def options(opt):
|
|
opt.load('g++ python')
|
|
|
|
def configure(conf):
|
|
conf.load('g++ python')
|
|
conf.check_python_version((2,4,2))
|
|
conf.check_python_headers()
|
|
|
|
conf.load('swig')
|
|
if conf.check_swig_version() < (1, 2, 27):
|
|
conf.fatal('this swig version is too old')
|
|
|
|
try:
|
|
conf.load('java')
|
|
# on mandriva, at least, libjvm.so is difficult to find
|
|
#conf.env.LIBPATH_JAVA = "/usr/lib/jvm/java-1.6.0-sun-1.6.0.13/jre/lib/amd64/server/"
|
|
conf.check_jni_headers()
|
|
conf.env.HAVE_JAVA = True
|
|
except conf.errors.ConfigurationError:
|
|
conf.env.HAVE_JAVA = False
|
|
|
|
def build(bld):
|
|
|
|
# embedding
|
|
#
|
|
# use swig_flags = '-c++ -python -debug-classes' for debugging
|
|
|
|
obj = bld(
|
|
features = 'cxx cxxprogram pyembed',
|
|
source = 'embed/src1.cpp embed/bind.swig',
|
|
target = 'embed/embed_demo',
|
|
swig_flags = '-c++ -python -Wall',
|
|
includes = '. embed')
|
|
|
|
|
|
# extending
|
|
#
|
|
# be careful that the .py produced by swig is mandatory for using the library
|
|
#
|
|
# it is possible to disable 'mylib', and to add extend/a.cpp
|
|
# to the source of extend/python/_test_swig_waf and remove use
|
|
|
|
bld(
|
|
features = 'cxx cxxshlib',
|
|
source = 'extend/a.cpp',
|
|
target = 'extend/mylib',
|
|
includes = 'extend',
|
|
export_includes = 'extend',
|
|
vnum = '1.2.3',
|
|
name = 'mylib')
|
|
|
|
bld(
|
|
features = 'cxx cxxshlib pyext',
|
|
source = 'extend/python/test_swig_waf.i',
|
|
target = 'extend/python/_test_swig_waf',
|
|
swig_flags = '-c++ -python -Wall',
|
|
includes = 'extend',
|
|
vnum = '1.2.3',
|
|
use = 'mylib')
|
|
|
|
bld.add_group()
|
|
|
|
python_site_package = '${PREFIX}/lib/python%s/site-packages' % bld.env.PYTHON_VERSION
|
|
generated_py = bld.path.find_or_declare('extend/python/test_swig_waf.py')
|
|
bld(features='py', source=generated_py, install_path=python_site_package, install_from=bld.path.get_bld())
|
|
|
|
|
|
bld.add_post_fun(exec_test_python)
|
|
|
|
# some java stuff
|
|
if not bld.env.HAVE_JAVA:
|
|
return
|
|
|
|
swigsrcdir = bld.path.get_bld().make_node('extend/java') # destination for generated java source from swig
|
|
swigoutdir = bld.path.get_bld().make_node('extend/jar') # destination for generated class files
|
|
|
|
# Will generate code via swig and also the JNI library in C++
|
|
jniswig = bld(
|
|
features = 'cxx cxxshlib',
|
|
source = 'extend/java/test_swig_waf.i',
|
|
target = 'extend/java/_test_swig_waf',
|
|
swig_flags = '-c++ -java -package foo.bar.pouet -outdir extend/java/foo/bar/pouet',
|
|
includes = 'extend',
|
|
vnum = '1.2.3',
|
|
uselib = 'JAVA',
|
|
use = 'mylib')
|
|
|
|
# Java will contain the generated code from swigsrcdir plus the local sources
|
|
jswig = bld(features = 'javac jar',
|
|
srcdir = [ swigsrcdir , 'extend/java'] ,
|
|
sourcepath = [],
|
|
outdir = swigoutdir,
|
|
basedir = swigoutdir,
|
|
destfile = 'maha.jar',
|
|
)
|
|
|
|
# Post JNI library and Java generators so we have tasks created
|
|
jniswig.post()
|
|
jswig.post()
|
|
# Now make sure javac task is executed after swig generation
|
|
for x in jniswig.tasks:
|
|
if x.__class__.__name__ == 'swig':
|
|
jswig.javac_task.set_run_after(x)
|
|
|
|
# Launch the test after build
|
|
bld.add_post_fun(exec_test_java)
|
|
|
|
|
|
def exec_test_java(bld):
|
|
try:
|
|
bld.cmd_and_log('LD_LIBRARY_PATH=$LD_LIBRARY_PATH:build/extend/java:build/extend java -classpath "build/maha.jar:." foo.bar.pouet.Foo')
|
|
except:
|
|
pass
|
|
|
|
def exec_test_python(bld):
|
|
import os, stat
|
|
try:
|
|
import subprocess
|
|
proc = subprocess.Popen('''
|
|
PYTHONPATH=$PYTHONPATH:build/extend/python
|
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:build/extend/python:build/extend
|
|
python -c "import test_swig_waf; a=test_swig_waf.A(); print('Testing: a.add(2, 3) -> %r' % a.add(2, 3))"
|
|
'''.replace('\n', ' '), shell=True)
|
|
proc.wait()
|
|
except:
|
|
pass
|
|
|
|
# why does this fail now on mandriva???
|
|
try:
|
|
os.stat('build/embed/embed_demo')
|
|
bld.cmd_and_log('PYTHONPATH=$PYTHONPATH:build/embed/ build/embed/embed_demo')
|
|
except:
|
|
pass
|
|
|