diff options
author | Vladimir Prus <ghost@cs.msu.su> | 2009-04-14 09:00:59 +0000 |
---|---|---|
committer | Vladimir Prus <ghost@cs.msu.su> | 2009-04-14 09:00:59 +0000 |
commit | f0b2e14e2d30019af8fe93416860d717f65a35df (patch) | |
tree | 2426fc94434623df6f82cbb144a17922c50b0e04 /Jamroot | |
parent | 4a5cf896edfc8a79338373b4ee79b7011d6a2187 (diff) | |
download | boost-f0b2e14e2d30019af8fe93416860d717f65a35df.tar.gz |
Merge from trunk.
[SVN r52380]
Diffstat (limited to 'Jamroot')
-rw-r--r-- | Jamroot | 428 |
1 files changed, 293 insertions, 135 deletions
@@ -59,8 +59,8 @@ # --show-libraries Displays the list of Boost libraries that require # build and installation steps, then exit. # -# --layout=<layout> Determines whether to choose library names -# and header locations such that multiple +# --layout=<layout> Determines whether to choose library names +# and header locations such that multiple # versions of Boost or multiple compilers can # be used on the same system. # @@ -124,12 +124,15 @@ import "class" : new ; import common ; import sequence ; import symlink ; +import targets ; +import project ; path-constant BOOST_ROOT : . ; constant BOOST_VERSION : 1.39.0 ; constant BOOST_JAMROOT_MODULE : $(__name__) ; -local version-tag = [ MATCH "^([^.]+)[.]([^.]+)[.]([^.]+)" : $(BOOST_VERSION) ] ; +local version-tag = [ MATCH "^([^.]+)[.]([^.]+)[.]([^.]+)" : $(BOOST_VERSION) ] + ; if $(version-tag[3]) = 0 { version-tag = $(version-tag[1-2]) ; @@ -137,101 +140,81 @@ if $(version-tag[3]) = 0 constant BOOST_VERSION_TAG : $(version-tag:J="_") ; -# Option to choose how many variants to build. The default is "minimal", -# which builds only the "release <threading>multi <link>shared" variant. +# Option to choose how many variants to build. The default is "minimal". local build-type = [ MATCH "^--build-type=(.*)" : [ modules.peek : ARGV ] ] ; build-type ?= minimal ; if ! ( $(build-type) in minimal complete ) { - build-type = minimal ; + ECHO "The value of the --build-type option should be either 'complete' or 'minimal'" ; + EXIT ; } -# Specify the build variants keyed on the build-type. -local default-build,minimal = - release - <threading>multi - <link>shared <link>static - <runtime-link>shared - ; -local default-build,complete = - debug release - <threading>single <threading>multi - <link>shared <link>static - <runtime-link>shared <runtime-link>static - ; - -# Set the default build. -local default-build = $(default-build,$(build-type)) ; - -# We only use the default build when building at the root to -# avoid having it impact the default regression testing of "debug". -# TODO: Consider having a "testing" build type instead of this check. -if $(__file__:D) != "" +rule handle-static-runtime ( properties * ) { - default-build = debug ; -} - + # Using static runtime with shared libraries is impossible on Linux, + # and dangerous on Windows. Therefore, we disallow it. This might + # be drastic, but it was disabled for a while with nobody complaining. -rule handle-static-runtime ( properties * ) -{ - # This property combination is dangerous. - # Ideally, we'd add constraint to default build, - # so that user can build with property combination - # by hand. But we don't have any 'constraint' mechanism - # for default-build, so disable such builds in requirements. - - # For CW, static runtime is needed so that - # std::locale works. - if <link>shared in $(properties) - && <runtime-link>static in $(properties) - && ! ( <toolset>cw in $(properties) ) + # For CW, static runtime is needed so that std::locale works. + if <link>shared in $(properties) && <runtime-link>static in $(properties) && + ! ( <toolset>cw in $(properties) ) { - return <build>no ; + ECHO "error: link=shared together with runtime-link=static is not allowed" ; + ECHO "error: such property combination is either impossible " ; + ECHO "error: or too dangerious to be of any use" ; + EXIT ; } } project boost : requirements <include>. - # disable auto-linking for all targets here, - # primarily because it caused troubles with V2 + # Disable auto-linking for all targets here, primarily because it caused + # troubles with V2. <define>BOOST_ALL_NO_LIB=1 - # Used to encode variant in target name. See the - # 'tag' rule below. + # Used to encode variant in target name. See the 'tag' rule below. <tag>@$(__name__).tag <conditional>@handle-static-runtime - + # The standard library Sun compilers use by default has no chance + # of working with Boost. Override it. + <toolset>sun:<stdlib>sun-stlport : usage-requirements <include>. : build-dir bin.v2 - : default-build $(default-build) ; + # Setup convenient aliases for all libraries. -all-libraries = - [ MATCH .*libs/(.*)/build/.* : [ glob libs/*/build/Jamfile.v2 ] [ glob libs/*/build/Jamfile ] ] +all-libraries = [ MATCH .*libs/(.*)/build/.* : [ glob libs/*/build/Jamfile.v2 ] + [ glob libs/*/build/Jamfile ] ] ; - -all-libraries = [ sequence.unique $(all-libraries) ] ; -# First, the complicated libraries: where the target name in -# Jamfile is different from directory name. -alias prg_exec_monitor : libs/test/build//boost_prg_exec_monitor ; -alias test_exec_monitor : libs/test/build//boost_test_exec_monitor ; -alias unit_test_framework : libs/test/build//boost_unit_test_framework ; -alias bgl-vis : libs/graps/build//bgl-vis ; -alias serialization : libs/serialization/build//boost_serialization ; -alias wserialization : libs/serialization/build//boost_wserialization ; +all-libraries = [ sequence.unique $(all-libraries) ] ; +# The function_types library has a Jamfile, but it's used for maintenance +# purposes, there's no library to build and install. +all-libraries = [ set.difference $(all-libraries) : function_types ] ; -explicit prg_exec_monitor test_exec_monitor unit_test_framework - bgl-vis serialization wserialization ; +local rule explicit-alias ( id : targets + ) +{ + alias $(id) : $(targets) ; + explicit $(id) ; +} + + +# First, the complicated libraries: where the target name in Jamfile is +# different from its directory name. +explicit-alias prg_exec_monitor : libs/test/build//boost_prg_exec_monitor ; +explicit-alias test_exec_monitor : libs/test/build//boost_test_exec_monitor ; +explicit-alias unit_test_framework : libs/test/build//boost_unit_test_framework ; +explicit-alias bgl-vis : libs/graps/build//bgl-vis ; +explicit-alias serialization : libs/serialization/build//boost_serialization ; +explicit-alias wserialization : libs/serialization/build//boost_wserialization ; for local l in $(all-libraries) { if ! $(l) in test graph serialization { - alias $(l) : libs/$(l)/build//boost_$(l) ; - explicit $(l) ; + explicit-alias $(l) : libs/$(l)/build//boost_$(l) ; } } @@ -240,14 +223,24 @@ alias headers : : : : <include>. ; # Decides which libraries are to be installed by looking at --with-<library> # --without-<library> arguments. Returns the list of directories under "libs" -# which must be built at installed. +# which must be built and installed. +# rule libraries-to-install ( existing-libraries * ) { local argv = [ modules.peek : ARGV ] ; local with-parameter = [ MATCH --with-(.*) : $(argv) ] ; local without-parameter = [ MATCH --without-(.*) : $(argv) ] ; + + if ! $(with-parameter) && ! $(without-parameter) + { + # Nothing is specified on command line. See if maybe + # project-config.jam has some choices. + local project-config-libs = [ modules.peek project-config : libraries ] ; + with-parameter = [ MATCH --with-(.*) : $(project-config-libs) ] ; + without-parameter = [ MATCH --without-(.*) : $(project-config-libs) ] ; + } - # Do some checks + # Do some checks. if $(with-parameter) && $(without-parameter) { ECHO "error: both --with-<library> and --without-<library> specified" ; @@ -277,22 +270,25 @@ rule libraries-to-install ( existing-libraries * ) } } -# what kind of layout are we doing? + +# What kind of layout are we doing? layout = [ MATCH "^--layout=(.*)" : [ modules.peek : ARGV ] ] ; layout ?= versioned ; layout-$(layout) = true ; -# possible stage only location + +# Possible stage only location. local stage-locate = [ MATCH "^--stagedir=(.*)" : [ modules.peek : ARGV ] ] ; stage-locate ?= stage ; - path-constant BOOST_STAGE_LOCATE : $(stage-locate) ; -# location of python -local python-root = [ MATCH "^--with-python-root=(.*)" : [ modules.peek : ARGV ] ] ; +# Python location. +local python-root = [ MATCH "^--with-python-root=(.*)" : [ modules.peek : ARGV ] + ] ; PYTHON_ROOT ?= $(python-root) ; + # Select the libraries to install. libraries = [ libraries-to-install $(all-libraries) ] ; @@ -313,9 +309,11 @@ if $(build-id) constant BUILD_ID : [ regex.replace $(build-id) "[*\\/:.\"\' ]" "_" ] ; } -# This rule is called by Boost.Build to determine the name of -# target. We use it to encode build variant, compiler name and -# boost version in the target name + +# This rule is called by Boost.Build to determine the name of target. We use it +# to encode the build variant, compiler name and boost version in the target +# name. +# rule tag ( name : type ? : property-set ) { if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB @@ -326,38 +324,54 @@ rule tag ( name : type ? : property-set ) <base> <toolset> <threading> <runtime> -$(BOOST_VERSION_TAG) -$(BUILD_ID) : $(name) : $(type) : $(property-set) ] ; - - # Optionally add version suffix. - # On NT, library with version suffix won't be recognized - # by linkers. On CYGWIN, we get strage duplicate symbol - # errors when library is generated with version suffix. - # On OSX, version suffix is not needed -- the linker expets - # libFoo.1.2.3.dylib format. - # AIX linkers don't accept version suffixes either. - # Pgi compilers can't accept library with version suffix + + # Optionally add version suffix. On NT, library with version suffix + # will not be recognized by linkers. On CYGWIN, we get strage + # duplicate symbol errors when library is generated with version + # suffix. On OSX, version suffix is not needed -- the linker expects + # the libFoo.1.2.3.dylib format. AIX linkers do not accept version + # suffixes either. Pgi compilers can not accept library with version + # suffix. if $(type) = SHARED_LIB && ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) && ! ( [ $(property-set).get <toolset> ] in pgi ) ) { result = $(result).$(BOOST_VERSION) ; } - + return $(result) ; } else { - return [ common.format-name - <base> <threading> <runtime> -$(BUILD_ID) + local result = [ common.format-name + <base> + -$(BUILD_ID) : $(name) : $(type) : $(property-set) ] ; + + # Optionally add version suffix. On NT, library with version suffix + # will not be recognized by linkers. On CYGWIN, we get strage + # duplicate symbol errors when library is generated with version + # suffix. On OSX, version suffix is not needed -- the linker expects + # the libFoo.1.2.3.dylib format. AIX linkers do not accept version + # suffixes either. Pgi compilers can not accept library with version + # suffix. + if $(type) = SHARED_LIB && + ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) && + ! ( [ $(property-set).get <toolset> ] in pgi ) ) + { + result = $(result).$(BOOST_VERSION) ; + } + + return $(result) ; } } } + # Install to system location. -local install-requirements = - <install-source-root>boost - ; +install-requirements = <install-source-root>$(BOOST_ROOT)/boost ; + if $(layout-versioned) { install-requirements += <install-header-subdir>boost-$(BOOST_VERSION_TAG)/boost ; @@ -383,35 +397,34 @@ local headers = [ path.glob boost/tr1/tr1 : * : bcc32 sun CVS .svn ] ; -# Complete install +# Complete install. package.install install-proper - : $(install-requirements) <install-no-version-symlinks>on + : $(install-requirements) <install-no-version-symlinks>on : - : libs/$(libraries)/build - : $(headers) + : libs/$(libraries)/build + : $(headers) ; explicit install-proper ; # Install just library. install stage-proper - : libs/$(libraries)/build - : <location>$(stage-locate)/lib - <install-dependencies>on <install-type>LIB - <install-no-version-symlinks>on + : libs/$(libraries)/build + : <location>$(stage-locate)/lib + <install-dependencies>on <install-type>LIB + <install-no-version-symlinks>on ; explicit stage-proper ; -if $(layout-versioned) - && ( [ modules.peek : NT ] || [ modules.peek : UNIX ] ) +if $(layout-versioned) && ( [ modules.peek : NT ] || [ modules.peek : UNIX ] ) { rule make-unversioned-links ( project name ? : property-set : sources * ) { local result ; local filtered ; - local pattern ; + local pattern ; local nt = [ modules.peek : NT ] ; - + # Collect the libraries that have the version number in 'filtered'. for local s in $(sources) { @@ -422,86 +435,230 @@ if $(layout-versioned) } else { - m = [ MATCH "(.*[.]so[.0-9]+)" "(.*[.]dylib)" "(.*[.]a)" : [ $(s).name ] ] ; - } + m = [ MATCH "(.*[.]so[.0-9]+)" "(.*[.]dylib)" "(.*[.]a)" : + [ $(s).name ] ] ; + } if $(m) { filtered += $(s) ; } } - + # Create links without version. for local s in $(filtered) { local name = [ $(s).name ] ; local ea = [ $(s).action ] ; local ep = [ $(ea).properties ] ; - local a = [ - new non-scanning-action $(s) : symlink.ln : $(ep) ] ; - + local a = [ new non-scanning-action $(s) : symlink.ln : $(ep) ] ; + local noversion-file ; if $(nt) { - noversion-file = [ MATCH "(.*)-[0-9_]+([.]lib)" : $(name) ] ; + noversion-file = [ MATCH "(.*)-[0-9_]+(.*[.]lib)" : $(name) ] ; } else { - noversion-file = - [ MATCH "(.*)-[0-9_]+([.]so)[.0-9]*" : $(name) ] - [ MATCH "(.*)-[0-9_]+([.]dylib)" : $(name) ] - [ MATCH "(.*)-[0-9_]+([.]a)" : $(name) ] - [ MATCH "(.*)-[0-9_]+([.]dll[.]a)" : $(name) ] ; + noversion-file = + [ MATCH "(.*)-[0-9_]+(.*[.]so)[.0-9]*" : $(name) ] + [ MATCH "(.*)-[0-9_]+(.*[.]dylib)" : $(name) ] + [ MATCH "(.*)-[0-9_]+(.*[.]a)" : $(name) ] + [ MATCH "(.*)-[0-9_]+(.*[.]dll[.]a)" : $(name) ] ; } - - local new-name = + + local new-name = $(noversion-file[1])$(noversion-file[2]) ; result += [ new file-target $(new-name) exact : [ $(s).type ] : $(project) : $(a) ] ; } return $(result) ; - } - - generate stage-unversioned : stage-proper : - <generating-rule>@make-unversioned-links ; + } + + generate stage-unversioned : stage-proper : + <generating-rule>@make-unversioned-links ; explicit stage-unversioned ; - - generate install-unversioned : install-proper : - <generating-rule>@make-unversioned-links ; + + generate install-unversioned : install-proper : + <generating-rule>@make-unversioned-links ; explicit install-unversioned ; } else { - # Create do-nothing aliases + # Create do-nothing aliases. alias stage-unversioned ; explicit stage-unversioned ; alias install-unversioned ; explicit install-unversioned ; } -alias install : install-proper install-unversioned ; -alias stage : stage-proper stage-unversioned ; +# This is a special metatarget class that handles the --build-type=complete +# option. +class top-level-target : alias-target-class +{ + import modules ; + import errors ; + + rule __init__ ( name : project : sources * : requirements * + : default-build * : usage-requirements * ) + { + alias-target-class.__init__ $(name) : $(project) : $(sources) : + $(requirements) : $(default-build) : $(usage-requirements) ; + + local m = [ $(project).project-module ] ; + self.build-type = [ modules.peek $(m) : build-type ] ; + # On Linux, we build release variant by default, since few users will + # ever want to debug C++ Boost libraries, and there's no ABI + # incompatibility between debug and release variants. We build + # shared and static libraries since that's what most packages + # seem to provide (.so in libfoo and .a in libfoo-dev). + self.minimal-properties = [ property-set.create + <variant>release <threading>multi <link>shared <link>static <runtime-link>shared ] ; + # On Windows, new IDE projects use: + # + # runtime-link=dynamic, threading=multi, variant=(debug|release) + # + # and in addition, C++ Boost's autolink defaults to static linking. + self.minimal-properties-win = [ property-set.create + <variant>debug <variant>release <threading>multi <link>static <runtime-link>shared ] ; + + self.complete-properties = [ property-set.create + <variant>debug <variant>release + <threading>single <threading>multi + <link>shared <link>static + <runtime-link>shared <runtime-link>static ] ; + } + + rule generate ( property-set ) + { + if $(self.build-type) = minimal + { + local expanded ; + + local os = [ $(property-set).get <target-os> ] ; + # Because we completely override parent's 'generate' + # we need to check for default value of feature ourself. + if ! $(os) + { + os = [ feature.defaults <target-os> ] ; + os = $(os:G=) ; + } + + if $(os) = windows + { + expanded = [ targets.apply-default-build $(property-set) + : $(self.minimal-properties-win) ] ; + } + else + { + expanded = [ targets.apply-default-build $(property-set) + : $(self.minimal-properties) ] ; + } + return [ build-multiple $(expanded) ] ; + } + else if $(self.build-type) = complete + { + local expanded = [ targets.apply-default-build $(property-set) + : $(self.complete-properties) ] ; + + # Filter inappopriate combinations + local filtered ; + for local p in $(expanded) + { + # See comment in handle-static-runtime regarding this logic. + if [ $(p).get <link> ] = shared && [ $(p).get <runtime-link> ] = static + && [ $(p).get <toolset> ] != cw + { + # Skip this + } + else + { + filtered += $(p) ; + } + } + return [ build-multiple $(filtered) ] ; + } + else + { + errors.error "Unknown build type" ; + } + } + + rule build-multiple ( property-sets * ) + { + local usage-requirements = [ property-set.empty ] ; + local result ; + for local p in $(property-sets) + { + local r = [ alias-target-class.generate $(p) ] ; + if $(r) + { + usage-requirements = [ $(usage-requirements).add $(r[1]) ] ; + result += $(r[2-]) ; + } + } + return $(usage-requirements) [ sequence.unique $(result) ] ; + } + +} + +targets.create-metatarget top-level-target : [ project.current ] + : install + : install-proper install-unversioned + ; +targets.create-metatarget top-level-target : [ project.current ] + : stage + : stage-proper stage-unversioned + ; + explicit install ; explicit stage ; +stage-abs = [ path.native [ path.root $(stage-locate)/lib [ path.pwd ] ] ] ; + +# This target is built by default, and will forward to 'stage' +# after producing some explanations. +targets.create-metatarget top-level-target : [ project.current ] + : forward + : explain stage + ; -# Just build the libraries, don't install them anywhere. -# This is what happens with just "bjam --v2". + +message explain : +"\nBuilding C++ Boost. + +After the build, the headers will be located at + + $(BOOST_ROOT) + +The libraries will be located at + + $(stage-abs) + +Use 'bjam install --prefix=<path>' if you wish to install headers and +libraries to a different location and remove the source tree.\n\n" + ; + + +# Just build the libraries, don't install them anywhere. This is what happens +# with just "bjam --v2". alias build_all : libs/$(libraries)/build ; -# This rule should be called from libraries' Jamfiles and will -# create two targets, "install" and "stage", that will install -# or stage that library. The --prefix option is respected, but -# --with and --without options, naturally, are ignored. + +# This rule should be called from libraries' Jamfiles and will create two +# targets, "install" and "stage", that will install or stage that library. The +# --prefix option is respected, but --with and --without options, naturally, are +# ignored. # # - libraries -- list of library targets to install. +# rule boost-install ( libraries * ) { package.install install - : <dependency>/boost//install-headers $(install-requirements) + : <dependency>/boost//install-proper-headers $(install-requirements) : # No binaries : $(libraries) - : # No headers, it's handled by the dependency + : # No headers, it is handled by the dependency. ; install stage : $(libraries) : <location>$(BOOST_STAGE_LOCATE) ; @@ -515,6 +672,7 @@ rule boost-install ( libraries * ) } } + # Make project ids of all libraries known. for local l in $(all-libraries) { |