Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/tools/build/v1/python.jam @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 19.0 KB
Line 
1if ! $(gPYTHON_INCLUDED)
2{
3gPYTHON_INCLUDED = true ;
4
5import testing ;
6   
7# Do some OS-specific setup
8if $(NT)
9{
10    CATENATE = type ;
11}
12else if $(UNIX)
13{
14    CATENATE = cat ;
15}
16
17PYTHON_VERSION ?= 2.4 ;
18
19# Strip the dot from the Python version in order to be able to name
20# libraries
21PYTHON_VERSION_NODOT
22 = [ MATCH ([0-9]*)\.([0-9]*) : $(PYTHON_VERSION) ]
23      ;
24PYTHON_VERSION_NODOT = $(PYTHON_VERSION_NODOT:J=) ;
25
26local RUN_PATH = $(RUN_PATH) ;
27
28if $(NT) || ( $(UNIX) && $(OS) = CYGWIN )
29{
30    PYTHON_WINDOWS = true ;
31}
32
33if $(PYTHON_WINDOWS)
34{
35    # common properties required for compiling any Python module.
36    PYTHON_PROPERTIES =
37      boost-python-disable-borland
38      select-nt-python-includes
39      <runtime-link>dynamic
40      <sysinclude>@boost
41      <$(gcc-compilers)><*><define>USE_DL_IMPORT
42      ;
43   
44    CYGWIN_PYTHON_ROOT ?= /usr ;
45    if ! $(NT)
46    {
47        PYTHON_ROOT ?= $(CYGWIN_PYTHON_ROOT) ;
48    }
49   
50    if $(CYGWIN_PYTHON_ROOT) = /usr
51    {
52        CYGWIN_PYTHON_DLL_PATH ?= /bin ;
53    }
54    else
55    {
56        CYGWIN_PYTHON_DLL_PATH ?= $(CYGWIN_PYTHON_ROOT)/bin ;
57    }
58    CYGWIN_PYTHON_VERSION ?= $(PYTHON_VERSION) ;
59    CYGWIN_PYTHON_LIB_PATH ?= $(CYGWIN_PYTHON_ROOT)/lib/python$(CYGWIN_PYTHON_VERSION)/config ;
60     
61    CYGWIN_PYTHON_DEBUG_VERSION ?= $(CYGWIN_PYTHON_VERSION) ;
62    CYGWIN_PYTHON_DEBUG_ROOT ?= $(PYTHON_ROOT) ;
63    CYGWIN_PYTHON_DEBUG_DLL_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/bin ;
64    CYGWIN_PYTHON_DEBUG_LIB_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/lib/python$(CYGWIN_PYTHON_DEBUG_VERSION)/config ;
65}
66else if $(UNIX)
67{
68        # PYTHON_EMBEDDED_LIBRARY: Libraries to include when
69        # embedding Python in C++ code.  We need the Python library,
70        # libdl for dynamic loading and possibly libutil on BSD-like
71        # systems (including Linux).  A dynamic libpython should
72        # automatically pick up the libutil dependency, but we cannot
73        # tell here if we are linking with a static or dynamic
74        # libpython, so we include libutil for all UNIX systems where
75        # it is available.
76
77        if $(OS) = MACOSX
78        {
79                PYTHON_EMBEDDED_LIBRARY = ;
80        }
81        else if $(OS) = SOLARIS
82        {
83                PYTHON_EMBEDDED_LIBRARY = python$(PYTHON_VERSION) dl ;
84        }
85        else if $(OS) = OSF
86        {
87                PYTHON_EMBEDDED_LIBRARY = python$(PYTHON_VERSION) ;
88        }
89        else
90        {
91                PYTHON_EMBEDDED_LIBRARY = python$(PYTHON_VERSION) dl util ;
92        }
93}
94
95
96if $(NT)
97{
98    PYTHON_ROOT ?= c:/Python$(PYTHON_VERSION_NODOT) ;
99   
100    # Reconstitute any paths split due to embedded spaces.
101    PYTHON_ROOT = $(PYTHON_ROOT:J=" ") ;
102   
103    PYTHON_LIB_PATH ?= $(PYTHON_ROOT)/libs [ GLOB $(PYTHON_ROOT) : PCbuild ] ;
104
105    PYTHON_INCLUDES ?= $(PYTHON_ROOT)/include ;
106   
107    PYTHON_DLL ?= [ GLOB $(PYTHON_ROOT) $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT).dll ] ;
108    PYTHON_DEBUG_DLL ?= [ GLOB $(PYTHON_ROOT) $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT)_d.dll ] ;
109    PYTHON_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;
110    PYTHON_DEBUG_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;
111}
112else if $(UNIX) && $(OS) = MACOSX
113{
114    if ! $(PYTHON_ROOT)
115    {
116        if [ GLOB /System/Library/Frameworks : Python.framework ]
117        {
118            PYTHON_ROOT ?= /System/Library/Frameworks/Python.framework/Versions/$(PYTHON_VERSION) ;
119        }
120        else
121        {
122            PYTHON_ROOT ?= /Library/Frameworks/Python.framework/Versions/$(PYTHON_VERSION) ;
123        }
124    }
125    PYTHON_ROOT = $(PYTHON_ROOT:J=" ") ;
126    PYTHON_INCLUDES ?= $(PYTHON_ROOT)/include/python$(PYTHON_VERSION) ;
127    PYTHON_FRAMEWORK ?= $(PYTHON_ROOT) ;
128    while $(PYTHON_FRAMEWORK:D=) && $(PYTHON_FRAMEWORK:D=) != Python.framework
129    {
130        PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D) ;
131    }
132    PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D)/Python ;
133
134    PYTHON_PROPERTIES ?=
135      <sysinclude>$(PYTHON_INCLUDES)
136      ;
137}
138else if $(UNIX)
139{
140    PYTHON_ROOT ?= /usr ;
141    PYTHON_ROOT = $(PYTHON_ROOT:J=" ") ;
142    PYTHON_INCLUDES ?= $(PYTHON_ROOT)/include/python$(PYTHON_VERSION) ;
143    PYTHON_LIB_PATH ?= $(PYTHON_ROOT)/lib/python$(PYTHON_VERSION)/config ;
144
145    PYTHON_PROPERTIES ?=
146      <sysinclude>$(PYTHON_INCLUDES)
147        <library-path>$(PYTHON_LIB_PATH)
148          <default>python-intel-use-gcc-stdlib
149          python-static-multithread
150      ;
151   
152    if $(OS) = OSF
153    {
154        local not-gcc-compilers = [ difference $(TOOLS) : $(gcc-compilers) ] ;
155
156        PYTHON_PROPERTIES +=
157          <$(not-gcc-compilers)><*><linkflags>"-expect_unresolved 'Py*' -expect_unresolved '_Py*'"
158          <$(gcc-compilers)><*><linkflags>"-Xlinker -expect_unresolved -Xlinker 'Py*' -Xlinker -expect_unresolved -Xlinker '_Py*'" ;
159    }
160    else if $(OS) = AIX
161    {
162        PYTHON_PROPERTIES
163          += <*><*><linkflags>"-Wl,-bI:$(PYTHON_LIB_PATH)/python.exp"
164            <*><*><find-library>pthreads ;
165    }
166}
167
168#
169# Locate the python executable(s)
170#
171CYGWIN_ROOT ?= c:/cygwin ;
172{
173    for local cyg in "" CYGWIN_
174    {
175        for local d in "" _D
176        {
177            local d_D = _DEBUG ;
178            local debug = $(d$(d)) ; # "" or _DEBUG
179
180            # select base name of variables
181            local var-base = $(cyg)PYTHON$(debug) ;
182           
183            # Base defaults for the debug build on the non-debug
184            $(var-base)_VERSION ?= $($(cyg)PYTHON_VERSION) ;
185            $(var-base)_ROOT ?= $($(cyg)PYTHON_ROOT) ;
186           
187            # Version number element of executable name
188            local exe-version = $($(var-base)_VERSION) ;
189            if $(NT) && ! $(cyg) { exe-version = $(d:L) ; }
190           
191            # assign default target name
192            local executable = $(cyg)PYTHON$(d) ;
193            $(executable) ?= <$(cyg)EXE$(d)@>python$(exe-version)$(SUFEXE) ;
194
195            # choose the appropriate root directory/ies to search for the target
196            local r = $($(var-base)_ROOT) ;
197            if $(NT)
198            {
199                switch $(r)
200                {
201                    case [/\\]* : # in case of unix-style path
202                      r = $(CYGWIN_ROOT)$(r) $(r) ; # re-root for windows
203                }
204            }
205           
206            # set up search path
207            SEARCH on $($(executable))
208              = $(r)/bin           # Standard locations
209                $(r)               # Standard locations
210                $(r)/PCBuild       # In case building from a windows development Python
211                $(RUN_PATH)        # Just look in the path
212                ;
213        }
214    }
215}
216
217# Normally on Linux, Python is built with GCC.  A "poor QOI choice" in
218# the implementation of the intel tools prevents the use of
219# intel-linked shared libs by a GCC-built executable unless they have
220# been told to use the GCC runtime.  This rule adds the requisite
221# flags to the compile and link lines.
222rule python-intel-use-gcc-stdlib ( toolset variant : non-defaults * )
223{
224    if ( ! $(PYTHON_WINDOWS) )
225      && ( ! <define>BOOST_PYTHON_STATIC_LIB in $(non-defaults) )
226          && [ MATCH (intel) : $(toolset) ]
227    {
228        return <stdlib>gcc ;
229    }
230    else
231    {
232        return ;
233    }
234}
235
236# Force statically-linked embedding applications to be multithreaded
237# on UNIX.
238rule python-static-multithread ( toolset variant : properties * )
239{
240    if ! $(PYTHON_WINDOWS)
241    {
242        local x = <define>BOOST_PYTHON_STATIC_LIB <threading>single ;
243        if $(x) in $(properties)
244        {
245            properties = [ difference $(properties) : <threading>single ] <threading>multi ;
246        }
247    }
248    return $(properties) ;
249}
250
251# Borland compilers are not supported
252rule boost-python-disable-borland ( toolset variant : properties * )
253{
254    if [ MATCH .*(bcc|borland).* : $(toolset) ]
255    {
256        properties += <build>no ;
257    }
258    return $(properties) ;
259}
260
261# select-python-library
262#
263# Ungristed elements of a requirements list are treated as the rule
264# names to be called to transform the property set. This is used when
265# the requirements are too complicated to express otherwise.  This
266# rule selects the right python library when building on Windows.
267rule select-python-library ( toolset variant : properties * )
268{
269    if $(PYTHON_WINDOWS)
270    {
271        if $(toolset) in $(gcc-compilers)
272        {
273            if <define>BOOST_DEBUG_PYTHON in $(properties)
274            {
275                properties += <library-path>$(CYGWIN_PYTHON_DEBUG_LIB_PATH) <find-library>python$(CYGWIN_PYTHON_DEBUG_VERSION).dll ;
276            }
277            else
278            {
279                properties += <library-path>$(CYGWIN_PYTHON_LIB_PATH) <find-library>python$(CYGWIN_PYTHON_VERSION).dll ;
280            }
281        }
282        else if [ MATCH .*(mingw).* : $(toolset) ]
283        {
284            local lib = $(PYTHON_IMPORT_LIB) ;
285            if <define>BOOST_DEBUG_PYTHON in $(properties)
286            {
287                lib = $(PYTHON_DEBUG_IMPORT_LIB) ;
288            }
289            lib ?= $(PYTHON_DLL) ;
290            if <define>BOOST_DEBUG_PYTHON in $(properties)
291            {
292                lib ?= $(PYTHON_DEBUG_DLL) ;
293            }
294            properties += <library-file>$(lib) ;
295        }
296        else
297        {
298            properties += <library-path>$(PYTHON_LIB_PATH) ;
299           
300            if $(toolset) != msvc  # msvc compilers auto-find the python library
301            {
302                properties += <library-path>$(PYTHON_LIB_PATH) ;
303               
304                local lib = python$(PYTHON_VERSION_NODOT) ;
305                if <define>BOOST_DEBUG_PYTHON in $(properties)
306                {
307                    lib = python$(PYTHON_VERSION_NODOT)_d ;
308                }
309                properties += <find-library>$(lib) ;
310            }
311        }
312    }
313    if $(OS) = MACOSX && [ MATCH .*(darwin).* : $(toolset) ]
314    {
315        if <target-type>PYD in $(properties)
316        {
317            properties += <link-format>bundle ;
318        }
319        properties += <framework>$(PYTHON_FRAMEWORK) ;
320    }
321    return $(properties) ;
322}
323
324if $(NT)
325{
326    python-nt-sysinclude = [ GLOB $(PYTHON_ROOT) : PC ] ;
327}
328
329rule select-nt-python-includes ( toolset variant : properties * )
330{
331    if $(toolset) in $(gcc-compilers)
332    {
333        local d = "" ;
334        if <define>BOOST_DEBUG_PYTHON in $(properties)
335        {
336            d = DEBUG_ ;
337        }
338        properties += <sysinclude>$(CYGWIN_PYTHON_$(d)ROOT)/include/python$(CYGWIN_PYTHON_$(d)VERSION) ;
339    }
340    else
341    {
342      properties +=
343          <sysinclude>$(PYTHON_INCLUDES)
344            <sysinclude>$(python-nt-sysinclude) # in case the user is using a source installation
345              ;
346       
347        if [ MATCH (cwpro) : $(toolset) ] && ( $(variant) = debug-python )
348        {
349            properties = [ difference $(properties) : <define>_DEBUG ] ;  #it warns about redefinition otherwise.
350        }
351        else
352        {
353            properties += <debug-python><define>_DEBUG ;
354        }
355    }
356    return $(properties) ;
357}
358
359PYTHON_PROPERTIES +=
360        <sysinclude>@boost
361          <stlport-iostream>on
362            select-python-library
363            ;
364
365BOOST_PYTHON_V2_PROPERTIES
366  = $(PYTHON_PROPERTIES)
367    <metrowerks><*><cxxflags>"-inline deferred"
368      <cwpro8><*><cxxflags>"-inline deferred"  # added for internal testing purposes
369        <cxx><*><sysinclude>@boost/boost/compatibility/cpp_c_headers
370         <define>BOOST_PYTHON_DYNAMIC_LIB
371      ;
372
373# Extends the RUN_PATH assignment for targets built under Cygwin so
374# that the Python DLL can be found.
375rule add-cygwin-python-run-path ( module )
376{
377    if <define>BOOST_DEBUG_PYTHON in $(gBUILD_PROPERTIES)
378    {
379        gRUN_LD_LIBRARY_PATH($(module)) += $(CYGWIN_PYTHON_DEBUG_DLL_PATH) ;
380    }
381    else
382    {
383        gRUN_LD_LIBRARY_PATH($(module)) += $(CYGWIN_PYTHON_DLL_PATH) ;
384    }
385}
386
387# This is the generator function for Python modules. It deals with the
388# need to change the name of modules compiled with debugging on. This
389# is just a wrapper around the generator for shared libraries,
390# dll-files.
391rule python-files ( module implib ? : sources * )
392{
393    dll-files $(module) $(implib) : $(sources) : PYD ;
394
395    if $(gCURRENT_TOOLSET) in $(gcc-compilers)
396    {
397        if $(PYTHON_WINDOWS)
398        {
399            add-cygwin-python-run-path $(<[-1]) ;
400        }
401        else
402        {
403            gRUN_PATH($(module)) += $(GCC_ROOT_DIRECTORY)/lib ;
404        }
405    }
406}
407
408if $(NT)
409{
410    # Adjust the name of Python modules so that they have the _d
411    # suffix when compiled with python debugging enabled.
412    gNAME_ADJUST(PYD) = name-adjust-PYD ;
413
414    rule name-adjust-PYD ( pyd implib ? : properties * : toolset variant )
415    {
416        # Cygwin python is only happy if compiled modules have a .dll
417        # extension
418        if $(toolset) in $(gcc-compilers)
419        {
420            pyd = $(pyd:S=.dll) ;
421        }
422        else if <define>BOOST_DEBUG_PYTHON in $(properties)
423        {
424            pyd = $(pyd:S=)_d$(pyd:S) ;
425        }
426        return $(pyd) $(implib) ;
427    }
428}
429
430rule Link-PYD
431{
432    if $(UNIX)
433    {
434        LINK_LIBPATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ;
435    }
436    gRUN_PYTHONPATH($(<)) += $(gLOCATE($(<[1]))) ;
437    .do-link $(<) : $(>) : PYD ;
438}
439
440declare-target-type PYD : <shared-linkable>true ;
441gGENERATOR_FUNCTION(PYD) = python-files ;
442if $(NT)
443{
444    SUFPYD = .pyd $(SUFDLL[2-]) ;
445}
446else if $(OS) = MACOSX
447{
448    SUFPYD = .so $(SUFDLL[2-]) ;
449}
450else
451{
452    SUFPYD = $(SUFDLL) ;
453}
454PYDMODE = $(DLLMODE) ;
455SHARED_TYPES += PYD ;
456
457gTARGET_TYPE_ID(pyd) = PYD ;
458gIS_DEPENDENCY(PYD) = TRUE ;
459
460# Declare a python extension.
461rule extension ( name : sources + : requirements * : default-BUILD * )
462{
463    requirements += $(BOOST_PYTHON_V2_PROPERTIES) ;
464   
465
466    declare-local-target $(name) : $(sources) : $(requirements) : $(default-BUILD) : PYD ;
467}
468
469gGENERATOR_FUNCTION(TEST_PYD) = run-test PYD  ;
470SUFTEST_PYD = .run ;
471
472declare-build-succeed-test RUN_PYD : TEST_PYD ;
473
474# boost-python-runtest target : python-script sources : requirements : local-build : args
475#
476# declare a python module test $(<).test which builds when out-of-date
477#
478# pass --python-test-all on the command-line to force rebuilding
479rule boost-python-runtest (
480  target : sources + : requirements * : local-build * : args * )
481{
482    local gRUN_TEST_ARGS = $(args) ;
483    local pyfiles = [ MATCH ^(.*[.]py)$ : $(sources) ] ;
484    sources = [ difference $(sources) : $(pyfiles) ] ;
485    local gRUN_TEST_INPUT_FILES = [ FGristFiles $(pyfiles) ] ;
486
487    # tell Jam that the python script is relative to this directory
488    SEARCH on $(gRUN_TEST_INPUT_FILES) = $(SEARCH_SOURCE) ;
489
490    # The user can add additional arguments in PYTHON_TEST_ARGS.
491    local gRUN_TEST_ARGS2 = $(PYTHON_TEST_ARGS) ;
492    gRUN_TEST_ARGS2 ?= -v ;
493   
494    #
495    # Stick the names of the python script and source files used in
496    # testing into $(source-files) on the main target.  This is kind
497    # of a hack, because boost-test will be returning the name of the
498    # main target, but unfortunatedly dump-tests runs during the
499    # evaluation of boost-test and not during the build phase :(
500    #
501    local main-target = [ FGristFiles [ expand-target-names $(target) : RUN_PYD ] ] ;
502    source-files on $(main-target) = $(gRUN_TEST_INPUT_FILES) ;
503   
504    local dependencies = [ FGristFiles [ expand-source-names $(sources) ] ] ;
505    source-files on $(main-target) += $(gTARGET_SOURCES($(dependencies))) ;
506     
507    local result = [
508      boost-test $(sources)
509        : RUN_PYD
510        : $(requirements)
511          boost-python-disable-borland
512          <default>python-intel-use-gcc-stdlib # unless otherwise
513                                               # specified, assume the GCC standard
514                                               # library is needed for intel
515          : $(target)
516            : $(local-build)
517    ] ;
518}
519
520rule boost-python-test ( name : sources + : requirements * : default-BUILD * )
521{
522    extension $(name) : $(sources) : $(requirements) <suppress>true : $(4) ;
523}
524
525# Returns the executable to use for testing one or more Python modules
526rule test-executable(PYD) ( targets-to-test + )
527{
528    # choose the right python executable
529    local python = $(PYTHON) ;
530   
531    if $(NT)
532    {
533        local d = "" ;
534        if <define>BOOST_DEBUG_PYTHON in $(gBUILD_PROPERTIES)
535        {
536            d = _D ;
537        }
538
539        if $(gCURRENT_TOOLSET) in $(gcc-compilers)
540        {
541            python = $(CYGWIN_PYTHON$(d)) ;
542        }
543        else
544        {
545            python = $(PYTHON$(d)) ;
546        }
547    }
548   
549    return $(python) ;
550}
551
552rule check-python-config ( )
553{
554    if --without-python in $(ARGV)
555    {
556        gNO_PYTHON_INSTALL = true ;
557    }
558    else if ! $(gPYTHON_CONFIG_CHECKED)
559    {
560        local dir ;
561       
562        if $(NT) &&  $(TOOLS) in $(gcc-compilers)
563        {
564            dir =  $(CYGWIN_PYTHON_DEBUG_ROOT) $(CYGWIN_PYTHON_ROOT) ;
565            v = $(CYGWIN_PYTHON_DEBUG_VERSION) $(CYGWIN_PYTHON_VERSION) ;
566            dir = $(dir)/include/python$(v) ;
567            dir = /cygwin/$(dir) $(dir) ;
568        }
569        dir += $(PYTHON_INCLUDES) ;
570         
571        # This represents an improvement over the checking that was in
572        # Boost 1.28.0, but it is still an imperfect hack. For
573        # Boost.Build v2 we will clean up the rules.
574        if ! [ GLOB $(dir) : Python.h ]
575        {
576            gNO_PYTHON_INSTALL = true ;
577            ECHO "---------------------------------------------------------------------" ;
578            ECHO "*** If you don't need Boost.Python, you can ignore this section  ***" ;
579            ECHO "*** pass --without-python to suppress this message in the future ***" ;
580            ECHO ;
581            ECHO skipping Boost.Python library build due to missing or incorrect configuration ;
582            ECHO ;
583            ECHO "couldn't find Python.h in"  \"$(dir:J=" ")\" ;
584            ECHO ;
585            ECHO You can configure the location of your python installation by setting: ;
586            ECHO "PYTHON_VERSION - The 2-part python Major.Minor version number (e.g." ;
587            ECHO "                 \"2.2\", NOT \"2.2.1\")  - currently" \"$(PYTHON_VERSION)\" ;
588            ECHO ;
589            if $(NT)
590            {
591                ECHO "PYTHON_ROOT    - automatically configured from PYTHON_VERSION if not" ;
592                ECHO "                 otherwise set ; currently" \"$(PYTHON_ROOT:J=" ")\" ;
593            }
594            else
595            {
596                ECHO "PYTHON_ROOT    - currently" \"$(PYTHON_ROOT:J=" ")\" ;
597            }
598            ECHO ;
599            ECHO "The following are automatically configured from PYTHON_ROOT if not" ;
600            ECHO "otherwise set:" ;
601            ECHO ;
602            ECHO "    PYTHON_LIB_PATH       - path to Python library object; currently" ;
603            ECHO "                            \""$(PYTHON_LIB_PATH:J=" ")\" ;
604           
605            if ! $(NT)
606            {
607                ECHO "    PYTHON_INCLUDES       - path to Python #include directories; currently" ;
608                ECHO "                            \""$(PYTHON_INCLUDES:J=" ")\" ;
609            }
610            else if [ intersection $(TOOLS) : $(gcc-compilers) ]
611            {
612                ECHO ;
613                ECHO "    For detailed configuration of Boost.Python for Cygwin GCC" ;
614                ECHO "    under Windows NT please see" ;
615                ECHO "    http://www.boost.org/libs/python/doc/building.html" ;
616            }
617           
618            ECHO "---------------------------------------------------------------------" ;
619        }
620        gPYTHON_CONFIG_CHECKED = true ;
621    }
622    if ! $(gNO_PYTHON_INSTALL)
623    {
624        return true ;
625    }
626}
627
628}
Note: See TracBrowser for help on using the repository browser.