1 # Copyright Vladimir Prus 2002-2006.
2 # Copyright Dave Abrahams 2005-2006.
3 # Copyright Rene Rivera 2005-2007.
4 # Copyright Douglas Gregor 2005.
6 # Distributed under the Boost Software License, Version 1.0.
7 # (See accompanying file LICENSE_1_0.txt or copy at
8 # http://www.boost.org/LICENSE_1_0.txt)
12 # bjam [options] [properties] [install|stage]
14 # Builds and installs Boost.
16 # Targets and Related Options:
18 # install Install headers and compiled library files to the
19 # ======= configured locations (below).
21 # --prefix=<PREFIX> Install architecture independent files here.
22 # Default; C:\Boost on Win32
23 # Default; /usr/local on Unix. Linux, etc.
25 # --exec-prefix=<EPREFIX> Install architecture dependent files here.
28 # --libdir=<DIR> Install library files here.
29 # Default; <EPREFIX>/lib
31 # --includedir=<HDRDIR> Install header files here.
32 # Default; <PREFIX>/include
34 # stage Build and install only compiled library files
35 # ===== to the stage directory.
37 # --stagedir=<STAGEDIR> Install library files here
42 # --build-type=<type> Build the specified pre-defined set of variations
43 # of the libraries. Note, that which variants get
44 # built depends on what each library supports.
46 # minimal (default) - Builds the single
47 # "release" version of the libraries. This
48 # release corresponds to specifying:
49 # "release <threading>multi <link>shared
50 # <link>static <runtime-link>shared" as the
51 # Boost.Build variant to build.
53 # complete - Attempts to build all possible
56 # --build-dir=DIR Build in this location instead of building
57 # within the distribution tree. Recommended!
59 # --show-libraries Displays the list of Boost libraries that require
60 # build and installation steps, then exit.
62 # --layout=<layout> Determines whether to choose library names
63 # and header locations such that multiple
64 # versions of Boost or multiple compilers can
65 # be used on the same system.
67 # versioned (default) - Names of boost
68 # binaries include the Boost version
69 # number and the name and version of the
70 # compiler. Boost headers are installed
71 # in a subdirectory of <HDRDIR> whose
72 # name contains the Boost version
75 # system - Binaries names do not include
76 # the Boost version number or the name
77 # and version number of the compiler.
78 # Boost headers are installed directly
79 # into <HDRDIR>. This option is
80 # intended for system integrators who
81 # are building distribution packages.
83 # --buildid=ID Adds the specified ID to the name of built
84 # libraries. The default is to not add anything.
86 # --help This message.
88 # --with-<library> Build and install the specified <library>
89 # If this option is used, only libraries
90 # specified using this option will be built.
92 # --without-<library> Do not build, stage, or install the specified
93 # <library>. By default, all libraries are built.
97 # toolset=toolset Indicates the toolset to build with.
99 # variant=debug|release Select the build variant
101 # link=static|shared Whether to build static or shared libraries
103 # threading=single|multi Whether to build single or multithreaded binaries
105 # runtime-link=static|shared
106 # Whether to link to static or shared C and C++ runtime.
110 # - handle boost version
111 # - handle python options such as pydebug
123 import "class" : new ;
128 path-constant BOOST_ROOT : . ;
129 constant BOOST_VERSION : 1.39.0 ;
130 constant BOOST_JAMROOT_MODULE : $(__name__) ;
132 local version-tag = [ MATCH "^([^.]+)[.]([^.]+)[.]([^.]+)" : $(BOOST_VERSION) ]
134 if $(version-tag[3]) = 0
136 version-tag = $(version-tag[1-2]) ;
139 constant BOOST_VERSION_TAG : $(version-tag:J="_") ;
141 # Option to choose how many variants to build. The default is "minimal".
142 local build-type = [ MATCH "^--build-type=(.*)" : [ modules.peek : ARGV ] ] ;
143 build-type ?= minimal ;
144 if ! ( $(build-type) in minimal complete )
146 build-type = minimal ;
149 # Specify the build variants keyed on the build-type.
150 local default-build,minimal =
153 <link>shared <link>static
156 local default-build,complete =
158 <threading>single <threading>multi
159 <link>shared <link>static
160 <runtime-link>shared <runtime-link>static
163 # Set the default build.
164 local default-build = $(default-build,$(build-type)) ;
166 # We only use the default build when building at the root to avoid having it
167 # impact the default regression testing of "debug".
168 # TODO: Consider having a "testing" build type instead of this check.
169 if $(__file__:D) != ""
171 default-build = debug ;
175 rule handle-static-runtime ( properties * )
177 # This property combination is dangerous. Ideally, we would add a constraint
178 # to default build, so that user can build this property combination only if
179 # requested directly. But we do not have any 'constraint' system for
180 # default-build, so we disable such builds in requirements.
182 # For CW, static runtime is needed so that std::locale works.
183 if <link>shared in $(properties) && <runtime-link>static in $(properties) &&
184 ! ( <toolset>cw in $(properties) )
192 : requirements <include>.
193 # Disable auto-linking for all targets here, primarily because it caused
195 <define>BOOST_ALL_NO_LIB=1
196 # Used to encode variant in target name. See the 'tag' rule below.
197 <tag>@$(__name__).tag
198 <conditional>@handle-static-runtime
199 : usage-requirements <include>.
201 : default-build $(default-build)
205 # Setup convenient aliases for all libraries.
207 all-libraries = [ MATCH .*libs/(.*)/build/.* : [ glob libs/*/build/Jamfile.v2 ]
208 [ glob libs/*/build/Jamfile ] ]
211 all-libraries = [ sequence.unique $(all-libraries) ] ;
214 local rule explicit-alias ( id : targets + )
216 alias $(id) : $(targets) ;
221 # First, the complicated libraries: where the target name in Jamfile is
222 # different from its directory name.
223 explicit-alias prg_exec_monitor : libs/test/build//boost_prg_exec_monitor ;
224 explicit-alias test_exec_monitor : libs/test/build//boost_test_exec_monitor ;
225 explicit-alias unit_test_framework : libs/test/build//boost_unit_test_framework ;
226 explicit-alias bgl-vis : libs/graps/build//bgl-vis ;
227 explicit-alias serialization : libs/serialization/build//boost_serialization ;
228 explicit-alias wserialization : libs/serialization/build//boost_wserialization ;
229 for local l in $(all-libraries)
231 if ! $(l) in test graph serialization
233 explicit-alias $(l) : libs/$(l)/build//boost_$(l) ;
237 alias headers : : : : <include>. ;
240 # Decides which libraries are to be installed by looking at --with-<library>
241 # --without-<library> arguments. Returns the list of directories under "libs"
242 # which must be built and installed.
244 rule libraries-to-install ( existing-libraries * )
246 local argv = [ modules.peek : ARGV ] ;
247 local with-parameter = [ MATCH --with-(.*) : $(argv) ] ;
248 local without-parameter = [ MATCH --without-(.*) : $(argv) ] ;
251 if $(with-parameter) && $(without-parameter)
253 ECHO "error: both --with-<library> and --without-<library> specified" ;
257 local wrong = [ set.difference $(with-parameter) : $(existing-libraries) ] ;
260 ECHO "error: wrong library name '$(wrong[1])' in the --with-<library> option." ;
263 local wrong = [ set.difference $(without-parameter) : $(existing-libraries) ] ;
266 ECHO "error: wrong library name '$(wrong[1])' in the --without-<library> option." ;
272 return [ set.intersection $(existing-libraries) : $(with-parameter) ] ;
276 return [ set.difference $(existing-libraries) : $(without-parameter) ] ;
281 # What kind of layout are we doing?
282 layout = [ MATCH "^--layout=(.*)" : [ modules.peek : ARGV ] ] ;
283 layout ?= versioned ;
284 layout-$(layout) = true ;
287 # Possible stage only location.
288 local stage-locate = [ MATCH "^--stagedir=(.*)" : [ modules.peek : ARGV ] ] ;
289 stage-locate ?= stage ;
290 path-constant BOOST_STAGE_LOCATE : $(stage-locate) ;
294 local python-root = [ MATCH "^--with-python-root=(.*)" : [ modules.peek : ARGV ]
296 PYTHON_ROOT ?= $(python-root) ;
299 # Select the libraries to install.
300 libraries = [ libraries-to-install $(all-libraries) ] ;
302 if --show-libraries in [ modules.peek : ARGV ]
304 ECHO "The following libraries require building:" ;
305 for local l in $(libraries)
313 local build-id = [ MATCH "^--buildid=(.*)" : [ modules.peek : ARGV ] ] ;
316 constant BUILD_ID : [ regex.replace $(build-id) "[*\\/:.\"\' ]" "_" ] ;
320 # This rule is called by Boost.Build to determine the name of target. We use it
321 # to encode the build variant, compiler name and boost version in the target
324 rule tag ( name : type ? : property-set )
326 if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB
328 if $(layout) = versioned
330 local result = [ common.format-name
331 <base> <toolset> <threading> <runtime> -$(BOOST_VERSION_TAG)
333 : $(name) : $(type) : $(property-set) ] ;
335 # Optionally add version suffix. On NT, library with version suffix
336 # will not be recognized by linkers. On CYGWIN, we get strage
337 # duplicate symbol errors when library is generated with version
338 # suffix. On OSX, version suffix is not needed -- the linker expects
339 # the libFoo.1.2.3.dylib format. AIX linkers do not accept version
340 # suffixes either. Pgi compilers can not accept library with version
342 if $(type) = SHARED_LIB &&
343 ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) &&
344 ! ( [ $(property-set).get <toolset> ] in pgi ) )
346 result = $(result).$(BOOST_VERSION) ;
353 local result = [ common.format-name
356 : $(name) : $(type) : $(property-set) ] ;
358 # Optionally add version suffix. On NT, library with version suffix
359 # will not be recognized by linkers. On CYGWIN, we get strage
360 # duplicate symbol errors when library is generated with version
361 # suffix. On OSX, version suffix is not needed -- the linker expects
362 # the libFoo.1.2.3.dylib format. AIX linkers do not accept version
363 # suffixes either. Pgi compilers can not accept library with version
365 if $(type) = SHARED_LIB &&
366 ( ! ( [ $(property-set).get <target-os> ] in windows cygwin darwin aix ) &&
367 ! ( [ $(property-set).get <toolset> ] in pgi ) )
369 result = $(result).$(BOOST_VERSION) ;
378 # Install to system location.
380 install-requirements = <install-source-root>$(BOOST_ROOT)/boost ;
382 if $(layout-versioned)
384 install-requirements += <install-header-subdir>boost-$(BOOST_VERSION_TAG)/boost ;
388 install-requirements += <install-header-subdir>boost ;
390 if [ modules.peek : NT ]
392 install-requirements += <install-default-prefix>C:/Boost ;
394 else if [ modules.peek : UNIX ]
396 install-requirements += <install-default-prefix>/usr/local ;
400 # The .SUNWCCh files are present in tr1 include directory and have to be installed,
401 # see http://lists.boost.org/Archives/boost/2007/05/121430.php
402 [ path.glob-tree $(BOOST_ROOT)/boost : *.hpp *.ipp *.h *.inc *.SUNWCCh : CVS .svn ]
403 [ path.glob-tree $(BOOST_ROOT)/boost/compatibility/cpp_c_headers : c* : CVS .svn ]
404 [ path.glob boost/tr1/tr1 : * : bcc32 sun CVS .svn ]
408 package.install install-proper
409 : $(install-requirements) <install-no-version-symlinks>on
411 : libs/$(libraries)/build
414 explicit install-proper ;
416 # Install just library.
418 : libs/$(libraries)/build
419 : <location>$(stage-locate)/lib
420 <install-dependencies>on <install-type>LIB
421 <install-no-version-symlinks>on
423 explicit stage-proper ;
426 if $(layout-versioned) && ( [ modules.peek : NT ] || [ modules.peek : UNIX ] )
428 rule make-unversioned-links ( project name ? : property-set : sources * )
433 local nt = [ modules.peek : NT ] ;
435 # Collect the libraries that have the version number in 'filtered'.
436 for local s in $(sources)
441 m = [ MATCH "(.*[.]lib)" : [ $(s).name ] ] ;
445 m = [ MATCH "(.*[.]so[.0-9]+)" "(.*[.]dylib)" "(.*[.]a)" :
454 # Create links without version.
455 for local s in $(filtered)
457 local name = [ $(s).name ] ;
458 local ea = [ $(s).action ] ;
459 local ep = [ $(ea).properties ] ;
460 local a = [ new non-scanning-action $(s) : symlink.ln : $(ep) ] ;
462 local noversion-file ;
465 noversion-file = [ MATCH "(.*)-[0-9_]+(.*[.]lib)" : $(name) ] ;
470 [ MATCH "(.*)-[0-9_]+(.*[.]so)[.0-9]*" : $(name) ]
471 [ MATCH "(.*)-[0-9_]+(.*[.]dylib)" : $(name) ]
472 [ MATCH "(.*)-[0-9_]+(.*[.]a)" : $(name) ]
473 [ MATCH "(.*)-[0-9_]+(.*[.]dll[.]a)" : $(name) ] ;
477 $(noversion-file[1])$(noversion-file[2]) ;
478 result += [ new file-target $(new-name) exact : [ $(s).type ] : $(project)
485 generate stage-unversioned : stage-proper :
486 <generating-rule>@make-unversioned-links ;
487 explicit stage-unversioned ;
489 generate install-unversioned : install-proper :
490 <generating-rule>@make-unversioned-links ;
491 explicit install-unversioned ;
495 # Create do-nothing aliases.
496 alias stage-unversioned ;
497 explicit stage-unversioned ;
498 alias install-unversioned ;
499 explicit install-unversioned ;
502 alias install : install-proper install-unversioned ;
503 alias stage : stage-proper stage-unversioned ;
508 # Just build the libraries, don't install them anywhere. This is what happens
509 # with just "bjam --v2".
510 alias build_all : libs/$(libraries)/build ;
513 # This rule should be called from libraries' Jamfiles and will create two
514 # targets, "install" and "stage", that will install or stage that library. The
515 # --prefix option is respected, but --with and --without options, naturally, are
518 # - libraries -- list of library targets to install.
520 rule boost-install ( libraries * )
522 package.install install
523 : <dependency>/boost//install-proper-headers $(install-requirements)
526 : # No headers, it is handled by the dependency.
529 install stage : $(libraries) : <location>$(BOOST_STAGE_LOCATE) ;
531 local c = [ project.current ] ;
532 local project-module = [ $(c).project-module ] ;
533 module $(project-module)
541 # Make project ids of all libraries known.
542 for local l in $(all-libraries)
544 use-project /boost/$(l) : libs/$(l)/build ;