|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r61419 - in branches/release/tools/build/v2: . build test tools tools/types util
From: ghost_at_[hidden]
Date: 2010-04-20 08:05:16
Author: vladimir_prus
Date: 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
New Revision: 61419
URL: http://svn.boost.org/trac/boost/changeset/61419
Log:
Merge from trunk
Added:
branches/release/tools/build/v2/build/configure.jam
- copied, changed from r59909, /trunk/tools/build/v2/build/configure.jam
branches/release/tools/build/v2/tools/clang-darwin.jam
- copied unchanged from r61380, /trunk/tools/build/v2/tools/clang-darwin.jam
branches/release/tools/build/v2/tools/clang-unix.jam
- copied unchanged from r61380, /trunk/tools/build/v2/tools/clang-unix.jam
branches/release/tools/build/v2/tools/clang.jam
- copied unchanged from r61380, /trunk/tools/build/v2/tools/clang.jam
Properties modified:
branches/release/tools/build/v2/ (props changed)
Text files modified:
branches/release/tools/build/v2/build-system.jam | 51 +++++++++++++++++++++
branches/release/tools/build/v2/build/configure.jam | 66 +++++++++++++++++++++++++++--
branches/release/tools/build/v2/build/targets.jam | 30 +++++++++++--
branches/release/tools/build/v2/build/virtual-target.jam | 11 +++-
branches/release/tools/build/v2/test/BoostBuild.py | 4 +
branches/release/tools/build/v2/test/build_dir.py | 1
branches/release/tools/build/v2/tools/borland.jam | 4
branches/release/tools/build/v2/tools/builtin.jam | 82 ------------------------------------
branches/release/tools/build/v2/tools/common.jam | 2
branches/release/tools/build/v2/tools/gcc.jam | 90 ++++++++++++++++++++++-----------------
branches/release/tools/build/v2/tools/stage.jam | 11 +++-
branches/release/tools/build/v2/tools/types/cpp.jam | 90 ++++++++++++++++++++++++++++++++++++++-
branches/release/tools/build/v2/tools/types/lib.jam | 56 ++++++++++++++++++++----
branches/release/tools/build/v2/tools/types/objc.jam | 27 ++++++++++-
branches/release/tools/build/v2/util/indirect.jam | 12 ++++-
branches/release/tools/build/v2/util/set.jam | 30 +++++++++++++
16 files changed, 405 insertions(+), 162 deletions(-)
Modified: branches/release/tools/build/v2/build-system.jam
==============================================================================
--- branches/release/tools/build/v2/build-system.jam (original)
+++ branches/release/tools/build/v2/build-system.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -26,6 +26,7 @@
import version ;
import virtual-target ;
import generators ;
+import configure ;
################################################################################
#
@@ -113,6 +114,15 @@
.default-toolset-version = $(version) ;
}
+rule set-pre-build-hook ( function )
+{
+ .pre-build-hook = $(function) ;
+}
+
+rule set-post-build-hook ( function )
+{
+ .post-build-hook = $(function) ;
+}
################################################################################
#
@@ -579,6 +589,10 @@
{
default-toolset = msvc ;
}
+ else if [ os.name ] = MACOSX
+ {
+ default-toolset = darwin ;
+ }
}
ECHO "warning: No toolsets are configured." ;
@@ -698,6 +712,17 @@
generators.dump ;
}
+ # We wish to put config.log in the build directory corresponding
+ # to Jamroot, so that the location does not differ depending on
+ # directory where we do build. The amount of indirection necessary
+ # here is scary.
+ local first-project = [ $(targets[0]).project ] ;
+ local first-project-root-location = [ $(first-project).get project-root ] ;
+ local first-project-root-module = [ project.load $(first-project-root-location) ] ;
+ local first-project-root = [ project.target $(first-project-root-module) ] ;
+ local first-build-build-dir = [ $(first-project-root).build-dir ] ;
+ configure.set-log-file $(first-build-build-dir)/config.log ;
+
# Now that we have a set of targets to build and a set of property sets to
# build the targets with, we can start the main build process by using each
# property set to generate virtual targets from all of our listed targets
@@ -947,8 +972,30 @@
UPDATE clean ;
}
else
- {
+ {
+ configure.print-configure-checks-summary ;
+
+ if $(.pre-build-hook)
+ {
+ $(.pre-build-hook) ;
+ }
+
DEPENDS all : $(actual-targets) ;
- UPDATE all $(.out-xml) ;
+ if UPDATE_NOW in [ RULENAMES ]
+ {
+ local ok = [ UPDATE_NOW all $(.out-xml) ] ;
+ if $(.post-build-hook)
+ {
+ $(.post-build-hook) $(ok) ;
+ }
+ # Prevent automatic update of the 'all' target, now that
+ # we have explicitly updated what we wanted.
+ UPDATE ;
+ }
+ else
+ {
+ UPDATE all $(.out-xml) ;
+ }
}
}
+
Copied: branches/release/tools/build/v2/build/configure.jam (from r59909, /trunk/tools/build/v2/build/configure.jam)
==============================================================================
--- /trunk/tools/build/v2/build/configure.jam (original)
+++ branches/release/tools/build/v2/build/configure.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -14,6 +14,7 @@
import errors ;
import targets ;
import sequence ;
+import "class" : new ;
rule log-summary ( )
{
@@ -48,16 +49,25 @@
.component-logs.$(component) += $(message) ;
}
+
+
rule log-check-result ( result )
{
- .check-results += $(result) ;
+ if ! $(.announced-checks)
+ {
+ ECHO "Performing configuration checks\n" ;
+ .announced-checks = 1 ;
+ }
+
+ ECHO $(result) ;
+ #.check-results += $(result) ;
}
rule print-component-configuration ( )
{
local c = [ sequence.unique $(.components) ] ;
- ECHO "Component configuration:\n" ;
+ ECHO "\nComponent configuration:\n" ;
for c in $(.components)
{
local s ;
@@ -102,11 +112,11 @@
rule builds ( metatarget-reference : project : ps : what )
{
local result ;
-
+
if ! $(.$(what)-tested.$(ps))
- {
+ {
.$(what)-tested.$(ps) = true ;
-
+
local targets = [ targets.generate-from-reference
$(metatarget-reference) : $(project) : $(ps) ] ;
@@ -155,3 +165,49 @@
}
}
+# Frontend rules
+
+class check-target-builds-worker
+{
+ import configure ;
+ import property-set ;
+ import targets ;
+ import property ;
+
+ rule __init__ ( target : true-properties * : false-properties * )
+ {
+ self.target = $(target) ;
+ self.true-properties = $(true-properties) ;
+ self.false-properties = $(false-properties) ;
+ }
+
+ rule check ( properties * )
+ {
+ # FIXME: this should not be hardcoded. Other checks might
+ # want to consider different set of features as relevant.
+ local toolset = [ property.select <toolset> : $(properties) ] ;
+ local ps = [ property-set.create $(toolset) ] ;
+ local t = [ targets.current ] ;
+ local p = [ $(t).project ] ;
+ if [ configure.builds $(self.target) : $(p) : $(ps) : "$(self.target) builds" ]
+ {
+ return $(self.true-properties) ;
+ }
+ else
+ {
+ return $(self.false-properties) ;
+ }
+ }
+}
+
+
+rule check-target-builds ( target : true-properties * : false-properties * )
+{
+ local instance = [ new check-target-builds-worker $(target) : $(true-properties)
+ : $(false-properties) ] ;
+ return <conditional>@$(instance).check ;
+}
+
+IMPORT $(__name__) : check-target-builds : : check-target-builds ;
+
+
Modified: branches/release/tools/build/v2/build/targets.jam
==============================================================================
--- branches/release/tools/build/v2/build/targets.jam (original)
+++ branches/release/tools/build/v2/build/targets.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -288,7 +288,7 @@
local self-location = [ get location ] ;
for local pn in [ get projects-to-build ]
{
- result += [ find $(pn) ] ;
+ result += [ find $(pn)/ ] ;
}
return $(result) ;
@@ -968,7 +968,7 @@
# might come from project's requirements.
local unconditional = [ feature.expand [ $(requirements).non-conditional ] ] ;
-
+
local raw = [ $(context).raw ] ;
raw = [ property.refine $(raw) : $(unconditional) ] ;
@@ -997,7 +997,7 @@
# <conditional> properties. So the list of indirect conditionals does not
# change.
local indirect = [ $(requirements).get <conditional> ] ;
- indirect = [ MATCH @(.*) : $(indirect) ] ;
+ indirect = [ MATCH ^@(.*) : $(indirect) ] ;
local ok ;
while $(count)
@@ -1066,6 +1066,22 @@
refined ] ;
}
+rule push-target ( target )
+{
+ .targets = $(target) $(.targets) ;
+}
+
+rule pop-target ( )
+{
+ .targets = $(.targets[2-]) ;
+}
+
+# Return the metatarget that is currently being generated.
+rule current ( )
+{
+ return $(.targets[1]) ;
+}
+
# Implements the most standard way of constructing main target alternative from
# sources. Allows sources to be either file or other main target and handles
@@ -1221,6 +1237,7 @@
ECHO [ targets.indent ] "Command line free features: " [ $(cf).raw ] ;
ECHO [ targets.indent ] "Target requirements: " [ $(self.requirements).raw ] ;
}
+ targets.push-target $(__name__) ;
if ! $(self.generated.$(property-set))
{
@@ -1320,8 +1337,10 @@
}
else if [ $(rproperties).get <build> ] = no
{
- ECHO [ targets.indent ] "Skipping build of: " [ full-name ]
- " <build>no in common properties" ;
+ # If we just see <build>no, we cannot produce any reasonable
+ # diagnostics. The code that adds this property is expected
+ # to explain why a target is not built, for example using
+ # the configure.log-component-configuration function.
}
else
{
@@ -1359,6 +1378,7 @@
}
}
+ targets.pop-target ;
targets.decrease-indent ;
return $(self.generated.$(property-set)) ;
}
Modified: branches/release/tools/build/v2/build/virtual-target.jam
==============================================================================
--- branches/release/tools/build/v2/build/virtual-target.jam (original)
+++ branches/release/tools/build/v2/build/virtual-target.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -1218,7 +1218,7 @@
# referred to using the dependency property are returned as properties, not
# targets.
#
- rule all-referenced-targets ( )
+ rule all-referenced-targets ( theset )
{
# Find directly referenced targets.
local deps = [ $(self.build-properties).dependency ] ;
@@ -1228,17 +1228,20 @@
local r ;
for local t in $(all-targets)
{
- r += [ $(t:G=).creating-subvariant ] ;
+ if ! [ $(theset).contains $(t) ]
+ {
+ $(theset).add $(t) ;
+ r += [ $(t:G=).creating-subvariant ] ;
+ }
}
r = [ sequence.unique $(r) ] ;
for local s in $(r)
{
if $(s) != $(__name__)
{
- all-targets += [ $(s).all-referenced-targets ] ;
+ $(s).all-referenced-targets $(theset) ;
}
}
- return $(all-targets) ;
}
# Returns the properties specifying implicit include paths to generated
Modified: branches/release/tools/build/v2/test/BoostBuild.py
==============================================================================
--- branches/release/tools/build/v2/test/BoostBuild.py (original)
+++ branches/release/tools/build/v2/test/BoostBuild.py 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -660,12 +660,14 @@
self.ignore('*.pdb') # MSVC program database files.
self.ignore('*.rsp') # Response files.
self.ignore('*.tds') # Borland debug symbols.
- self.ignore('*.manifest') # MSVC DLL manifests.
+ self.ignore('*.manifest') # MSVC DLL manifests.
# Debug builds of bjam built with gcc produce this profiling data.
self.ignore('gmon.out')
self.ignore('*/gmon.out')
+ self.ignore("bin/config.log")
+
if not self.unexpected_difference.empty():
annotation('failure', 'Unexpected changes found')
output = StringIO.StringIO()
Modified: branches/release/tools/build/v2/test/build_dir.py
==============================================================================
--- branches/release/tools/build/v2/test/build_dir.py (original)
+++ branches/release/tools/build/v2/test/build_dir.py 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -36,6 +36,7 @@
# Test that building from child projects work.
t.run_build_system(subdir='src')
+t.ignore("build/config.log")
t.expect_nothing_more()
# Test that project can override build dir.
Modified: branches/release/tools/build/v2/tools/borland.jam
==============================================================================
--- branches/release/tools/build/v2/tools/borland.jam (original)
+++ branches/release/tools/build/v2/tools/borland.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -117,13 +117,13 @@
actions compile.c++
{
- "$(CONFIG_COMMAND)" -j5 -g255 -q -c -P -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+ "$(CONFIG_COMMAND)" -j5 -g255 -q -c -P -a8 -Vx- -Ve- -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
}
# For C, we don't pass -P flag
actions compile.c
{
- "$(CONFIG_COMMAND)" -j5 -g255 -q -c -a8 -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
+ "$(CONFIG_COMMAND)" -j5 -g255 -q -c -a8 -Vx- -Ve- -b- $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -I"$(STDHDRS)" -o"$(<)" "$(>)"
}
Modified: branches/release/tools/build/v2/tools/builtin.jam
==============================================================================
--- branches/release/tools/build/v2/tools/builtin.jam (original)
+++ branches/release/tools/build/v2/tools/builtin.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -1,5 +1,5 @@
# Copyright 2002, 2003, 2004, 2005 Dave Abrahams
-# Copyright 2002, 2005, 2006, 2007 Rene Rivera
+# Copyright 2002, 2005, 2006, 2007, 2010 Rene Rivera
# Copyright 2006 Juergen Hunold
# Copyright 2005 Toon Knapen
# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
@@ -429,86 +429,6 @@
}
-class c-scanner : scanner
-{
- import path ;
- import regex ;
- import scanner ;
- import sequence ;
- import virtual-target ;
-
- rule __init__ ( includes * )
- {
- scanner.__init__ ;
-
- for local i in $(includes)
- {
- self.includes += [ sequence.transform path.native
- : [ regex.split $(i:G=) "&&" ] ] ;
- }
- }
-
- rule pattern ( )
- {
- return "#[ \t]*include[ ]*(<(.*)>|\"(.*)\")" ;
- }
-
- rule process ( target : matches * : binding )
- {
- local angle = [ regex.transform $(matches) : "<(.*)>" ] ;
- angle = [ sequence.transform path.native : $(angle) ] ;
- local quoted = [ regex.transform $(matches) : "\"(.*)\"" ] ;
- quoted = [ sequence.transform path.native : $(quoted) ] ;
-
- # CONSIDER: the new scoping rule seem to defeat "on target" variables.
- local g = [ on $(target) return $(HDRGRIST) ] ;
- local b = [ NORMALIZE_PATH $(binding:D) ] ;
-
- # Attach binding of including file to included targets. When a target is
- # directly created from virtual target this extra information is
- # unnecessary. But in other cases, it allows us to distinguish between
- # two headers of the same name included from different places. We do not
- # need this extra information for angle includes, since they should not
- # depend on including file (we can not get literal "." in include path).
- local g2 = $(g)"#"$(b) ;
-
- angle = $(angle:G=$(g)) ;
- quoted = $(quoted:G=$(g2)) ;
-
- local all = $(angle) $(quoted) ;
-
- INCLUDES $(target) : $(all) ;
- NOCARE $(all) ;
- SEARCH on $(angle) = $(self.includes:G=) ;
- SEARCH on $(quoted) = $(b) $(self.includes:G=) ;
-
- # Just propagate the current scanner to includes in hope that includes
- # do not change scanners.
- scanner.propagate $(__name__) : $(angle) $(quoted) : $(target) ;
-
- ISFILE $(angle) $(quoted) ;
- }
-}
-
-
-type.register H : h ;
-type.register HPP : hpp : H ;
-type.register C : c ;
-
-scanner.register c-scanner : include ;
-
-# It most cases where a CPP file or a H file is a source of some action, we
-# should rebuild the result if any of files included by CPP/H are changed. One
-# case when this is not needed is installation, which is handled specifically.
-type.set-scanner CPP : c-scanner ;
-type.set-scanner C : c-scanner ;
-# One case where scanning of H/HPP files is necessary is PCH generation -- if
-# any header included by HPP being precompiled changes, we need to recompile the
-# header.
-type.set-scanner H : c-scanner ;
-type.set-scanner HPP : c-scanner ;
-
-
# The generator class for libraries (target type LIB). Depending on properties
# it will request building of the appropriate specific library type --
# -- SHARED_LIB, STATIC_LIB or SHARED_LIB.
Modified: branches/release/tools/build/v2/tools/common.jam
==============================================================================
--- branches/release/tools/build/v2/tools/common.jam (original)
+++ branches/release/tools/build/v2/tools/common.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -825,6 +825,8 @@
switch [ $(property-set).get <toolset> ]
{
case borland* : tag += bcb ;
+ case clang-unix* : tag += gcc ;
+ case clang-darwin* : tag += xgcc ;
case como* : tag += como ;
case cw : tag += cw ;
case darwin* : tag += xgcc ;
Modified: branches/release/tools/build/v2/tools/gcc.jam
==============================================================================
--- branches/release/tools/build/v2/tools/gcc.jam (original)
+++ branches/release/tools/build/v2/tools/gcc.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -44,39 +44,11 @@
generators.override gcc.prebuilt : builtin.prebuilt ;
generators.override gcc.searched-lib-generator : searched-lib-generator ;
-# Target naming is determined by types/lib.jam and the settings below this
-# comment.
-#
-# On *nix:
-# libxxx.a static library
-# libxxx.so shared library
-#
-# On windows (mingw):
-# libxxx.lib static library
-# xxx.dll DLL
-# xxx.lib import library
-#
-# On windows (cygwin) i.e. <target-os>cygwin
-# libxxx.a static library
-# xxx.dll DLL
-# libxxx.dll.a import library
-#
-# Implementation notes:
-# * User can always override this by using the <tag>@rule.
-# * These settings have been chosen so that mingw is in line with msvc naming
-# conventions.
-# * For cygwin the cygwin naming convention has been chosen.
-
# Make gcc toolset object files use the "o" suffix on all platforms.
type.set-generated-target-suffix OBJ : <toolset>gcc : o ;
type.set-generated-target-suffix OBJ : <toolset>gcc <target-os>windows : o ;
type.set-generated-target-suffix OBJ : <toolset>gcc <target-os>cygwin : o ;
-type.set-generated-target-suffix STATIC_LIB : <toolset>gcc <target-os>cygwin : a ;
-type.set-generated-target-suffix IMPORT_LIB : <toolset>gcc <target-os>cygwin : dll.a ;
-type.set-generated-target-prefix IMPORT_LIB : <toolset>gcc <target-os>cygwin : lib ;
-
-
# Initializes the gcc toolset for the given version. If necessary, command may
# be used to specify where the compiler is located. The parameter 'options' is a
# space-delimited list of options, each one specified as
@@ -103,12 +75,12 @@
bin ?= [ common.get-absolute-tool-path $(command[-1]) ] ;
root ?= $(bin:D) ;
}
+ # The 'command' variable can have multiple elements. When calling
+ # the SHELL builtin we need a single string.
+ local command-string = $(command:J=" ") ;
# Autodetect the version and flavor if not given.
if $(command)
- {
- # The 'command' variable can have multiple elements. When calling
- # the SHELL builtin we need a single string.
- local command-string = $(command:J=" ") ;
+ {
local machine = [ MATCH "^([^ ]+)"
: [ SHELL "$(command-string) -dumpmachine" ] ] ;
version ?= [ MATCH "^([0-9.]+)"
@@ -185,17 +157,35 @@
# If it's not a system gcc install we should adjust the various programs as
# needed to prefer using the install specific versions. This is essential
# for correct use of MinGW and for cross-compiling.
+
+ local nl = "
+" ;
# - The archive builder.
- local archiver =
- [ common.get-invocation-command gcc
- : ar : [ feature.get-values <archiver> : $(options) ] : $(bin) : search-path ] ;
+ local archiver = [ common.get-invocation-command gcc
+ : [ NORMALIZE_PATH [ MATCH "(.*)[$(nl)]+" : [ SHELL "$(command-string) -print-prog-name=ar" ] ] ]
+ : [ feature.get-values <archiver> : $(options) ]
+ : $(bin)
+ : search-path ] ;
toolset.flags gcc.archive .AR $(condition) : $(archiver[1]) ;
if $(.debug-configuration)
{
ECHO notice: using gcc archiver :: $(condition) :: $(archiver[1]) ;
}
+ # - Ranlib
+ local ranlib = [ common.get-invocation-command gcc
+ : [ NORMALIZE_PATH [ MATCH "(.*)[$(nl)]+" : [ SHELL "$(command-string) -print-prog-name=ranlib" ] ] ]
+ : [ feature.get-values <ranlib> : $(options) ]
+ : $(bin)
+ : search-path ] ;
+ toolset.flags gcc.archive .RANLIB $(condition) : $(ranlib[1]) ;
+ if $(.debug-configuration)
+ {
+ ECHO notice: using gcc ranlib :: $(condition) :: $(ranlib[1]) ;
+ }
+
+
# - The resource compiler.
local rc =
[ common.get-invocation-command-nodefault gcc
@@ -480,8 +470,11 @@
DEPENDS $(<) : [ on $(<) return $(PCH_FILE) ] ;
}
-rule compile.fortran
+rule compile.fortran ( targets * : sources * : properties * )
{
+ setup-threading $(targets) : $(sources) : $(properties) ;
+ setup-fpic $(targets) : $(sources) : $(properties) ;
+ setup-address-model $(targets) : $(sources) : $(properties) ;
}
actions compile.c++ bind PCH_FILE
@@ -799,6 +792,22 @@
}
}
+# Enclose the RPATH variable on 'targets' in (double) quotes,
+# unless it's already enclosed in single quotes.
+# This special casing is done because it's common to pass
+# '$ORIGIN' to linker -- and it has to have single quotes
+# to prevent expansion by shell -- and if we add double
+# quotes then preventing properties of single quotes disappear.
+rule quote-rpath ( targets * )
+{
+ local r = [ on $(targets[1]) return $(RPATH) ] ;
+ if ! [ MATCH "('.*')" : $(r) ]
+ {
+ r = "\"$(r)\"" ;
+ }
+ RPATH on $(targets) = $(r) ;
+}
+
# Declare actions for linking.
rule link ( targets * : sources * : properties * )
{
@@ -809,11 +818,12 @@
# parallel is just slower. For now, serialize only gcc links, it might be a
# good idea to serialize all links.
JAM_SEMAPHORE on $(targets) = <s>gcc-link-semaphore ;
+ quote-rpath $(targets) ;
}
actions link bind LIBRARIES
{
- "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" $(START-GROUP) "$(>)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
+ "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,$(RPATH) -Wl,-rpath-link$(SPACE)-Wl,"$(RPATH_LINK)" -o "$(<)" $(START-GROUP) "$(>)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
}
@@ -822,6 +832,7 @@
# logic in intel-linux, but that's hardly worth the trouble as on Linux, 'ar' is
# always available.
.AR = ar ;
+.RANLIB = ranlib ;
toolset.flags gcc.archive AROPTIONS <archiveflags> ;
@@ -862,21 +873,22 @@
actions piecemeal archive
{
"$(.AR)" $(AROPTIONS) rc "$(<)" "$(>)"
+ "$(.RANLIB)" "$(<)"
}
-
rule link.dll ( targets * : sources * : properties * )
{
setup-threading $(targets) : $(sources) : $(properties) ;
setup-address-model $(targets) : $(sources) : $(properties) ;
SPACE on $(targets) = " " ;
JAM_SEMAPHORE on $(targets) = <s>gcc-link-semaphore ;
+ quote-rpath $(targets) ;
}
# Differs from 'link' above only by -shared.
actions link.dll bind LIBRARIES
{
- "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" "$(.IMPLIB-COMMAND)$(<[1])" -o "$(<[-1])" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,$(<[-1]:D=) -shared $(START-GROUP) "$(>)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
+ "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,$(RPATH) "$(.IMPLIB-COMMAND)$(<[1])" -o "$(<[-1])" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,$(<[-1]:D=) -shared $(START-GROUP) "$(>)" "$(LIBRARIES)" $(FINDLIBS-ST-PFX) -l$(FINDLIBS-ST) $(FINDLIBS-SA-PFX) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
}
rule setup-threading ( targets * : sources * : properties * )
Modified: branches/release/tools/build/v2/tools/stage.jam
==============================================================================
--- branches/release/tools/build/v2/tools/stage.jam (original)
+++ branches/release/tools/build/v2/tools/stage.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -246,20 +246,23 @@
s += [ $(t).creating-subvariant ] ;
}
s = [ sequence.unique $(s) ] ;
-
- local result = $(targets) ;
+
+ local result = [ new set ] ;
+ $(result).add $(targets) ;
+
for local i in $(s)
{
- result += [ $(i).all-referenced-targets ] ;
+ $(i).all-referenced-targets $(result) ;
}
local result2 ;
- for local r in $(result)
+ for local r in [ $(result).list ]
{
if $(r:G) != <use>
{
result2 += $(r:G=) ;
}
}
+ DELETE_MODULE $(result) ;
result = [ sequence.unique $(result2) ] ;
}
Modified: branches/release/tools/build/v2/tools/types/cpp.jam
==============================================================================
--- branches/release/tools/build/v2/tools/types/cpp.jam (original)
+++ branches/release/tools/build/v2/tools/types/cpp.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -1,4 +1,86 @@
-# Copyright David Abrahams 2004. Distributed under the Boost
-# Software License, Version 1.0. (See accompanying
-# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-type CPP : cpp cxx cc ;
+# Copyright David Abrahams 2004.
+# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
+# Copyright 2010 Rene Rivera
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+import type ;
+import scanner ;
+
+class c-scanner : scanner
+{
+ import path ;
+ import regex ;
+ import scanner ;
+ import sequence ;
+ import virtual-target ;
+
+ rule __init__ ( includes * )
+ {
+ scanner.__init__ ;
+
+ for local i in $(includes)
+ {
+ self.includes += [ sequence.transform path.native
+ : [ regex.split $(i:G=) "&&" ] ] ;
+ }
+ }
+
+ rule pattern ( )
+ {
+ return "#[ \t]*include[ ]*(<(.*)>|\"(.*)\")" ;
+ }
+
+ rule process ( target : matches * : binding )
+ {
+ local angle = [ regex.transform $(matches) : "<(.*)>" ] ;
+ angle = [ sequence.transform path.native : $(angle) ] ;
+ local quoted = [ regex.transform $(matches) : "\"(.*)\"" ] ;
+ quoted = [ sequence.transform path.native : $(quoted) ] ;
+
+ # CONSIDER: the new scoping rule seem to defeat "on target" variables.
+ local g = [ on $(target) return $(HDRGRIST) ] ;
+ local b = [ NORMALIZE_PATH $(binding:D) ] ;
+
+ # Attach binding of including file to included targets. When a target is
+ # directly created from virtual target this extra information is
+ # unnecessary. But in other cases, it allows us to distinguish between
+ # two headers of the same name included from different places. We do not
+ # need this extra information for angle includes, since they should not
+ # depend on including file (we can not get literal "." in include path).
+ local g2 = $(g)"#"$(b) ;
+
+ angle = $(angle:G=$(g)) ;
+ quoted = $(quoted:G=$(g2)) ;
+
+ local all = $(angle) $(quoted) ;
+
+ INCLUDES $(target) : $(all) ;
+ NOCARE $(all) ;
+ SEARCH on $(angle) = $(self.includes:G=) ;
+ SEARCH on $(quoted) = $(b) $(self.includes:G=) ;
+
+ # Just propagate the current scanner to includes in hope that includes
+ # do not change scanners.
+ scanner.propagate $(__name__) : $(angle) $(quoted) : $(target) ;
+
+ ISFILE $(angle) $(quoted) ;
+ }
+}
+
+scanner.register c-scanner : include ;
+
+type.register CPP : cpp cxx cc ;
+type.register H : h ;
+type.register HPP : hpp : H ;
+type.register C : c ;
+
+# It most cases where a CPP file or a H file is a source of some action, we
+# should rebuild the result if any of files included by CPP/H are changed. One
+# case when this is not needed is installation, which is handled specifically.
+type.set-scanner CPP : c-scanner ;
+type.set-scanner C : c-scanner ;
+# One case where scanning of H/HPP files is necessary is PCH generation -- if
+# any header included by HPP being precompiled changes, we need to recompile the
+# header.
+type.set-scanner H : c-scanner ;
+type.set-scanner HPP : c-scanner ;
Modified: branches/release/tools/build/v2/tools/types/lib.jam
==============================================================================
--- branches/release/tools/build/v2/tools/types/lib.jam (original)
+++ branches/release/tools/build/v2/tools/types/lib.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -5,26 +5,64 @@
import type ; # for set-generated-target-suffix
import os ;
-type.register LIB ;
+# The following naming scheme is used for libraries.
+#
+# On *nix:
+# libxxx.a static library
+# libxxx.so shared library
+#
+# On windows (msvc)
+# libxxx.lib static library
+# xxx.dll DLL
+# xxx.lib import library
+#
+# On windows (mingw):
+# libxxx.a static library
+# libxxx.dll DLL
+# libxxx.dll.a import library
+#
+# On cygwin i.e. <target-os>cygwin
+# libxxx.a static library
+# cygxxx.dll DLL
+# libxxx.dll.a import library
+#
-type.set-generated-target-prefix LIB : : "lib" ;
-type.set-generated-target-prefix LIB : <target-os>windows : "" ;
-type.set-generated-target-prefix LIB : <target-os>cygwin : "cyg" ;
+type.register LIB ;
-# FIXME: should not register both extensions on both
-# platforms.
+# FIXME: should not register both extensions on both platforms.
type.register STATIC_LIB : a lib : LIB ;
+# The 'lib' prefix is used everywhere
+type.set-generated-target-prefix STATIC_LIB : : lib ;
+
+# Use '.lib' suffix for windows
type.set-generated-target-suffix STATIC_LIB : <target-os>windows : lib ;
+
+# Except with gcc.
type.set-generated-target-suffix STATIC_LIB : <toolset>gcc <target-os>windows : a ;
-type.set-generated-target-suffix STATIC_LIB : <target-os>cygwin : lib ;
-type.set-generated-target-prefix STATIC_LIB : : lib ;
+# Use xxx.lib for import libs
type IMPORT_LIB : : STATIC_LIB ;
-type.set-generated-target-suffix IMPORT_LIB : : lib ;
type.set-generated-target-prefix IMPORT_LIB : : "" ;
+type.set-generated-target-suffix IMPORT_LIB : : lib ;
+
+# Except with gcc (mingw or cygwin), where use libxxx.dll.a
+type.set-generated-target-prefix IMPORT_LIB : <toolset>gcc : lib ;
+type.set-generated-target-suffix IMPORT_LIB : <toolset>gcc : dll.a ;
type.register SHARED_LIB : so dll dylib : LIB ;
+
+# Both mingw and cygwin use libxxx.dll naming scheme.
+# On Linux, use "lib" prefix
+type.set-generated-target-prefix SHARED_LIB : : lib ;
+# But don't use it on windows
+type.set-generated-target-prefix SHARED_LIB : <target-os>windows : "" ;
+# But use it again on mingw
+type.set-generated-target-prefix SHARED_LIB : <toolset>gcc <target-os>windows : lib ;
+# And use 'cyg' on cygwin
+type.set-generated-target-prefix SHARED_LIB : <target-os>cygwin : cyg ;
+
+
type.set-generated-target-suffix SHARED_LIB : <target-os>windows : dll ;
type.set-generated-target-suffix SHARED_LIB : <target-os>cygwin : dll ;
type.set-generated-target-suffix SHARED_LIB : <target-os>darwin : dylib ;
Modified: branches/release/tools/build/v2/tools/types/objc.jam
==============================================================================
--- branches/release/tools/build/v2/tools/types/objc.jam (original)
+++ branches/release/tools/build/v2/tools/types/objc.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -1,5 +1,26 @@
-# Copyright Rene Rivera 2008.
+# Copyright Rene Rivera 2008, 2010.
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-type OBJECTIVE_C : m ;
-type OBJECTIVE_CPP : mm ;
+import type ;
+import scanner ;
+import types/cpp ;
+
+class objc-scanner : c-scanner
+{
+ rule __init__ ( includes * )
+ {
+ c-scanner.__init__ $(includes) ;
+ }
+
+ rule pattern ( )
+ {
+ return "#[ \t]*include|import[ ]*(<(.*)>|\"(.*)\")" ;
+ }
+}
+
+scanner.register objc-scanner : include ;
+
+type.register OBJECTIVE_C : m ;
+type.register OBJECTIVE_CPP : mm ;
+type.set-scanner OBJECTIVE_C : objc-scanner ;
+type.set-scanner OBJECTIVE_CPP : objc-scanner ;
Modified: branches/release/tools/build/v2/util/indirect.jam
==============================================================================
--- branches/release/tools/build/v2/util/indirect.jam (original)
+++ branches/release/tools/build/v2/util/indirect.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -51,9 +51,15 @@
else
{
frames ?= 1 ;
- # Take the first dot-separated element as module name. This disallows
- # module names with dots, but allows rule names with dots.
- local module-context = [ MATCH ^([^.]*)\\..* : $(rulename) ] ;
+ # If the rule name includes a Jamfile module, grab it.
+ local module-context = [ MATCH ^(Jamfile<[^>]*>)\\..* : $(rulename) ] ;
+
+ if ! $(module-context)
+ {
+ # Take the first dot-separated element as module name. This disallows
+ # module names with dots, but allows rule names with dots.
+ module-context = [ MATCH ^([^.]*)\\..* : $(rulename) ] ;
+ }
module-context ?= [ CALLER_MODULE $(frames) ] ;
return [ make $(rulename) $(bound-args) : $(module-context) ] ;
}
Modified: branches/release/tools/build/v2/util/set.jam
==============================================================================
--- branches/release/tools/build/v2/util/set.jam (original)
+++ branches/release/tools/build/v2/util/set.jam 2010-04-20 08:05:14 EDT (Tue, 20 Apr 2010)
@@ -3,6 +3,36 @@
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+class set
+{
+ rule __init__ ( )
+ {
+ }
+
+ rule add ( elements * )
+ {
+ for local e in $(elements)
+ {
+ if ! $($(e))
+ {
+ $(e) = 1 ;
+ self.result += $(e) ;
+ }
+ }
+ }
+
+ rule contains ( element )
+ {
+ return $($(element)) ;
+ }
+
+ rule list ( )
+ {
+ return $(self.result) ;
+ }
+}
+
+
# Returns the elements of set1 that are not in set2.
#
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk