From e38d3df128a7f72ef285a46d4d1488f12bc280ea Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 15 Feb 2005 12:10:09 +0000 Subject: [PATCH] More work on Boost.Python. Most tests now pass on Linux. [SVN r27387] --- src/tools/python.jam | 109 +++++++++++++++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 25 deletions(-) diff --git a/src/tools/python.jam b/src/tools/python.jam index 2c9c0d55c..85c2a5756 100644 --- a/src/tools/python.jam +++ b/src/tools/python.jam @@ -4,6 +4,16 @@ # http://www.boost.org/LICENSE_1_0.txt) # Support for Python and the the Boost.Python library. +# +# This module defines +# +# - a project 'python' with a target 'python' in it, that corresponds +# to the python library +# +# - a main target rule 'python-extension' which can be used +# to build a python extension. +# +# Extensions that use Boost.Python must explicitly link to it. # Known problems: # - the directory where extension is generated is different from V2 @@ -11,6 +21,9 @@ # SHARED_LIB, not PYTHON_EXTENSION. That's because we reuse # 'lib-target-class', which creates SHARED_LIB explicitly. + + + import type ; import testing ; import generators ; @@ -48,15 +61,32 @@ rule init-unix ( version ? : root : includes ? : libraries ? ) includes ?= $(root)/include/python$(version) ; libraries ?= $(root)/lib/python$(version)/config ; - alias python : + if --debug-configuration in [ modules.peek : ARGV ] + { + ECHO "notice: Python include path is" $(includes) ; + ECHO "notice: Python library path is" $(libraries) ; + } + + + + # On Linux, we don't want to link either Boost.Python or + # Python extensions to libpython, so that when extensions + # loaded in the interpreter, the symbols in the interpreter + # are used. If we linked to libpython, we'd get duplicate + # symbols. So declare two targets -- one for headers and another + # for library. + alias python_for_extensions + : + : + : + : $(includes) + ; + + alias python + : : : : $(includes) - # On Linux, we don't want to link either Boost.Python or - # Python extensions to libpython, so that when extensions - # loaded in the interpreter, the symbols in the interpreter - # are used. If we linked to libpython, we'd get duplicate - # symbols. $(libraries) python$(version) ; @@ -70,6 +100,9 @@ rule init-unix ( version ? : root : includes ? : libraries ? ) # python-static-multithread # ; +# TODO: need to figure out when the following code is needed: +# for builtin extensions only or in some other cases too. + # if [ modules.peek $(OS) ] = OSF # { # PYTHON_PROPERTIES += <*><*>"-expect_unresolved 'Py*' -expect_unresolved '_Py*'" ; @@ -110,16 +143,13 @@ rule init-mac ( version : root : includes ? : libraries ? ) : : $(includes) ; - - # TODO: handle the following V1 code - #if $(OS) = MACOSX && $(toolset) = darwin - #{ - # if PYD in $(properties) - # { - # properties += bundle ; - # } - # properties += $(PYTHON_FRAMEWORK) ; - #} + + alias python + : + : MACOSXX darwin + : + : $(PYTHON_FRAMEWORK) + ; } rule init-nt ( version : root : includes ? : libraries ? : cygwin-condition ? ) @@ -233,7 +263,20 @@ type.set-generated-target-suffix PYTHON_EXTENSION : CYGWIN : dll ; rule python-extension ( name : sources * : requirements * : default-build * : usage-requirements * ) { - requirements += $(BOOST_PYTHON_V2_PROPERTIES) ; + requirements += /python//python_for_extensions ; + + # TODO: handle the following V1 code + #if $(OS) = MACOSX && $(toolset) = darwin + #{ + # if PYD in $(properties) + # { + # properties += bundle ; + # } + # properties += $(PYTHON_FRAMEWORK) ; + #} + + # TODO: handle + # python-intel-use-gcc-stdlib # <*>"-inline deferred" @@ -270,7 +313,7 @@ rule python-extension ( name : sources * : requirements * : default-build * : # python-static-multithread - + local project = [ project.current ] ; targets.main-target-alternative @@ -281,6 +324,8 @@ rule python-extension ( name : sources * : requirements * : default-build * : ] ; } +IMPORT python : python-extension : : python-extension ; + # Support for testing type.register PY : py ; type.register RUN_PYD_OUTPUT ; @@ -289,6 +334,8 @@ type.register RUN_PYD : : TEST ; class python-test-generator : generator { + import set ; + rule __init__ ( * : * ) { generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; @@ -306,10 +353,20 @@ class python-test-generator : generator } } + local extensions ; + for local s in $(sources) + { + if [ $(s).type ] = PYTHON_EXTENSION + { + extensions += $(s) ; + } + } + local libs ; for local s in $(sources) { - if [ type.is-derived [ $(s).type ] LIB ] + if [ type.is-derived [ $(s).type ] LIB ] + && ! $(s) in $(extensions) { libs += $(s) ; } @@ -320,8 +377,8 @@ class python-test-generator : generator { if [ type.is-derived [ $(s).type ] CPP ] { - local name = [ $(s).name ] ; - if $(name) = [ $(python).name ] + local name = [ utility.basename [ $(s).name ] ] ; + if $(name) = [ utility.basename [ $(python).name ] ] { name = $(name)_ext ; } @@ -332,9 +389,10 @@ class python-test-generator : generator new-sources += $(extension[2-]) ; } } + - result = [ construct-result $(python) $(new-sources) : $(project) $(name) - : $(property-set) ] ; + result = [ construct-result $(python) $(extensions) $(new-sources) + : $(project) $(name) : $(property-set) ] ; } } @@ -352,11 +410,12 @@ rule capture-output ( target : sources * : properties * ) LAUNCHER on $(target) = PYTHONPATH=$(PYTHONPATH) "python" ; } -rule bpl-test ( sources + : requirements * : target-name ? ) +rule bpl-test ( name : sources * : requirements * ) { + sources ?= $(name).py $(name).cpp ; return [ testing.make-test run-pyd : $(sources) /boost/python//boost_python - : $(requirements) : $(target-name) ] ; + : $(requirements) : $(name) ] ; } IMPORT $(__name__) : bpl-test : : bpl-test ;