diff --git a/allyourbase.jam b/allyourbase.jam index 66a4fc759..4a5185d59 100644 --- a/allyourbase.jam +++ b/allyourbase.jam @@ -178,7 +178,8 @@ if $(NT) SUFOBJ ?= .obj ; SUFEXE ?= .exe ; SUFDLL ?= .dll .lib ; - gLINKABLE_PRODUCT_INDEX(DLL) = 2 ; # (the .lib is the ones to link) + gLINK_VARIABLE(.dll) = ; # dlls are NOT linked to directly + gLINK_VARIABLE(.lib) = NEEDLIBS ; # instead, users link to import libs PREDLL ?= "" ; NOARSCAN ?= true ; SHELL_EXPORT ?= ; @@ -191,8 +192,6 @@ if $(NT) YACCFILES ?= y.tab ; YACC_OUTPUT ?= --output= ; LEX_OUTPUT ?= -o ; - - DLL_AS_LIB ?= true ; } else if $(OS2) { @@ -315,10 +314,12 @@ else if $(UNIX) switch $(OS) { case AIX : - DLL_AS_LIB ?= true ; + IMPLIB_FLAGS ?= -bI: ; SUFDLL ?= .so .imp ; - gLINKABLE_PRODUCT_INDEX(DLL) = 1 ; # (the .so is the one to link) - + gLINK_VARIABLE(.so) = NEEDLIBS ; # shared libs should be added to the list of libs needed + gLINK_VARIABLE(.imp) = NEEDIMPS ; # import libs are handled separately. + gSHELL_LIBPATH = LIBPATH ; + case AMIGA : YACC ?= bison -y ; @@ -390,7 +391,7 @@ else if $(UNIX) RELOCATE ?= true ; case OSF : - DLL_AS_LIB ?= true ; + gLINK_VARIABLE(.so) = NEEDLIBS ; # shared objects should be added to the list of libs needed } # UNIX defaults @@ -403,6 +404,7 @@ else if $(UNIX) YACCFLAGS ?= -d ; SHELL_EXPORT ?= "export " ; SHELL_SET ?= "" ; + gSHELL_LIBPATH ?= LD_LIBRARY_PATH ; } # @@ -454,7 +456,6 @@ UNDEFFLAG ?= "-u _" ; YACC ?= ; YACCFILES ?= ; YACCFLAGS ?= ; -DLL_AS_LIB ?= ; HDRPATTERN = "^[ ]*#[ ]*include[ ]*([<\"][^\">]*[\">]).*$" ; @@ -1387,39 +1388,44 @@ rule strip-grist # split-path bar/baz/mumble => bar baz mumble rule split-path { - local result ; - local parent = $(<:P) ; - if $(NT) - { - switch $(<:G=) - { - # It turns out that to match a backslash, you need a /quadruple/ slash - # in the case clause! - case *\\\\*:* : # continue splitting - case *:\\\\*\\\\* : # continue splitting - case *:/*\\\\* : # continue splitting - case *:\\\\*/* : # continue splitting - case *:/*/* : # continue splitting - case *:/* : result = $(<) ; - case *:\\\\* : result = $(<) ; - case *: : result = $(<) ; - } - } + local result = $(gSPLIT-PATH.$(<)) ; - if ( ! $(<:B) ) && ( $(<) != $(DOT) ) # handle the case where $(<) is all grist. + if ! $(result) { - result ?= $(<:G) ; - } - else if ( ! $(parent:G=) ) - { - result ?= $(<) ; - } - else - { - local p = [ split-path $(parent) ] ; - local b = [ strip-grist $(<) ] ; - p += $(b:D=) ; # can't use :B here because it destroys . and .. - result ?= $(p) ; + local parent = $(<:P) ; + if $(NT) + { + switch $(<:G=) + { + # It turns out that to match a backslash, you need a /quadruple/ slash + # in the case clause! + case *\\\\*:* : # continue splitting + case *:\\\\*\\\\* : # continue splitting + case *:/*\\\\* : # continue splitting + case *:\\\\*/* : # continue splitting + case *:/*/* : # continue splitting + case *:/* : result = $(<) ; + case *:\\\\* : result = $(<) ; + case *: : result = $(<) ; + } + } + + if ( ! $(<:B) ) && ( $(<) != $(DOT) ) # handle the case where $(<) is all grist. + { + result ?= $(<:G) ; + } + else if ( ! $(parent:G=) ) + { + result ?= $(<) ; + } + else + { + local p = [ split-path $(parent) ] ; + local b = [ strip-grist $(<) ] ; + p += $(b:D=) ; # can't use :B here because it destroys . and .. + result ?= $(p) ; + } + gSPLIT-PATH.$(<) = $(result) ; } return $(result) ; } diff --git a/boost-base.jam b/boost-base.jam index aa5d7c543..96ccb5f89 100644 --- a/boost-base.jam +++ b/boost-base.jam @@ -160,7 +160,7 @@ rule template-modifier ( target : source ) # generate instructions to build the given "main" target from the given object # files given in the 2nd parameter. The 3rd parameter should be EXE for an # executable, or DLL for a shared library. -rule main-from-objects +rule main-from-objects ( targets * : objects * : type ) { # make compiled sources a dependency of target @@ -168,8 +168,8 @@ rule main-from-objects Clean clean : $(<) ; - MODE on $(<) = $($(3)MODE) ; - local link-function = Link-$(3) ; + MODE on $(<) = $($(type)MODE) ; + local link-function = Link-$(type) ; local ignored = [ $(link-function) $(<) : $(>) : $(3) ] ; Chmod $(<[1]) ; DEPENDS $(<) : $(>) ; @@ -179,32 +179,38 @@ rule Link-EXE { # N.B. By the time this rule is invoked, we had better have gRUN_PATH completely set. Link-action $(<) : $(>) : EXE ; - RUN_PATH on $(<) = [ join $(gRUN_PATH($(<))) : $(SPLITPATH) ] ; + RUN_PATH on $(<) = [ join [ unique $(gRUN_PATH($(<))) ] : $(SPLITPATH) ] ; if $(UNIX) { - RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) $(RUN_LD_LIBRARY_PATH) : $(SPLITPATH) ] ; + RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; } } rule Link-DLL { - gRUN_PATH($(<)) += $(gLOCATE($(<[1]))) ; + gRUN_PATH($(<)) += $(gLOCATE($(<[1]))) $(TOOLSET_LIB_PATH) ; if $(UNIX) { - RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) $(RUN_LD_LIBRARY_PATH) : $(SPLITPATH) ] ; + RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; gRUN_LD_LIBRARY_PATH($(<)) += $(gLOCATE($(<[1]))) ; + + if $(OS) = AIX + { + Aix-Implib-Action $(<) : $(>) ; + } } - if $(OS) = AIX - { - Aix-Implib-Action $(<) : $(>) ; - } Link-action $(<) : $(>) : DLL ; } +rule Aix-Implib-Action +{ + SPACE on $(<) = " " ; +} + actions Aix-Implib-Action bind import-generator-script { - "$(BOOST_ROOT)/tools/build/gen_aix_import_file.py" $(<[1]:BD=) $(>:D=) "-directory=$(<[1]:D)" -verbose=1 + "$(BOOST_ROOT)/tools/build/gen_aix_import_file.py" $(<[1]:BD=) $(>:D=) -optldflags="$(LINKFLAGS:J=$(SPACE))" "-directory=$(<[1]:D)" -verbose=1 } # store the shell's PATH again, just in case someone uses PATH. @@ -213,7 +219,7 @@ actions Aix-Implib-Action bind import-generator-script RUN_PATH ?= $(PATH) ; if $(UNIX) { - RUN_LD_LIBRARY_PATH ?= $(LD_LIBRARY_PATH) ; + RUN_LD_LIBRARY_PATH ?= $($(gSHELL_LIBPATH)) ; } if $(NT) { @@ -225,9 +231,11 @@ if $(NT) PATH = $(RUN_PATH) ; if $(UNIX) { - LD_LIBRARY_PATH = $(RUN_LD_LIBRARY_PATH) ; + $(gSHELL_LIBPATH) = $(RUN_LD_LIBRARY_PATH) ; } +DOLLAR = "$" ; + # A simple action to run an executable target if $(UNIX) { @@ -235,8 +243,8 @@ if $(UNIX) { $(SHELL_SET)PATH=$(RUN_PATH):$PATH $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(RUN_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(RUN_LD_LIBRARY_PATH):$$(gSHELL_LIBPATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(<) $(COMMAND-LINE) } } @@ -669,9 +677,9 @@ rule include-tools # clear any lingering target variables that may have been declared $(gTARGET_VARIABLES) = ; - gTARGET_VARIABLES = NEEDLIBS ; # start over from the beginning + gTARGET_VARIABLES = NEEDLIBS NEEDIMPS ; # start over from the beginning + gTOOLSET_LIB_PATH = ; } - { local gIN_INCLUDE_TOOLS = true ; @@ -1430,7 +1438,7 @@ rule find-compatible-subvariant ( main-target : toolset variant : dependent-simp # # For each target specified in libs, generate build instructions # for a subvariant that can be linked with a dependent target with -# dependent-properties, returning a list of the linkable targets. +# dependent-properties, returning a list of all generated targets. rule link-libraries { local lib-path result ; @@ -1448,14 +1456,7 @@ rule link-libraries local lib-subvariant = [ find-compatible-subvariant $(lib-target) : $(>) : $(3) ] ; # Generate build instructions for the library target - local lib-files - = [ subvariant-target $(lib-target) : $(lib-subvariant) : $(>) ] ; - - # Add the name of the linkable product to the result. - local type = $(gTARGET_TYPE($(lib-target))) ; - local index = $(gLINKABLE_PRODUCT_INDEX($(type))) ; - index ?= 1 ; - result += $(lib-files[$(index)]) ; + result += [ subvariant-target $(lib-target) : $(lib-subvariant) : $(>) ] ; } return $(result) ; } @@ -1536,15 +1537,24 @@ rule depend-on-libraries gRUN_LD_LIBRARY_PATH($(<)) = [ unique $(gRUN_LD_LIBRARY_PATH($(<))) $(gRUN_LD_LIBRARY_PATH($(>))) ] ; } -rule depend-on-dlls +rule depend-on-dlls ( targets + : dlls-and-import-libs * ) { - if $(DLL_AS_LIB) + local linkable ; + + # collect the linkable elements of the source libs into the appropriate variables + for local f in $(dlls-and-import-libs) { - NEEDLIBS += $(>) ; - NEEDLIBS on $(<) += $(>) ; + local v = $(gLINK_VARIABLE($(f:S))) ; + $(v) += $(f) ; + $(v) on $(targets) += $(f) ; + if $(v) + { + linkable += $(f) ; + } } - LIBPATH on $(<) += $(gLOCATE($(>))) ; - FINDLIBS on $(<) += $(gTARGET_NAME($(gTARGET_SUBVARIANT($(>))))) ; # $(gTARGET_SUBVARIANT($(>)):G=) ; + + LIBPATH on $(<) += [ unique $(gLOCATE($(>))) ] ; + FINDLIBS on $(<) += [ unique $(gTARGET_NAME($(gTARGET_SUBVARIANT($(>))))) ] ; DEPENDS $(<) : $(>) ; # To run these targets, we need everything needed to run the libraries gRUN_PATH($(<)) = [ unique $(gRUN_PATH($(<))) $(gRUN_PATH($(>))) ] ; diff --git a/borland-tools.jam b/borland-tools.jam index 0e16d7601..d045f5cb5 100644 --- a/borland-tools.jam +++ b/borland-tools.jam @@ -96,7 +96,7 @@ rule Link-action # $(BCC_TOOL_PATH) to the path if $(NT) { -actions borland-Link-action bind NEEDLIBS +actions borland-Link-action { set PATH=$(BCC_TOOL_PATH);%PATH% "$(BCC_TOOL_PATH)bcc32" -v -q $(LINKFLAGS) -L"$(LIBPATH)" -L"$(STDLIBPATH)" -e"$(<[1])" @"$(>)" $(FINDLIBS:S=.lib) @@ -104,7 +104,7 @@ actions borland-Link-action bind NEEDLIBS } else { -actions borland-Link-action bind NEEDLIBS +actions borland-Link-action { export PATH=$(BCC_TOOL_PATH):$PATH "$(BCC_TOOL_PATH)bcc32" -v -q $(LINKFLAGS) -L"$(LIBPATH)" -L"$(STDLIBPATH)" -e"$(<[1])" @"$(>)" $(FINDLIBS:S=.lib) diff --git a/gcc-tools.jam b/gcc-tools.jam index 52f5739ca..43590aeb5 100644 --- a/gcc-tools.jam +++ b/gcc-tools.jam @@ -245,7 +245,7 @@ rule Link-action # will be "multiplied away" otherwise. The --exclude-symbols directive # proved to be neccessary with some versions of Cygwin. IMPLIB_COMMAND on $(<) = "-Wl,--export-all-symbols -Wl,--exclude-symbols,_bss_end__:_bss_start__:_data_end__:_data_start__ -Wl,--out-implib," ; - DEPENDS $(<) : $(NEEDLIBS) ; + DEPENDS $(<) : $(NEEDLIBS) $(NEEDIMPS) ; gRUN_LD_LIBRARY_PATH($(<)) += $(GCC_STDLIB_DIRECTORY) ; if $(<[2]) && $(NT) && ( -mno-cygwin in $(gBUILD_PROPERTIES:G=) ) { @@ -258,17 +258,17 @@ rule Link-action } # for gcc, we repeat all libraries so that dependencies are always resolved -actions gcc-Link-action bind NEEDLIBS +actions gcc-Link-action bind NEEDLIBS NEEDIMPS { - $(SHELL_SET)LD_LIBRARY_PATH=$(RUN_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH - $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(LNOPT)-Wl,-rpath-link,.$(SPACE)"-Wl,-soname,$(<[1]:D=)$(SOTAG)" + $(SHELL_SET)$(gSHELL_LIBPATH)=$(RUN_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) + $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) $(LNOPT)-Wl,-rpath-link,.$(SPACE)"-Wl,-soname,$(<[1]:D=)$(SOTAG)" $(ACTION_1)$(LN)$(SPACE)-fs$(SPACE)"$(<[1]:D=)$(OUTTAG)"$(SPACE)"$(<[1])" } -actions gcc-dllwrap bind NEEDLIBS +actions gcc-dllwrap bind NEEDLIBS NEEDIMPS { - dllwrap --dllname $(<[1]) -o foo.pyd $(>) -s --entry _DllMain@12 --target=i386-mingw32 -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -Wl,-rpath-link,. $(LINKFLAGS) + dllwrap --dllname $(<[1]) -o foo.pyd $(>) -s --entry _DllMain@12 --target=i386-mingw32 -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) -Wl,-rpath-link,. $(LINKFLAGS) } #### Cc ##### diff --git a/gen_aix_import_file.py b/gen_aix_import_file.py index 34fc4d8a8..a2ba63e25 100644 --- a/gen_aix_import_file.py +++ b/gen_aix_import_file.py @@ -91,11 +91,12 @@ impfile.write("#!" + LIBTARGET + "\n") expfile = open(EXPFILENAME, 'r') symbol = expfile.readline() while symbol: - if maxlinelength: - symbol = symbol[:maxlinelength] - if symbol[-1] != '\n': - symbol += '\n' - impfile.write(symbol) + if len(symbol) <= maxlinelength: + if symbol[-1] != '\n': + symbol += '\n' + impfile.write(symbol) + else: + print 'skipping', str(len(symbol)) + '-character symbol:',str(symbol) symbol = expfile.readline() impfile.close() expfile.close() diff --git a/intel-linux-tools.jam b/intel-linux-tools.jam index d4ba026f1..976d3967c 100644 --- a/intel-linux-tools.jam +++ b/intel-linux-tools.jam @@ -142,10 +142,10 @@ rule Link-action } # for icc, we repeat all libraries so that dependencies are always resolved -actions intel-linux-Link-action bind NEEDLIBS +actions intel-linux-Link-action bind NEEDLIBS NEEDIMPS { $(INTEL_LINUX_SETUP) - icc $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" -l$(FINDLIBS) "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) "-Qoption,link,-soname,$(<[1]:D=)$(SOTAG)" + icc $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" -l$(FINDLIBS) "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" "-Qoption,link,-soname,$(<[1]:D=)$(SOTAG)" $(ACTION_1)$(LN)$(SPACE)-fs$(SPACE)"$(<[1]:D=)$(OUTTAG)"$(SPACE)"$(<[1])" } diff --git a/intel-win32-stlport-tools.jam b/intel-win32-stlport-tools.jam index 80f48ca2d..41622fac7 100644 --- a/intel-win32-stlport-tools.jam +++ b/intel-win32-stlport-tools.jam @@ -18,11 +18,11 @@ # tests, and seems to be unneeded for the regression tests, but it # is a slight hack. local root = [ get-stlport-root ] ; - if ! $(root)/lib in $(PATH) + if ! $(root)/lib in $(TOOLSET_LIB_PATH) { # Stick it at the front of the path because Windows only seems # to be willing to look so far, then quits! - PATH = $(root)/lib $(PATH) ; + TOOLSET_LIB_PATH = $(root)/lib $(TOOLSET_LIB_PATH) ; } } \ No newline at end of file diff --git a/kcc-tools.jam b/kcc-tools.jam index b8edd9440..8402d0e7e 100644 --- a/kcc-tools.jam +++ b/kcc-tools.jam @@ -41,9 +41,9 @@ rule Link-action kcc-Link-action $(<) : $(>) ; } -actions kcc-Link-action bind NEEDLIBS +actions kcc-Link-action bind NEEDLIBS NEEDIMPS { - $(kcc.bin-directory)KCC $(LINKFLAGS) -o "$(<[1])" -L$(STDLIBPATH) "$(>)" $(NEEDLIBS) -lm + $(kcc.bin-directory)KCC $(LINKFLAGS) -o "$(<[1])" -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -lm } #### Cc ##### diff --git a/metrowerks-tools.jam b/metrowerks-tools.jam index f21ec27b7..d389582f8 100644 --- a/metrowerks-tools.jam +++ b/metrowerks-tools.jam @@ -84,7 +84,7 @@ rule Link-action IMPLIB_COMMAND on $(<) = "-implib " ; # will be "multiplied away" if not # needed. - with-command-file metrowerks-Link-action $(<) : $(>) $(NEEDLIBS) # $(NEEDLIBS) + with-command-file metrowerks-Link-action $(<) : $(>) $(NEEDLIBS) ; } diff --git a/msvc-tools.jam b/msvc-tools.jam index c4f6c3ba8..fba8bff15 100644 --- a/msvc-tools.jam +++ b/msvc-tools.jam @@ -133,7 +133,7 @@ rule Link-action ( target implib ? : sources + : target-type ? ) vc-set-pdb-file $(<) : $(target:B) ; } -actions together vc-Link bind NEEDLIBS +actions together vc-Link { $(VC_SETUP) "$(VC_TOOL_PATH)$(VC_LINKER)" /nologo $(NOINCREMENTAL) $(LINKFLAGS) $(PDB_LINKFLAG)"$(VC_PDB_FILE)" /out:"$(<[1])" /IMPLIB:"$(<[2])" /LIBPATH:"$(LIBPATH)" /LIBPATH:"$(STDLIBPATH)" "$(FINDLIBS:S=.lib)" @"$(>)" diff --git a/python.jam b/python.jam index 49aa750d8..9b181c698 100644 --- a/python.jam +++ b/python.jam @@ -79,6 +79,12 @@ else if $(UNIX) { PYTHON_PROPERTIES += <*><*>"-expect_unresolved 'Py*' -expect_unresolved '_Py*'" ; } + else if $(OS) = AIX + { + PYTHON_PROPERTIES + += <*><*>"-bI:$(PYTHON_LIB_PATH)/python.exp" + <*><*>pthreads ; + } } # Locate the python executable @@ -255,6 +261,13 @@ rule Link-PYD { RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; gRUN_LD_LIBRARY_PATH($(<)) += $(gLOCATE($(<[1]))) ; + + if $(OS) = AIX + { + # explicitly designate the exported init function + LINKFLAGS on $(<) += "-e init$(<[1]:B)" ; + Aix-Implib-Action $(<) : $(>) ; + } } Link-action $(<) : $(>) : PYD ; } @@ -324,15 +337,20 @@ rule python-test-target ( test-target : sources + ) if $(UNIX) { - gAPPEND_LD_LIBRARY_PATH = ":$LD_LIBRARY_PATH" ; + gAPPEND_LD_LIBRARY_PATH = ":$"$(gSHELL_LIBPATH) ; + gAPPEND_PATH = ":$"PATH ; +} +else if $(NT) +{ + gAPPEND_PATH = ";%PATH%" ; } actions python-test-target bind PYTHON { - $(SHELL_SET)PATH=$(PATH) + $(SHELL_SET)PATH=$(run.path)$(gAPPEND_PATH) $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(LD_LIBRARY_PATH)$(gAPPEND_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(run.library_path)$(gAPPEND_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(SHELL_SET)PYTHONPATH=$(PYTHONPATH) $(SHELL_EXPORT)PYTHONPATH $(PYTHON_LAUNCH) $(PYTHON) $(PYTHON_ARGS) "$(>)" $(ARGS) 2>&1 "$(<)" || $(CATENATE) "$(<)" @@ -349,10 +367,10 @@ rule python-runtest-target ( test-target : sources + ) } actions python-runtest-target bind PYTHON { - $(SHELL_SET)PATH=$(PATH) + $(SHELL_SET)PATH=$(run.path)$(gAPPEND_PATH) $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(LD_LIBRARY_PATH)$(gAPPEND_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(run.library_path)$(gAPPEND_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(SHELL_SET)PYTHONPATH=$(PYTHONPATH) $(SHELL_EXPORT)PYTHONPATH $(PYTHON_LAUNCH) $(PYTHON) $(PYTHON_ARGS) "$(>)" $(ARGS) @@ -424,15 +442,13 @@ rule python-runtest-aux ( target : sources + ) # set the path so that DLLs linked into extension modules will be # found - PATH on $(target) = [ join - $(gRUN_PATH($(target))) # location of module dependencies + run.path on $(target) = [ join + $(gRUN_PATH($(target))) # location of module dependencies $(>:D) # directory of python driver file(s) - $(PATH) # base PATH from environment : $(SPLITPATH) ] ; # platform path separator - LD_LIBRARY_PATH on $(target) = [ join - $(gRUN_LD_LIBRARY_PATH($(target))) # location of module dependencies - : $(SPLITPATH) ] ; # platform path separator + run.library_path on $(target) + = $(gRUN_LD_LIBRARY_PATH($(target)):J=$(SPLITPATH)) ; PYTHON on $(target) = $(python) ; DEPENDS $(target) : $(python) ; diff --git a/tru64cxx-tools.jam b/tru64cxx-tools.jam index 3eddd0b8e..94e276830 100644 --- a/tru64cxx-tools.jam +++ b/tru64cxx-tools.jam @@ -60,7 +60,7 @@ rule Link-action ( target : sources + : target-type ) # for tru64cxx, we repeat all libraries so that dependencies are always resolved actions tru64cxx-Link-action bind NEEDLIBS { - cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt + cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt } actions tru64cxx-Link-shared bind NEEDLIBS diff --git a/tru64cxx65-tools.jam b/tru64cxx65-tools.jam index 8e099cdb8..116f1df4e 100644 --- a/tru64cxx65-tools.jam +++ b/tru64cxx65-tools.jam @@ -56,7 +56,7 @@ rule Link-action ( target : sources + : target-type ) # for tru64cxx, we repeat all libraries so that dependencies are always resolved actions tru64cxx65-Link-action bind NEEDLIBS { - cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt + cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt } actions tru64cxx65-Link-shared bind NEEDLIBS diff --git a/v1/allyourbase.jam b/v1/allyourbase.jam index 66a4fc759..4a5185d59 100644 --- a/v1/allyourbase.jam +++ b/v1/allyourbase.jam @@ -178,7 +178,8 @@ if $(NT) SUFOBJ ?= .obj ; SUFEXE ?= .exe ; SUFDLL ?= .dll .lib ; - gLINKABLE_PRODUCT_INDEX(DLL) = 2 ; # (the .lib is the ones to link) + gLINK_VARIABLE(.dll) = ; # dlls are NOT linked to directly + gLINK_VARIABLE(.lib) = NEEDLIBS ; # instead, users link to import libs PREDLL ?= "" ; NOARSCAN ?= true ; SHELL_EXPORT ?= ; @@ -191,8 +192,6 @@ if $(NT) YACCFILES ?= y.tab ; YACC_OUTPUT ?= --output= ; LEX_OUTPUT ?= -o ; - - DLL_AS_LIB ?= true ; } else if $(OS2) { @@ -315,10 +314,12 @@ else if $(UNIX) switch $(OS) { case AIX : - DLL_AS_LIB ?= true ; + IMPLIB_FLAGS ?= -bI: ; SUFDLL ?= .so .imp ; - gLINKABLE_PRODUCT_INDEX(DLL) = 1 ; # (the .so is the one to link) - + gLINK_VARIABLE(.so) = NEEDLIBS ; # shared libs should be added to the list of libs needed + gLINK_VARIABLE(.imp) = NEEDIMPS ; # import libs are handled separately. + gSHELL_LIBPATH = LIBPATH ; + case AMIGA : YACC ?= bison -y ; @@ -390,7 +391,7 @@ else if $(UNIX) RELOCATE ?= true ; case OSF : - DLL_AS_LIB ?= true ; + gLINK_VARIABLE(.so) = NEEDLIBS ; # shared objects should be added to the list of libs needed } # UNIX defaults @@ -403,6 +404,7 @@ else if $(UNIX) YACCFLAGS ?= -d ; SHELL_EXPORT ?= "export " ; SHELL_SET ?= "" ; + gSHELL_LIBPATH ?= LD_LIBRARY_PATH ; } # @@ -454,7 +456,6 @@ UNDEFFLAG ?= "-u _" ; YACC ?= ; YACCFILES ?= ; YACCFLAGS ?= ; -DLL_AS_LIB ?= ; HDRPATTERN = "^[ ]*#[ ]*include[ ]*([<\"][^\">]*[\">]).*$" ; @@ -1387,39 +1388,44 @@ rule strip-grist # split-path bar/baz/mumble => bar baz mumble rule split-path { - local result ; - local parent = $(<:P) ; - if $(NT) - { - switch $(<:G=) - { - # It turns out that to match a backslash, you need a /quadruple/ slash - # in the case clause! - case *\\\\*:* : # continue splitting - case *:\\\\*\\\\* : # continue splitting - case *:/*\\\\* : # continue splitting - case *:\\\\*/* : # continue splitting - case *:/*/* : # continue splitting - case *:/* : result = $(<) ; - case *:\\\\* : result = $(<) ; - case *: : result = $(<) ; - } - } + local result = $(gSPLIT-PATH.$(<)) ; - if ( ! $(<:B) ) && ( $(<) != $(DOT) ) # handle the case where $(<) is all grist. + if ! $(result) { - result ?= $(<:G) ; - } - else if ( ! $(parent:G=) ) - { - result ?= $(<) ; - } - else - { - local p = [ split-path $(parent) ] ; - local b = [ strip-grist $(<) ] ; - p += $(b:D=) ; # can't use :B here because it destroys . and .. - result ?= $(p) ; + local parent = $(<:P) ; + if $(NT) + { + switch $(<:G=) + { + # It turns out that to match a backslash, you need a /quadruple/ slash + # in the case clause! + case *\\\\*:* : # continue splitting + case *:\\\\*\\\\* : # continue splitting + case *:/*\\\\* : # continue splitting + case *:\\\\*/* : # continue splitting + case *:/*/* : # continue splitting + case *:/* : result = $(<) ; + case *:\\\\* : result = $(<) ; + case *: : result = $(<) ; + } + } + + if ( ! $(<:B) ) && ( $(<) != $(DOT) ) # handle the case where $(<) is all grist. + { + result ?= $(<:G) ; + } + else if ( ! $(parent:G=) ) + { + result ?= $(<) ; + } + else + { + local p = [ split-path $(parent) ] ; + local b = [ strip-grist $(<) ] ; + p += $(b:D=) ; # can't use :B here because it destroys . and .. + result ?= $(p) ; + } + gSPLIT-PATH.$(<) = $(result) ; } return $(result) ; } diff --git a/v1/boost-base.jam b/v1/boost-base.jam index aa5d7c543..96ccb5f89 100644 --- a/v1/boost-base.jam +++ b/v1/boost-base.jam @@ -160,7 +160,7 @@ rule template-modifier ( target : source ) # generate instructions to build the given "main" target from the given object # files given in the 2nd parameter. The 3rd parameter should be EXE for an # executable, or DLL for a shared library. -rule main-from-objects +rule main-from-objects ( targets * : objects * : type ) { # make compiled sources a dependency of target @@ -168,8 +168,8 @@ rule main-from-objects Clean clean : $(<) ; - MODE on $(<) = $($(3)MODE) ; - local link-function = Link-$(3) ; + MODE on $(<) = $($(type)MODE) ; + local link-function = Link-$(type) ; local ignored = [ $(link-function) $(<) : $(>) : $(3) ] ; Chmod $(<[1]) ; DEPENDS $(<) : $(>) ; @@ -179,32 +179,38 @@ rule Link-EXE { # N.B. By the time this rule is invoked, we had better have gRUN_PATH completely set. Link-action $(<) : $(>) : EXE ; - RUN_PATH on $(<) = [ join $(gRUN_PATH($(<))) : $(SPLITPATH) ] ; + RUN_PATH on $(<) = [ join [ unique $(gRUN_PATH($(<))) ] : $(SPLITPATH) ] ; if $(UNIX) { - RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) $(RUN_LD_LIBRARY_PATH) : $(SPLITPATH) ] ; + RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; } } rule Link-DLL { - gRUN_PATH($(<)) += $(gLOCATE($(<[1]))) ; + gRUN_PATH($(<)) += $(gLOCATE($(<[1]))) $(TOOLSET_LIB_PATH) ; if $(UNIX) { - RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) $(RUN_LD_LIBRARY_PATH) : $(SPLITPATH) ] ; + RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; gRUN_LD_LIBRARY_PATH($(<)) += $(gLOCATE($(<[1]))) ; + + if $(OS) = AIX + { + Aix-Implib-Action $(<) : $(>) ; + } } - if $(OS) = AIX - { - Aix-Implib-Action $(<) : $(>) ; - } Link-action $(<) : $(>) : DLL ; } +rule Aix-Implib-Action +{ + SPACE on $(<) = " " ; +} + actions Aix-Implib-Action bind import-generator-script { - "$(BOOST_ROOT)/tools/build/gen_aix_import_file.py" $(<[1]:BD=) $(>:D=) "-directory=$(<[1]:D)" -verbose=1 + "$(BOOST_ROOT)/tools/build/gen_aix_import_file.py" $(<[1]:BD=) $(>:D=) -optldflags="$(LINKFLAGS:J=$(SPACE))" "-directory=$(<[1]:D)" -verbose=1 } # store the shell's PATH again, just in case someone uses PATH. @@ -213,7 +219,7 @@ actions Aix-Implib-Action bind import-generator-script RUN_PATH ?= $(PATH) ; if $(UNIX) { - RUN_LD_LIBRARY_PATH ?= $(LD_LIBRARY_PATH) ; + RUN_LD_LIBRARY_PATH ?= $($(gSHELL_LIBPATH)) ; } if $(NT) { @@ -225,9 +231,11 @@ if $(NT) PATH = $(RUN_PATH) ; if $(UNIX) { - LD_LIBRARY_PATH = $(RUN_LD_LIBRARY_PATH) ; + $(gSHELL_LIBPATH) = $(RUN_LD_LIBRARY_PATH) ; } +DOLLAR = "$" ; + # A simple action to run an executable target if $(UNIX) { @@ -235,8 +243,8 @@ if $(UNIX) { $(SHELL_SET)PATH=$(RUN_PATH):$PATH $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(RUN_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(RUN_LD_LIBRARY_PATH):$$(gSHELL_LIBPATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(<) $(COMMAND-LINE) } } @@ -669,9 +677,9 @@ rule include-tools # clear any lingering target variables that may have been declared $(gTARGET_VARIABLES) = ; - gTARGET_VARIABLES = NEEDLIBS ; # start over from the beginning + gTARGET_VARIABLES = NEEDLIBS NEEDIMPS ; # start over from the beginning + gTOOLSET_LIB_PATH = ; } - { local gIN_INCLUDE_TOOLS = true ; @@ -1430,7 +1438,7 @@ rule find-compatible-subvariant ( main-target : toolset variant : dependent-simp # # For each target specified in libs, generate build instructions # for a subvariant that can be linked with a dependent target with -# dependent-properties, returning a list of the linkable targets. +# dependent-properties, returning a list of all generated targets. rule link-libraries { local lib-path result ; @@ -1448,14 +1456,7 @@ rule link-libraries local lib-subvariant = [ find-compatible-subvariant $(lib-target) : $(>) : $(3) ] ; # Generate build instructions for the library target - local lib-files - = [ subvariant-target $(lib-target) : $(lib-subvariant) : $(>) ] ; - - # Add the name of the linkable product to the result. - local type = $(gTARGET_TYPE($(lib-target))) ; - local index = $(gLINKABLE_PRODUCT_INDEX($(type))) ; - index ?= 1 ; - result += $(lib-files[$(index)]) ; + result += [ subvariant-target $(lib-target) : $(lib-subvariant) : $(>) ] ; } return $(result) ; } @@ -1536,15 +1537,24 @@ rule depend-on-libraries gRUN_LD_LIBRARY_PATH($(<)) = [ unique $(gRUN_LD_LIBRARY_PATH($(<))) $(gRUN_LD_LIBRARY_PATH($(>))) ] ; } -rule depend-on-dlls +rule depend-on-dlls ( targets + : dlls-and-import-libs * ) { - if $(DLL_AS_LIB) + local linkable ; + + # collect the linkable elements of the source libs into the appropriate variables + for local f in $(dlls-and-import-libs) { - NEEDLIBS += $(>) ; - NEEDLIBS on $(<) += $(>) ; + local v = $(gLINK_VARIABLE($(f:S))) ; + $(v) += $(f) ; + $(v) on $(targets) += $(f) ; + if $(v) + { + linkable += $(f) ; + } } - LIBPATH on $(<) += $(gLOCATE($(>))) ; - FINDLIBS on $(<) += $(gTARGET_NAME($(gTARGET_SUBVARIANT($(>))))) ; # $(gTARGET_SUBVARIANT($(>)):G=) ; + + LIBPATH on $(<) += [ unique $(gLOCATE($(>))) ] ; + FINDLIBS on $(<) += [ unique $(gTARGET_NAME($(gTARGET_SUBVARIANT($(>))))) ] ; DEPENDS $(<) : $(>) ; # To run these targets, we need everything needed to run the libraries gRUN_PATH($(<)) = [ unique $(gRUN_PATH($(<))) $(gRUN_PATH($(>))) ] ; diff --git a/v1/borland-tools.jam b/v1/borland-tools.jam index 0e16d7601..d045f5cb5 100644 --- a/v1/borland-tools.jam +++ b/v1/borland-tools.jam @@ -96,7 +96,7 @@ rule Link-action # $(BCC_TOOL_PATH) to the path if $(NT) { -actions borland-Link-action bind NEEDLIBS +actions borland-Link-action { set PATH=$(BCC_TOOL_PATH);%PATH% "$(BCC_TOOL_PATH)bcc32" -v -q $(LINKFLAGS) -L"$(LIBPATH)" -L"$(STDLIBPATH)" -e"$(<[1])" @"$(>)" $(FINDLIBS:S=.lib) @@ -104,7 +104,7 @@ actions borland-Link-action bind NEEDLIBS } else { -actions borland-Link-action bind NEEDLIBS +actions borland-Link-action { export PATH=$(BCC_TOOL_PATH):$PATH "$(BCC_TOOL_PATH)bcc32" -v -q $(LINKFLAGS) -L"$(LIBPATH)" -L"$(STDLIBPATH)" -e"$(<[1])" @"$(>)" $(FINDLIBS:S=.lib) diff --git a/v1/gcc-tools.jam b/v1/gcc-tools.jam index 52f5739ca..43590aeb5 100644 --- a/v1/gcc-tools.jam +++ b/v1/gcc-tools.jam @@ -245,7 +245,7 @@ rule Link-action # will be "multiplied away" otherwise. The --exclude-symbols directive # proved to be neccessary with some versions of Cygwin. IMPLIB_COMMAND on $(<) = "-Wl,--export-all-symbols -Wl,--exclude-symbols,_bss_end__:_bss_start__:_data_end__:_data_start__ -Wl,--out-implib," ; - DEPENDS $(<) : $(NEEDLIBS) ; + DEPENDS $(<) : $(NEEDLIBS) $(NEEDIMPS) ; gRUN_LD_LIBRARY_PATH($(<)) += $(GCC_STDLIB_DIRECTORY) ; if $(<[2]) && $(NT) && ( -mno-cygwin in $(gBUILD_PROPERTIES:G=) ) { @@ -258,17 +258,17 @@ rule Link-action } # for gcc, we repeat all libraries so that dependencies are always resolved -actions gcc-Link-action bind NEEDLIBS +actions gcc-Link-action bind NEEDLIBS NEEDIMPS { - $(SHELL_SET)LD_LIBRARY_PATH=$(RUN_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH - $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(LNOPT)-Wl,-rpath-link,.$(SPACE)"-Wl,-soname,$(<[1]:D=)$(SOTAG)" + $(SHELL_SET)$(gSHELL_LIBPATH)=$(RUN_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) + $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) $(LNOPT)-Wl,-rpath-link,.$(SPACE)"-Wl,-soname,$(<[1]:D=)$(SOTAG)" $(ACTION_1)$(LN)$(SPACE)-fs$(SPACE)"$(<[1]:D=)$(OUTTAG)"$(SPACE)"$(<[1])" } -actions gcc-dllwrap bind NEEDLIBS +actions gcc-dllwrap bind NEEDLIBS NEEDIMPS { - dllwrap --dllname $(<[1]) -o foo.pyd $(>) -s --entry _DllMain@12 --target=i386-mingw32 -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -Wl,-rpath-link,. $(LINKFLAGS) + dllwrap --dllname $(<[1]) -o foo.pyd $(>) -s --entry _DllMain@12 --target=i386-mingw32 -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) -Wl,-rpath-link,. $(LINKFLAGS) } #### Cc ##### diff --git a/v1/gen_aix_import_file.py b/v1/gen_aix_import_file.py index 34fc4d8a8..a2ba63e25 100644 --- a/v1/gen_aix_import_file.py +++ b/v1/gen_aix_import_file.py @@ -91,11 +91,12 @@ impfile.write("#!" + LIBTARGET + "\n") expfile = open(EXPFILENAME, 'r') symbol = expfile.readline() while symbol: - if maxlinelength: - symbol = symbol[:maxlinelength] - if symbol[-1] != '\n': - symbol += '\n' - impfile.write(symbol) + if len(symbol) <= maxlinelength: + if symbol[-1] != '\n': + symbol += '\n' + impfile.write(symbol) + else: + print 'skipping', str(len(symbol)) + '-character symbol:',str(symbol) symbol = expfile.readline() impfile.close() expfile.close() diff --git a/v1/intel-linux-tools.jam b/v1/intel-linux-tools.jam index d4ba026f1..976d3967c 100644 --- a/v1/intel-linux-tools.jam +++ b/v1/intel-linux-tools.jam @@ -142,10 +142,10 @@ rule Link-action } # for icc, we repeat all libraries so that dependencies are always resolved -actions intel-linux-Link-action bind NEEDLIBS +actions intel-linux-Link-action bind NEEDLIBS NEEDIMPS { $(INTEL_LINUX_SETUP) - icc $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" -l$(FINDLIBS) "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) "-Qoption,link,-soname,$(<[1]:D=)$(SOTAG)" + icc $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" -l$(FINDLIBS) "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" "-Qoption,link,-soname,$(<[1]:D=)$(SOTAG)" $(ACTION_1)$(LN)$(SPACE)-fs$(SPACE)"$(<[1]:D=)$(OUTTAG)"$(SPACE)"$(<[1])" } diff --git a/v1/intel-win32-stlport-tools.jam b/v1/intel-win32-stlport-tools.jam index 80f48ca2d..41622fac7 100644 --- a/v1/intel-win32-stlport-tools.jam +++ b/v1/intel-win32-stlport-tools.jam @@ -18,11 +18,11 @@ # tests, and seems to be unneeded for the regression tests, but it # is a slight hack. local root = [ get-stlport-root ] ; - if ! $(root)/lib in $(PATH) + if ! $(root)/lib in $(TOOLSET_LIB_PATH) { # Stick it at the front of the path because Windows only seems # to be willing to look so far, then quits! - PATH = $(root)/lib $(PATH) ; + TOOLSET_LIB_PATH = $(root)/lib $(TOOLSET_LIB_PATH) ; } } \ No newline at end of file diff --git a/v1/kcc-tools.jam b/v1/kcc-tools.jam index b8edd9440..8402d0e7e 100644 --- a/v1/kcc-tools.jam +++ b/v1/kcc-tools.jam @@ -41,9 +41,9 @@ rule Link-action kcc-Link-action $(<) : $(>) ; } -actions kcc-Link-action bind NEEDLIBS +actions kcc-Link-action bind NEEDLIBS NEEDIMPS { - $(kcc.bin-directory)KCC $(LINKFLAGS) -o "$(<[1])" -L$(STDLIBPATH) "$(>)" $(NEEDLIBS) -lm + $(kcc.bin-directory)KCC $(LINKFLAGS) -o "$(<[1])" -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -lm } #### Cc ##### diff --git a/v1/metrowerks-tools.jam b/v1/metrowerks-tools.jam index f21ec27b7..d389582f8 100644 --- a/v1/metrowerks-tools.jam +++ b/v1/metrowerks-tools.jam @@ -84,7 +84,7 @@ rule Link-action IMPLIB_COMMAND on $(<) = "-implib " ; # will be "multiplied away" if not # needed. - with-command-file metrowerks-Link-action $(<) : $(>) $(NEEDLIBS) # $(NEEDLIBS) + with-command-file metrowerks-Link-action $(<) : $(>) $(NEEDLIBS) ; } diff --git a/v1/msvc-tools.jam b/v1/msvc-tools.jam index c4f6c3ba8..fba8bff15 100644 --- a/v1/msvc-tools.jam +++ b/v1/msvc-tools.jam @@ -133,7 +133,7 @@ rule Link-action ( target implib ? : sources + : target-type ? ) vc-set-pdb-file $(<) : $(target:B) ; } -actions together vc-Link bind NEEDLIBS +actions together vc-Link { $(VC_SETUP) "$(VC_TOOL_PATH)$(VC_LINKER)" /nologo $(NOINCREMENTAL) $(LINKFLAGS) $(PDB_LINKFLAG)"$(VC_PDB_FILE)" /out:"$(<[1])" /IMPLIB:"$(<[2])" /LIBPATH:"$(LIBPATH)" /LIBPATH:"$(STDLIBPATH)" "$(FINDLIBS:S=.lib)" @"$(>)" diff --git a/v1/python.jam b/v1/python.jam index 49aa750d8..9b181c698 100644 --- a/v1/python.jam +++ b/v1/python.jam @@ -79,6 +79,12 @@ else if $(UNIX) { PYTHON_PROPERTIES += <*><*>"-expect_unresolved 'Py*' -expect_unresolved '_Py*'" ; } + else if $(OS) = AIX + { + PYTHON_PROPERTIES + += <*><*>"-bI:$(PYTHON_LIB_PATH)/python.exp" + <*><*>pthreads ; + } } # Locate the python executable @@ -255,6 +261,13 @@ rule Link-PYD { RUN_LD_LIBRARY_PATH on $(<) = [ join $(gRUN_LD_LIBRARY_PATH($(<))) : $(SPLITPATH) ] ; gRUN_LD_LIBRARY_PATH($(<)) += $(gLOCATE($(<[1]))) ; + + if $(OS) = AIX + { + # explicitly designate the exported init function + LINKFLAGS on $(<) += "-e init$(<[1]:B)" ; + Aix-Implib-Action $(<) : $(>) ; + } } Link-action $(<) : $(>) : PYD ; } @@ -324,15 +337,20 @@ rule python-test-target ( test-target : sources + ) if $(UNIX) { - gAPPEND_LD_LIBRARY_PATH = ":$LD_LIBRARY_PATH" ; + gAPPEND_LD_LIBRARY_PATH = ":$"$(gSHELL_LIBPATH) ; + gAPPEND_PATH = ":$"PATH ; +} +else if $(NT) +{ + gAPPEND_PATH = ";%PATH%" ; } actions python-test-target bind PYTHON { - $(SHELL_SET)PATH=$(PATH) + $(SHELL_SET)PATH=$(run.path)$(gAPPEND_PATH) $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(LD_LIBRARY_PATH)$(gAPPEND_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(run.library_path)$(gAPPEND_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(SHELL_SET)PYTHONPATH=$(PYTHONPATH) $(SHELL_EXPORT)PYTHONPATH $(PYTHON_LAUNCH) $(PYTHON) $(PYTHON_ARGS) "$(>)" $(ARGS) 2>&1 "$(<)" || $(CATENATE) "$(<)" @@ -349,10 +367,10 @@ rule python-runtest-target ( test-target : sources + ) } actions python-runtest-target bind PYTHON { - $(SHELL_SET)PATH=$(PATH) + $(SHELL_SET)PATH=$(run.path)$(gAPPEND_PATH) $(SHELL_EXPORT)PATH - $(SHELL_SET)LD_LIBRARY_PATH=$(LD_LIBRARY_PATH)$(gAPPEND_LD_LIBRARY_PATH) - $(SHELL_EXPORT)LD_LIBRARY_PATH + $(SHELL_SET)$(gSHELL_LIBPATH)=$(run.library_path)$(gAPPEND_LD_LIBRARY_PATH) + $(SHELL_EXPORT)$(gSHELL_LIBPATH) $(SHELL_SET)PYTHONPATH=$(PYTHONPATH) $(SHELL_EXPORT)PYTHONPATH $(PYTHON_LAUNCH) $(PYTHON) $(PYTHON_ARGS) "$(>)" $(ARGS) @@ -424,15 +442,13 @@ rule python-runtest-aux ( target : sources + ) # set the path so that DLLs linked into extension modules will be # found - PATH on $(target) = [ join - $(gRUN_PATH($(target))) # location of module dependencies + run.path on $(target) = [ join + $(gRUN_PATH($(target))) # location of module dependencies $(>:D) # directory of python driver file(s) - $(PATH) # base PATH from environment : $(SPLITPATH) ] ; # platform path separator - LD_LIBRARY_PATH on $(target) = [ join - $(gRUN_LD_LIBRARY_PATH($(target))) # location of module dependencies - : $(SPLITPATH) ] ; # platform path separator + run.library_path on $(target) + = $(gRUN_LD_LIBRARY_PATH($(target)):J=$(SPLITPATH)) ; PYTHON on $(target) = $(python) ; DEPENDS $(target) : $(python) ; diff --git a/v1/tru64cxx-tools.jam b/v1/tru64cxx-tools.jam index 3eddd0b8e..94e276830 100644 --- a/v1/tru64cxx-tools.jam +++ b/v1/tru64cxx-tools.jam @@ -60,7 +60,7 @@ rule Link-action ( target : sources + : target-type ) # for tru64cxx, we repeat all libraries so that dependencies are always resolved actions tru64cxx-Link-action bind NEEDLIBS { - cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt + cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt } actions tru64cxx-Link-shared bind NEEDLIBS diff --git a/v1/tru64cxx65-tools.jam b/v1/tru64cxx65-tools.jam index 8e099cdb8..116f1df4e 100644 --- a/v1/tru64cxx65-tools.jam +++ b/v1/tru64cxx65-tools.jam @@ -56,7 +56,7 @@ rule Link-action ( target : sources + : target-type ) # for tru64cxx, we repeat all libraries so that dependencies are always resolved actions tru64cxx65-Link-action bind NEEDLIBS { - cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt + cxx $(LINKFLAGS) -o "$(<)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -lrt } actions tru64cxx65-Link-shared bind NEEDLIBS diff --git a/v1/vacpp-tools.jam b/v1/vacpp-tools.jam index ee42d473c..b26e7b89f 100644 --- a/v1/vacpp-tools.jam +++ b/v1/vacpp-tools.jam @@ -49,9 +49,9 @@ rule Link-action } # for xlc, we repeat all libraries so that dependencies are always resolved -actions xlc-Link-action bind NEEDLIBS +actions xlc-Link-action bind NEEDLIBS NEEDIMPS { - xlC -qrtti $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) + xlC -qrtti $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) } #### Cc ##### diff --git a/vacpp-tools.jam b/vacpp-tools.jam index ee42d473c..b26e7b89f 100644 --- a/vacpp-tools.jam +++ b/vacpp-tools.jam @@ -49,9 +49,9 @@ rule Link-action } # for xlc, we repeat all libraries so that dependencies are always resolved -actions xlc-Link-action bind NEEDLIBS +actions xlc-Link-action bind NEEDLIBS NEEDIMPS { - xlC -qrtti $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) + xlC -qrtti $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) } #### Cc #####