From 1ba4cc4fd5e5c2fd6bf5056b658e4042f1337514 Mon Sep 17 00:00:00 2001 From: Beman Dawes Date: Thu, 15 Nov 2007 15:20:27 +0000 Subject: [PATCH 01/40] Get rid of .cvsignore files [SVN r41107] --- v2/test/.cvsignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 v2/test/.cvsignore diff --git a/v2/test/.cvsignore b/v2/test/.cvsignore deleted file mode 100644 index 77615057d..000000000 --- a/v2/test/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc test_results.txt failed_test test-config.jam \ No newline at end of file From deebd6b5210c1689e06018d35ff8f243eb3e705e Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Thu, 15 Nov 2007 18:56:43 +0000 Subject: [PATCH 02/40] Switch intel-win32 to use static multi thread runtime since the single thread static runtime is no longer available. (fixes #1287) [SVN r41113] --- historic/jam/src/build.jam | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/historic/jam/src/build.jam b/historic/jam/src/build.jam index cd78b11e8..d7b1c6372 100644 --- a/historic/jam/src/build.jam +++ b/historic/jam/src/build.jam @@ -197,8 +197,8 @@ toolset intel-linux icc : "-o " : -D ## Intel C/C++ for Win32 toolset intel-win32 icl : /Fe : -D : /nologo - [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ] - [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ] + [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /GB ] + [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 ] -I$(--python-include) -I$(--extra-include) : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## KCC ? From a4a7522aad7450e6a854060a7e4a8b3911a1e103 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Fri, 16 Nov 2007 16:15:35 +0000 Subject: [PATCH 03/40] Add support for msvc-9.0, thanks to John Pavel. [SVN r41149] --- v2/tools/builtin.jam | 4 +++- v2/tools/msvc.jam | 26 +++++++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/v2/tools/builtin.jam b/v2/tools/builtin.jam index 225e6545c..962df6e6f 100644 --- a/v2/tools/builtin.jam +++ b/v2/tools/builtin.jam @@ -1,5 +1,5 @@ # Copyright 2002, 2003, 2004, 2005 Dave Abrahams -# Copyright 2002, 2005, 2006 Rene Rivera +# Copyright 2002, 2005, 2006, 2007 Rene Rivera # Copyright 2006 Juergen Hunold # Copyright 2005 Toon Knapen # Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus @@ -214,6 +214,8 @@ feature instruction-set : i386 i486 i586 i686 pentium pentium-mmx pentiumpro pentium2 pentium3 pentium3m pentium-m pentium4 pentium4m prescott nocona + conroe conroe-xe conroe-l allendale mermon mermon-xe kentsfield kentsfield-xe + penryn wolfdale yorksfield nehalem k6 k6-2 k6-3 athlon athlon-tbird athlon-4 athlon-xp athlon-mp k8 opteron athlon64 athlon-fx winchip-c6 winchip2 diff --git a/v2/tools/msvc.jam b/v2/tools/msvc.jam index 1a61f5c5c..6cb75bdb2 100644 --- a/v2/tools/msvc.jam +++ b/v2/tools/msvc.jam @@ -3,6 +3,7 @@ # Copyright (c) 2005 Alexey Pakhunov. # Copyright (c) 2006 Bojan Resnik. # Copyright (c) 2006 Ilya Sokolov. +# Copyright (c) 2007 Rene Rivera # # Use, modification and distribution is subject to the Boost Software # License Version 1.0. (See accompanying file LICENSE_1_0.txt or @@ -231,6 +232,10 @@ local rule configure-really ( { # Even if version is not explicitly specified, try to detect the version # from the path. + if [ MATCH "(Microsoft Visual Studio 9)" : $(command) ] + { + version = 9.0 ; + } if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ] { version = 8.0 ; @@ -299,8 +304,9 @@ local rule configure-really ( if ! $(below-8.0) { cpu = i386 amd64 ia64 ; - # Whereas http://msdn2.microsoft.com/en-us/library/x4d2c09s(VS.80).aspx - # say about x86_ipf, that seem to be doc bug, + # Whereas http://msdn2.microsoft.com/en-us/library/x4d2c09s(VS.80).aspx or + # http://msdn2.microsoft.com/en-us/library/x4d2c09s(vs.90).aspx + # say about x86_IPF, that seem to be doc bug, # and x86_ia64 is right one. setup-option = x86 x86_amd64 x86_ia64 ; @@ -394,13 +400,16 @@ local rule configure-really ( } -# Supported CPU types +# Supported CPU types (only Itanium optimization options are supported from +# VC++ 2005 on). See http://msdn2.microsoft.com/en-us/library/h66s5s0e(vs.90).aspx cpu-type-g5 = i586 pentium pentium-mmx ; cpu-type-g6 = i686 pentiumpro pentium2 pentium3 pentium3m pentium-m k6 k6-2 k6-3 winchip-c6 winchip2 c3 c3-2 ; -cpu-type-em64t = prescott nocona ; +cpu-type-em64t = prescott nocona + conroe conroe-xe conroe-l allendale mermon mermon-xe kentsfield kentsfield-xe + penryn wolfdale yorksfield nehalem ; cpu-type-amd64 = k8 opteron athlon64 athlon-fx ; cpu-type-g7 = @@ -465,12 +474,12 @@ rule configure-version-specific ( toolset : version : condition ) } else { - # 8.0 adds some more options + # 8.0 and above adds some more options flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/ : /favor:blend ; flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/$(cpu-type-em64t) : /favor:EM64T ; flags $(toolset).compile CFLAGS $(condition)/$(cpu-arch-amd64)/$(cpu-type-amd64) : /favor:AMD64 ; - # 8.0 only has multi-threaded static RTL + # 8.0 and above only has multi-threaded static RTL flags $(toolset).compile CFLAGS $(condition)/off/static/single : /MT ; flags $(toolset).compile CFLAGS $(condition)/on/static/single : /MTd ; } @@ -916,13 +925,14 @@ actions compile.mc .ProgramFiles = [ path.make [ common.get-program-files-dir ] ] ; -.known-versions = 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ; +.known-versions = 9.0 9.0express 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ; # Version aliases .version-alias-6 = 6.0 ; .version-alias-6.5 = 6.0 ; .version-alias-7 = 7.0 ; .version-alias-8 = 8.0 ; +.version-alias-9 = 9.0 ; # Name of the registry key that contains Visual C++ installation path # (relative to "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft" @@ -931,6 +941,8 @@ actions compile.mc .version-7.1-reg = "VisualStudio\\7.1\\Setup\\VC" ; .version-8.0-reg = "VisualStudio\\8.0\\Setup\\VC" ; .version-8.0express-reg = "VCExpress\\8.0\\Setup\\VC" ; +.version-9.0-reg = "VisualStudio\\9.0\\Setup\\VC" ; +.version-9.0express-reg = "VCExpress\\9.0\\Setup\\VC" ; # Visual C++ Toolkit 2003 do not store its installation path in the registry. # The environment variable 'VCToolkitInstallDir' and the default installation From 7724214a2b491ed9429c1e44c145afabbbfbec3d Mon Sep 17 00:00:00 2001 From: "K. Noel Belcourt" Date: Fri, 16 Nov 2007 17:30:57 +0000 Subject: [PATCH 04/40] Make vacpp toolset recognize and support version numbers. Also perform minimal options processing. [SVN r41151] --- v2/tools/vacpp.jam | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/v2/tools/vacpp.jam b/v2/tools/vacpp.jam index 6a4741c4b..1f5a53d5f 100644 --- a/v2/tools/vacpp.jam +++ b/v2/tools/vacpp.jam @@ -18,11 +18,17 @@ feature.extend toolset : vacpp ; toolset.inherit vacpp : unix ; generators.override vacpp.prebuilt : builtin.lib-generator ; generators.override vacpp.searched-lib-generator : searched-lib-generator ; -feature.subfeature toolset vacpp : version ; # Configure the vacpp toolset rule init ( version ? : command * : options * ) { + local condition = [ + common.check-init-parameters vacpp : version $(version) ] ; + + command = [ common.get-invocation-command vacpp : xlC + : $(command) : "/usr/vacpp/bin/xlC" ] ; + + common.handle-options vacpp : $(condition) : $(command) : $(options) ; } # Declare generators From 823d54698ba2f9c6ae45ecc2359fd9f0e27f93ee Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 17 Nov 2007 04:11:49 +0000 Subject: [PATCH 05/40] Add "--out-xml=xyz.xml" option that dumps the output of all actions, and the test.jam information, to the given file. Changes are mostly from Dave. [SVN r41167] --- v2/build-system.jam | 55 +++++++++++++++++++++++++++++++++++++++++++- v2/tools/testing.jam | 30 ++++++++++++++++++------ 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/v2/build-system.jam b/v2/build-system.jam index c4e3df8f9..b9c7a8180 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -487,8 +487,61 @@ for t in $(virtual-targets) { actual-targets += [ $(t).actualize ] ; } + +# Was an XML dump requested? +.out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ; +if $(.out-xml) +{ + modules.poke : .out-xml : $(.out-xml) ; + module + { + rule out-xml ( target : sources * ) + { + INCLUDES $(target) : $(sources) ; + local nl = " +" ; + on $(target) .header = + "" + "$(nl)" ; + on $(target) .footer = + $(nl)$(nl) ; + } + + actions out-xml + { + } + + rule out-xml-action-rule ( target sources * : status : user : system : command : output ? ) + { + local contents = [ on $(target) return $(.header) $(.contents) $(.footer) ] ; + local f = @($(target):E=$(contents)) ; + } + + __ACTION_RULE__ on $(.out-xml) = out-xml-action-rule ; + + rule __ACTION_RULE__ ( target sources * : status : user : system : command : output ? ) + { + local nl = " +" ; + local locate = [ on $(target) return $(LOCATE) ] ; + .contents on $(.out-xml) += + $(nl)" " + $(nl)" "$(target:G=:R=$(locate)) + $(nl)" "$(sources) + $(nl)" "$(nl) + $(nl)" " + $(nl)" "$(nl) ; + } + + __ACTION_RULE__ = __ACTION_RULE__ ; + } + + ALWAYS $(.out-xml) ; + out-xml $(.out-xml) : $(actual-targets) ; +} + NOTFILE all ; -DEPENDS all : $(actual-targets) ; +DEPENDS all : $(actual-targets) $(.out-xml) ; if $(bjam-targets) { diff --git a/v2/tools/testing.jam b/v2/tools/testing.jam index 4a5a24764..4819e00c5 100644 --- a/v2/tools/testing.jam +++ b/v2/tools/testing.jam @@ -193,6 +193,8 @@ local rule get-library-name ( path ) } } +# Was an XML dump requested? +.out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ; # Take a target (instance of 'basic-target') and prints # - its type @@ -235,13 +237,27 @@ rule dump-test ( target ) # Extract values of the feature local test-info = [ $(r).get ] ; - # Format them into a single string of quoted strings - test-info = \"$(test-info:J=\"\ \")\" ; - - ECHO boost-test($(type)) \"$(name)\" - [$(test-info)] - ":" \"$(source-files)\" - ; + if $(.out-xml) + { + local nl = " +" ; + .contents on $(.out-xml) += + $(nl)" " + $(nl)" " + $(nl)" " + $(nl)" " + ; + } + else + { + # Format them into a single string of quoted strings + test-info = \"$(test-info:J=\"\ \")\" ; + + ECHO boost-test($(type)) \"$(name)\" + [$(test-info)] + ":" \"$(source-files)\" + ; + } } # Register generators. Depending on target type, either From 020239be9680568d25a7c0a859d587b4f4f93279 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 17 Nov 2007 20:14:24 +0000 Subject: [PATCH 06/40] Add in Dave's comments, and expand information in XML output to include action names, sources, properties, bjam info, and platform info. This required one minor change to actions to keep track of the action object generating the targets. [SVN r41174] --- v2/build-system.jam | 179 +++++++++++++++++++++++++----------- v2/build/virtual-target.jam | 5 + v2/tools/testing.jam | 12 ++- 3 files changed, 139 insertions(+), 57 deletions(-) diff --git a/v2/build-system.jam b/v2/build-system.jam index b9c7a8180..8c3f98c55 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -1,5 +1,5 @@ -# Copyright 2003, 2005 Dave Abrahams -# Copyright 2006 Rene Rivera +# Copyright 2003, 2005, 2007 Dave Abrahams +# Copyright 2006, 2007 Rene Rivera # Copyright 2003, 2004, 2005, 2006 Vladimir Prus # 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) @@ -492,60 +492,141 @@ for t in $(virtual-targets) .out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ; if $(.out-xml) { - modules.poke : .out-xml : $(.out-xml) ; - module + # Generate an XML file containing build statistics for each + # constituent + rule out-xml ( xml-file : constituents * ) { - rule out-xml ( target : sources * ) - { - INCLUDES $(target) : $(sources) ; - local nl = " + # Prepare valid XML header and footer with some basic info + local nl = " " ; - on $(target) .header = - "" - "$(nl)" ; - on $(target) .footer = - $(nl)$(nl) ; - } + local jam = [ modules.peek : JAM_VERSION ] ; + local os = [ modules.peek : OS OSPLAT JAMUNAME ] "" ; + local timestamp = [ modules.peek : JAMDATE ] ; + .header on $(xml-file) = + "" + "$(nl)" + "$(nl) " + "$(nl) " + "$(nl) " + ; + .footer on $(xml-file) = + "$(nl)" ; + + # Build $(xml-file) after $(constituents) and do so even if a + # constituent action fails, and regenerate the xml on every bjam run. + INCLUDES $(xml-file) : $(constituents) ; + ALWAYS $(xml-file) ; + __ACTION_RULE__ on $(xml-file) = + build-system.out-xml.generate-action ; + out-xml.generate $(xml-file) ; + } - actions out-xml - { - } + # The actual build actions are here; if we did this work in the + # actions clause we would have to form a valid command line + # containing the result of @(...) below (the name of the XML file). + rule out-xml.generate-action ( + xml-file args * : + status : user : system : command : output ? ) + { + local contents = + [ on $(xml-file) return $(.header) $(.contents) $(.footer) ] ; + local f = @($(xml-file):E=$(contents)) ; + } - rule out-xml-action-rule ( target sources * : status : user : system : command : output ? ) + # Nothing to do here; the *real* actions happen in + # out-xml.generate-action + actions quietly out-xml.generate { } + + # Define the out-xml file target, which depends on all the targets + # so that it runs the collection after the targets have run. + out-xml $(.out-xml) : $(actual-targets) ; + + # Set up a global __ACTION_RULE__ that records all the available + # statistics about each actual target in a variable "on" the + # --out-xml target. + rule out-xml.collect ( + xml-file target : + status : user : system : command : output ? ) + { + local nl = " +" ; + # Open the action with some basic info. + .contents on $(xml-file) += + "$(nl) " + ; + + # If we have an action object we can print out more detailed info. + local action = [ on $(target) return $(.action) ] ; + if $(action) { - local contents = [ on $(target) return $(.header) $(.contents) $(.footer) ] ; - local f = @($(target):E=$(contents)) ; + local action-name = [ $(action).action-name ] ; + local action-sources = [ $(action).sources ] ; + local action-props = [ $(action).properties ] ; + + # The qualified name of the action which we created the target. + .contents on $(xml-file) += + "$(nl) " + ; + + # The sources that made up the target. + .contents on $(xml-file) += + "$(nl) " + ; + for local source in $(action-sources) + { + local source-actual = [ $(source).actual-name ] ; + .contents on $(xml-file) += + "$(nl) " + ; + } + .contents on $(xml-file) += + "$(nl) " + ; + + # The properties that define the conditions under which the + # target was built. + .contents on $(xml-file) += + "$(nl) " + ; + for local prop in [ $(action-props).raw ] + { + local prop-name = [ MATCH ^<(.*)>$ : $(prop:G) ] ; + .contents on $(xml-file) += + "$(nl) " + ; + } + .contents on $(xml-file) += + "$(nl) " + ; } - __ACTION_RULE__ on $(.out-xml) = out-xml-action-rule ; - - rule __ACTION_RULE__ ( target sources * : status : user : system : command : output ? ) - { - local nl = " -" ; - local locate = [ on $(target) return $(LOCATE) ] ; - .contents on $(.out-xml) += - $(nl)" " - $(nl)" "$(target:G=:R=$(locate)) - $(nl)" "$(sources) - $(nl)" "$(nl) - $(nl)" " - $(nl)" "$(nl) ; - } - - __ACTION_RULE__ = __ACTION_RULE__ ; + local locate = [ on $(target) return $(LOCATE) ] ; + .contents on $(xml-file) += + "$(nl) " + "$(nl) " + "$(nl) " + ; + .contents on $(xml-file) += + "$(nl) " + ; + } + + # When no __ACTION_RULE__ is set "on" a target, the search falls + # back to the global module + module + { + __ACTION_RULE__ = build-system.out-xml.collect + [ modules.peek build-system : .out-xml ] ; } - - ALWAYS $(.out-xml) ; - out-xml $(.out-xml) : $(actual-targets) ; } NOTFILE all ; -DEPENDS all : $(actual-targets) $(.out-xml) ; +DEPENDS all : $(actual-targets) ; if $(bjam-targets) { - UPDATE $(bjam-targets:G=e) ; + UPDATE $(bjam-targets:G=e) $(.out-xml) ; } else if $(cleanall) { @@ -560,13 +641,13 @@ else if $(clean) # Remove only derived targets. if [ $(t).action ] - { + { if $(t) in $(targets-to-clean) || [ is-child [ $(p).project-module ] ] = true { to-clean += $(t) ; - } - } + } + } } local to-clean-actual ; for local t in $(to-clean) @@ -575,14 +656,8 @@ else if $(clean) } common.Clean clean : $(to-clean-actual) ; UPDATE clean ; - - } - else { - UPDATE all ; + UPDATE all $(.out-xml) ; } - - - diff --git a/v2/build/virtual-target.jam b/v2/build/virtual-target.jam index c05ca5029..45b717d96 100644 --- a/v2/build/virtual-target.jam +++ b/v2/build/virtual-target.jam @@ -716,6 +716,11 @@ class action [ indirect.get-rule $(self.action-name[1]) ] $(actual-targets) : $(properties) ; + # Reflect ourselves in a variable for the target. This allows + # looking up additional info for the action given the raw target. + # For example to debug or output action information from action rules. + .action on $(actual-targets) = $(__name__) ; + indirect.call $(self.action-name) $(actual-targets) : $(self.actual-sources) : [ $(properties).raw ] ; diff --git a/v2/tools/testing.jam b/v2/tools/testing.jam index 4819e00c5..16124e533 100644 --- a/v2/tools/testing.jam +++ b/v2/tools/testing.jam @@ -237,15 +237,17 @@ rule dump-test ( target ) # Extract values of the feature local test-info = [ $(r).get ] ; + # If the user requested XML output on the command-line, add the + # test info to that XML file rather than dumping them to stdout. if $(.out-xml) { - local nl = " + local nl = " " ; .contents on $(.out-xml) += - $(nl)" " - $(nl)" " - $(nl)" " - $(nl)" " + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " ; } else From 4f4c9276669db4d5b994e813d8c06b3be9c7addb Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 17 Nov 2007 21:22:40 +0000 Subject: [PATCH 07/40] Add working dir to build description, move jam version to an attribute. [SVN r41182] --- v2/build-system.jam | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/v2/build-system.jam b/v2/build-system.jam index 8c3f98c55..4584de910 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -502,12 +502,14 @@ if $(.out-xml) local jam = [ modules.peek : JAM_VERSION ] ; local os = [ modules.peek : OS OSPLAT JAMUNAME ] "" ; local timestamp = [ modules.peek : JAMDATE ] ; + local cwd = [ PWD ] ; .header on $(xml-file) = "" "$(nl)" - "$(nl) " + "$(nl) " "$(nl) " "$(nl) " + "$(nl) " ; .footer on $(xml-file) = "$(nl)" ; @@ -552,8 +554,7 @@ if $(.out-xml) " ; # Open the action with some basic info. .contents on $(xml-file) += - "$(nl) " + "$(nl) " ; # If we have an action object we can print out more detailed info. @@ -603,6 +604,7 @@ if $(.out-xml) local locate = [ on $(target) return $(LOCATE) ] ; .contents on $(xml-file) += + "$(nl) " "$(nl) " "$(nl) " "$(nl) " From 7c26ce083ba687156a713930722d67fd942cb748 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 17 Nov 2007 22:09:26 +0000 Subject: [PATCH 08/40] Change "actual" to the more natural "target", and change "target" to "path". Add bjam command and bb version to XML. [SVN r41186] --- v2/build-system.jam | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/v2/build-system.jam b/v2/build-system.jam index 4584de910..af53ad660 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -499,17 +499,20 @@ if $(.out-xml) # Prepare valid XML header and footer with some basic info local nl = " " ; - local jam = [ modules.peek : JAM_VERSION ] ; + local jam = [ version.jam ] ; local os = [ modules.peek : OS OSPLAT JAMUNAME ] "" ; local timestamp = [ modules.peek : JAMDATE ] ; local cwd = [ PWD ] ; + local command = [ modules.peek : ARGV ] ; + local bb-version = [ version.boost-build ] ; .header on $(xml-file) = "" - "$(nl)" + "$(nl)" "$(nl) " "$(nl) " "$(nl) " "$(nl) " + "$(nl) " ; .footer on $(xml-file) = "$(nl)" ; @@ -603,9 +606,10 @@ if $(.out-xml) } local locate = [ on $(target) return $(LOCATE) ] ; + locate ?= "" ; .contents on $(xml-file) += - "$(nl) " - "$(nl) " + "$(nl) " + "$(nl) " "$(nl) " "$(nl) " ; From 33692c73dad93408ade09385dbedd88f33efb5d5 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 18 Nov 2007 06:42:14 +0000 Subject: [PATCH 09/40] Add to XML output the known targets and dependencies to allow creation of the full build dependency graph. Merge from Dave's Bitten branch. [SVN r41192] --- v2/build-system.jam | 52 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/v2/build-system.jam b/v2/build-system.jam index af53ad660..b9170a8da 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -492,6 +492,15 @@ for t in $(virtual-targets) .out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ; if $(.out-xml) { + # Get the qualified name of a virtual target. + rule full-target-name ( t ) + { + local name = [ $(t).name ] ; + local project = [ $(t).project ] ; + local project-path = [ $(project).get location ] ; + return $(project-path)//$(name) ; + } + # Generate an XML file containing build statistics for each # constituent rule out-xml ( xml-file : constituents * ) @@ -516,7 +525,46 @@ if $(.out-xml) ; .footer on $(xml-file) = "$(nl)" ; - + # Generate target dependency graph + .contents on $(xml-file) += + "$(nl) " + ; + + for local t in [ virtual-target.all-targets ] + { + local action = [ $(t).action ] ; + if $(action) + { + # If a target has no action, it has + # no dependencies. + + local name = [ full-target-name $(t) ] ; + local sources = [ $(action).sources ] ; + local dependencies ; + for local s in $(sources) + { + dependencies += [ full-target-name $(s) ] ; + } + + local path = [ $(t).path ] ; + local jam-target = [ $(t).actual-name ] ; + + .contents on $(xml-file) += + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " + "$(nl) " + ; + } + } + .contents on $(xml-file) += + "$(nl) " + ; + # Build $(xml-file) after $(constituents) and do so even if a # constituent action fails, and regenerate the xml on every bjam run. INCLUDES $(xml-file) : $(constituents) ; @@ -608,7 +656,7 @@ if $(.out-xml) local locate = [ on $(target) return $(LOCATE) ] ; locate ?= "" ; .contents on $(xml-file) += - "$(nl) " + "$(nl) " "$(nl) " "$(nl) " "$(nl) " From e29345438ea9ccb9888eac8685359d60f83bbee7 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 18 Nov 2007 20:24:25 +0000 Subject: [PATCH 10/40] Inspection report fixes. [SVN r41212] --- v2/build/build-request.jam | 7 ++-- v2/build/modifiers.jam | 7 ++-- v2/doc/Jamfile.v2 | 3 ++ v2/example/generate/Jamroot | 43 +++++++++++--------- v2/example/generate/REAME.txt | 3 ++ v2/example/generate/a.cpp | 6 +++ v2/example/generator/Jamroot | 5 ++- v2/example/generator/README.txt | 3 ++ v2/example/generator/foo.gci | 7 +++- v2/example/generator/soap.jam | 27 ++++++------ v2/example/python_modules/Jamroot | 5 ++- v2/example/python_modules/python_helpers.jam | 3 ++ v2/example/python_modules/python_helpers.py | 5 ++- v2/test/dependency_property.py | 7 ++-- v2/test/dependency_test.py | 5 +++ v2/test/double_loading.py | 7 ++-- v2/test/duplicate.py | 7 ++-- v2/test/echo_args.jam | 4 ++ v2/test/empty.jam | 6 ++- v2/test/expansion.py | 7 ++-- v2/test/explicit.py | 7 ++-- v2/test/gcc_runtime.py | 7 ++-- v2/test/project-test3/lib3/Jamfile | 3 ++ v2/test/readme.txt | 4 ++ v2/test/test_system.html | 8 ++-- 25 files changed, 122 insertions(+), 74 deletions(-) diff --git a/v2/build/build-request.jam b/v2/build/build-request.jam index 82d39b022..d0ff34f39 100644 --- a/v2/build/build-request.jam +++ b/v2/build/build-request.jam @@ -1,7 +1,6 @@ -# (C) Copyright David Abrahams 2002. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2002 Dave Abrahams +# 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 sequence ; import set ; diff --git a/v2/build/modifiers.jam b/v2/build/modifiers.jam index 9a4e150ac..40bed930d 100644 --- a/v2/build/modifiers.jam +++ b/v2/build/modifiers.jam @@ -1,7 +1,6 @@ -# (C) Copyright Rene Rivera, 2003. -# -# See accompanying license for terms and conditions of use. -# +# Copyright 2003 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) # Modifiers are generalized generators that mutate targets in specific ways. # This structure allows for grouping a variety of functionality in an diff --git a/v2/doc/Jamfile.v2 b/v2/doc/Jamfile.v2 index e5e83c479..a00f6ff7d 100644 --- a/v2/doc/Jamfile.v2 +++ b/v2/doc/Jamfile.v2 @@ -1,3 +1,6 @@ +# Copyright 2004,2006 Vladimir Prus +# 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 quickbook ; diff --git a/v2/example/generate/Jamroot b/v2/example/generate/Jamroot index 52c00d811..bc8563a4a 100644 --- a/v2/example/generate/Jamroot +++ b/v2/example/generate/Jamroot @@ -1,3 +1,6 @@ +# Copyright 2007 Vladimir Prus +# 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 common ; import "class" : new ; @@ -7,26 +10,26 @@ rule generate-example ( project name : property-set : sources * ) local result ; for local s in $(sources) { - #local ea = [ $(s).action ] ; - #local ep = [ $(ea).properties ] ; - - # Create a new action, that takes the source target - # and runs 'common.copy' comamnd on it. - local a = [ - new non-scanning-action $(s) : common.copy : $(property-set) ] ; - - local source-name = [ $(s).name ] ; - - # Create the target to represent the result of the action. - # The target has the name that was specified in Jamfile - # and passed here via the 'name' parameter, - # and the same type and project as the source. - result += [ new file-target $(name) - : [ $(s).type ] - : $(project) - : $(a) ] ; - } + #local ea = [ $(s).action ] ; + #local ep = [ $(ea).properties ] ; + + # Create a new action, that takes the source target + # and runs 'common.copy' comamnd on it. + local a = [ + new non-scanning-action $(s) : common.copy : $(property-set) ] ; + + local source-name = [ $(s).name ] ; + + # Create the target to represent the result of the action. + # The target has the name that was specified in Jamfile + # and passed here via the 'name' parameter, + # and the same type and project as the source. + result += [ new file-target $(name) + : [ $(s).type ] + : $(project) + : $(a) ] ; + } return $(result) ; } -generate a2 : a.cpp : @generate-example ; \ No newline at end of file +generate a2 : a.cpp : @generate-example ; diff --git a/v2/example/generate/REAME.txt b/v2/example/generate/REAME.txt index e4e9e9781..e8cecc1ed 100644 --- a/v2/example/generate/REAME.txt +++ b/v2/example/generate/REAME.txt @@ -10,3 +10,6 @@ flexible. Please consult the docs for more explanations. +# Copyright 2007 Vladimir Prus +# 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) diff --git a/v2/example/generate/a.cpp b/v2/example/generate/a.cpp index 42187a0de..364975671 100644 --- a/v2/example/generate/a.cpp +++ b/v2/example/generate/a.cpp @@ -2,3 +2,9 @@ int main() { } + +/* +Copyright 2007 Vladimir Prus +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) + */ diff --git a/v2/example/generator/Jamroot b/v2/example/generator/Jamroot index a67e24ca0..9703134db 100644 --- a/v2/example/generator/Jamroot +++ b/v2/example/generator/Jamroot @@ -1,3 +1,6 @@ +# Copyright 2006 Vladimir Prus +# 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 soap ; -exe foo : foo.gci : on ; \ No newline at end of file +exe foo : foo.gci : on ; diff --git a/v2/example/generator/README.txt b/v2/example/generator/README.txt index 340b9a7bd..c711dd206 100644 --- a/v2/example/generator/README.txt +++ b/v2/example/generator/README.txt @@ -2,3 +2,6 @@ This example shows how to declare a new generator class. It's necessary when generator's logic is more complex that just running a single tool. +# Copyright 2006 Vladimir Prus +# 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) diff --git a/v2/example/generator/foo.gci b/v2/example/generator/foo.gci index 7d5f90dff..2ccc45c6c 100644 --- a/v2/example/generator/foo.gci +++ b/v2/example/generator/foo.gci @@ -2,4 +2,9 @@ int main() { return 0; -} \ No newline at end of file +} +/* +Copyright 2006 Vladimir Prus +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) + */ diff --git a/v2/example/generator/soap.jam b/v2/example/generator/soap.jam index ce69391f4..d28bfdecc 100644 --- a/v2/example/generator/soap.jam +++ b/v2/example/generator/soap.jam @@ -1,3 +1,6 @@ +# Copyright 2006 Vladimir Prus +# 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) # This is example of a fictional code generator tool. # It accepts a single input of type '.gci' and produces @@ -19,47 +22,47 @@ feature.feature server : off on : incidental ; class soap-generator : generator { import "class" : new ; - + rule __init__ ( * : * ) { generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; } - + rule run ( project name ? : property-set : sources * ) { if ! $(sources[2]) { # Accept only single source. local t = [ $(sources[1]).type ] ; - if $(t) = GCI + if $(t) = GCI { # The type is correct. - + # If no output name is specified, guess it from sources. if ! $(name) { name = [ generator.determine-output-name $(sources) ] ; } - + # Produce one output, using just copy. - local a = [ new action $(sources[1]) + local a = [ new action $(sources[1]) : common.copy : $(property-set) ] ; local t = [ new file-target $(name) : CPP : $(project) : $(a) ] ; - + # If in server mode, create another output -- an # empty file. If this were a real SOAP generator, we # might have created a single action, and two targets # both using that action. - local t2 ; - if [ $(property-set).get ] = "on" - { + local t2 ; + if [ $(property-set).get ] = "on" + { local a = [ new action : soap.touch : $(property-set) ] ; t2 = [ new file-target $(name)_server : CPP : $(project) : $(a) ] ; } - return [ virtual-target.register $(t) ] - [ virtual-target.register $(t2) ] ; + return [ virtual-target.register $(t) ] + [ virtual-target.register $(t2) ] ; } } } diff --git a/v2/example/python_modules/Jamroot b/v2/example/python_modules/Jamroot index f504aaeb0..c53e75d58 100644 --- a/v2/example/python_modules/Jamroot +++ b/v2/example/python_modules/Jamroot @@ -1,5 +1,8 @@ +# Copyright 2006 Vladimir Prus +# 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 python_helpers ; ECHO "test1:" [ python_helpers.test1 ] ; -ECHO "test2:" [ python_helpers.test2 1234 : 5678 ] ; \ No newline at end of file +ECHO "test2:" [ python_helpers.test2 1234 : 5678 ] ; diff --git a/v2/example/python_modules/python_helpers.jam b/v2/example/python_modules/python_helpers.jam index d21e2d732..d6363af67 100644 --- a/v2/example/python_modules/python_helpers.jam +++ b/v2/example/python_modules/python_helpers.jam @@ -1,3 +1,6 @@ +# Copyright 2006 Vladimir Prus +# 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 the Python rules to Boost.Build PYTHON_IMPORT_RULE python_helpers : test1 : python_helpers : test1 ; diff --git a/v2/example/python_modules/python_helpers.py b/v2/example/python_modules/python_helpers.py index 4b5839f27..8148f57c3 100644 --- a/v2/example/python_modules/python_helpers.py +++ b/v2/example/python_modules/python_helpers.py @@ -1,3 +1,6 @@ +# Copyright 2006 Vladimir Prus +# 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) # Declare a couple of functions called from Boost.Build # @@ -10,6 +13,6 @@ def test1(l): return ["foo", "bar"] - + def test2(l, l2): return [l[0], l2[0]] \ No newline at end of file diff --git a/v2/test/dependency_property.py b/v2/test/dependency_property.py index 3004c3554..5383108b2 100644 --- a/v2/test/dependency_property.py +++ b/v2/test/dependency_property.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2003 Vladimir Prus +# 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) # Regression test: virtual targets with different dependency properties # were considered different by 'virtual-target.register', but the code diff --git a/v2/test/dependency_test.py b/v2/test/dependency_test.py index 6a1b4972e..be056f415 100644 --- a/v2/test/dependency_test.py +++ b/v2/test/dependency_test.py @@ -1,5 +1,10 @@ #!/usr/bin/python +# Copyright 2003 Dave Abrahams +# Copyright 2002, 2003, 2005, 2006 Vladimir Prus +# 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) + from BoostBuild import Tester, List t = Tester() diff --git a/v2/test/double_loading.py b/v2/test/double_loading.py index e1418dccd..14bb0ea43 100644 --- a/v2/test/double_loading.py +++ b/v2/test/double_loading.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2003 Vladimir Prus +# 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) from BoostBuild import Tester, List import string diff --git a/v2/test/duplicate.py b/v2/test/duplicate.py index f26de455a..18922e75b 100644 --- a/v2/test/duplicate.py +++ b/v2/test/duplicate.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2004. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2004 Vladimir Prus +# 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) # This test tries to stage the same file to the same location by *two* # different stage rules, in two different projects. This is not exactly diff --git a/v2/test/echo_args.jam b/v2/test/echo_args.jam index 99fff9868..0f6956e46 100644 --- a/v2/test/echo_args.jam +++ b/v2/test/echo_args.jam @@ -1,3 +1,7 @@ +# Copyright 2001 Dave Abrahams +# 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) + rule echo_args ( a b ? c ? : d + : e * ) { ECHO a= $(a) b= $(b) c= $(c) ":" d= $(d) ":" e= $(e) ; diff --git a/v2/test/empty.jam b/v2/test/empty.jam index 712bd9a2e..895b1087e 100644 --- a/v2/test/empty.jam +++ b/v2/test/empty.jam @@ -1 +1,5 @@ -# This file is empty; it just suppresses warnings \ No newline at end of file +# This file is empty; it just suppresses warnings + +# Copyright 2001 Dave Abrahams +# 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) diff --git a/v2/test/expansion.py b/v2/test/expansion.py index 71b0bc893..b3e93e38c 100644 --- a/v2/test/expansion.py +++ b/v2/test/expansion.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2003 Vladimir Prus +# 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) # This file is template for Boost.Build tests. It creates a simple # project that builds one exe from one source, and checks that the exe diff --git a/v2/test/explicit.py b/v2/test/explicit.py index 616ce9248..a2c183308 100644 --- a/v2/test/explicit.py +++ b/v2/test/explicit.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2003. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2003 Vladimir Prus +# 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) # This file is template for Boost.Build tests. It creates a simple # project that builds one exe from one source, and checks that the exe diff --git a/v2/test/gcc_runtime.py b/v2/test/gcc_runtime.py index 2efb68704..bb3bb75d2 100644 --- a/v2/test/gcc_runtime.py +++ b/v2/test/gcc_runtime.py @@ -1,9 +1,8 @@ #!/usr/bin/python -# Copyright (C) Vladimir Prus 2004. Permission to copy, use, modify, sell and -# distribute this software is granted provided this copyright notice appears in -# all copies. This software is provided "as is" without express or implied -# warranty, and with no claim as to its suitability for any purpose. +# Copyright 2004 Vladimir Prus +# 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) # Tests that on gcc, we correctly report problem when static runtime # is requested when building DLL. diff --git a/v2/test/project-test3/lib3/Jamfile b/v2/test/project-test3/lib3/Jamfile index a6e61f6b6..0d457817e 100644 --- a/v2/test/project-test3/lib3/Jamfile +++ b/v2/test/project-test3/lib3/Jamfile @@ -1,3 +1,6 @@ +# Copyright 2003, 2005 Vladimir Prus +# 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) # This project-root.jam also serves the role of Jamfile project lib3 ; diff --git a/v2/test/readme.txt b/v2/test/readme.txt index 0d2fb4631..b29e79dc0 100644 --- a/v2/test/readme.txt +++ b/v2/test/readme.txt @@ -1,3 +1,7 @@ Comprehensive tests for Boost.Build v2; requires Python. To test, execute: python test_all.py + +# Copyright 2002 Dave Abrahams +# 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) diff --git a/v2/test/test_system.html b/v2/test/test_system.html index d70935222..7cdb48529 100644 --- a/v2/test/test_system.html +++ b/v2/test/test_system.html @@ -545,11 +545,9 @@ t.cleanup()

Last modified: Mar 11, 2005

-

© Copyright Vladimir Prus 2002, 2003, 2004, 2005. Permission to - copy, use, modify, sell and distribute this document is granted provided - this copyright notice appears in all copies. This document is provided - ``as is'' without express or implied warranty, and with no claim as to - its suitability for any purpose.

+

© Copyright Vladimir Prus 2002, 2003, 2004, 2005. + 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)

From eb7f1625d126fb67666c23fd6f8d19eb82b011b6 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 19 Nov 2007 17:44:31 +0000 Subject: [PATCH 11/40] Make quietly actions really quiet by not printing the command output. The output for the quietly actions is still available through "__ACTION_RULE__". [SVN r41236] --- historic/jam/src/output.c | 28 +++++++++----- historic/jam/test/actions_quietly.jam | 55 +++++++++++++++++++++++++++ historic/jam/test/test.jam | 1 + 3 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 historic/jam/test/actions_quietly.jam diff --git a/historic/jam/src/output.c b/historic/jam/src/output.c index a43dbd9cd..8f7dd0da8 100644 --- a/historic/jam/src/output.c +++ b/historic/jam/src/output.c @@ -63,7 +63,11 @@ void out_action( case EXIT_TIMEOUT: { /* process expired, make user aware with explicit message */ - fprintf(bjam_out, "%d second time limit exceeded\n", globs.timeout); + if ( action ) + { + /* but only output for non-quietly actions */ + fprintf(bjam_out, "%d second time limit exceeded\n", globs.timeout); + } break; } default: @@ -71,16 +75,20 @@ void out_action( } /* print out the command output, if requested */ - if (0 != out_data && - ( globs.pipe_action & 1 /* STDOUT_FILENO */ || - globs.pipe_action == 0)) + if ( action ) { - out_(out_data,bjam_out); - } - if (0 != err_data && - globs.pipe_action & 2 /* STDERR_FILENO */) - { - out_(err_data,bjam_err); + /* but only output for non-quietly actions */ + if (0 != out_data && + ( globs.pipe_action & 1 /* STDOUT_FILENO */ || + globs.pipe_action == 0)) + { + out_(out_data,bjam_out); + } + if (0 != err_data && + globs.pipe_action & 2 /* STDERR_FILENO */) + { + out_(err_data,bjam_err); + } } fflush(bjam_out); diff --git a/historic/jam/test/actions_quietly.jam b/historic/jam/test/actions_quietly.jam new file mode 100644 index 000000000..ad5e84ddd --- /dev/null +++ b/historic/jam/test/actions_quietly.jam @@ -0,0 +1,55 @@ +#~ Copyright 2007 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) + +if ! $(BJAM_SUBTEST) +{ + ECHO --- Testing \"actions quietly\"... ; + + assert "...found 4 targets... +...updating 2 targets... +.a. subtest_a + +echo [subtest_a] 0 +echo [subtest_a] 1 +echo [subtest_a] 2 + +[subtest_a] 0 +[subtest_a] 1 +[subtest_a] 2 +.a. subtest_b + +echo [subtest_b] 0 +echo [subtest_b] 1 +echo [subtest_b] 2 + +[subtest_b] 0 +[subtest_b] 1 +[subtest_b] 2 +...updated 2 targets... +" : (==) : [ SHELL "$(ARGV[1]) -f actions_quietly.jam -sBJAM_SUBTEST=1 -d2" ] ; + + assert "...found 4 targets... +...updating 2 targets... +...updated 2 targets... +" : (==) : [ SHELL "$(ARGV[1]) -f actions_quietly.jam -sBJAM_SUBTEST=1" ] ; +} +else +{ + actions quietly .a. + { +echo [$(<:B)] 0 +echo [$(<:B)] 1 +echo [$(<:B)] 2 + } + + rule .a. + { + DEPENDS $(<) : $(>) ; + } + + NOTFILE subtest ; + .a. subtest_a : subtest ; + .a. subtest_b : subtest ; + DEPENDS all : subtest_a subtest_b ; +} diff --git a/historic/jam/test/test.jam b/historic/jam/test/test.jam index 9d07c2df8..10a16116b 100644 --- a/historic/jam/test/test.jam +++ b/historic/jam/test/test.jam @@ -41,6 +41,7 @@ rule assert ( expected * : test ? : obtained * ) } } +include actions_quietly.jam ; include builtin_shell.jam ; include builtin_w32_getregnames.jam ; include option_d2.jam ; From 408b691bc97cb52183c954883862444b1d973feb Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 19 Nov 2007 18:02:43 +0000 Subject: [PATCH 12/40] Add architecture and instruction-set values for HP/PA-RISC. [SVN r41237] --- v2/tools/builtin.jam | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v2/tools/builtin.jam b/v2/tools/builtin.jam index 962df6e6f..28cf8c412 100644 --- a/v2/tools/builtin.jam +++ b/v2/tools/builtin.jam @@ -205,6 +205,8 @@ feature architecture : power # MIPS/SGI mips1 mips2 mips3 mips4 mips32 mips32r2 mips64 + # HP/PA-RISC + parisc # : propagated optional ; @@ -237,6 +239,8 @@ feature instruction-set : r2000 r3000 r3900 r4000 r4100 r4300 r4400 r4600 r4650 r6000 r8000 rm7000 rm9000 orion sb1 vr4100 vr4111 vr4120 vr4130 vr4300 vr5000 vr5400 vr5500 + # HP/PA-RISC + 700 7100 7100lc 7200 7300 8000 # : propagated optional ; From c4296e131fc1f76026ce1ab88a56758a5bccd42d Mon Sep 17 00:00:00 2001 From: Boris Gubenko Date: Mon, 19 Nov 2007 19:25:21 +0000 Subject: [PATCH 13/40] add OSPLAT=PARISC for HP-UX PA-RISC [SVN r41242] --- historic/jam/src/jam.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/historic/jam/src/jam.h b/historic/jam/src/jam.h index 49a1cef60..cfae431ff 100644 --- a/historic/jam/src/jam.h +++ b/historic/jam/src/jam.h @@ -483,6 +483,10 @@ # define OSPLAT "OSPLAT=390" # endif +# ifdef __hppa +# define OSPLAT "OSPLAT=PARISC" +# endif + # ifndef OSPLAT # define OSPLAT "" # endif From ab07ba65231796824cb7da8cd1fa68821bade33d Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 24 Nov 2007 02:16:50 +0000 Subject: [PATCH 14/40] Allow use of "conditional" to multiply a condition that already has the full condition in it. [SVN r41324] --- v2/build/project.jam | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/v2/build/project.jam b/v2/build/project.jam index 92d4a958a..ec9826828 100644 --- a/v2/build/project.jam +++ b/v2/build/project.jam @@ -1007,7 +1007,15 @@ module project-rules # rule conditional ( condition + : requirements * ) { - return $(condition:J=,):$(requirements) ; + local condition = $(condition:J=,) ; + if [ MATCH (:) : $(condition) ] + { + return $(condition)$(requirements) ; + } + else + { + return $(condition):$(requirements) ; + } } } From d17ea0e96412bb3a5d938a3bdaa141d70166a580 Mon Sep 17 00:00:00 2001 From: "K. Noel Belcourt" Date: Sat, 24 Nov 2007 19:09:56 +0000 Subject: [PATCH 15/40] Replace mpi wrappers with native pathscale compilers. Fixed how we invoke f77 (pathf90 -f77). Thanks to Alain Miniussi for reporting this. [SVN r41341] --- v2/tools/pathscale.jam | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/v2/tools/pathscale.jam b/v2/tools/pathscale.jam index b4c0578cd..26ecf496d 100644 --- a/v2/tools/pathscale.jam +++ b/v2/tools/pathscale.jam @@ -23,19 +23,19 @@ rule init ( version ? : command * : options * ) { local condition = [ common.check-init-parameters pathscale : version $(version) ] ; - command = [ common.get-invocation-command pathscale : mpicxx : $(command) ] ; + command = [ common.get-invocation-command pathscale : pathCC : $(command) ] ; common.handle-options pathscale : $(condition) : $(command) : $(options) ; toolset.flags pathscale.compile.fortran90 OPTIONS $(condition) : [ feature.get-values : $(options) ] : unchecked ; - command_c = $(command_c[1--2]) $(command[-1]:B=mpicxx) ; + command_c = $(command_c[1--2]) $(command[-1]:B=pathCC) ; toolset.flags pathscale CONFIG_C_COMMAND $(condition) : $(command_c) ; # fortran support - local f-command = [ common.get-invocation-command pathscale : mpif77 : $(command) ] ; + local f-command = [ common.get-invocation-command pathscale : pathf90 : $(command) ] ; local command_f = $(command_f[1--2]) $(f-command[-1]:B=pathf77) ; local command_f90 = $(command_f[1--2]) $(f-command[-1]:B=pathf90) ; @@ -84,7 +84,7 @@ actions compile.c++ actions compile.fortran { - "$(CONFIG_F_COMMAND)" $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" + "$(CONFIG_F_COMMAND)" -f77 $(OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" } rule compile.fortran90 ( targets * : sources * : properties * ) From 6cdbd3e4e222066e4d682d0460d832941a0f7eec Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 27 Nov 2007 17:53:56 +0000 Subject: [PATCH 16/40] Remove non-existent option info. [SVN r41414] --- historic/jam/src/jam.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/historic/jam/src/jam.c b/historic/jam/src/jam.c index d98b099c7..5bf08b985 100644 --- a/historic/jam/src/jam.c +++ b/historic/jam/src/jam.c @@ -249,9 +249,8 @@ int main( int argc, char **argv, char **arg_environ ) printf( "-lx Limit actions to x number of seconds after which they are stopped.\n" ); printf( "-n Don't actually execute the updating actions.\n" ); printf( "-ox Write the updating actions to file x.\n" ); - printf( "-px x=0, pipes action stdout and stderr merged into action output.\n" ); - printf( "-q Quit quickly as soon as a target fails.\n" ); - printf( "-r Enable Dart results.\n" ); + printf( "-px x=0, pipes action stdout and stderr merged into action output.\n" ); + printf( "-q Quit quickly as soon as a target fails.\n" ); printf( "-sx=y Set variable x=y, overriding environment.\n" ); printf( "-tx Rebuild x, even if it is up-to-date.\n" ); printf( "-v Print the version of jam and exit.\n" ); From 7109c033f07f1871b734926d1121aa5a72f6cc86 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 27 Nov 2007 17:55:13 +0000 Subject: [PATCH 17/40] Add some utility output formatting functions. [SVN r41415] --- historic/jam/src/output.c | 24 ++++++++++++++++++++++++ historic/jam/src/output.h | 6 ++++++ 2 files changed, 30 insertions(+) diff --git a/historic/jam/src/output.c b/historic/jam/src/output.c index 8f7dd0da8..1204d8d4f 100644 --- a/historic/jam/src/output.c +++ b/historic/jam/src/output.c @@ -6,6 +6,7 @@ #include "jam.h" #include "output.h" +#include "newstr.h" #include #define bjam_out (stdout) @@ -95,3 +96,26 @@ void out_action( fflush(bjam_err); fflush(globs.cmdout); } + + +char * outf_int( int value ) +{ + char buffer[50]; + sprintf(buffer, "%i", value); + return newstr(buffer); +} + +char * outf_double( double value ) +{ + char buffer[50]; + sprintf(buffer, "%f", value); + return newstr(buffer); +} + +char * outf_time( time_t value ) +{ + char buffer[50]; + strftime(buffer,49,"%Y-%m-%d %H:%M:%SZ",gmtime(&value)); + return newstr(buffer); +} + diff --git a/historic/jam/src/output.h b/historic/jam/src/output.h index 079c048a7..6cd1b6c88 100644 --- a/historic/jam/src/output.h +++ b/historic/jam/src/output.h @@ -7,6 +7,8 @@ #ifndef BJAM_OUTPUT_H #define BJAM_OUTPUT_H +#include + #define EXIT_OK 0 #define EXIT_FAIL 1 #define EXIT_TIMEOUT 2 @@ -20,4 +22,8 @@ void out_action( int exit_reason ); +char * outf_int( int value ); +char * outf_double( double value ); +char * outf_time( time_t value ); + #endif From 79bc7ec202104bab5c3830f6fb816bbe175f54d6 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 27 Nov 2007 17:57:15 +0000 Subject: [PATCH 18/40] Check empty string invariants, instead of assuming all strings are allocated. And reset strings when they are freed. [SVN r41416] --- historic/jam/src/strings.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/historic/jam/src/strings.c b/historic/jam/src/strings.c index e54434bfc..5a4efe27f 100644 --- a/historic/jam/src/strings.c +++ b/historic/jam/src/strings.c @@ -16,6 +16,14 @@ static void assert_invariants( string* self ) { int i; + + if ( self->value == 0 ) + { + assert( self->size == 0 ); + assert( self->capacity == 0 ); + assert( self->opt[0] == 0 ); + return; + } assert( self->size < self->capacity ); assert( ( self->capacity <= sizeof(self->opt) ) == ( self->value == self->opt ) ); @@ -49,6 +57,7 @@ void string_free( string* s ) assert_invariants( s ); if ( s->value != s->opt ) BJAM_FREE( s->value ); + string_new( s ); } static void string_reserve_internal( string* self, size_t capacity ) From edf794fe4cca0595f73fc2407251fb67e55162f4 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 27 Nov 2007 17:58:50 +0000 Subject: [PATCH 19/40] Fix buffer overrun bug in expanding @() subexpressions. [SVN r41417] --- historic/jam/src/variable.c | 296 ++++++++++++++++++------------------ 1 file changed, 150 insertions(+), 146 deletions(-) diff --git a/historic/jam/src/variable.c b/historic/jam/src/variable.c index 2832e5e92..808d92547 100644 --- a/historic/jam/src/variable.c +++ b/historic/jam/src/variable.c @@ -177,143 +177,147 @@ var_defines( char *const* e, int preprocess ) int var_string( - char *in, - char *out, - int outsize, - LOL *lol ) + char *in, + char *out, + int outsize, + LOL *lol ) { - char *out0 = out; - char *oute = out + outsize - 1; + char *out0 = out; + char *oute = out + outsize - 1; - while( *in ) - { - char *lastword; - int dollar = 0; + while( *in ) + { + char *lastword; + int dollar = 0; - /* Copy white space */ + /* Copy white space */ - while( isspace( *in ) ) - { - if( out >= oute ) - return -1; + while( isspace( *in ) ) + { + if( out >= oute ) + return -1; - *out++ = *in++; - } + *out++ = *in++; + } - lastword = out; + lastword = out; - /* Copy non-white space, watching for variables */ + /* Copy non-white space, watching for variables */ - while( *in && !isspace( *in ) ) - { - if( out >= oute ) - return -1; + while( *in && !isspace( *in ) ) + { + if( out >= oute ) + return -1; - if( in[0] == '$' && in[1] == '(' ) - dollar++; - #ifdef OPT_AT_FILES - else if ( in[0] == '@' && in[1] == '(' ) + if( in[0] == '$' && in[1] == '(' ) + { + dollar++; + *out++ = *in++; + } + #ifdef OPT_AT_FILES + else if ( in[0] == '@' && in[1] == '(' ) + { + int depth = 1; + char *ine = in + 2; + char *split = 0; + + /* Scan the content of the response file @() section. */ + + while( *ine && depth > 0 ) { - int depth = 1; - char *ine = in + 2; - char *split = 0; - - /* Scan the content of the response file @() section. */ - - while( *ine && depth > 0 ) + switch( *ine ) { - switch( *ine ) + case '(': + ++depth; + break; + case ')': + --depth; + break; + case ':': + if( depth == 1 && ine[1] == 'E' && ine[2] == '=' ) { - case '(': - ++depth; - break; - case ')': - --depth; - break; - case ':': - if( depth == 1 && ine[1] == 'E' && ine[2] == '=' ) - { - split = ine; - } - break; + split = ine; } - ++ine; + break; } - - if (!split) - { - /* the @() reference doesn't match the @(foo:E=bar) format. - hence we leave it alone by copying directly to output. */ - int l = 0; - if ( out+2 >= oute ) return -1; - *(out++) = '@'; - *(out++) = '('; - l = var_string(in+2,out,oute-out,lol); - if ( l < 0 ) return -1; - out += l; - if ( out+1 >= oute ) return -1; - *(out++) = ')'; - in = ine; - } - - else if ( depth == 0 ) - { - string file_name_v; - int file_name_l = 0; - const char * file_name_s = 0; - - /* expand the temporary file name var inline */ - #if 0 - string_copy(&file_name_v,"$("); - string_append_range(&file_name_v,in+2,split); - string_push_back(&file_name_v,')'); - #else - string_new(&file_name_v); - string_append_range(&file_name_v,in+2,split); - #endif - file_name_l = var_string(file_name_v.value,out,oute-out+1,lol); - string_free(&file_name_v); - if ( file_name_l < 0 ) return -1; - file_name_s = out; - - /* for stdout/stderr we will create a temp file and generate - a command that outputs the content as needed. */ - if ( strcmp( "STDOUT", out ) == 0 || strcmp( "STDERR", out ) == 0 ) - { - int err_redir = strcmp( "STDERR", out ) == 0; - out[0] = '\0'; - file_name_s = path_tmpfile(); - file_name_l = strlen(file_name_s); - #ifdef OS_NT - if ( (out+7+file_name_l+(err_redir?5:0)) >= oute ) return -1; - sprintf( out,"type \"%s\"%s", - file_name_s, - err_redir ? " 1>&2" : "" ); - #else - if ( (out+6+file_name_l+(err_redir?5:0)) >= oute ) return -1; - sprintf( out,"cat \"%s\"%s", - file_name_s, - err_redir ? " 1>&2" : "" ); - #endif - /* we also make sure that the temp files created by this - get nuked eventually. */ - file_remove_atexit( file_name_s ); - } - - /* expand the file value into the file reference */ - var_string_to_file( split+3, ine-split-4, file_name_s, lol ); - - /* continue on with the expansion */ - out += strlen(out); - } - - /* and continue with the parsing just past the @() reference */ - in = ine; + ++ine; } - #endif - - *out++ = *in++; - } + + if (!split) + { + /* the @() reference doesn't match the @(foo:E=bar) format. + hence we leave it alone by copying directly to output. */ + int l = 0; + if ( out+2 >= oute ) return -1; + *(out++) = '@'; + *(out++) = '('; + l = var_string(in+2,out,oute-out,lol); + if ( l < 0 ) return -1; + out += l; + if ( out+1 >= oute ) return -1; + *(out++) = ')'; + } + + else if ( depth == 0 ) + { + string file_name_v; + int file_name_l = 0; + const char * file_name_s = 0; + + /* expand the temporary file name var inline */ + #if 0 + string_copy(&file_name_v,"$("); + string_append_range(&file_name_v,in+2,split); + string_push_back(&file_name_v,')'); + #else + string_new(&file_name_v); + string_append_range(&file_name_v,in+2,split); + #endif + file_name_l = var_string(file_name_v.value,out,oute-out+1,lol); + string_free(&file_name_v); + if ( file_name_l < 0 ) return -1; + file_name_s = out; + + /* for stdout/stderr we will create a temp file and generate + a command that outputs the content as needed. */ + if ( strcmp( "STDOUT", out ) == 0 || strcmp( "STDERR", out ) == 0 ) + { + int err_redir = strcmp( "STDERR", out ) == 0; + out[0] = '\0'; + file_name_s = path_tmpfile(); + file_name_l = strlen(file_name_s); + #ifdef OS_NT + if ( (out+7+file_name_l+(err_redir?5:0)) >= oute ) return -1; + sprintf( out,"type \"%s\"%s", + file_name_s, + err_redir ? " 1>&2" : "" ); + #else + if ( (out+6+file_name_l+(err_redir?5:0)) >= oute ) return -1; + sprintf( out,"cat \"%s\"%s", + file_name_s, + err_redir ? " 1>&2" : "" ); + #endif + /* we also make sure that the temp files created by this + get nuked eventually. */ + file_remove_atexit( file_name_s ); + } + + /* expand the file value into the file reference */ + var_string_to_file( split+3, ine-split-4, file_name_s, lol ); + + /* continue on with the expansion */ + out += strlen(out); + } + + /* and continue with the parsing just past the @() reference */ + in = ine; + } + #endif + else + { + *out++ = *in++; + } + } /* Add zero to 'out' so that 'lastword' is correctly zero-terminated. */ if (out >= oute) @@ -321,40 +325,40 @@ var_string( /* Don't increment, intentionally. */ *out= '\0'; - /* If a variable encountered, expand it and and embed the */ - /* space-separated members of the list in the output. */ + /* If a variable encountered, expand it and and embed the */ + /* space-separated members of the list in the output. */ - if( dollar ) - { - LIST *l; + if( dollar ) + { + LIST *l; - l = var_expand( L0, lastword, out, lol, 0 ); + l = var_expand( L0, lastword, out, lol, 0 ); - out = lastword; + out = lastword; - while ( l ) - { - int so = strlen( l->string ); + while ( l ) + { + int so = strlen( l->string ); - if( out + so >= oute ) - return -1; + if( out + so >= oute ) + return -1; - strcpy( out, l->string ); - out += so; - l = list_next( l ); - if ( l ) *out++ = ' '; - } + strcpy( out, l->string ); + out += so; + l = list_next( l ); + if ( l ) *out++ = ' '; + } - list_free( l ); - } - } + list_free( l ); + } + } - if( out >= oute ) - return -1; + if( out >= oute ) + return -1; - *out++ = '\0'; + *out++ = '\0'; - return out - out0; + return out - out0; } void var_string_to_file( const char * in, int insize, const char * out, LOL * lol ) From 6ea2b7b52423eadac2d0c2ba29115b2fa5a4f8bb Mon Sep 17 00:00:00 2001 From: "K. Noel Belcourt" Date: Wed, 28 Nov 2007 02:27:13 +0000 Subject: [PATCH 20/40] Fix pathscale rpath issue per Alain Minussi's suggestion. [SVN r41429] --- v2/tools/pathscale.jam | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2/tools/pathscale.jam b/v2/tools/pathscale.jam index 26ecf496d..7d2f33234 100644 --- a/v2/tools/pathscale.jam +++ b/v2/tools/pathscale.jam @@ -129,7 +129,7 @@ rule link ( targets * : sources * : properties * ) actions link bind LIBRARIES { - "$(CONFIG_COMMAND)" $(OPTIONS) -L"$(LINKPATH)" -Wl,-rpath,"$(RPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) + "$(CONFIG_COMMAND)" $(OPTIONS) -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) } # Slight mods for dlls @@ -140,7 +140,7 @@ rule link.dll ( targets * : sources * : properties * ) actions link.dll bind LIBRARIES { - "$(CONFIG_COMMAND)" $(OPTIONS) -L"$(LINKPATH)" -Wl,-rpath,"$(RPATH)" -o "$(<)" -Wl,-soname$(SPACE)-Wl,$(<[1]:D=) -shared "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) + "$(CONFIG_COMMAND)" $(OPTIONS) -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -o "$(<)" -Wl,-soname$(SPACE)-Wl,$(<[1]:D=) -shared "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) } # Declare action for creating static libraries From 1ea44258f8a49e0866e0d674079cfae9591fba73 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Wed, 28 Nov 2007 07:08:13 +0000 Subject: [PATCH 21/40] Add test for result status values of simple actions, i.e. empty actions. [SVN r41430] --- historic/jam/test/action_status.jam | 24 ++++++++++++++++++++++++ historic/jam/test/test.jam | 1 + 2 files changed, 25 insertions(+) create mode 100644 historic/jam/test/action_status.jam diff --git a/historic/jam/test/action_status.jam b/historic/jam/test/action_status.jam new file mode 100644 index 000000000..a54fb50d8 --- /dev/null +++ b/historic/jam/test/action_status.jam @@ -0,0 +1,24 @@ +#~ Copyright 2007 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) + +if ! $(BJAM_SUBTEST) +{ + ECHO --- Testing \"actions status results\"... ; + + assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1" : exit-status : no-output ] ; + assert "" 0 : (!=) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 -sACTION=invalid" : exit-status : no-output ] ; +} +else +{ + actions quietly .a. { $(ACTION) } + + rule .a. + { + DEPENDS $(<) : $(>) ; + } + + NOTFILE subtest ; + .a. subtest_a : subtest ; + DEPENDS all : subtest_a ; +} diff --git a/historic/jam/test/test.jam b/historic/jam/test/test.jam index 10a16116b..f050f849f 100644 --- a/historic/jam/test/test.jam +++ b/historic/jam/test/test.jam @@ -41,6 +41,7 @@ rule assert ( expected * : test ? : obtained * ) } } +include action_status.jam ; include actions_quietly.jam ; include builtin_shell.jam ; include builtin_w32_getregnames.jam ; From 585226c5d2005164d15c5d0180156d8a18838129 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Wed, 28 Nov 2007 07:21:49 +0000 Subject: [PATCH 22/40] build-system.jam * Reflect added start/end timestamps for actions in xml output. And update action rules for new args. execcmd.h * Add start/end timestamps to action timing info. execnt.c * Fix filetime_seconds calculation when time is larger than low 32 bit value. * Add calc of C time_t from Windows FILETIME. * Add start/end timestamps recording to action timing info. execunix.c * Add start/end timestamps recording to action timing info. jam.c * Change JAMDATE to use common ISO date format. make1.c * Redo __TIMING_RULE__ and __ACTION__RULE__ invocations to new argument ordering and added end/result timestamp values. [SVN r41431] --- historic/jam/src/execcmd.h | 24 +++++++---- historic/jam/src/execnt.c | 43 ++++++++++++++----- historic/jam/src/execunix.c | 13 ++++-- historic/jam/src/jam.c | 15 +------ historic/jam/src/make1.c | 83 ++++++++++++++++++++----------------- v2/build-system.jam | 10 ++--- 6 files changed, 110 insertions(+), 78 deletions(-) diff --git a/historic/jam/src/execcmd.h b/historic/jam/src/execcmd.h index 4bfe8b415..c39341c30 100644 --- a/historic/jam/src/execcmd.h +++ b/historic/jam/src/execcmd.h @@ -10,23 +10,31 @@ * 05/04/94 (seiwald) - async multiprocess interface */ +#ifndef EXECCMD_H +#define EXECCMD_H + +#include + typedef struct timing_info { - /* double elapsed; */ /* We don't know how to get this number on Unix */ double system; double user; + time_t start; + time_t end; } timing_info; void execcmd( - char *string, - void (*func)( void *closure, int status, timing_info*, char *, char * ), - void *closure, - LIST *shell, + char *string, + void (*func)( void *closure, int status, timing_info*, char *, char * ), + void *closure, + LIST *shell, char *action, char *target); int execwait(); -# define EXEC_CMD_OK 0 -# define EXEC_CMD_FAIL 1 -# define EXEC_CMD_INTR 2 +# define EXEC_CMD_OK 0 +# define EXEC_CMD_FAIL 1 +# define EXEC_CMD_INTR 2 + +#endif diff --git a/historic/jam/src/execnt.c b/historic/jam/src/execnt.c index 67b2adbb9..a0017702c 100644 --- a/historic/jam/src/execnt.c +++ b/historic/jam/src/execnt.c @@ -21,6 +21,7 @@ # include # include # include +# include # ifdef USE_EXECNT @@ -758,7 +759,35 @@ static FILETIME negate_FILETIME(FILETIME t) /* Convert a FILETIME to a number of seconds */ static double filetime_seconds(FILETIME t) { - return t.dwHighDateTime * (double)(1UL << 31) * 2 + t.dwLowDateTime * 1.0e-7; + return t.dwHighDateTime * ((double)(1UL << 31) * 2.0 * 1.0e-7) + t.dwLowDateTime * 1.0e-7; +} + +/* What should be a simple conversion, turns out to be horribly + complicated by the defficiencies of MSVC and the Win32 API. */ +static time_t filetime_dt(FILETIME t_utc) +{ + static int calc_time_diff = 1; + static double time_diff; + if ( calc_time_diff ) + { + struct tm t0_; + FILETIME f0_local,f0_; + SYSTEMTIME s0_; + GetSystemTime(&s0_); + t0_.tm_year = s0_.wYear-1900; + t0_.tm_mon = s0_.wMonth-1; + t0_.tm_wday = s0_.wDayOfWeek; + t0_.tm_mday = s0_.wDay; + t0_.tm_hour = s0_.wHour; + t0_.tm_min = s0_.wMinute; + t0_.tm_sec = s0_.wSecond; + t0_.tm_isdst = 0; + SystemTimeToFileTime(&s0_,&f0_local); + LocalFileTimeToFileTime(&f0_local,&f0_); + time_diff = filetime_seconds(f0_)-((double)mktime(&t0_)); + calc_time_diff = 0; + } + return ceil(filetime_seconds(t_utc)-time_diff); } static void record_times(HANDLE process, timing_info* time) @@ -767,17 +796,11 @@ static void record_times(HANDLE process, timing_info* time) if (GetProcessTimes(process, &creation, &exit, &kernel, &user)) { - /* Compute the elapsed time */ - #if 0 /* We don't know how to get this number on Unix */ - time->elapsed = filetime_seconds( - add_FILETIME( exit, negate_FILETIME(creation) ) - ); - #endif time->system = filetime_seconds(kernel); - time->user = filetime_seconds(user); + time->user = filetime_seconds(user); + time->start = filetime_dt(creation); + time->end = filetime_dt(exit); } - - /* CloseHandle((HANDLE)pid); */ } #define IO_BUFFER_SIZE (16*1024) diff --git a/historic/jam/src/execunix.c b/historic/jam/src/execunix.c index 612658447..15711896e 100644 --- a/historic/jam/src/execunix.c +++ b/historic/jam/src/execunix.c @@ -85,6 +85,7 @@ static struct char *buffer[2]; /* buffer to hold stdout and stderr, if any */ void (*func)( void *closure, int status, timing_info*, char *, char * ); void *closure; + time_t start_dt; /* start of command timestamp */ } cmdtab[ MAXJOBS ] = {{0}}; /* @@ -194,6 +195,8 @@ execcmd( /* Start the command */ + cmdtab[ slot ].start_dt = time(0); + if (0 < globs.timeout) { /* * handle hung processes by manually tracking elapsed @@ -418,7 +421,7 @@ execwait() int i, ret, fd_max; int pid, status, finished; int rstat; - timing_info time; + timing_info time_info; fd_set fds; struct tms new_time; @@ -491,8 +494,10 @@ execwait() times(&new_time); - time.system = (double)(new_time.tms_cstime - old_time.tms_cstime) / CLOCKS_PER_SEC; - time.user = (double)(new_time.tms_cutime - old_time.tms_cutime) / CLOCKS_PER_SEC; + time_info.system = (double)(new_time.tms_cstime - old_time.tms_cstime) / CLOCKS_PER_SEC; + time_info.user = (double)(new_time.tms_cutime - old_time.tms_cutime) / CLOCKS_PER_SEC; + time_info.start = cmdtab[i].start_dt; + time_info.end = time(0); old_time = new_time; @@ -508,7 +513,7 @@ execwait() rstat = EXEC_CMD_OK; /* assume -p0 in effect so only pass buffer[0] containing merged output */ - (*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat, &time, cmdtab[i].command, cmdtab[i].buffer[0] ); + (*cmdtab[ i ].func)( cmdtab[ i ].closure, rstat, &time_info, cmdtab[i].command, cmdtab[i].buffer[0] ); BJAM_FREE(cmdtab[i].buffer[OUT]); cmdtab[i].buffer[OUT] = 0; diff --git a/historic/jam/src/jam.c b/historic/jam/src/jam.c index 5bf08b985..3c0b40500 100644 --- a/historic/jam/src/jam.c +++ b/historic/jam/src/jam.c @@ -122,6 +122,7 @@ # include "strings.h" # include "expand.h" # include "filesys.h" +# include "output.h" /* Macintosh is "special" */ @@ -372,19 +373,7 @@ int main( int argc, char **argv, char **arg_environ ) /* Set JAMDATE first */ - { - char *date; - time_t clock; - time( &clock ); - date = newstr( ctime( &clock ) ); - - /* Trim newline from date */ - - if( strlen( date ) == 25 ) - date[ 24 ] = 0; - - var_set( "JAMDATE", list_new( L0, newstr( date ) ), VAR_SET ); - } + var_set( "JAMDATE", list_new( L0, outf_time(time(0)) ), VAR_SET ); var_set( "JAM_VERSION", diff --git a/historic/jam/src/make1.c b/historic/jam/src/make1.c index 5dda30bbe..485a41caf 100644 --- a/historic/jam/src/make1.c +++ b/historic/jam/src/make1.c @@ -664,16 +664,6 @@ make1c( state *pState ) } } -/* To l, append a 1-element list containing the string representation - * of x - */ -static void append_double_string( LOL *l, double x ) -{ - char buffer[50]; - sprintf(buffer, "%f", x); - lol_add( l, list_new( L0, newstr( buffer ) ) ); -} - /* Look up the __TIMING_RULE__ variable on the given target, and if * non-empty, invoke the rule it names, passing the given * timing_info @@ -688,33 +678,37 @@ static void call_timing_rule(TARGET* target, timing_info* time) if (timing_rule) { - /* We'll prepend $(__TIMING_RULE__[2-]) to the first argument */ - LIST* initial_args = list_copy( L0, timing_rule->next ); - + /* rule timing-rule ( + args * : + target : + start end user system ) */ + /* Prepare the argument list */ FRAME frame[1]; frame_init( frame ); - /* First argument is the name of the timed target */ - lol_add( frame->args, list_new( initial_args, target->name ) ); - append_double_string(frame->args, time->user); - append_double_string(frame->args, time->system); + /* args * :: $(__ACTION_RULE__[2-]) */ + lol_add( frame->args, list_copy( L0, timing_rule->next ) ); + + /* target :: the name of the target */ + lol_add( frame->args, list_new( L0, target->name ) ); + + /* start end user system :: info about the action command */ + lol_add( frame->args, + list_new( list_new( list_new( list_new( L0, + outf_time(time->start) ), + outf_time(time->end) ), + outf_double(time->user) ), + outf_double(time->system) ) ); + + /* Call the rule. */ + evaluate_rule( timing_rule->string, frame ); - if( lol_get( frame->args, 2 ) ) - evaluate_rule( timing_rule->string, frame ); - /* Clean up */ frame_free( frame ); } } -static void append_int_string(LOL *l, int x) -{ - char buffer[50]; - sprintf(buffer, "%i", x); - lol_add(l, list_new(L0, newstr(buffer))); -} - /* Look up the __ACTION_RULE__ variable on the given target, and if * non-empty, invoke the rule it names, passing the given info, * timing_info, executed command and command output @@ -730,27 +724,40 @@ static void call_action_rule(TARGET* target, int status, timing_info* time, if (action_rule) { - /* We'll prepend $(__ACTION_RULE__[2-]) to the first argument */ - LIST* initial_args = list_copy( L0, action_rule->next ); - + /* rule action-rule ( + args * : + target : + command status start end user system : + output ? ) */ + /* Prepare the argument list */ FRAME frame[1]; frame_init( frame ); - /* First argument is the name of the target */ - lol_add( frame->args, list_new( initial_args, target->name ) ); - append_int_string(frame->args, status); - append_double_string(frame->args, time->user); - append_double_string(frame->args, time->system); - lol_add(frame->args, list_new(L0, newstr(executed_command))); + /* args * :: $(__ACTION_RULE__[2-]) */ + lol_add( frame->args, list_copy( L0, action_rule->next ) ); + /* target :: the name of the target */ + lol_add( frame->args, list_new( L0, target->name ) ); + + /* command status start end user system :: info about the action command */ + lol_add( frame->args, + list_new( list_new( list_new( list_new( list_new( list_new( L0, + newstr(executed_command) ), + outf_int(status) ), + outf_time(time->start) ), + outf_time(time->end) ), + outf_double(time->user) ), + outf_double(time->system) ) ); + + /* output ? :: the output of the action command */ if (command_output) lol_add(frame->args, list_new(L0, newstr(command_output))); else lol_add(frame->args, L0); - if( lol_get( frame->args, 2 ) ) - evaluate_rule( action_rule->string, frame ); + /* Call the rule. */ + evaluate_rule( action_rule->string, frame ); /* Clean up */ frame_free( frame ); diff --git a/v2/build-system.jam b/v2/build-system.jam index b9170a8da..18c0c0eeb 100755 --- a/v2/build-system.jam +++ b/v2/build-system.jam @@ -578,8 +578,8 @@ if $(.out-xml) # actions clause we would have to form a valid command line # containing the result of @(...) below (the name of the XML file). rule out-xml.generate-action ( - xml-file args * : - status : user : system : command : output ? ) + args * : xml-file : + command status start end user system : output ? ) { local contents = [ on $(xml-file) return $(.header) $(.contents) $(.footer) ] ; @@ -598,14 +598,14 @@ if $(.out-xml) # statistics about each actual target in a variable "on" the # --out-xml target. rule out-xml.collect ( - xml-file target : - status : user : system : command : output ? ) + xml-file : target : + command status start end user system : output ? ) { local nl = " " ; # Open the action with some basic info. .contents on $(xml-file) += - "$(nl) " + "$(nl) " ; # If we have an action object we can print out more detailed info. From 3ce96bb6d89301b10c66d70ecff385627f785b2a Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Wed, 28 Nov 2007 20:24:17 +0000 Subject: [PATCH 23/40] Fix for latest Doxygen namespace file names. And support for method groups. From Samuel Debionne. [SVN r41440] --- v2/tools/doxproc.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/v2/tools/doxproc.py b/v2/tools/doxproc.py index b2df94c24..4cbd5edd2 100644 --- a/v2/tools/doxproc.py +++ b/v2/tools/doxproc.py @@ -530,6 +530,12 @@ class Doxygen2BoostBook: def _translate_sectiondef_private_func( self, sectiondef, target=None, **kwargs ): return self._translate_sectiondef_func_(sectiondef, name='private member functions',target=target,**kwargs) + + #~ Translate: + #~
...
...
+ def _translate_sectiondef_user_defined( self, sectiondef, target=None, **kwargs ): + return self._translate_sectiondef_func_(sectiondef, + name=self._getChildData('header', root=sectiondef),target=target,**kwargs) #~ Translate: #~ @@ -829,11 +835,11 @@ def main( xmldir=None, output=None, id=None, title=None, index=False ): #~ and definitions so that lookup is unambiguous when reading in the definitions. namespace_files = filter( lambda x: - os.path.basename(x).startswith('namespace_'), + os.path.basename(x).startswith('namespace'), input) decl_files = filter( lambda x: - not os.path.basename(x).startswith('namespace_') and not os.path.basename(x).startswith('_'), + not os.path.basename(x).startswith('namespace') and not os.path.basename(x).startswith('_'), input) for dox in namespace_files: #~ print '--|',os.path.basename(dox) From 9146c3ca2f9e3bf050ab84748a85c0bb7b13fb9a Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Fri, 30 Nov 2007 01:41:20 +0000 Subject: [PATCH 24/40] Add combined architectures, from Mat Marcus, in support of Darwin universal builds. [SVN r41485] --- v2/tools/builtin.jam | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/v2/tools/builtin.jam b/v2/tools/builtin.jam index 28cf8c412..8d9b1558c 100644 --- a/v2/tools/builtin.jam +++ b/v2/tools/builtin.jam @@ -207,6 +207,11 @@ feature architecture : mips1 mips2 mips3 mips4 mips32 mips32r2 mips64 # HP/PA-RISC parisc + # Combined architectures for platforms/toolsets that support + # building for multiple architectures at once. "combined" + # would be the default multi-arch for the toolset. + combined + combined-x86-power # : propagated optional ; From 208e193c6a522e43d6d8aeb8053f767d2f7ca5fa Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 1 Dec 2007 02:15:17 +0000 Subject: [PATCH 25/40] Boost.Python: * Workarounds for many SunCC 5.9 bugs * Suppression of many SunCC 5.9 warnings * Improve the style of some test invocations in Jamfile [SVN r41521] --- v2/tools/python.jam | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/v2/tools/python.jam b/v2/tools/python.jam index ef40bc560..b21441159 100644 --- a/v2/tools/python.jam +++ b/v2/tools/python.jam @@ -610,13 +610,16 @@ local rule system-library-dependencies ( target-os ) # appears to duplicate the logic already in gcc.jam, it # doesn't as long as we're not forcing multi. - # Caleb Epstein reports that his python's + # On solaris 10, # distutils.sysconfig.get_config_var('LIBS') yields - # -lresolv -lsocket -lnsl -lrt -ldl. However, we're not - # yet sure that is the right list for extension modules. - # Being conservative, we add rt and remove pthread, which - # was causing errors. - return dl gcc:rt ; + # '-lresolv -lsocket -lnsl -lrt -ldl'. However, that + # doesn't seem to be the right list for extension modules. + # For example, on my installation, adding -ldl causes at + # least one test to fail because the library can't be + # found and removing it causes no failures. + + # Apparently, though, we need to add -lrt for gcc. + return gcc:rt ; case osf : return pthread gcc:rt ; From fa75fd6cd0011f4c8fe32e8fcb870f244f31c4bc Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 14:56:23 +0000 Subject: [PATCH 26/40] Change the detection of 64-bit windows to handle EM64T processors. [SVN r41532] --- v2/tools/msvc.jam | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/v2/tools/msvc.jam b/v2/tools/msvc.jam index 6cb75bdb2..ce95dd4e7 100644 --- a/v2/tools/msvc.jam +++ b/v2/tools/msvc.jam @@ -310,8 +310,16 @@ local rule configure-really ( # and x86_ia64 is right one. setup-option = x86 x86_amd64 x86_ia64 ; - # Use a native x64 compiler if possible + # When using 64-bit Windows, and targeting 64-bit, + # it's possible to use native 64-bit compiler, which is + # selected by the "amd64" parameter to vcvarsall.bat. + # There are two variables we can use -- + # PROCESSOR_ARCHITECTURE and PROCESSOR_IDENTIFIER. + # The first reflects processor proper, and the second is + # empirically found to be always x86 when using 32-bit + # windows. if [ MATCH ^(AMD64) : [ os.environ PROCESSOR_IDENTIFIER ] ] + || [ MATCH ^(EM64T) : [ os.environ PROCESSOR_IDENTIFIER ] ] { setup-option = x86 amd64 x86_ia64 ; } From 6d09870d20190128a81b50f171e632dfaf76379a Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 1 Dec 2007 16:44:54 +0000 Subject: [PATCH 27/40] Plug memory leak when closing out actions. Thanks to Martin Kortmann for finding this. [SVN r41535] --- historic/jam/src/execnt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/historic/jam/src/execnt.c b/historic/jam/src/execnt.c index a0017702c..a7e65da43 100644 --- a/historic/jam/src/execnt.c +++ b/historic/jam/src/execnt.c @@ -539,6 +539,7 @@ int execwait() string_free(&cmdtab[i].target); string_new(&cmdtab[i].target); string_free(&cmdtab[i].command); string_new(&cmdtab[i].command); if (cmdtab[i].pi.hProcess) { CloseHandle(cmdtab[i].pi.hProcess); cmdtab[i].pi.hProcess = 0; } + if (cmdtab[i].pi.hThread) { CloseHandle(cmdtab[i].pi.hThread); cmdtab[i].pi.hThread = 0; } if (cmdtab[i].pipe_out[0]) { CloseHandle(cmdtab[i].pipe_out[0]); cmdtab[i].pipe_out[0] = 0; } if (cmdtab[i].pipe_out[1]) { CloseHandle(cmdtab[i].pipe_out[1]); cmdtab[i].pipe_out[1] = 0; } if (cmdtab[i].pipe_err[0]) { CloseHandle(cmdtab[i].pipe_err[0]); cmdtab[i].pipe_err[0] = 0; } From 05b4b61b15c8b8dac6ac903551c71111ea95dc6f Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 17:56:47 +0000 Subject: [PATCH 28/40] Document 64-bit compilation. [SVN r41538] --- v2/doc/src/reference.xml | 125 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 3 deletions(-) diff --git a/v2/doc/src/reference.xml b/v2/doc/src/reference.xml index cf38b4340..e2053030e 100644 --- a/v2/doc/src/reference.xml +++ b/v2/doc/src/reference.xml @@ -678,9 +678,50 @@ path-constant DATA : data/a.txt ; release variant with debugging information. + + architecture + + + The architecture features specifies + the general processor familty to generate code for. + + + + + instruction-set + instruction-set + + Allowed values for this feature depend on used toolset. + + The instruction-set specifies for which + specific instruction set the code should be generated. The + code in general might not run on processors with older/different + instruction sets. + + While Boost.Build allows a large set of possible values + for this features, whether a given value works depends on which + compiler you use. Please see + for details. + + + + + + address-model + 64-bit compilation + + Allowed values: 32, 64. + + The address-model specifies if 32-bit or + 64-bit code should be generated by the compiler. Whether this feature + works depends on the used compiler, it's version, how the compiler + is configured, and the values of the architecture + instruction-set + features. Please see + for details. + + - - @@ -770,6 +811,15 @@ using gcc : &toolset_ops; ; + 64-bit compilation + gcc + + In order to compile 64-bit applications, you have to specify + address-model=64, and the instruction-set + feature should refer to a 64 bit processor. Currently, those + include nocona, opteron, + athlon64 and athlon-fx. + @@ -887,6 +937,70 @@ using msvc : &toolset_ops; ; + +
+ 64-bit support + + 64-bit compilation + Microsoft Visual Studio + + Starting with version 8.0, Microsoft Visual Studio + can generate binaries for 64-bit processor, both 64-bit + flavours of x86 (codenamed AMD64/EM64T), and + Itanium (codenamed IA64). In addition, compilers that are + itself run in 64-bit mode, for better performance, are provided. + The complete list of compiler configurations are as follows + (we abbreviate AMD64/EM64T to just AMD64): + + 32-bit x86 host, 32-bit x86 target + + 32-bit x86 host, 64-bit AMD64 target + + 32-bit x86 host, 64-bit IA64 target + + 64-bit AMD64 host, 64-bit AMD64 target + + 64-bit IA64 host, 64-bit IA64 target + + + + The 32-bit host compilers can be always used, even on 64-bit Windows. + On the contrary, 64-bit host compilers require both 64-bit + host processor and 64-bit Windows, but can be faster. By default, + only 32-bit host, 32-bit target compiler is installed, and additional + compilers should be installed explicitly. + + + To use 64-bit compilation you should: + + Configure you compiler as usual. If you provide + a path to the compiler explicitly, provide the path to the + 32-bit compiler. If you try to specify the path to any of 64-bit + compilers, configuration won't work. + + + When compiling, use address-model=64, + to generate AMD64 code. + + To generate IA64 code, use + architecture=ia64 + + + The (AMD64 host, AMD64 target) compiler will be used + automatically when you're generating AMD64 code and are + running 64-bit Windows on AMD64. The (IA64 host, IA64 target) + compiler won't be ever used, since nobody has an IA64 machine + to test. + + It is believed that AMD64 and EM64T targets are essentially + compatible. The compiler options /favor:AMD64 + and /favor:EM64T, which are accepted only by + AMD64 targeting compilers, cause the generated code to be + tuned to a specific flavor of 64-bit x86. Boost.Build will + make use of those options depending on the value + of theinstruction-set feature. + +
@@ -1183,7 +1297,12 @@ using sun : &toolset_ops; ; - + + 64-bit compilation + Sun Studio + Starting with Sun Studio 12, you can create 64-bit applications + by using the address-model=64 property. +
From e47c52e1fa6e6ffef597344835bd5e99ebaece72 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 19:07:22 +0000 Subject: [PATCH 29/40] Add functionality to unit-test rule. Patch from Mark Desnoyer. [SVN r41542] --- v2/tools/testing.jam | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/v2/tools/testing.jam b/v2/tools/testing.jam index 16124e533..6a9c8407d 100644 --- a/v2/tools/testing.jam +++ b/v2/tools/testing.jam @@ -490,6 +490,7 @@ actions quietly updated ignore piecemeal together RmTemps MAKE_FILE = [ common.file-creation-command ] ; toolset.flags testing.unit-test LAUNCHER ; +toolset.flags testing.unit-test ARGS ; rule unit-test ( target : source : properties * ) { run-path-setup $(target) : $(source) : $(properties) ; @@ -498,7 +499,7 @@ rule unit-test ( target : source : properties * ) actions unit-test { $(PATH_SETUP) - $(LAUNCHER) $(>) && $(MAKE_FILE) $(<) + $(LAUNCHER) $(>) $(ARGS) && $(MAKE_FILE) $(<) } IMPORT $(__name__) : compile compile-fail run run-fail link link-fail From 412fd25fffc6f2a422ae3622234ecd04df3ba2c0 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 20:06:43 +0000 Subject: [PATCH 30/40] Document runtime-link [SVN r41547] --- v2/doc/src/reference.xml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/v2/doc/src/reference.xml b/v2/doc/src/reference.xml index e2053030e..b0b11f31f 100644 --- a/v2/doc/src/reference.xml +++ b/v2/doc/src/reference.xml @@ -462,13 +462,35 @@ path-constant DATA : data/a.txt ; link + + Allowed values: shared, + static + A feature that controls how libraries are built. + + + + runtime linking + runtime-link + + Allowed values: shared, static - + + + Controls if a static or shared C/C++ runtime should be used. There + are some restrictions how this feature can be used, for example + on some compilers an application using static runtime should + not use shared libraries at all, and on some compilers, + mixing static and shared runtime requires extreme care. Check + your compiler documentation for more details. + + + + source From 9fb36963e2a4809a0c5e9931de92abd723a3b276 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 1 Dec 2007 20:17:52 +0000 Subject: [PATCH 31/40] Add support for detection and building with vc9. (fixes #1490) [SVN r41548] --- historic/jam/src/build.bat | 26 ++++++++++++++++++++++++++ historic/jam/src/build.jam | 7 +++++++ 2 files changed, 33 insertions(+) diff --git a/historic/jam/src/build.bat b/historic/jam/src/build.bat index dfffb005c..377db20c0 100644 --- a/historic/jam/src/build.bat +++ b/historic/jam/src/build.bat @@ -66,6 +66,16 @@ REM location of the found toolset. if "_%ProgramFiles%_" == "__" set ProgramFiles=C:\Program Files +setlocal & endlocal +if NOT "_%VS90COMNTOOLS%_" == "__" ( + set "BOOST_JAM_TOOLSET=vc9" + set "BOOST_JAM_TOOLSET_ROOT=%VS90COMNTOOLS%..\..\VC\" + goto :eof) +setlocal & endlocal +if EXIST "%ProgramFiles%\Microsoft Visual Studio 9.0\VC\VCVARSALL.BAT" ( + set "BOOST_JAM_TOOLSET=vc9" + set "BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio 9.0\VC\" + goto :eof) setlocal & endlocal if NOT "_%VS80COMNTOOLS%_" == "__" ( set "BOOST_JAM_TOOLSET=vc8" @@ -83,6 +93,7 @@ if NOT "_%VS71COMNTOOLS%_" == "__" ( goto :eof) setlocal & endlocal if NOT "_%VCINSTALLDIR%_" == "__" ( + REM %VCINSTALLDIR% is also set for VC9 (and probably VC8) set "BOOST_JAM_TOOLSET=vc7" set "BOOST_JAM_TOOLSET_ROOT=%VCINSTALLDIR%\VC7\" goto :eof) @@ -281,6 +292,21 @@ set "BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0" set "BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0" set "_known_=1" :Skip_VC8 +if NOT "_%BOOST_JAM_TOOLSET%_" == "_vc9_" goto :Skip_VC9 +if NOT "_%VS90COMNTOOLS%_" == "__" ( + set "BOOST_JAM_TOOLSET_ROOT=%VS90COMNTOOLS%..\..\VC\" + ) +if "_%VCINSTALLDIR%_" == "__" call :Call_If_Exists "%BOOST_JAM_TOOLSET_ROOT%VCVARSALL.BAT" %BOOST_JAM_ARGS% +if NOT "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( + if "_%VCINSTALLDIR%_" == "__" ( + set "PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%" + ) ) +set "BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib" +set "BOOST_JAM_OPT_JAM=/Febootstrap\jam0" +set "BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0" +set "BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0" +set "_known_=1" +:Skip_VC9 if NOT "_%BOOST_JAM_TOOLSET%_" == "_borland_" goto :Skip_BORLAND if "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( call :Test_Path bcc32.exe ) diff --git a/historic/jam/src/build.jam b/historic/jam/src/build.jam index d7b1c6372..f4c989619 100644 --- a/historic/jam/src/build.jam +++ b/historic/jam/src/build.jam @@ -317,6 +317,13 @@ toolset vc8 cl : /Fe /Fe /Fd /Fo : -D [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ] -I$(--python-include) -I$(--extra-include) : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; +## Microsoft Visual C++ 2008 +toolset vc9 cl : /Fe /Fe /Fd /Fo : -D + : /nologo + [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ] + [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ] + -I$(--python-include) -I$(--extra-include) + : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## VMS/OpenVMS DEC C toolset vmsdecc cc : /OBJECT= : "/DEFINES=(" "," ")" : /STANDARD=VAXC /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES From cbfcdde0f006a0c59dba024e432b0d09b4d7803b Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 21:26:09 +0000 Subject: [PATCH 32/40] Document STLport [SVN r41555] --- v2/doc/src/reference.xml | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/v2/doc/src/reference.xml b/v2/doc/src/reference.xml index b0b11f31f..2868b22ff 100644 --- a/v2/doc/src/reference.xml +++ b/v2/doc/src/reference.xml @@ -1349,6 +1349,47 @@ using vacpp ;
+ + +
+ Third-party libraries + + Boost.Build provides special support for some + third-party C++ libraries, documented below. + +
+ STLport library + STLport + + The STLport library + is an alternative implementation of C++ runtime library. Boost.Build + supports using that library on Windows platfrom. Linux is + hampered by different naming of libraries in each STLport + version and is not officially supported. + + Before using STLport, you need to configure it in + user-config.jam using the following syntax: + + +using stlport : version : header-path : library-path ; + + + Where version is the version of + STLport, for example 5.1.4, + headers is the location where + STLport headers can be found, and libraries + is the location where STLport libraries can be found. + The version should always be provided, and the library path should + be provided if you're using STLport's implementation of + iostreams. Note that STLport 5.* always uses its own iostream + implementation, so the library path is required. + + + When STLport is configured, you can build with STLport by + requesting stdlib=stlport on the command line. + + +
From 727495e6065bfe8a44a4777dbfc065eaf658181e Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sat, 1 Dec 2007 21:53:47 +0000 Subject: [PATCH 33/40] Document various "new" features, and add in the history till now for 3.1.16. (fixes #1445 #1447 #1448) [SVN r41556] --- historic/jam/doc/bjam.qbk | 65 ++++++++++++++++++++++++++++++++-- historic/jam/doc/history.qbk | 68 ++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 3 deletions(-) diff --git a/historic/jam/doc/bjam.qbk b/historic/jam/doc/bjam.qbk index 35dfda034..f62dd8255 100644 --- a/historic/jam/doc/bjam.qbk +++ b/historic/jam/doc/bjam.qbk @@ -217,12 +217,14 @@ The supported toolsets, and wether they are auto-detected, are: [ [] [] [[lines - [line [@http://msdn.microsoft.com/visualc/ =vc8=]] - [line Microsoft Visual C++ 8.x] + [line [@http://msdn.microsoft.com/visualc/ =vc8= and =vc9=]] + [line Microsoft Visual C++ 8.x and 9.x] ]] [Detection: [list [li =VCVARSALL.BAT= already configured] + [li =%VS90COMNTOOLS%= is present in environment] + [li Common install location: "=%ProgramFiles%\Microsoft Visual Studio 9="] [li =%VS80COMNTOOLS%= is present in environment] [li Common install location: "=%ProgramFiles%\Microsoft Visual Studio 8="] [li =CL.EXE= in =PATH=] @@ -1315,6 +1317,17 @@ ECHO $(y) ; # prints "4 5 6" [endsect] +[section:atfile Generated File Expansion] + +During expansion of expressions =bjam= also looks for subexpressions of the form +=@(filename:E=filecontents)= and replaces the expression with =filename= after +creating the given file with the contents set to =filecontents=. This is useful +for creating compiler response files, and other "internal" files. The expansion +works both during parsing and action execution. Hence it is possible to create +files during any of the three build phases. + +[endsect] + [section:builtins Built-in Variables] This section discusses variables that have special meaning to =bjam=. @@ -1387,7 +1400,7 @@ A number of Jam built-in variables can be used to identify runtime platform: [section Jam Version] [variablelist -[[=JAMDATE=] [Time and date at =bjam= start-up.]] +[[=JAMDATE=] [Time and date at =bjam= start-up as an ISO-8601 UTC value.]] [[=JAMUNAME=] [Ouput of uname(1) command (Unix only)]] [[=JAMVERSION=] [=bjam= version, currently ":version:"]] [[=JAM_VERSION=] [A predefined global variable with two elements indicates the version number of Boost Jam. Boost Jam versions start at "=03=" "=00=". Earlier versions of =Jam= do not automatically define =JAM_VERSION=.]] @@ -1432,6 +1445,52 @@ esac [endsect] +[section:actionrule =__TIMING_RULE__= and =__ACTION_RULE__=] + +The =__TIMING_RULE__= and =__ACTION_RULE__= can be set to the name of a rule +for =bjam= to call *after* an action completes for a target. They both give +diagnostic information about the action that completed. For =__TIMING_RULE__= +the rule is called as: + + rule timing-rule ( args * : target : start end user system ) + +And =__ACTION_RULE__= is called as: + + rule action-rule ( args * : target : command status start end user system : output ? ) + +The arguments for both are: + +[variablelist + [[[^args]] + [Any values following the rule name in the =__TIMING_RULE__= or =__ACTION_RULE__= + are passed along here.]] + [[[^target]] + [The =bjam= target that was built.]] + [[[^command]] + [The text of the executed command in the action body.]] + [[[^status]] + [The integer result of the executed command.]] + [[[^start]] + [The starting timestamp of the executed command as a ISO-8601 UTC value.]] + [[[^end]] + [The completion timestamp of the executed command as a ISO-8601 UTC value.]] + [[[^user]] + [The number of user CPU seconds the executed command spent as a floating + point value.]] + [[[^system]] + [The number of system CPU seconds the executed command spent as a floating + point value.]] + [[[^output]] + [The output of the command as a single string. The content of the output + reflects the use of the =-pX= option.]] +] + +[note + If both variables are set for a target both are called, first =__TIMING_RULE__= + then =__ACTION_RULE__=. ] + +[endsect] + [endsect] [endsect] diff --git a/historic/jam/doc/history.qbk b/historic/jam/doc/history.qbk index cf1ee3e1c..d8dfbac97 100644 --- a/historic/jam/doc/history.qbk +++ b/historic/jam/doc/history.qbk @@ -1,5 +1,73 @@ [variablelist +[[3.1.16] [ + +This is mostly a bug fix release. + +[list + [li Add support for detection and building with =vc9=. + -- ['John P.] + ] + [li Plug memory leak when closing out actions. Thanks to Martin Kortmann for finding this. + -- ['Rene R.] + ] + [li Various improvements to =__TIMING_RULE__= and =__ACTION_RULE__= target variable + hooks. + -- ['Rene R.] + ] + [li Change [^JAMDATE] to use common ISO date format. + -- ['Rene R.] + ] + [li Add test for result status values of simple actions, i.e. empty actions. + -- ['Rene R.] + ] + [li Fix buffer overrun bug in expanding [^@()] subexpressions. + -- ['Rene R.] + ] + [li Check empty string invariants, instead of assuming all strings are allocated. + And reset strings when they are freed. + -- ['Rene R.] + ] + [li Add [^OSPLAT=PARISC] for HP-UX PA-RISC. + -- ['Boris G.] + ] + [li Make quietly actions really quiet by not printing the command output. The + output for the quietly actions is still available through =__ACTION_RULE__=. + -- ['Rene R.] + ] + [li Switch intel-win32 to use static multi thread runtime since the single + thread static runtime is no longer available. + -- ['Rene R.] + ] + [li When setting =OSPLAT=, check =__ia64= macro. + -- ['Boris G.] + ] + [li Get the unix timing working correctly. + -- ['Noel B.] + ] + [li Add =-fno-strict-aliasing= to compilation with gcc. Which works around + GCC-4.2 crash problems. + -- ['Boris G.] + ] + [li Increased support for Python integration. + -- ['Vladimir P.], ['Daniel W.] + ] + [li Allow specifying options with quotes, i.e. [^--with-python=xyz], to work + around the CMD shell using [^=] as an argument separator. + -- ['Rene R.] + ] + [li Add values of variables specified with -s to .EVNRION + module, so that we can override environment on + command line. + -- ['Vladimir P.] + ] + [li Make NORMALIZE_PATH convert \\ to /. + -- ['Vladimir P.] + ] +] + +]] + [[3.1.15] [ This release sees a variety of fixes for long standing Perforce/Jam problems. Most of From 89db6c49ff2561e28e61c47103430fded18d0a8b Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sat, 1 Dec 2007 22:31:04 +0000 Subject: [PATCH 34/40] Remove unused method [SVN r41557] --- v2/build/generators.jam | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/v2/build/generators.jam b/v2/build/generators.jam index 75e1dd4e6..d181ebf05 100644 --- a/v2/build/generators.jam +++ b/v2/build/generators.jam @@ -903,8 +903,6 @@ local rule try-one-generator ( project name ? : generator : } } - - rule construct-types ( project name ? : target-types + : property-set : sources + ) { @@ -1188,27 +1186,6 @@ rule construct ( project name ? : target-type : property-set * : sources * ) decrease-indent ; .construct-stack = $(.construct-stack[2-]) ; - - + return $(result) ; } - -# Given 'result', obtained from some generator or -# generators.construct, adds 'raw-properties' as usage requirements -# to it. If result already contains usage requirements -- that is -# the first element of result of an instance of the property-set class, -# the existing usage requirements and 'raw-properties' are combined. -rule add-usage-requirements ( result * : raw-properties * ) -{ - if $(result) - { - if [ class.is-a $(result[1]) : property-set ] - { - return [ $(result[1]).add-raw $(raw-properties) ] $(result[2-]) ; - } - else - { - return [ property-set.create $(raw-properties) ] $(result) ; - } - } -} From e3a19e2dd6c03afcfc2704268fb72cbcd15fa927 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 2 Dec 2007 01:59:02 +0000 Subject: [PATCH 35/40] No-op no-empty action. [SVN r41562] --- historic/jam/test/action_status.jam | 2 ++ 1 file changed, 2 insertions(+) diff --git a/historic/jam/test/action_status.jam b/historic/jam/test/action_status.jam index a54fb50d8..1dc7a54f6 100644 --- a/historic/jam/test/action_status.jam +++ b/historic/jam/test/action_status.jam @@ -7,10 +7,12 @@ if ! $(BJAM_SUBTEST) ECHO --- Testing \"actions status results\"... ; assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1" : exit-status : no-output ] ; + assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 \"-sACTION=;\"" : exit-status : no-output ] ; assert "" 0 : (!=) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 -sACTION=invalid" : exit-status : no-output ] ; } else { + #~ actions .a. { $(ACTION) } actions quietly .a. { $(ACTION) } rule .a. From d0c894c58aff23f72ca96decda6de98dc573970b Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 2 Dec 2007 02:03:48 +0000 Subject: [PATCH 36/40] ';' can't be a no-op on nix. [SVN r41563] --- historic/jam/test/action_status.jam | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/historic/jam/test/action_status.jam b/historic/jam/test/action_status.jam index 1dc7a54f6..96e828677 100644 --- a/historic/jam/test/action_status.jam +++ b/historic/jam/test/action_status.jam @@ -7,7 +7,10 @@ if ! $(BJAM_SUBTEST) ECHO --- Testing \"actions status results\"... ; assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1" : exit-status : no-output ] ; - assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 \"-sACTION=;\"" : exit-status : no-output ] ; + if $(NT) + { + assert "" 0 : (==) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 \"-sACTION=;\"" : exit-status : no-output ] ; + } assert "" 0 : (!=) : [ SHELL "$(ARGV[1]) -f action_status.jam -sBJAM_SUBTEST=1 -sACTION=invalid" : exit-status : no-output ] ; } else From 787fa1f93febef1cdae23b6d26dd444d66a9e892 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Sun, 2 Dec 2007 20:15:25 +0000 Subject: [PATCH 37/40] Support building of universal binaries using architecture options. Thanks to Mat Marcus. (fixes #552 #1342 #989) [SVN r41592] --- v2/tools/darwin.jam | 120 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 112 insertions(+), 8 deletions(-) diff --git a/v2/tools/darwin.jam b/v2/tools/darwin.jam index 89374b8b9..7784b9ce5 100644 --- a/v2/tools/darwin.jam +++ b/v2/tools/darwin.jam @@ -1,6 +1,9 @@ # Copyright 2003 Christopher Currie # Copyright 2006 Dave Abrahams # Copyright 2003, 2004, 2005, 2006 Vladimir Prus +# Copyright 2005-2007 Mat Marcus +# Copyright 2005-2007 Adobe Systems Incorporated +# Copyright 2007 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) @@ -12,6 +15,7 @@ import toolset : flags ; import type ; import common ; import generators ; +import path : basename ; feature.extend toolset : darwin ; import gcc ; @@ -22,10 +26,13 @@ generators.override darwin.searched-lib-generator : searched-lib-generator ; toolset.inherit-rules darwin : gcc ; toolset.inherit-flags darwin : gcc - : # On Darwin, static runtime is just not supported. So don't inherit - # any flags settings for static - static - ; + : static + x86/32 + x86/64 + x86/ + power/32 + power/64 + power/ ; # No additional initialization should be necessary rule init ( version ? : command * : options * ) @@ -49,8 +56,104 @@ rule init ( version ? : command * : options * ) feature framework : : free ; +# The following adds objective-c support to darwin. +# Thanks to http://thread.gmane.org/gmane.comp.lib.boost.build/13759 + +type.register OBJECTIVE_C : m ; +type.register OBJECTIVE_CPP : mm ; + +generators.register-c-compiler darwin.compile.m : OBJECTIVE_C : OBJ : darwin ; +generators.register-c-compiler darwin.compile.mm : OBJECTIVE_CPP : OBJ : darwin ; + +rule compile.m +{ + LANG on $(<) = "-x objective-c" ; +} + +actions compile.m +{ + "$(CONFIG_COMMAND)" $(LANG) $(OPTIONS) $(USER_OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" +} + +rule compile.mm +{ + LANG on $(<) = "-x objective-c++" ; +} + +actions compile.mm +{ + "$(CONFIG_COMMAND)" $(LANG) $(OPTIONS) $(USER_OPTIONS) -D$(DEFINES) -I"$(INCLUDES)" -c -o "$(<)" "$(>)" +} + +# Determine the MacOSX SDK versions installed and their locations. +local rule available-macosx-versions ( ) +{ + local sdks = [ GLOB /Developer/SDKs : MacOSX* ] ; + for local sdk in $(sdks) + { + local sdk-version = [ MATCH ([0-9]+[.][0-9]+[.]?[0-9]*) : $(sdk) ] ; + if $(sdk-version) + { + .macosx-sdk = $(sdk-version) $(.macosx-sdk) ; + .macosx-sdk.$(sdk-version) = $(sdk) ; + } + } + return $(.macosx-sdk) ; +} + +# Add the found SDK version only to the allowed set. The "latests" SDKs +# wil be first in the list, and hence the default. +feature macosx-version + : [ available-macosx-versions ] + : propagated link-incompatible symmetric ; + +# Add the options for all the found SDKs. +for local sdk in $(.macosx-sdk) +{ + flags darwin.compile OPTIONS $(sdk) : + -isysroot $(.macosx-sdk.$(sdk)) + -mmacosx-version-min=$(sdk) + ; + flags darwin.link OPTIONS $(sdk) : + -isysroot $(.macosx-sdk.$(sdk)) + -mmacosx-version-min=$(sdk) + ; +} + +# Add option selection for combined and specific architecture combinations. + +local rule arch-addr-flags ( toolset variable + : architecture : address-model + : values + : default ? ) +{ + if $(default) + { + flags $(toolset) $(variable) + $(architecture)/ + : $(values) ; + } + flags $(toolset) $(variable) + /$(address-model) + $(architecture)/$(address-model) + : $(values) ; +} + +arch-addr-flags darwin OPTIONS : combined : 32 : -arch i386 -arch ppc : default ; +arch-addr-flags darwin OPTIONS : combined : 64 : -arch x86_64 -arch ppc64 ; + +arch-addr-flags darwin OPTIONS : x86 : 32 : -arch i386 : default ; +arch-addr-flags darwin OPTIONS : x86 : 64 : -arch x86_64 ; + +arch-addr-flags darwin OPTIONS : power : 32 : -arch ppc : default ; +arch-addr-flags darwin OPTIONS : power : 64 : -arch ppc64 ; + + +flags darwin.link OPTIONS static + : -nodefaultlibs -shared-libgcc -lstdc++-static -lgcc_eh -lgcc -lSystem ; + +flags darwin.link OPTIONS release : -Wl,-dead_strip -no_dead_strip_inits_and_terms ; + flags darwin.compile OPTIONS shared : -dynamic ; -flags darwin.compile OPTIONS : -Wno-long-double -no-cpp-precomp ; +flags darwin.compile OPTIONS : -Wno-long-double -no-cpp-precomp -gdwarf-2 ; flags darwin.link FRAMEWORK ; @@ -86,11 +189,12 @@ rule link.dll actions link.dll bind LIBRARIES { - $(CONFIG_COMMAND) -dynamiclib -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS) + $(CONFIG_COMMAND) -dynamiclib -install_name "$(<:B)$(<:S)" -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS) } +# We use libtool instead of ar to support universal binary linking +# TODO: Find a way to use the underlying tools, i.e. lipo, to do this. actions piecemeal archive { - ar -c -r -s $(ARFLAGS) "$(<:T)" "$(>:T)" + libtool -static -o "$(<:T)" $(ARFLAGS) "$(>:T)" } - From cca76bfc6a70498677fc2cf8b0f261b9801f22d2 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 3 Dec 2007 02:57:49 +0000 Subject: [PATCH 38/40] Work around some Windows CMD.EXE programs that will fail executing a totally empty batch file. [SVN r41626] --- historic/jam/src/execnt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/historic/jam/src/execnt.c b/historic/jam/src/execnt.c index a7e65da43..41dd1dab4 100644 --- a/historic/jam/src/execnt.c +++ b/historic/jam/src/execnt.c @@ -238,7 +238,7 @@ void execcmd( } /* Trim leading, -ending- white space */ - while( isspace( *command ) ) + while( *(command+1) && isspace( *command ) ) ++command; /* Write to .BAT file unless the line would be too long and it From c9603dac1499eda464b5586f4235dc812ebeac7f Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 3 Dec 2007 03:06:22 +0000 Subject: [PATCH 39/40] Work around some Windows CMD.EXE programs that will fail executing a totally empty batch file. [SVN r41627] --- historic/jam/doc/history.qbk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/historic/jam/doc/history.qbk b/historic/jam/doc/history.qbk index d8dfbac97..b9024aae6 100644 --- a/historic/jam/doc/history.qbk +++ b/historic/jam/doc/history.qbk @@ -5,6 +5,10 @@ This is mostly a bug fix release. [list + [li Work around some Windows CMD.EXE programs that will fail executing a totally + empty batch file. + -- ['Rene R.] + ] [li Add support for detection and building with =vc9=. -- ['John P.] ] From a2aab13fac883d796f61cad6beae8eb8b6f56cb7 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Mon, 3 Dec 2007 03:17:01 +0000 Subject: [PATCH 40/40] Boost Jam 3.1.16 Release [SVN r41628] --- boost.css | 65 - historic/jam/build_dist.bat | 0 index.html | 21 - v2/boost-build.jam | 8 - v2/boost.css | 63 - v2/boost_build.png | Bin 7437 -> 0 bytes v2/bootstrap.jam | 18 - v2/build-system.jam | 717 --- v2/build/alias.jam | 75 - v2/build/build-request.jam | 300 -- v2/build/feature.jam | 1284 ----- v2/build/generators.jam | 1191 ----- v2/build/modifiers.jam | 240 - v2/build/project.jam | 1026 ---- v2/build/property-set.jam | 464 -- v2/build/property.jam | 704 --- v2/build/readme.txt | 13 - v2/build/scanner.jam | 151 - v2/build/targets.jam | 1550 ------ v2/build/toolset.jam | 501 -- v2/build/type.jam | 370 -- v2/build/version.jam | 20 - v2/build/virtual-target.jam | 1236 ----- v2/changes.txt | 317 -- v2/debian/boost-build.docs | 4 - v2/debian/boost-build.examples | 1 - v2/debian/changelog | 6 - v2/debian/conffiles | 1 - v2/debian/control | 13 - v2/debian/copyright | 0 v2/debian/excludes | 14 - v2/debian/rules | 56 - v2/doc/Jamfile.v2 | 29 - v2/doc/development_plan.html | 130 - v2/doc/src/advanced.xml | 1235 ----- v2/doc/src/architecture.xml | 636 --- v2/doc/src/catalog.xml | 9 - v2/doc/src/extending.xml | 873 --- v2/doc/src/faq.xml | 400 -- v2/doc/src/fragments.xml | 58 - v2/doc/src/howto.xml | 34 - v2/doc/src/install.xml | 228 - v2/doc/src/recipes.xml | 11 - v2/doc/src/reference.xml | 2133 -------- v2/doc/src/standalone.xml | 32 - v2/doc/src/tasks.xml | 657 --- v2/doc/src/tutorial.xml | 716 --- v2/doc/src/userman.xml | 24 - v2/doc/src/v1_vs_v2.xml | 111 - v2/doc/tools.html | 92 - v2/doc/userman.pdf | 4763 ----------------- v2/example/boost-build.jam | 6 - v2/example/customization/Jamfile | 7 - v2/example/customization/class.verbatim | 7 - v2/example/customization/codegen.cpp | 36 - v2/example/customization/inline_file.py | 44 - v2/example/customization/project-root.jam | 6 - v2/example/customization/readme.txt | 11 - v2/example/customization/t1.verbatim | 2 - v2/example/customization/t2.verbatim | 0 v2/example/customization/usage.verbatim | 6 - v2/example/customization/verbatim.jam | 51 - v2/example/generate/Jamroot | 35 - v2/example/generate/REAME.txt | 15 - v2/example/generate/a.cpp | 10 - v2/example/generator/Jamroot | 6 - v2/example/generator/README.txt | 7 - v2/example/generator/foo.gci | 10 - v2/example/generator/soap.jam | 77 - v2/example/gettext/Jamfile | 26 - v2/example/gettext/main.cpp | 28 - v2/example/gettext/project-root.jam | 6 - v2/example/gettext/readme.txt | 25 - v2/example/gettext/russian.po | 21 - v2/example/hello/Jamroot | 2 - v2/example/hello/hello.cpp | 16 - v2/example/libraries/Jamroot | 4 - v2/example/libraries/app/Jamfile | 9 - v2/example/libraries/app/app.cpp | 15 - v2/example/libraries/util/foo/Jamfile | 9 - v2/example/libraries/util/foo/bar.cpp | 13 - v2/example/libraries/util/foo/include/lib1.h | 10 - v2/example/make/Jamroot | 23 - v2/example/make/main_cpp.pro | 2 - v2/example/make/readme.txt | 7 - v2/example/pch/Jamroot | 29 - v2/example/pch/include/pch.hpp | 19 - v2/example/pch/source/hello_world.cpp | 15 - v2/example/python_modules/Jamroot | 8 - v2/example/python_modules/python_helpers.jam | 10 - v2/example/python_modules/python_helpers.py | 18 - v2/example/python_modules/readme.txt | 15 - v2/example/qt/README.txt | 21 - v2/example/qt/qt3/hello/Jamroot | 13 - v2/example/qt/qt3/hello/canvas.cpp | 73 - v2/example/qt/qt3/hello/canvas.h | 35 - v2/example/qt/qt3/hello/main.cpp | 36 - v2/example/qt/qt3/moccable-cpp/Jamroot | 11 - v2/example/qt/qt3/moccable-cpp/main.cpp | 41 - v2/example/qt/qt3/uic/Jamroot | 15 - v2/example/qt/qt3/uic/hello_world_widget.ui | 58 - v2/example/qt/qt3/uic/main.cpp | 18 - v2/example/qt/qt4/hello/Jamroot | 14 - v2/example/qt/qt4/hello/arrow.cpp | 158 - v2/example/qt/qt4/hello/arrow.h | 30 - v2/example/qt/qt4/hello/main.cpp | 27 - v2/example/qt/qt4/moccable-cpp/Jamroot | 18 - v2/example/qt/qt4/moccable-cpp/main.cpp | 39 - v2/example/qt/qt4/uic/Jamroot | 18 - v2/example/qt/qt4/uic/hello_world_widget.ui | 55 - v2/example/qt/qt4/uic/main.cpp | 23 - v2/example/variant/Jamfile | 13 - v2/example/variant/a.cpp | 7 - v2/example/variant/libs/Jamfile | 6 - v2/example/variant/libs/l.cpp | 9 - v2/example/variant/project-root.jam | 14 - v2/example/variant/readme.txt | 11 - v2/example/versioned/hello.cpp | 12 - v2/example/versioned/jamfile.jam | 9 - v2/example/versioned/project-root.jam | 8 - v2/generators_prototype.py | 731 --- v2/hacking.txt | 154 - v2/index.html | 171 - v2/kernel/boost-build.jam | 5 - v2/kernel/bootstrap.jam | 134 - v2/kernel/class.jam | 431 -- v2/kernel/errors.jam | 264 - v2/kernel/modules.jam | 331 -- v2/nightly.sh | 29 - v2/notes/README.txt | 8 - v2/notes/build_dir_option.txt | 80 - v2/notes/relative_source_paths.txt | 76 - v2/options/help.jam | 211 - v2/release_procedure.txt | 83 - v2/roll.sh | 61 - v2/site-config.jam | 4 - v2/test/BoostBuild.py | 835 --- v2/test/Jamfile | 11 - v2/test/Jamrules | 4 - v2/test/TestCmd.py | 618 --- v2/test/abs_workdir.py | 39 - v2/test/absolute_sources.py | 77 - v2/test/alias.py | 80 - v2/test/alternatives.py | 120 - v2/test/assert-equal.jam | 33 - v2/test/bad_dirname.py | 23 - v2/test/boost-build.jam | 14 - v2/test/boostbook.py | 23 - v2/test/boostbook/Jamroot | 3 - v2/test/boostbook/a.hpp | 16 - v2/test/boostbook/docs.xml | 36 - v2/test/build_dir.py | 113 - v2/test/build_file.py | 46 - v2/test/build_no.py | 35 - v2/test/c_file.py | 34 - v2/test/chain.py | 60 - v2/test/check-arguments.jam | 71 - v2/test/check-bindrule.jam | 29 - v2/test/check-jam-patches.jam | 293 - v2/test/check-test-tools.jam | 26 - v2/test/clean.py | 130 - v2/test/composite.py | 29 - v2/test/conditionals.py | 55 - v2/test/conditionals2.py | 48 - v2/test/conditionals3.py | 33 - v2/test/core_d12.py | 40 - v2/test/core_delete_module.py | 51 - v2/test/core_dependencies.py | 156 - v2/test/core_import_module.py | 64 - v2/test/core_modifiers.py | 60 - v2/test/core_typecheck.py | 47 - v2/test/core_varnames.py | 37 - v2/test/custom_generator.py | 55 - v2/test/default_build.py | 92 - v2/test/default_features.py | 56 - v2/test/dependency-test/Jamfile | 25 - v2/test/dependency-test/a.cpp | 17 - v2/test/dependency-test/a.h | 8 - v2/test/dependency-test/a_c.c | 12 - v2/test/dependency-test/b.cpp | 14 - v2/test/dependency-test/b.h | 8 - v2/test/dependency-test/c.cpp | 14 - v2/test/dependency-test/e.cpp | 15 - v2/test/dependency-test/foo.jam | 34 - v2/test/dependency-test/project-root.jam | 7 - v2/test/dependency-test/src1/a.h | 10 - v2/test/dependency-test/src1/b.h | 10 - v2/test/dependency-test/src1/c.h | 8 - v2/test/dependency-test/src1/z.h | 5 - v2/test/dependency-test/src2/b.h | 8 - v2/test/dependency-test/x.foo | 0 v2/test/dependency-test/y.foo | 0 v2/test/dependency_property.py | 41 - v2/test/dependency_test.py | 109 - v2/test/direct-request-test/Jamfile | 13 - v2/test/direct-request-test/Jamfile2 | 9 - v2/test/direct-request-test/a.cpp | 19 - v2/test/direct-request-test/b.cpp | 22 - v2/test/direct-request-test/b_inverse.cpp | 22 - v2/test/direct-request-test/project-root.jam | 6 - v2/test/direct_request_test.py | 46 - v2/test/disambiguation.py | 37 - v2/test/dll_path.py | 127 - v2/test/double_loading.py | 46 - v2/test/duplicate.py | 43 - v2/test/echo_args.jam | 20 - v2/test/empty.jam | 5 - v2/test/example_customization.py | 23 - v2/test/example_gettext.py | 31 - v2/test/example_libraries.py | 22 - v2/test/example_make.py | 20 - v2/test/example_qt4.py | 26 - v2/test/expansion.py | 91 - v2/test/explicit.py | 74 - v2/test/free_features_request.py | 45 - v2/test/gcc_runtime.py | 33 - v2/test/generators-test/Jamfile | 19 - v2/test/generators-test/a.cpp | 22 - v2/test/generators-test/b.cxx | 10 - v2/test/generators-test/c.tui | 0 v2/test/generators-test/d.wd | 0 v2/test/generators-test/e.cpp | 8 - v2/test/generators-test/extra.jam | 113 - v2/test/generators-test/lex.jam | 26 - v2/test/generators-test/lib/Jamfile | 9 - v2/test/generators-test/lib/c.cpp | 10 - v2/test/generators-test/nm.jam | 39 - v2/test/generators-test/project-root.jam | 95 - v2/test/generators-test/qt.jam | 34 - v2/test/generators-test/x.l | 5 - v2/test/generators-test/y.x_pro | 0 v2/test/generators-test/z.cpp | 16 - v2/test/generators_test.py | 41 - v2/test/implicit_dependency.py | 56 - v2/test/indirect_conditional.py | 84 - v2/test/inherit_toolset.py | 77 - v2/test/inline.py | 70 - v2/test/lib_source_property.py | 45 - v2/test/library_chain.py | 165 - v2/test/library_order.py | 122 - v2/test/library_property.py | 62 - v2/test/load_dir.py | 84 - v2/test/load_order.py | 75 - v2/test/loop.py | 27 - v2/test/m1-01.py | 65 - v2/test/m1-02.py | 92 - v2/test/m1-03.py | 61 - v2/test/make_rule.py | 62 - v2/test/module-actions/boost-build.jam | 5 - v2/test/module-actions/bootstrap.jam | 75 - v2/test/module_actions.py | 44 - v2/test/ndebug.py | 46 - v2/test/no_type.py | 22 - v2/test/notfile.py | 56 - v2/test/ordered_properties.py | 45 - v2/test/out_of_tree.py | 46 - v2/test/path_features.py | 83 - v2/test/pch.py | 70 - v2/test/prebuilt.py | 43 - v2/test/prebuilt/Jamfile | 13 - v2/test/prebuilt/ext/Jamfile | 13 - v2/test/prebuilt/ext/Jamfile2 | 39 - v2/test/prebuilt/ext/Jamfile3 | 46 - v2/test/prebuilt/ext/a.cpp | 17 - v2/test/prebuilt/ext/debug/a.h | 13 - v2/test/prebuilt/ext/project-root.jam | 5 - v2/test/prebuilt/ext/release/a.h | 13 - v2/test/prebuilt/hello.cpp | 20 - v2/test/prebuilt/project-root.jam | 4 - v2/test/print.py | 47 - v2/test/project-test1.jam | 18 - v2/test/project-test1/Jamfile | 10 - v2/test/project-test1/dir/Jamfile | 10 - v2/test/project-test1/dir2/Jamfile | 9 - v2/test/project-test1/dir2/project-root.jam | 4 - v2/test/project-test1/project-root.jam | 6 - v2/test/project-test1/project-test1.jam | 21 - v2/test/project-test1/readme.txt | 8 - v2/test/project-test1/standalone-project.jam | 12 - v2/test/project-test3/Jamfile | 13 - v2/test/project-test3/a.cpp | 8 - v2/test/project-test3/lib/Jamfile | 9 - v2/test/project-test3/lib/b.cpp | 8 - v2/test/project-test3/lib2/Jamfile | 11 - v2/test/project-test3/lib2/c.cpp | 8 - v2/test/project-test3/lib2/d.cpp | 8 - v2/test/project-test3/lib2/helper/Jamfile | 9 - v2/test/project-test3/lib2/helper/e.cpp | 8 - v2/test/project-test3/lib3/Jamfile | 37 - v2/test/project-test3/lib3/f.cpp | 8 - v2/test/project-test3/lib3/project-root.jam | 5 - v2/test/project-test3/project-root.jam | 46 - v2/test/project-test3/readme.txt | 7 - v2/test/project-test4/Jamfile | 11 - v2/test/project-test4/Jamfile3 | 5 - v2/test/project-test4/Jamfile4 | 4 - v2/test/project-test4/Jamfile5 | 6 - v2/test/project-test4/a.cpp | 8 - v2/test/project-test4/a_gcc.cpp | 8 - v2/test/project-test4/lib/Jamfile | 6 - v2/test/project-test4/lib/Jamfile1 | 2 - v2/test/project-test4/lib/Jamfile2 | 4 - v2/test/project-test4/lib/Jamfile3 | 2 - v2/test/project-test4/lib/b.cpp | 8 - v2/test/project-test4/lib2/Jamfile | 8 - v2/test/project-test4/lib2/Jamfile2 | 4 - v2/test/project-test4/project-root.jam | 47 - v2/test/project-test4/readme.txt | 6 - v2/test/project_dependencies.py | 51 - v2/test/project_glob.py | 180 - v2/test/project_root_constants.py | 67 - v2/test/project_root_rule.py | 40 - v2/test/project_test1.py | 79 - v2/test/project_test3.py | 140 - v2/test/project_test4.py | 68 - v2/test/property_expansion.py | 34 - v2/test/railsys.py | 14 - v2/test/railsys/libx/include/test_libx.h | 25 - v2/test/railsys/libx/project-root.jam | 13 - v2/test/railsys/libx/src/Jamfile | 19 - v2/test/railsys/libx/src/test_libx.cpp | 15 - v2/test/railsys/program/Jamfile | 45 - v2/test/railsys/program/include/test_a.h | 22 - v2/test/railsys/program/liba/Jamfile | 14 - v2/test/railsys/program/liba/test_a.cpp | 17 - v2/test/railsys/program/main/Jamfile | 12 - v2/test/railsys/program/main/main.cpp | 19 - v2/test/railsys/program/project-root.jam | 14 - v2/test/readme.txt | 7 - v2/test/rebuilds.py | 53 - v2/test/recursive.jam | 117 - v2/test/regression.py | 134 - v2/test/relative_sources.py | 19 - v2/test/remove_requirement.py | 115 - v2/test/resolution.py | 38 - v2/test/searched_lib.py | 189 - v2/test/skipping.py | 40 - v2/test/source_locations.py | 53 - v2/test/stage.py | 247 - v2/test/standalone.py | 46 - v2/test/startup/boost-root/boost-build.jam | 7 - .../startup/boost-root/build/boost-build.jam | 6 - .../startup/boost-root/build/bootstrap.jam | 7 - v2/test/startup/bootstrap-env/boost-build.jam | 5 - .../bootstrap-explicit/boost-build.jam | 6 - v2/test/startup/bootstrap-implicit/readme.txt | 5 - v2/test/startup/no-bootstrap1/boost-build.jam | 6 - .../startup/no-bootstrap1/subdir/readme.txt | 5 - v2/test/startup/no-bootstrap2/boost-build.jam | 6 - v2/test/startup/no-bootstrap3/boost-build.jam | 5 - v2/test/startup_v1.py | 99 - v2/test/startup_v2.py | 83 - v2/test/subdir1/file-to-bind | 1 - v2/test/suffix.py | 64 - v2/test/svn_tree.py | 670 --- v2/test/symlink.py | 36 - v2/test/tag.py | 106 - v2/test/template.py | 41 - v2/test/test-config-example.jam | 19 - v2/test/test.jam | 23 - v2/test/test1.py | 17 - v2/test/test2.py | 24 - v2/test/test2/Jamfile | 8 - v2/test/test2/Jamrules | 0 v2/test/test2/foo.cpp | 10 - v2/test/test_all.py | 197 - v2/test/test_nt_line_length.jam | 39 - v2/test/test_system.html | 553 -- v2/test/testing-primitives/boost-build.jam | 5 - v2/test/testing-primitives/bootstrap.jam | 137 - v2/test/testing_primitives.py | 37 - v2/test/timedata.py | 57 - v2/test/tree.py | 118 - v2/test/unit-tests.jam | 262 - v2/test/unit_test.py | 43 - v2/test/unit_tests.py | 12 - v2/test/unused.py | 36 - v2/test/unused/Jamfile | 11 - v2/test/unused/a.cpp | 9 - v2/test/unused/b.cpp | 4 - v2/test/unused/b.x | 0 v2/test/unused/project-root.jam | 57 - v2/test/use_requirements.py | 359 -- v2/test/using.py | 43 - v2/test/v1-testing/Jamfile | 26 - v2/test/v1-testing/a.cpp | 5 - v2/test/v1-testing/b.cpp | 5 - v2/test/v1-testing/boost-build.jam | 6 - v2/test/v1-testing/c.cpp | 16 - v2/test/v1_testing.py | 88 - v2/test/v1_testing/Jamfile | 23 - v2/test/v1_testing/Jamrules | 0 v2/test/v1_testing/boost-build.jam | 6 - v2/test/v1_testing/foo.cpp | 22 - v2/test/v1_testing/lib-err.cpp | 7 - v2/test/v1_testing/lib.cpp | 6 - v2/test/v1_testing/project-root.jam | 5 - v2/test/wrapper.py | 46 - v2/test/wrong_project.py | 43 - v2/tools/acc.jam | 107 - v2/tools/bison.jam | 32 - v2/tools/boostbook-config.jam | 53 - v2/tools/boostbook.jam | 459 -- v2/tools/borland.jam | 224 - v2/tools/builtin.jam | 930 ---- v2/tools/cast.jam | 89 - v2/tools/common.jam | 830 --- v2/tools/como-linux.jam | 101 - v2/tools/como-win.jam | 112 - v2/tools/como.jam | 30 - v2/tools/cw-config.jam | 34 - v2/tools/cw.jam | 245 - v2/tools/darwin.jam | 200 - v2/tools/dmc.jam | 134 - v2/tools/docutils.jam | 81 - v2/tools/doxproc.py | 859 --- v2/tools/doxygen-config.jam | 11 - v2/tools/doxygen.jam | 459 -- v2/tools/fop.jam | 102 - v2/tools/fortran.jam | 55 - v2/tools/gcc.jam | 878 --- v2/tools/generate.jam | 108 - v2/tools/gettext.jam | 234 - v2/tools/gfortran.jam | 39 - v2/tools/hp_cxx.jam | 168 - v2/tools/hpfortran.jam | 35 - v2/tools/ifort.jam | 44 - v2/tools/intel-linux.jam | 101 - v2/tools/intel-win.jam | 161 - v2/tools/intel.jam | 30 - v2/tools/lex.jam | 33 - v2/tools/make.jam | 73 - v2/tools/mc.jam | 44 - v2/tools/midl.jam | 142 - v2/tools/mipspro.jam | 145 - v2/tools/mpi.jam | 501 -- v2/tools/msvc-config.jam | 12 - v2/tools/msvc.jam | 1023 ---- v2/tools/notfile.jam | 71 - v2/tools/package.jam | 98 - v2/tools/pathscale.jam | 150 - v2/tools/pch.jam | 97 - v2/tools/pgi.jam | 139 - v2/tools/python-config.jam | 27 - v2/tools/python.jam | 1197 ----- v2/tools/qcc.jam | 228 - v2/tools/qt.jam | 17 - v2/tools/qt3.jam | 212 - v2/tools/qt4.jam | 589 -- v2/tools/quickbook-config.jam | 44 - v2/tools/quickbook.jam | 315 -- v2/tools/rc.jam | 155 - v2/tools/stage.jam | 493 -- v2/tools/stlport.jam | 296 - v2/tools/sun.jam | 137 - v2/tools/symlink.jam | 138 - v2/tools/testing.jam | 537 -- v2/tools/types/asm.jam | 4 - v2/tools/types/cpp.jam | 4 - v2/tools/types/exe.jam | 5 - v2/tools/types/html.jam | 4 - v2/tools/types/lib.jam | 32 - v2/tools/types/obj.jam | 5 - v2/tools/types/qt.jam | 10 - v2/tools/types/register.jam | 39 - v2/tools/types/rsp.jam | 4 - v2/tools/unix.jam | 224 - v2/tools/vacpp.jam | 136 - v2/tools/whale.jam | 116 - v2/tools/xlf.jam | 39 - v2/tools/xsltproc-config.jam | 37 - v2/tools/xsltproc.jam | 112 - v2/user-config.jam | 78 - v2/util/assert.jam | 142 - v2/util/container.jam | 314 -- v2/util/doc.jam | 970 ---- v2/util/indirect.jam | 103 - v2/util/numbers.jam | 230 - v2/util/option.jam | 93 - v2/util/order.jam | 173 - v2/util/os.jam | 164 - v2/util/path.jam | 824 --- v2/util/print.jam | 406 -- v2/util/regex.jam | 184 - v2/util/sequence.jam | 320 -- v2/util/set.jam | 62 - v2/util/string.jam | 181 - v2/util/utility.jam | 157 - 488 files changed, 58837 deletions(-) delete mode 100644 boost.css mode change 100644 => 100755 historic/jam/build_dist.bat delete mode 100644 index.html delete mode 100644 v2/boost-build.jam delete mode 100644 v2/boost.css delete mode 100644 v2/boost_build.png delete mode 100644 v2/bootstrap.jam delete mode 100755 v2/build-system.jam delete mode 100644 v2/build/alias.jam delete mode 100644 v2/build/build-request.jam delete mode 100644 v2/build/feature.jam delete mode 100644 v2/build/generators.jam delete mode 100644 v2/build/modifiers.jam delete mode 100644 v2/build/project.jam delete mode 100644 v2/build/property-set.jam delete mode 100644 v2/build/property.jam delete mode 100644 v2/build/readme.txt delete mode 100644 v2/build/scanner.jam delete mode 100644 v2/build/targets.jam delete mode 100644 v2/build/toolset.jam delete mode 100644 v2/build/type.jam delete mode 100644 v2/build/version.jam delete mode 100644 v2/build/virtual-target.jam delete mode 100644 v2/changes.txt delete mode 100644 v2/debian/boost-build.docs delete mode 100644 v2/debian/boost-build.examples delete mode 100644 v2/debian/changelog delete mode 100644 v2/debian/conffiles delete mode 100644 v2/debian/control delete mode 100644 v2/debian/copyright delete mode 100644 v2/debian/excludes delete mode 100755 v2/debian/rules delete mode 100644 v2/doc/Jamfile.v2 delete mode 100644 v2/doc/development_plan.html delete mode 100644 v2/doc/src/advanced.xml delete mode 100644 v2/doc/src/architecture.xml delete mode 100644 v2/doc/src/catalog.xml delete mode 100644 v2/doc/src/extending.xml delete mode 100644 v2/doc/src/faq.xml delete mode 100644 v2/doc/src/fragments.xml delete mode 100644 v2/doc/src/howto.xml delete mode 100644 v2/doc/src/install.xml delete mode 100644 v2/doc/src/recipes.xml delete mode 100644 v2/doc/src/reference.xml delete mode 100644 v2/doc/src/standalone.xml delete mode 100644 v2/doc/src/tasks.xml delete mode 100644 v2/doc/src/tutorial.xml delete mode 100644 v2/doc/src/userman.xml delete mode 100644 v2/doc/src/v1_vs_v2.xml delete mode 100644 v2/doc/tools.html delete mode 100644 v2/doc/userman.pdf delete mode 100644 v2/example/boost-build.jam delete mode 100644 v2/example/customization/Jamfile delete mode 100644 v2/example/customization/class.verbatim delete mode 100644 v2/example/customization/codegen.cpp delete mode 100644 v2/example/customization/inline_file.py delete mode 100644 v2/example/customization/project-root.jam delete mode 100644 v2/example/customization/readme.txt delete mode 100644 v2/example/customization/t1.verbatim delete mode 100644 v2/example/customization/t2.verbatim delete mode 100644 v2/example/customization/usage.verbatim delete mode 100644 v2/example/customization/verbatim.jam delete mode 100644 v2/example/generate/Jamroot delete mode 100644 v2/example/generate/REAME.txt delete mode 100644 v2/example/generate/a.cpp delete mode 100644 v2/example/generator/Jamroot delete mode 100644 v2/example/generator/README.txt delete mode 100644 v2/example/generator/foo.gci delete mode 100644 v2/example/generator/soap.jam delete mode 100644 v2/example/gettext/Jamfile delete mode 100644 v2/example/gettext/main.cpp delete mode 100644 v2/example/gettext/project-root.jam delete mode 100644 v2/example/gettext/readme.txt delete mode 100644 v2/example/gettext/russian.po delete mode 100644 v2/example/hello/Jamroot delete mode 100644 v2/example/hello/hello.cpp delete mode 100644 v2/example/libraries/Jamroot delete mode 100644 v2/example/libraries/app/Jamfile delete mode 100644 v2/example/libraries/app/app.cpp delete mode 100644 v2/example/libraries/util/foo/Jamfile delete mode 100644 v2/example/libraries/util/foo/bar.cpp delete mode 100644 v2/example/libraries/util/foo/include/lib1.h delete mode 100644 v2/example/make/Jamroot delete mode 100644 v2/example/make/main_cpp.pro delete mode 100644 v2/example/make/readme.txt delete mode 100644 v2/example/pch/Jamroot delete mode 100644 v2/example/pch/include/pch.hpp delete mode 100644 v2/example/pch/source/hello_world.cpp delete mode 100644 v2/example/python_modules/Jamroot delete mode 100644 v2/example/python_modules/python_helpers.jam delete mode 100644 v2/example/python_modules/python_helpers.py delete mode 100644 v2/example/python_modules/readme.txt delete mode 100644 v2/example/qt/README.txt delete mode 100644 v2/example/qt/qt3/hello/Jamroot delete mode 100644 v2/example/qt/qt3/hello/canvas.cpp delete mode 100644 v2/example/qt/qt3/hello/canvas.h delete mode 100644 v2/example/qt/qt3/hello/main.cpp delete mode 100644 v2/example/qt/qt3/moccable-cpp/Jamroot delete mode 100644 v2/example/qt/qt3/moccable-cpp/main.cpp delete mode 100644 v2/example/qt/qt3/uic/Jamroot delete mode 100644 v2/example/qt/qt3/uic/hello_world_widget.ui delete mode 100644 v2/example/qt/qt3/uic/main.cpp delete mode 100644 v2/example/qt/qt4/hello/Jamroot delete mode 100644 v2/example/qt/qt4/hello/arrow.cpp delete mode 100644 v2/example/qt/qt4/hello/arrow.h delete mode 100644 v2/example/qt/qt4/hello/main.cpp delete mode 100644 v2/example/qt/qt4/moccable-cpp/Jamroot delete mode 100644 v2/example/qt/qt4/moccable-cpp/main.cpp delete mode 100644 v2/example/qt/qt4/uic/Jamroot delete mode 100644 v2/example/qt/qt4/uic/hello_world_widget.ui delete mode 100644 v2/example/qt/qt4/uic/main.cpp delete mode 100644 v2/example/variant/Jamfile delete mode 100644 v2/example/variant/a.cpp delete mode 100644 v2/example/variant/libs/Jamfile delete mode 100644 v2/example/variant/libs/l.cpp delete mode 100644 v2/example/variant/project-root.jam delete mode 100644 v2/example/variant/readme.txt delete mode 100644 v2/example/versioned/hello.cpp delete mode 100644 v2/example/versioned/jamfile.jam delete mode 100644 v2/example/versioned/project-root.jam delete mode 100644 v2/generators_prototype.py delete mode 100644 v2/hacking.txt delete mode 100644 v2/index.html delete mode 100755 v2/kernel/boost-build.jam delete mode 100755 v2/kernel/bootstrap.jam delete mode 100644 v2/kernel/class.jam delete mode 100755 v2/kernel/errors.jam delete mode 100755 v2/kernel/modules.jam delete mode 100755 v2/nightly.sh delete mode 100644 v2/notes/README.txt delete mode 100644 v2/notes/build_dir_option.txt delete mode 100644 v2/notes/relative_source_paths.txt delete mode 100755 v2/options/help.jam delete mode 100644 v2/release_procedure.txt delete mode 100755 v2/roll.sh delete mode 100644 v2/site-config.jam delete mode 100644 v2/test/BoostBuild.py delete mode 100644 v2/test/Jamfile delete mode 100644 v2/test/Jamrules delete mode 100644 v2/test/TestCmd.py delete mode 100644 v2/test/abs_workdir.py delete mode 100644 v2/test/absolute_sources.py delete mode 100644 v2/test/alias.py delete mode 100644 v2/test/alternatives.py delete mode 100644 v2/test/assert-equal.jam delete mode 100644 v2/test/bad_dirname.py delete mode 100644 v2/test/boost-build.jam delete mode 100644 v2/test/boostbook.py delete mode 100644 v2/test/boostbook/Jamroot delete mode 100644 v2/test/boostbook/a.hpp delete mode 100644 v2/test/boostbook/docs.xml delete mode 100644 v2/test/build_dir.py delete mode 100644 v2/test/build_file.py delete mode 100644 v2/test/build_no.py delete mode 100644 v2/test/c_file.py delete mode 100644 v2/test/chain.py delete mode 100644 v2/test/check-arguments.jam delete mode 100644 v2/test/check-bindrule.jam delete mode 100644 v2/test/check-jam-patches.jam delete mode 100644 v2/test/check-test-tools.jam delete mode 100644 v2/test/clean.py delete mode 100644 v2/test/composite.py delete mode 100644 v2/test/conditionals.py delete mode 100644 v2/test/conditionals2.py delete mode 100644 v2/test/conditionals3.py delete mode 100644 v2/test/core_d12.py delete mode 100644 v2/test/core_delete_module.py delete mode 100644 v2/test/core_dependencies.py delete mode 100644 v2/test/core_import_module.py delete mode 100644 v2/test/core_modifiers.py delete mode 100644 v2/test/core_typecheck.py delete mode 100644 v2/test/core_varnames.py delete mode 100644 v2/test/custom_generator.py delete mode 100644 v2/test/default_build.py delete mode 100644 v2/test/default_features.py delete mode 100644 v2/test/dependency-test/Jamfile delete mode 100644 v2/test/dependency-test/a.cpp delete mode 100644 v2/test/dependency-test/a.h delete mode 100644 v2/test/dependency-test/a_c.c delete mode 100644 v2/test/dependency-test/b.cpp delete mode 100644 v2/test/dependency-test/b.h delete mode 100644 v2/test/dependency-test/c.cpp delete mode 100644 v2/test/dependency-test/e.cpp delete mode 100644 v2/test/dependency-test/foo.jam delete mode 100644 v2/test/dependency-test/project-root.jam delete mode 100644 v2/test/dependency-test/src1/a.h delete mode 100644 v2/test/dependency-test/src1/b.h delete mode 100644 v2/test/dependency-test/src1/c.h delete mode 100644 v2/test/dependency-test/src1/z.h delete mode 100644 v2/test/dependency-test/src2/b.h delete mode 100644 v2/test/dependency-test/x.foo delete mode 100644 v2/test/dependency-test/y.foo delete mode 100644 v2/test/dependency_property.py delete mode 100644 v2/test/dependency_test.py delete mode 100644 v2/test/direct-request-test/Jamfile delete mode 100644 v2/test/direct-request-test/Jamfile2 delete mode 100644 v2/test/direct-request-test/a.cpp delete mode 100644 v2/test/direct-request-test/b.cpp delete mode 100644 v2/test/direct-request-test/b_inverse.cpp delete mode 100644 v2/test/direct-request-test/project-root.jam delete mode 100644 v2/test/direct_request_test.py delete mode 100644 v2/test/disambiguation.py delete mode 100644 v2/test/dll_path.py delete mode 100644 v2/test/double_loading.py delete mode 100644 v2/test/duplicate.py delete mode 100644 v2/test/echo_args.jam delete mode 100644 v2/test/empty.jam delete mode 100644 v2/test/example_customization.py delete mode 100644 v2/test/example_gettext.py delete mode 100644 v2/test/example_libraries.py delete mode 100644 v2/test/example_make.py delete mode 100644 v2/test/example_qt4.py delete mode 100644 v2/test/expansion.py delete mode 100644 v2/test/explicit.py delete mode 100644 v2/test/free_features_request.py delete mode 100644 v2/test/gcc_runtime.py delete mode 100644 v2/test/generators-test/Jamfile delete mode 100644 v2/test/generators-test/a.cpp delete mode 100644 v2/test/generators-test/b.cxx delete mode 100644 v2/test/generators-test/c.tui delete mode 100644 v2/test/generators-test/d.wd delete mode 100644 v2/test/generators-test/e.cpp delete mode 100644 v2/test/generators-test/extra.jam delete mode 100644 v2/test/generators-test/lex.jam delete mode 100644 v2/test/generators-test/lib/Jamfile delete mode 100644 v2/test/generators-test/lib/c.cpp delete mode 100644 v2/test/generators-test/nm.jam delete mode 100644 v2/test/generators-test/project-root.jam delete mode 100644 v2/test/generators-test/qt.jam delete mode 100644 v2/test/generators-test/x.l delete mode 100644 v2/test/generators-test/y.x_pro delete mode 100644 v2/test/generators-test/z.cpp delete mode 100644 v2/test/generators_test.py delete mode 100644 v2/test/implicit_dependency.py delete mode 100644 v2/test/indirect_conditional.py delete mode 100644 v2/test/inherit_toolset.py delete mode 100644 v2/test/inline.py delete mode 100644 v2/test/lib_source_property.py delete mode 100644 v2/test/library_chain.py delete mode 100644 v2/test/library_order.py delete mode 100644 v2/test/library_property.py delete mode 100644 v2/test/load_dir.py delete mode 100644 v2/test/load_order.py delete mode 100644 v2/test/loop.py delete mode 100644 v2/test/m1-01.py delete mode 100644 v2/test/m1-02.py delete mode 100644 v2/test/m1-03.py delete mode 100644 v2/test/make_rule.py delete mode 100644 v2/test/module-actions/boost-build.jam delete mode 100644 v2/test/module-actions/bootstrap.jam delete mode 100644 v2/test/module_actions.py delete mode 100644 v2/test/ndebug.py delete mode 100644 v2/test/no_type.py delete mode 100644 v2/test/notfile.py delete mode 100644 v2/test/ordered_properties.py delete mode 100644 v2/test/out_of_tree.py delete mode 100644 v2/test/path_features.py delete mode 100644 v2/test/pch.py delete mode 100644 v2/test/prebuilt.py delete mode 100644 v2/test/prebuilt/Jamfile delete mode 100644 v2/test/prebuilt/ext/Jamfile delete mode 100644 v2/test/prebuilt/ext/Jamfile2 delete mode 100644 v2/test/prebuilt/ext/Jamfile3 delete mode 100644 v2/test/prebuilt/ext/a.cpp delete mode 100644 v2/test/prebuilt/ext/debug/a.h delete mode 100644 v2/test/prebuilt/ext/project-root.jam delete mode 100644 v2/test/prebuilt/ext/release/a.h delete mode 100644 v2/test/prebuilt/hello.cpp delete mode 100644 v2/test/prebuilt/project-root.jam delete mode 100644 v2/test/print.py delete mode 100644 v2/test/project-test1.jam delete mode 100644 v2/test/project-test1/Jamfile delete mode 100644 v2/test/project-test1/dir/Jamfile delete mode 100644 v2/test/project-test1/dir2/Jamfile delete mode 100644 v2/test/project-test1/dir2/project-root.jam delete mode 100644 v2/test/project-test1/project-root.jam delete mode 100644 v2/test/project-test1/project-test1.jam delete mode 100644 v2/test/project-test1/readme.txt delete mode 100644 v2/test/project-test1/standalone-project.jam delete mode 100644 v2/test/project-test3/Jamfile delete mode 100644 v2/test/project-test3/a.cpp delete mode 100644 v2/test/project-test3/lib/Jamfile delete mode 100644 v2/test/project-test3/lib/b.cpp delete mode 100644 v2/test/project-test3/lib2/Jamfile delete mode 100644 v2/test/project-test3/lib2/c.cpp delete mode 100644 v2/test/project-test3/lib2/d.cpp delete mode 100644 v2/test/project-test3/lib2/helper/Jamfile delete mode 100644 v2/test/project-test3/lib2/helper/e.cpp delete mode 100644 v2/test/project-test3/lib3/Jamfile delete mode 100644 v2/test/project-test3/lib3/f.cpp delete mode 100644 v2/test/project-test3/lib3/project-root.jam delete mode 100644 v2/test/project-test3/project-root.jam delete mode 100644 v2/test/project-test3/readme.txt delete mode 100644 v2/test/project-test4/Jamfile delete mode 100644 v2/test/project-test4/Jamfile3 delete mode 100644 v2/test/project-test4/Jamfile4 delete mode 100644 v2/test/project-test4/Jamfile5 delete mode 100644 v2/test/project-test4/a.cpp delete mode 100644 v2/test/project-test4/a_gcc.cpp delete mode 100644 v2/test/project-test4/lib/Jamfile delete mode 100644 v2/test/project-test4/lib/Jamfile1 delete mode 100644 v2/test/project-test4/lib/Jamfile2 delete mode 100644 v2/test/project-test4/lib/Jamfile3 delete mode 100644 v2/test/project-test4/lib/b.cpp delete mode 100644 v2/test/project-test4/lib2/Jamfile delete mode 100644 v2/test/project-test4/lib2/Jamfile2 delete mode 100644 v2/test/project-test4/project-root.jam delete mode 100644 v2/test/project-test4/readme.txt delete mode 100644 v2/test/project_dependencies.py delete mode 100644 v2/test/project_glob.py delete mode 100644 v2/test/project_root_constants.py delete mode 100644 v2/test/project_root_rule.py delete mode 100644 v2/test/project_test1.py delete mode 100644 v2/test/project_test3.py delete mode 100644 v2/test/project_test4.py delete mode 100644 v2/test/property_expansion.py delete mode 100644 v2/test/railsys.py delete mode 100644 v2/test/railsys/libx/include/test_libx.h delete mode 100644 v2/test/railsys/libx/project-root.jam delete mode 100644 v2/test/railsys/libx/src/Jamfile delete mode 100644 v2/test/railsys/libx/src/test_libx.cpp delete mode 100644 v2/test/railsys/program/Jamfile delete mode 100644 v2/test/railsys/program/include/test_a.h delete mode 100644 v2/test/railsys/program/liba/Jamfile delete mode 100644 v2/test/railsys/program/liba/test_a.cpp delete mode 100644 v2/test/railsys/program/main/Jamfile delete mode 100644 v2/test/railsys/program/main/main.cpp delete mode 100644 v2/test/railsys/program/project-root.jam delete mode 100644 v2/test/readme.txt delete mode 100644 v2/test/rebuilds.py delete mode 100644 v2/test/recursive.jam delete mode 100644 v2/test/regression.py delete mode 100644 v2/test/relative_sources.py delete mode 100644 v2/test/remove_requirement.py delete mode 100644 v2/test/resolution.py delete mode 100644 v2/test/searched_lib.py delete mode 100644 v2/test/skipping.py delete mode 100644 v2/test/source_locations.py delete mode 100644 v2/test/stage.py delete mode 100644 v2/test/standalone.py delete mode 100644 v2/test/startup/boost-root/boost-build.jam delete mode 100644 v2/test/startup/boost-root/build/boost-build.jam delete mode 100644 v2/test/startup/boost-root/build/bootstrap.jam delete mode 100644 v2/test/startup/bootstrap-env/boost-build.jam delete mode 100644 v2/test/startup/bootstrap-explicit/boost-build.jam delete mode 100644 v2/test/startup/bootstrap-implicit/readme.txt delete mode 100644 v2/test/startup/no-bootstrap1/boost-build.jam delete mode 100644 v2/test/startup/no-bootstrap1/subdir/readme.txt delete mode 100644 v2/test/startup/no-bootstrap2/boost-build.jam delete mode 100644 v2/test/startup/no-bootstrap3/boost-build.jam delete mode 100644 v2/test/startup_v1.py delete mode 100644 v2/test/startup_v2.py delete mode 100644 v2/test/subdir1/file-to-bind delete mode 100644 v2/test/suffix.py delete mode 100644 v2/test/svn_tree.py delete mode 100644 v2/test/symlink.py delete mode 100644 v2/test/tag.py delete mode 100644 v2/test/template.py delete mode 100644 v2/test/test-config-example.jam delete mode 100644 v2/test/test.jam delete mode 100644 v2/test/test1.py delete mode 100644 v2/test/test2.py delete mode 100644 v2/test/test2/Jamfile delete mode 100644 v2/test/test2/Jamrules delete mode 100644 v2/test/test2/foo.cpp delete mode 100644 v2/test/test_all.py delete mode 100644 v2/test/test_nt_line_length.jam delete mode 100644 v2/test/test_system.html delete mode 100644 v2/test/testing-primitives/boost-build.jam delete mode 100644 v2/test/testing-primitives/bootstrap.jam delete mode 100644 v2/test/testing_primitives.py delete mode 100644 v2/test/timedata.py delete mode 100644 v2/test/tree.py delete mode 100644 v2/test/unit-tests.jam delete mode 100644 v2/test/unit_test.py delete mode 100644 v2/test/unit_tests.py delete mode 100644 v2/test/unused.py delete mode 100644 v2/test/unused/Jamfile delete mode 100644 v2/test/unused/a.cpp delete mode 100644 v2/test/unused/b.cpp delete mode 100644 v2/test/unused/b.x delete mode 100644 v2/test/unused/project-root.jam delete mode 100644 v2/test/use_requirements.py delete mode 100644 v2/test/using.py delete mode 100644 v2/test/v1-testing/Jamfile delete mode 100644 v2/test/v1-testing/a.cpp delete mode 100644 v2/test/v1-testing/b.cpp delete mode 100644 v2/test/v1-testing/boost-build.jam delete mode 100644 v2/test/v1-testing/c.cpp delete mode 100644 v2/test/v1_testing.py delete mode 100644 v2/test/v1_testing/Jamfile delete mode 100644 v2/test/v1_testing/Jamrules delete mode 100644 v2/test/v1_testing/boost-build.jam delete mode 100644 v2/test/v1_testing/foo.cpp delete mode 100644 v2/test/v1_testing/lib-err.cpp delete mode 100644 v2/test/v1_testing/lib.cpp delete mode 100644 v2/test/v1_testing/project-root.jam delete mode 100644 v2/test/wrapper.py delete mode 100644 v2/test/wrong_project.py delete mode 100644 v2/tools/acc.jam delete mode 100644 v2/tools/bison.jam delete mode 100644 v2/tools/boostbook-config.jam delete mode 100644 v2/tools/boostbook.jam delete mode 100644 v2/tools/borland.jam delete mode 100644 v2/tools/builtin.jam delete mode 100644 v2/tools/cast.jam delete mode 100644 v2/tools/common.jam delete mode 100644 v2/tools/como-linux.jam delete mode 100644 v2/tools/como-win.jam delete mode 100644 v2/tools/como.jam delete mode 100644 v2/tools/cw-config.jam delete mode 100644 v2/tools/cw.jam delete mode 100644 v2/tools/darwin.jam delete mode 100644 v2/tools/dmc.jam delete mode 100755 v2/tools/docutils.jam delete mode 100644 v2/tools/doxproc.py delete mode 100644 v2/tools/doxygen-config.jam delete mode 100644 v2/tools/doxygen.jam delete mode 100644 v2/tools/fop.jam delete mode 100644 v2/tools/fortran.jam delete mode 100644 v2/tools/gcc.jam delete mode 100644 v2/tools/generate.jam delete mode 100644 v2/tools/gettext.jam delete mode 100644 v2/tools/gfortran.jam delete mode 100644 v2/tools/hp_cxx.jam delete mode 100644 v2/tools/hpfortran.jam delete mode 100644 v2/tools/ifort.jam delete mode 100644 v2/tools/intel-linux.jam delete mode 100644 v2/tools/intel-win.jam delete mode 100644 v2/tools/intel.jam delete mode 100644 v2/tools/lex.jam delete mode 100644 v2/tools/make.jam delete mode 100644 v2/tools/mc.jam delete mode 100644 v2/tools/midl.jam delete mode 100644 v2/tools/mipspro.jam delete mode 100644 v2/tools/mpi.jam delete mode 100644 v2/tools/msvc-config.jam delete mode 100644 v2/tools/msvc.jam delete mode 100644 v2/tools/notfile.jam delete mode 100644 v2/tools/package.jam delete mode 100644 v2/tools/pathscale.jam delete mode 100644 v2/tools/pch.jam delete mode 100644 v2/tools/pgi.jam delete mode 100644 v2/tools/python-config.jam delete mode 100644 v2/tools/python.jam delete mode 100644 v2/tools/qcc.jam delete mode 100644 v2/tools/qt.jam delete mode 100644 v2/tools/qt3.jam delete mode 100644 v2/tools/qt4.jam delete mode 100644 v2/tools/quickbook-config.jam delete mode 100644 v2/tools/quickbook.jam delete mode 100644 v2/tools/rc.jam delete mode 100644 v2/tools/stage.jam delete mode 100644 v2/tools/stlport.jam delete mode 100644 v2/tools/sun.jam delete mode 100644 v2/tools/symlink.jam delete mode 100644 v2/tools/testing.jam delete mode 100644 v2/tools/types/asm.jam delete mode 100644 v2/tools/types/cpp.jam delete mode 100644 v2/tools/types/exe.jam delete mode 100644 v2/tools/types/html.jam delete mode 100644 v2/tools/types/lib.jam delete mode 100644 v2/tools/types/obj.jam delete mode 100644 v2/tools/types/qt.jam delete mode 100644 v2/tools/types/register.jam delete mode 100644 v2/tools/types/rsp.jam delete mode 100644 v2/tools/unix.jam delete mode 100644 v2/tools/vacpp.jam delete mode 100644 v2/tools/whale.jam delete mode 100644 v2/tools/xlf.jam delete mode 100644 v2/tools/xsltproc-config.jam delete mode 100644 v2/tools/xsltproc.jam delete mode 100644 v2/user-config.jam delete mode 100644 v2/util/assert.jam delete mode 100644 v2/util/container.jam delete mode 100644 v2/util/doc.jam delete mode 100755 v2/util/indirect.jam delete mode 100644 v2/util/numbers.jam delete mode 100644 v2/util/option.jam delete mode 100644 v2/util/order.jam delete mode 100644 v2/util/os.jam delete mode 100644 v2/util/path.jam delete mode 100644 v2/util/print.jam delete mode 100644 v2/util/regex.jam delete mode 100644 v2/util/sequence.jam delete mode 100644 v2/util/set.jam delete mode 100644 v2/util/string.jam delete mode 100644 v2/util/utility.jam diff --git a/boost.css b/boost.css deleted file mode 100644 index d0a30762d..000000000 --- a/boost.css +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright 2002 David Abrahams. -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) - */ -H1 -{ - FONT-SIZE: 200% - COLOR: #00007f -} -H2 -{ - FONT-SIZE: 150%; -} -H3 -{ - FONT-SIZE: 125%; -} -H4 -{ - FONT-SIZE: 108%; -} -BODY -{ - FONT-SIZE: 100%; - BACKGROUND-COLOR: #ffffff -} -PRE -{ - MARGIN-LEFT: 2pc; - FONT-SIZE: 80%; - BACKGROUND-COLOR: #dfffff -} -CODE -{ - FONT-SIZE: 95%; - white-space: pre -} -.index -{ - TEXT-ALIGN: left -} -.page-index -{ - TEXT-ALIGN: left -} -.definition -{ - TEXT-ALIGN: left -} -.footnote -{ - FONT-SIZE: 66%; - VERTICAL-ALIGN: super; - TEXT-DECORATION: none -} -.function-semantics -{ - CLEAR: left -} -.metafunction-semantics -{ - CLEAR: left -} diff --git a/historic/jam/build_dist.bat b/historic/jam/build_dist.bat old mode 100644 new mode 100755 diff --git a/index.html b/index.html deleted file mode 100644 index 12f22e413..000000000 --- a/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - Automatic redirection failed, please go to v2/index.html. - - diff --git a/v2/boost-build.jam b/v2/boost-build.jam deleted file mode 100644 index 73db0497b..000000000 --- a/v2/boost-build.jam +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2001, 2002 Dave Abrahams -# Copyright 2002 Rene Rivera -# Copyright 2003 Vladimir Prus -# 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) - - -boost-build kernel ; diff --git a/v2/boost.css b/v2/boost.css deleted file mode 100644 index 8401b29c3..000000000 --- a/v2/boost.css +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright 2002 Dave Abrahams */ -/* 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) */ - -H1 -{ - FONT-SIZE: 200% - COLOR: #00007f -} -H2 -{ - FONT-SIZE: 150%; -} -H3 -{ - FONT-SIZE: 125%; -} -H4 -{ - FONT-SIZE: 108%; -} -BODY -{ - FONT-SIZE: 100%; - BACKGROUND-COLOR: #ffffff -} -PRE -{ - MARGIN-LEFT: 2pc; - FONT-SIZE: 80%; - BACKGROUND-COLOR: #dfffff -} -CODE -{ - FONT-SIZE: 95%; - white-space: pre -} -.index -{ - TEXT-ALIGN: left -} -.page-index -{ - TEXT-ALIGN: left -} -.definition -{ - TEXT-ALIGN: left -} -.footnote -{ - FONT-SIZE: 66%; - VERTICAL-ALIGN: super; - TEXT-DECORATION: none -} -.function-semantics -{ - CLEAR: left -} -.metafunction-semantics -{ - CLEAR: left -} diff --git a/v2/boost_build.png b/v2/boost_build.png deleted file mode 100644 index 3a9e64df2a0ed6ba72143ea6ccabf3518add387c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7437 zcmeAS@N?(olHy`uVBq!ia0y~yVC-RFV6fp}V_;w?ZRzc1U|?V=cJd72;Nak>;YjIV zU|`@Z@Q5sCVBi)8VMc~ob0ioT7$i$vBT9nv(@M${i&7cN%ggmL^RkPR6AM!H@{7`E zzq65IV36tZba4!+nDcgSc}&RlZO7|_R~!y-&E(SH>d@$l4QzHxW;dBu@zzl4y{Y-d z8D+^npC*a>9-L5~yl$4u*{es|?slk%=_GJ=Bsq39DR6j5wk6K^_s>Ca#?0bxBF6&1 zfB&plcrGsey=n2OTd8liT1fS}F$-6`U;W={UBFA-{Pz!gzKb27d5NX<(vf$IS9dQ3tAC-@KEgx^~ zn;zP=q3p2Tv0cBvyy)5QE0wmXuWeH4YJu6p{zj+P#F$9lo0lhcX+`eC*-;1ATB}ab zo>F!C^{b`J%p4b*6z*Tdw*B3mTbQajSot#EKjgA|fAZ$dSy7x?tFq)@sk=7&@VQr8Ti9N?==!3g zEbmG3_h`rNX@j&o}Ju7QVI9^6>4;ynNrbxoxes`Kpz|6DZNb#P0Hy z*L20Xu2oSnr%okL;e7k1`#_)Umam?tlkR-Y$ zyppx4fbnPf`|TUkuCdB9q!>wB$n>4FXYl=R-Zm?WbKm{4D;7^HV!rV5A6jwH*3e+l zY|p9}PAfwm{+TKhb5_sg+uLdl4ZU`+vogmHUTf=DsMl{P`Q}=&!T#4b4yNhZaeHS4 z2WuaE>1|$MykFwx_V)|-1RbgBTOH8w;G7-DyEonc9y(gd$2kYAylU~`x#}BVyZ)@e zxt^tl7qwLuoJ{CA^40CWx&5E2o{crXb|{LON<5vaw0M6v@BDVgy}J^hJSh0W{hrHN zu2H^R-aR*V@4cdWdH-f!H^)ND*X5BGrAy9Lzk7c7xTJIQj@=fKR}wl@gXZii;7z~0 zxzKhyhg#cJW6oBm#$UgVWncYcyZp7RPt}=w_wK!^`XsIw(=la=h?^o`d-IPU6+Uw; zF23P1SQxUh(9W3sxpA?;rK95cXJ>QR>+?^3t*g2I(EH^^1va|f9~&>V#w<+ z3GHL|o^XFCDL;1OVeN;Yko+ASvcA{e3QAtjfBbz4Pt2Z4r?ZYk1uIW`aA;~w%#KOj z@!#e;MFhC}biC_6SnI?iC+oSys7B(yb`h5sk5zw?oQRj`xn=i{-25_|ga6y{*~RJy zPJcdm#J6gi#k{JiR~JNety-nUBWoqHb?er&mHtbE994uCI=AzAczQZ6_nUhrNT1;?3puNjKjVx_x(g!lhbgUBg!0Kes(7bzVb(Xz11- zsrNPC{Q4{N%)j&455ZdASFGEXZCNDsdb_&f<6pU(U$8S=|J+qzyPl&iPA+0!f>IN6 zZRfe*)uunb+~2)o;|8Hkd7_Wr&(As1#X8wwhyRJmVb51Caa?vl{J-as`0JnMZ_)Bq zQCDBQVZ((SWtmnd#-%}>O-)QL?(WLU%FO4^J)5~q?NwfuiIj!ato7e>bc$MqUT>2* zw6iCt`TX9A;XSJIxd+zW4?dfwGwZTK@PqdF{)f#!a$PRF?YdF@#%9{Odl_NL7w0_s zJ+-3xY*>z;jpG+-8QZyy*_P$EUBtTzO-_hJ?9Q~mwDv{o_bm!5^AGI5mb+amnUTRp zj^9S^e9qUEv(I`wdHy{4-k!>|)wBP9y&nH~`TV-182Jrbw;ny#D}DCb3e6Q)rD}F& z+S^sX7Huh4md=Vjb?Wf{e-lnfwB3z~IjeW%cJ{WUx7M3GlOJT895^=jq(#M_AnEMu zKYqXU^m6|A*K5!Il&*W4T2rHXW!ukh+i53qI8ZC}N6uflHMQwxyI3Rgbf0Cqtqgj6 zIKSTcoa}39-Q&lOC7qt8yQA=N+sV?aSFbv1O>H{-(4;rw+uPgi>-YWQ(hgr|va_zv z$A>2=DamKuiAfq$wQ6=h6}VRaN9s*Zu0(3EUYz@%^X#`%LKgO)k}|yaze@Vrx;edk zZ)ZH89hzmj?{1NV`lU@eOJbFu8y9aVdu+F7yG2;~riJ@AeF}8la6tCPM&>5wngfQ1 z57oOHukp9lKOyQ>v-_vPzUZw2HT!;6EkCbyn{P?P(v1uZcJup{-TP+5oZngeTtHT~ z_rwX0HF0~T3=Iu^7x#X@UoZdn_xIx;9v=3+d^JTkvY=EfLCjlCXQNBkq)l2eJ0@{& zY|(jm>2H@*j`f75R{j1<+LPVB$_v=cHl8^26vwQ0kdS2mH^^ONmH#SSA9w`kHnI8JcDUDAhNHTD5tE%XY zS`$%Yb+?($XVa&>-syT{@)S3n^N))z8Xu9LTVwN3OT^&beercq9;MZ7l-y#{ySx0o zlAa#lyLay_3LY@j)Yg8y=q~^8albv=g&hKRwZBSY_SHzuh^RZ>xWG`5voW5w8p!ig~0}q9#3w(aWF!yPB*XfO)IeucV5KV-gN7q0gC zne3lE&sjFs|M+LGpX3wL5;k{x_l)z;3wO@2tjm}!!OgH?`{sii>h5msi{BY}Aj@FU zud@0@)u~aBl}c3V*q(5ymdRLl+qz%wcz5@%XXXr(P4X;#&&n6pg#EDmXc6e%f0*%@ z%hzLbW(XdU>z`^`>VGHU%Ju8XpPrl)=ydV$^lV(8zc~2xs?gO1|Nc~}sH!qDoH}*N zp!QeE9E(Dxntg@q>t0u`V)*dW#z)?qW&R#RSu>WyIZM6PmOEd0w|M1_;26IvdHX*o z)O^3_lx*aW zo9{GbdW>55gBv%s#V)*gsiOT{Z`0?Q!7G@0&)+gR0Sv^VP;j%T|;l*2*ZF&{C%vI)%?sn$?l_?1>=6lQ@yDHsOUVh@; z*XI+N>*G`=%@#Ip+A%rRx8~Q&Abl)J$vfz-Mf>|&$HdIx%$tZW5X1a!1N#qv9=nFO8ITy%3jMQts8=YyRA~VY&6p|6g0RbxTW9I8PSYZttjAH#bS< zvHKU-3~~Fgoxep*HP)`!*5KwZ?lo0vrun-Kr%HK09J?}|Ez&{x^Q0LwI{fW^vOGT4 zdw7;<_Loy%-`*DIE$ zE=&H~JSB4Sq7IvoyeDE?BhG}cylOGIZt{xWn})}#O)YNROuDs0(Ph(fP9uNqDJve?Ofud2T$9rsJN?FCVvU$*h>aO~Ke$xcK=wR}T-4 zy5DcjkKM>**ii8?>C8;ynkl@VwOVu9Qb>Q+{Nzu?ViOP9*H4k<>S4DcPUf%rX_M2?+KE5)E3#(_d zZZVX9`t<1xn@Xdc+}y$s4;&xG-m(Alf!WB|xbW+%P=*6vUtix?@i8gq_O{*~xvR}2 z7z8fbPPm%T5yfg!9iW`H_WJqLhjjvDm7SO)dD$33uG-wY91wYSojk*rx{L&$gZIv{ zDbB5ptX^=5%`&CP_42-HE9&lU{QDqt%ElcpuU+vfc*S(HW1Xo}BeNU-+g8nFHrr6{ z-f1m|8LP_qU5rj2GCL{q=Cj-D?@fA6yMNe*F6Q1D)3;-X#gr*i9=y1?n1hQ;$?p2a zi-Mhp7#`0{>HtI(uhY-}&x{?yv| zUV1HwIZ=1dzhAE{%HPR6di>ZhYsx>{j9(mFT!*IVMn}n1 zzh1k&;NcVBr$R2-O>ee4x)TZh7*g3m0*OHQVp z5tp1)+pKtDhRid;C3-8Lah+cuBKRs}y=HxrWRQ>P4T71L_dD}%t@0cZ%jJM<>Ko4@b~-u<~#T4@B6XHb;g86iw8qD_*xi&EMQhe)c|m^1{JH-P0&Wb>Y6oGu|hz{`{EHSh8Bq)?o9p151*TB9o@qD^KrlZET_&FhhK^B?S8-6UgzxcRtuQ} zH&0G1%{moR_d4gEc7H~m!JN4#c#i$;l3HAnN-0w{ zH8;QetF1JVLs;Ff#cAPzgU##@UuMoL^<{W*VIgzbyE~mPUSw!Y?VY&C{`VVW9vKUP z$H#gvSN4TU^JF&5Sh6l%Q?xeLKepu!+he~%$t6ZR9j*7220BR8Evek29iDE~T&TSM zgvQ*c;DY{GckzYF7f+nI8`_chch~El&qrLQuHf5U=YMpe@EgTD`l(NYn?FvtwX14v z@5)^-eCqXecd>0?zqwk_dqVARIVY>_Z(rP$2+-E zjPMipJS*Zr4W}u`TT|SBe0B>^*IzUvf4`hnGGi{!^SR~s9D{;{?0!BGK5{I}JQ#6BT*@cIOCce6|a>B_i%QvmPmf*3(=#6(;`PWTbA1;nwJaa`<-qoxYe%{>2O^0@?}%JM1{7=DSmR5zodR7Db6gF|3#MZ4_cVmCOy^O4`IHRJD4v(~1PDWwQ%S%gl6g@4R z!niu(OPEIJiWRF|pPjX~sQIKXaxa;W^;5?KhxiuO(kqc>=4C8;_jjDNdNNIW%8v)L z--5cgZEl;|nXhLwG#}Sby1dT5qhyY0p#+Q7H-jA2>(%B;-;OfAxN9pgPfoAr(^daS4k2kf{=&uV38(K(UbE@?=dKMUU)_58x(*zO zyL(~bT<+DuJx(Y0?Q=P`*u}%t)YPK#lZsW@mA`q}-f3rNwO+XrvL=4N9D~ACFT>PR zB1@JpKYaA)(zm?F_HNSZiT|?m=If`0J0r}h*WCN0P@nI@&vU%6=}m>vPNw)j>H11e z%mUU`3RSHv8M@Q1dZ(V)Q7657@}&;()W3Ud4Dwq3`D6zl=R34<^UM`$C+5ahtY`AJ zyVdaVu(Dy6hyUC-!&LsP0yA6b-IIel#db9wGg-alp|8)vH;%m9WNmz>tleOK_!r+v zZvlqB<*5&2+|1fs+7>OI&c4U??t$tVt?SFbpWBdcwsmRP>PY9UlY6dwnHU{#OYM9E z@BH?qo8vA;-_tf>xXnK=ZLPanc*60Cn_cEkUq11MIQxV1S5~{cJ6Zab7c_A2P0l#C z_OisY^Yi)C1X)1$le#< zGP_&Ys$z$OMnS`lxUN^TtgbmUuI1$Wa`X)6F6R@|r-VP;y>^-UvhbBxHP)|jP4(5i z$h3O?boRx^!?rWz@8Dw9bz1vkvE#A}J74U7`T2UJvA7-YnHdICK32D|mb$!u*SN!H zg7Blrw)4*)zTbT8QS*+6H@8xk11x@P?SYbwQiB+0Ps&5gvcr9DgID+Hb$=}VaUxj^*M=ck)L z{JVaehwI!mgeP7rzFeJSE5 z!m(DB4>xa5J9N@%Kd0u!=0k$66T-@lwJhZLaJ5XiHtvO}P{UMib>XjC&CIoil_~Yy z8L5AJQ=iK?oKJoOXr7v!7 zR{!+rQ^&G1Ix|ap&OdKH|GfF|Lj^4@u0OTEzb)J|$Fihl?ONSCcjw=kvwr$=Z80C& zPDQIb!JaQKoD-e@ub9m*eph2W|6E0`7j9k+`PD~yL{Xf0}gZMBNN~(^(Z)I82Uhi~4@B=19KXmzXD) zK79UkVD)9Uh4B`Zhvqyx(<#~57x#99wdT|t+#e&KE?sf&#l@|{`|j6?gm31azr~87 z;qr3-nF&YiagBQn-6Y-|f>)pO`(9+_yB`npKu}?uDpS!^Xo^vrToH_s->gc64t;xSE@y z>0_~f7UitwpSn5@Ih(YfetO{kapC4F_GF)smdH)qv$*-#Gv2>zY7{&uVZMlef2|E`%$7X)(n&{RQLRV)#xtPNHVMol4-Bt$=`*t|&=aaD1xTEv^1~+r{ zgVsjd38kwA(*N!1{LP;g5U1JXqSfrQu;tIg`CIjPW((Wv^Ve*Al&`UN#j%fDbW)y+ zFMiX=AsVWr5phX!JFA|aUd7{HbDewZ78aPCKYaI~lWVB%Cob>8-79#umIhrhKM|lm zb)lnL``op0UlNFG8!CW5x&11$hr?uA}naO7ocby^tE@gSS;O}pC98D*T&8ho}-XSuho zJ#D$`iBHbt%Rl7zTJwLscKl-exr>Wu_gS6X$K1a3&IYrYr{%e`IL=>uv3kzaUoY49 zd$v8;p27CB{6eVu!|z$KH-1G;Xjzgt;o=Le=Nsl637dbin9kQNh_CbZb%M8s23;O;|cRbB3wT*k_W?#S6=T&lzBzX2-_dcJ0uu8XN{~yWt zZT#mA-&7e&ND4J4UihkHBEfd&wF}$f1!gzbPcNIjiJ8`=!IoxwU&sBzc1G`>y%!vHJDV0{)pyb5ZBFIM4$0(SOGBM?RjleWLvg3=9mO Lu6{1-oD!M ] - { - known = true ; - } - - if $(known) && $(version) - && ! [ feature.is-subvalue toolset : $(toolset) : version : $(version) ] - { - known = ; - } - - if ! $(known) - { - if $(debug-config) - { - ECHO notice: [cmdline-cfg] toolset $(toolset-version) - not previously configured; configuring now ; - } - toolset.using $(toolset) : $(version) ; - } - else - { - if $(debug-config) - { - ECHO notice: [cmdline-cfg] toolset $(toolset-version) already configured ; - } - } - - # make sure we get an appropriate property into the build request in - # case the user used the "--toolset=..." form - if ! $(t) in $(argv) - && ! $(t) in $(feature-toolsets) - { - if $(debug-config) - { - ECHO notice: [cmdline-cfg] adding toolset=$(t) "to build request." ; - } - extra-build-request += toolset=$(t) ; - } - } -} - -if USER_MODULE in [ RULENAMES ] -{ - USER_MODULE site-config user-config ; -} - - - -if --version in [ modules.peek : ARGV ] -{ - version.print ; - EXIT ; -} - - - -# We always load project in "." so that 'use-project' directives has -# any chance of been seen. Otherwise, we won't be able to refer to -# subprojects using target ids. -if [ project.find "." : "." ] -{ - current-project = [ project.target [ project.load "." ] ] ; -} - -if ! [ feature.values ] -{ - local default-toolset = gcc ; - if [ os.name ] = NT - { - default-toolset = msvc ; - } - - ECHO "warning: No toolsets are configured." ; - ECHO "warning: Configuring default toolset" \"$(default-toolset)\". ; - ECHO "warning: If the default is wrong, you may not be able to build C++ programs." ; - ECHO "warning: Use the \"--toolset=xxxxx\" option to override our guess." ; - ECHO "warning: For more configuration options, please consult" ; - ECHO "warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ; - - - if ! $(ignore-config) - { - toolset.using $(default-toolset) ; - } -} - -build-request = [ - build-request.from-command-line [ - modules.peek : ARGV - ] $(extra-build-request) -] ; - -properties = [ $(build-request).get-at 2 ] ; - -if $(properties) -{ - expanded = [ build-request.expand-no-defaults $(properties) ] ; - local xexpanded ; - for local e in $(expanded) - { - xexpanded += [ property-set.create [ feature.split $(e) ] ] ; - } - expanded = $(xexpanded) ; -} -else -{ - expanded = [ property-set.empty ] ; -} - - - -local target-ids = [ $(build-request).get-at 1 ] ; -local targets -local clean ; - - -if "--clean-all" in [ modules.peek : ARGV ] -{ - cleanall = true ; -} - -if "--clean" in [ modules.peek : ARGV ] -{ - clean = true ; -} - - -local bjam-targets ; - -# Given a target it, try to find and return corresponding target. -# This is only invoked when there's no Jamfile in "." -# This code somewhat duplicates code in project-target.find but we can't reuse -# that code without project-targets instance. -rule find-target ( target-id ) -{ - local split = [ MATCH (.*)//(.*) : $(target-id) ] ; - - local pm ; - if $(split) - { - pm = [ project.find $(split[1]) : "." ] ; - } - else - { - pm = [ project.find $(target-id) : "." ] ; - } - - local result ; - if $(pm) - { - result = [ project.target $(pm) ] ; - } - - if $(split) - { - result = [ $(result).find $(split[2]) ] ; - } - - return $(result) ; -} - - - -if ! $(current-project) -{ - if ! $(target-ids) - { - ECHO "error: no Jamfile in current directory found, and no target references specified." ; - EXIT ; - } -} - - -for local id in $(target-ids) -{ - if $(id) = clean - { - clean = true ; - } - else - { - local t ; - if $(current-project) - { - t = [ $(current-project).find $(id) : no-error ] ; - } - else - { - t = [ find-target $(id) ] ; - } - - if ! $(t) - { - ECHO "notice: could not find main target " $(id) ; - ECHO "notice: assuming it's a name of file to create " ; - bjam-targets += $(id) ; - } - else - { - targets += $(t) ; - } - } -} - -if ! $(targets) -{ - targets += [ project.target [ project.module-name "." ] ] ; -} - -virtual-targets = ; - -# Virtual targets obtained when building main targets references on -# the command line. When running -# -# bjam --clean main_target -# -# we want to clean the files that belong only to that main target, -# so we need to record which targets are produced. -local results-of-main-targets ; - -for local p in $(expanded) -{ - .command-line-free-features = [ property-set.create [ $(p).free ] ] ; - for local t in $(targets) - { - local g = [ $(t).generate $(p) ] ; - if ! [ class.is-a $(t) : project-target ] - { - results-of-main-targets += $(g[2-]) ; - } - virtual-targets += $(g[2-]) ; - } -} - -# The cleaning is tricky. Say, if -# user says: -# -# bjam --clean foo -# -# where 'foo' is a directory, then we want to clean targets -# which are in 'foo' or in any children Jamfiles, but not in any -# unrelated Jamfiles. So, we collect the list of project under which -# cleaning is allowed. -# - -local projects-to-clean ; -local targets-to-clean ; -if $(clean) || $(clean-all) -{ - for local t in $(targets) - { - if [ class.is-a $(t) : project-target ] - { - projects-to-clean += [ $(t).project-module ] ; - } - } - - local subvariants ; - for local t in $(results-of-main-targets) - { - # Don't include roots or sources. - targets-to-clean += [ virtual-target.traverse $(t) ] ; - } - targets-to-clean = [ sequence.unique $(targets-to-clean) ] ; -} - -# Returns 'true' if 'project' is a child of 'current-project', -# possibly indirect, or is equal to 'project'. -# Returns 'false' otherwise. -rule is-child ( project ) -{ - if ! $(.is-child.$(project)) - { - local r = false ; - if $(project) in $(projects-to-clean) - { - r = true ; - } - else - { - local parent = [ project.attribute $(project) parent-module ] ; - if $(parent) && $(parent) != user-config - { - r = [ is-child $(parent) ] ; - } - } - - .is-child.$(project) = $(r) ; - } - - return $(.is-child.$(project)) ; -} - - - - -actual-targets = ; -for t in $(virtual-targets) -{ - actual-targets += [ $(t).actualize ] ; -} - -# Was an XML dump requested? -.out-xml = [ MATCH --out-xml=(.*) : [ modules.peek : ARGV ] ] ; -if $(.out-xml) -{ - # Get the qualified name of a virtual target. - rule full-target-name ( t ) - { - local name = [ $(t).name ] ; - local project = [ $(t).project ] ; - local project-path = [ $(project).get location ] ; - return $(project-path)//$(name) ; - } - - # Generate an XML file containing build statistics for each - # constituent - rule out-xml ( xml-file : constituents * ) - { - # Prepare valid XML header and footer with some basic info - local nl = " -" ; - local jam = [ version.jam ] ; - local os = [ modules.peek : OS OSPLAT JAMUNAME ] "" ; - local timestamp = [ modules.peek : JAMDATE ] ; - local cwd = [ PWD ] ; - local command = [ modules.peek : ARGV ] ; - local bb-version = [ version.boost-build ] ; - .header on $(xml-file) = - "" - "$(nl)" - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - ; - .footer on $(xml-file) = - "$(nl)" ; - # Generate target dependency graph - .contents on $(xml-file) += - "$(nl) " - ; - - for local t in [ virtual-target.all-targets ] - { - local action = [ $(t).action ] ; - if $(action) - { - # If a target has no action, it has - # no dependencies. - - local name = [ full-target-name $(t) ] ; - local sources = [ $(action).sources ] ; - local dependencies ; - for local s in $(sources) - { - dependencies += [ full-target-name $(s) ] ; - } - - local path = [ $(t).path ] ; - local jam-target = [ $(t).actual-name ] ; - - .contents on $(xml-file) += - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - ; - } - } - .contents on $(xml-file) += - "$(nl) " - ; - - # Build $(xml-file) after $(constituents) and do so even if a - # constituent action fails, and regenerate the xml on every bjam run. - INCLUDES $(xml-file) : $(constituents) ; - ALWAYS $(xml-file) ; - __ACTION_RULE__ on $(xml-file) = - build-system.out-xml.generate-action ; - out-xml.generate $(xml-file) ; - } - - # The actual build actions are here; if we did this work in the - # actions clause we would have to form a valid command line - # containing the result of @(...) below (the name of the XML file). - rule out-xml.generate-action ( - args * : xml-file : - command status start end user system : output ? ) - { - local contents = - [ on $(xml-file) return $(.header) $(.contents) $(.footer) ] ; - local f = @($(xml-file):E=$(contents)) ; - } - - # Nothing to do here; the *real* actions happen in - # out-xml.generate-action - actions quietly out-xml.generate { } - - # Define the out-xml file target, which depends on all the targets - # so that it runs the collection after the targets have run. - out-xml $(.out-xml) : $(actual-targets) ; - - # Set up a global __ACTION_RULE__ that records all the available - # statistics about each actual target in a variable "on" the - # --out-xml target. - rule out-xml.collect ( - xml-file : target : - command status start end user system : output ? ) - { - local nl = " -" ; - # Open the action with some basic info. - .contents on $(xml-file) += - "$(nl) " - ; - - # If we have an action object we can print out more detailed info. - local action = [ on $(target) return $(.action) ] ; - if $(action) - { - local action-name = [ $(action).action-name ] ; - local action-sources = [ $(action).sources ] ; - local action-props = [ $(action).properties ] ; - - # The qualified name of the action which we created the target. - .contents on $(xml-file) += - "$(nl) " - ; - - # The sources that made up the target. - .contents on $(xml-file) += - "$(nl) " - ; - for local source in $(action-sources) - { - local source-actual = [ $(source).actual-name ] ; - .contents on $(xml-file) += - "$(nl) " - ; - } - .contents on $(xml-file) += - "$(nl) " - ; - - # The properties that define the conditions under which the - # target was built. - .contents on $(xml-file) += - "$(nl) " - ; - for local prop in [ $(action-props).raw ] - { - local prop-name = [ MATCH ^<(.*)>$ : $(prop:G) ] ; - .contents on $(xml-file) += - "$(nl) " - ; - } - .contents on $(xml-file) += - "$(nl) " - ; - } - - local locate = [ on $(target) return $(LOCATE) ] ; - locate ?= "" ; - .contents on $(xml-file) += - "$(nl) " - "$(nl) " - "$(nl) " - "$(nl) " - ; - .contents on $(xml-file) += - "$(nl) " - ; - } - - # When no __ACTION_RULE__ is set "on" a target, the search falls - # back to the global module - module - { - __ACTION_RULE__ = build-system.out-xml.collect - [ modules.peek build-system : .out-xml ] ; - } -} - -NOTFILE all ; -DEPENDS all : $(actual-targets) ; - -if $(bjam-targets) -{ - UPDATE $(bjam-targets:G=e) $(.out-xml) ; -} -else if $(cleanall) -{ - UPDATE clean-all ; -} -else if $(clean) -{ - local to-clean ; - for local t in [ virtual-target.all-targets ] - { - local p = [ $(t).project ] ; - - # Remove only derived targets. - if [ $(t).action ] - { - if $(t) in $(targets-to-clean) - || [ is-child [ $(p).project-module ] ] = true - { - to-clean += $(t) ; - } - } - } - local to-clean-actual ; - for local t in $(to-clean) - { - to-clean-actual += [ $(t).actualize ] ; - } - common.Clean clean : $(to-clean-actual) ; - UPDATE clean ; -} -else -{ - UPDATE all $(.out-xml) ; -} diff --git a/v2/build/alias.jam b/v2/build/alias.jam deleted file mode 100644 index 993243b03..000000000 --- a/v2/build/alias.jam +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2003, 2004, 2006 Vladimir Prus -# 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) - -# This module defines the 'alias' rule and associated class. -# -# Alias is just a main target which returns its source targets without any -# processing. For example:: -# -# alias bin : hello test_hello ; -# alias lib : helpers xml_parser ; -# -# Another important use of 'alias' is to conveniently group source files:: -# -# alias platform-src : win.cpp : NT ; -# alias platform-src : linux.cpp : LINUX ; -# exe main : main.cpp platform-src ; -# -# Lastly, it's possible to create local alias for some target, with different -# properties:: -# -# alias big_lib : : @/external_project/big_lib/static ; -# - -import targets ; -import "class" : new ; -import property ; -import errors : error ; -import type : type ; -import regex ; -import project ; -import property-set ; - -class alias-target-class : basic-target -{ - rule __init__ ( name : project : sources * : requirements * - : default-build * : usage-requirements * ) - { - basic-target.__init__ $(name) : $(project) : $(sources) : $(requirements) - : $(default-build) : $(usage-requirements) ; - } - - rule construct ( name : source-targets * : property-set ) - { - return [ property-set.empty ] $(source-targets) ; - } - - rule compute-usage-requirements ( subvariant ) - { - local base = [ basic-target.compute-usage-requirements $(subvariant) ] ; - # Add source's usage requirement. If we don't do this, "alias" does not - # look like 100% alias. - return [ $(base).add [ $(subvariant).sources-usage-requirements ] ] ; - } - -} - -# Declares the 'alias' target. It will build sources, and return them unaltered. -rule alias ( name : sources * : requirements * : default-build * : usage-requirements * ) -{ - local project = [ project.current ] ; - - targets.main-target-alternative - [ new alias-target-class $(name) : $(project) - : [ targets.main-target-sources $(sources) : $(name) : no-renaming ] - : [ targets.main-target-requirements $(requirements) : $(project) ] - : [ targets.main-target-default-build $(default-build) : $(project) ] - : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ] - ] ; -} - -IMPORT $(__name__) : alias : : alias ; - - - diff --git a/v2/build/build-request.jam b/v2/build/build-request.jam deleted file mode 100644 index d0ff34f39..000000000 --- a/v2/build/build-request.jam +++ /dev/null @@ -1,300 +0,0 @@ -# Copyright 2002 Dave Abrahams -# 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 sequence ; -import set ; -import regex ; -import feature ; -import property ; -import numbers ; -import container ; -import "class" : new ; -import string ; - -# Transform property-set by applying f to each component property. -local rule apply-to-property-set ( f property-set ) -{ - local properties = [ feature.split $(property-set) ] ; - return [ string.join [ $(f) $(properties) ] : / ] ; -} - -# expand the given build request by combining all property-sets which don't -# specify conflicting non-free features. -rule expand-no-defaults ( property-sets * ) -{ - # First make all features and subfeatures explicit - local expanded-property-sets = [ - sequence.transform apply-to-property-set feature.expand-subfeatures - : $(property-sets) ] ; - - # Now combine all of the expanded property-sets - local product = [ x-product $(expanded-property-sets) : $(feature-space) ] ; - - return $(product) ; -} - -# implementaiton of x-product, below -local rule x-product-aux ( property-sets + ) -{ - local result ; - local p = [ feature.split $(property-sets[1]) ] ; - local f = [ set.difference $(p:G) : [ feature.free-features ] ] ; - local seen ; - # No conflict with things used at a higher level? - if ! [ set.intersection $(f) : $(x-product-used) ] - { - local x-product-seen ; - { - # don't mix in any conflicting features - local x-product-used = $(x-product-used) $(f) ; - - if $(property-sets[2]) - { - local rest = [ x-product-aux $(property-sets[2-]) : $(feature-space) ] ; - result = $(property-sets[1])/$(rest) ; - } - - result ?= $(property-sets[1]) ; - } - - # If we didn't encounter a conflicting feature lower down, - # don't recurse again. - if ! [ set.intersection $(f) : $(x-product-seen) ] - { - property-sets = ; - } - - seen = $(x-product-seen) ; - } - - if $(property-sets[2]) - { - result += [ x-product-aux $(property-sets[2-]) : $(feature-space) ] ; - } - - # Note that we've seen these features so that higher levels will - # recurse again without them set. - x-product-seen += $(f) $(seen) ; - return $(result) ; -} - -# Return the cross-product of all elements of property-sets, less any -# that would contain conflicting values for single-valued features. -local rule x-product ( property-sets * ) -{ - if $(property-sets).non-empty - { - # prepare some "scoped globals" that can be used by the - # implementation function, x-product-aux. - local x-product-seen x-product-used ; - return [ x-product-aux $(property-sets) : $(feature-space) ] ; - } - # otherwise return empty -} - -# Returns true if 'v' is either implicit value, or -# the part before the first '-' symbol is implicit value -local rule looks-like-implicit-value ( v ) -{ - - if [ feature.is-implicit-value $(v) ] - { - return true ; - } - else - { - local split = [ regex.split $(v) - ] ; - if [ feature.is-implicit-value $(split[1]) ] - { - return true ; - } - } -} - - -# Takes the command line tokens (such as taken from ARGV rule) and constructs -# build request from it. -# Returns a vector of two vectors (where "vector" means container.jam's "vector"). -# First is the set of targets specified in the command line, and second is -# the set of requested build properties. -rule from-command-line ( command-line * ) -{ - local targets ; - local properties ; - - command-line = $(command-line[2-]) ; - local skip-next = ; - for local e in $(command-line) - { - if $(skip-next) - { - skip-next = ; - } - else if ! [ MATCH "^(-).*" : $(e) ] - { - # Build request spec either has "=" in it, or completely - # consists of implicit feature values. - local fs = feature-space ; - if [ MATCH "(.*=.*)" : $(e) ] - || [ looks-like-implicit-value $(e:D=) : $(feature-space) ] - { - properties += [ convert-command-line-element $(e) : $(feature-space) ] ; - } - else - { - targets += $(e) ; - } - } - else if [ MATCH "^(-[-ldjfsto])$" : $(e) ] - { - skip-next = true ; - } - } - return [ new vector [ new vector $(targets) ] [ new vector $(properties) ] ] ; -} - -# Converts one element of command line build request specification into -# internal form. -local rule convert-command-line-element ( e ) -{ - local result ; - local parts = [ regex.split $(e) "/" ] ; - for local p in $(parts) - { - local m = [ MATCH "([^=]*)=(.*)" : $(p) ] ; - local lresult ; - if $(m) - { - local feature = $(m[1]) ; - local values = [ regex.split $(m[2]) "," ] ; - lresult = <$(feature)>$(values) ; - } - else - { - lresult = [ regex.split $(p) "," ] ; - } - - if ! [ MATCH (.*-.*) : $(p) ] - { - # property.validate cannot handle subfeatures, - # so we avoid the check here. - for local p in $(lresult) - { - property.validate $(p) : $(feature-space) ; - } - } - - - if ! $(result) - { - result = $(lresult) ; - } - else - { - result = $(result)/$(lresult) ; - } - } - - return $(result) ; -} - -rule __test__ ( ) -{ - import assert feature ; - - feature.prepare-test build-request-test-temp ; - - import build-request ; - import build-request : expand-no-defaults : build-request.expand-no-defaults ; - import errors : try catch ; - import feature : feature subfeature ; - - feature toolset : gcc msvc borland : implicit ; - subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4 - 3.0 3.0.1 3.0.2 : optional ; - - feature variant : debug release : implicit composite ; - feature inlining : on off ; - feature "include" : : free ; - - feature stdlib : native stlport : implicit ; - - feature runtime-link : dynamic static : symmetric ; - - # empty build requests should expand to empty. - assert.result - : build-request.expand-no-defaults - ; - - assert.result - gcc/3.0.1/stlport/debug - msvc/stlport/debug - msvc/debug - - : build-request.expand-no-defaults gcc-3.0.1/stlport msvc/stlport msvc debug - ; - - assert.result - gcc/3.0.1/stlport/debug - msvc/debug - debug/msvc/stlport - - : build-request.expand-no-defaults gcc-3.0.1/stlport msvc debug msvc/stlport - ; - - assert.result - gcc/3.0.1/stlport/debug/off - gcc/3.0.1/stlport/release/off - - : build-request.expand-no-defaults gcc-3.0.1/stlport debug release off - ; - - assert.result - a/b/c/gcc/3.0.1/stlport/debug/x/y/z - a/b/c/msvc/stlport/debug/x/y/z - a/b/c/msvc/debug/x/y/z - - : build-request.expand-no-defaults a/b/c gcc-3.0.1/stlport msvc/stlport msvc debug x/y/z - ; - - local r ; - - r = [ build-request.from-command-line bjam debug runtime-link=dynamic ] ; - assert.equal [ $(r).get-at 1 ] : ; - assert.equal [ $(r).get-at 2 ] : debug dynamic ; - - try ; - { - - build-request.from-command-line bjam gcc/debug runtime-link=dynamic/static ; - } - catch \"static\" is not a value of an implicit feature ; - - - r = [ build-request.from-command-line bjam -d2 --debug debug target runtime-link=dynamic ] ; - assert.equal [ $(r).get-at 1 ] : target ; - assert.equal [ $(r).get-at 2 ] : debug dynamic ; - - r = [ build-request.from-command-line bjam debug runtime-link=dynamic,static ] ; - assert.equal [ $(r).get-at 1 ] : ; - assert.equal [ $(r).get-at 2 ] : debug dynamic static ; - - r = [ build-request.from-command-line bjam debug gcc/runtime-link=dynamic,static ] ; - assert.equal [ $(r).get-at 1 ] : ; - assert.equal [ $(r).get-at 2 ] : debug gcc/dynamic - gcc/static ; - - r = [ build-request.from-command-line bjam msvc gcc,borland/runtime-link=static ] ; - assert.equal [ $(r).get-at 1 ] : ; - assert.equal [ $(r).get-at 2 ] : msvc gcc/static - borland/static ; - - r = [ build-request.from-command-line bjam gcc-3.0 ] ; - assert.equal [ $(r).get-at 1 ] : ; - assert.equal [ $(r).get-at 2 ] : gcc-3.0 ; - - feature.finish-test build-request-test-temp ; -} - - diff --git a/v2/build/feature.jam b/v2/build/feature.jam deleted file mode 100644 index 0e4e88830..000000000 --- a/v2/build/feature.jam +++ /dev/null @@ -1,1284 +0,0 @@ -# Copyright 2001, 2002, 2003 Dave Abrahams -# Copyright 2002, 2006 Rene Rivera -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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 "class" : * ; - -import errors : error lol->list ; -import sequence ; -import regex ; -import set ; -import utility ; -import modules indirect ; -import assert : * ; - -local rule setup ( ) -{ - .all-attributes = - - implicit - executed - composite - optional - symmetric - free - incidental - path - dependency - propagated - link-incompatible - subfeature - order-sensitive - ; - - .all-features = ; - .all-subfeatures = ; # non-subfeatures - .all-top-features = ; # non-subfeatures - .all-implicit-values = ; -} -setup ; - -# prepare a fresh space to test in by moving all global variable -# settings into the given temporary module and erasing them here. -rule prepare-test ( temp-module ) -{ - DELETE_MODULE $(temp-module) ; - - # transfer globals to temp-module - for local v in [ VARNAMES feature ] - { - if [ MATCH (\\.) : $(v) ] - { - modules.poke $(temp-module) : $(v) : $($(v)) ; - $(v) = ; - } - } - setup ; -} - -# clear out all global variables and recover all variables from the -# given temporary module -rule finish-test ( temp-module ) -{ - # clear globals - for local v in [ VARNAMES feature ] - { - if [ MATCH (\\.) : $(v) ] - { - $(v) = ; - } - } - - for local v in [ VARNAMES $(temp-module) ] - { - $(v) = [ modules.peek $(temp-module) : $(v) ] ; - } - DELETE_MODULE $(temp-module) ; -} - - -# Transform features by bracketing any elements which aren't already -# bracketed by "<>" -local rule grist ( features * ) -{ - local empty = "" ; - local r = $(empty:G=$(features)) ; - return $(r) ; -} - -empty = "" ; - -# declare a new feature with the given name, values, and attributes. -rule feature ( - name # feature name - : values * # the allowable values - may be extended later with feature.extend - : attributes * # The feature's attributes (e.g. implicit, free, propagated...) -) -{ - name = [ grist $(name) ] ; - - local error ; - - # if there are any unknown attributes... - if ! ( $(attributes) in $(.all-attributes) ) - { - error = unknown attributes: - [ set.difference $(attributes) : $(.all-attributes) ] ; - } - else if $(name) in $(.all-features) - { - error = feature already defined: ; - } - else if implicit in $(attributes) && free in $(attributes) - { - error = free features cannot also be implicit ; - } - else if free in $(attributes) && propagated in $(attributes) - { - error = free features cannot be propagated ; - } - - - if $(error) - { - error $(error) - : "in" feature declaration: - : feature [ lol->list $(1) : $(2) : $(3) ] ; - } - - $(name).values ?= ; - $(name).attributes = $(attributes) ; - $(name).subfeatures ?= ; - $(attributes).features += $(name) ; - - .all-features += $(name) ; - if subfeature in $(attributes) - { - .all-subfeatures += $(name) ; - } - else - { - .all-top-features += $(name) ; - } - extend $(name) : $(values) ; -} - -# set default value of the given feature, overriding any previous -# default. -rule set-default ( feature : value ) -{ - local f = [ grist $(feature) ] ; - if ! $(value) in $($(f).values) - { - errors.error "The specified default value, '$(value)' is invalid" - : "allowed values are: " $($(f).values) ; - } - $(f).default = $(value) ; -} - - -# return the default property values for the given features. -rule defaults ( features * ) -{ - local result ; - for local f in $(features) - { - local gf = $(:E=:G=$(f)) ; - local a = $($(gf).attributes) ; - if ( free in $(a) ) || ( optional in $(a) ) - { - } - else - { - result += $(gf)$($(gf).default) ; - } - } - return $(result) ; -} - -# returns true iff all elements of names are valid features. -rule valid ( names + ) -{ - if $(names) in $(.all-features) - { - return true ; - } -} - -# return the attibutes of the given feature -rule attributes ( feature ) -{ - return $($(:E=:G=$(feature)).attributes) ; -} - -# return the values of the given feature -rule values ( feature ) -{ - return $($(:E=:G=$(feature)).values) ; -} - -# returns true iff 'value-string' is a value-string of an implicit feature -rule is-implicit-value ( value-string ) -{ - local v = [ regex.split $(value-string) - ] ; - local failed ; - if ! $(v[1]) in $(.all-implicit-values) - { - failed = true ; - } - else - { - local feature = $($(v[1]).implicit-feature) ; - - for local subvalue in $(v[2-]) - { - if ! [ find-implied-subfeature $(feature) $(subvalue) : $(v[1]) ] - { - failed = true ; - } - } - } - - if ! $(failed) - { - return true ; - } -} - -# return the implicit feature associated with the given implicit value. -rule implied-feature ( implicit-value ) -{ - local components = [ regex.split $(implicit-value) "-" ] ; - - local feature = $($(components[1]).implicit-feature) ; - if ! $(feature) - { - error \"$(implicit-value)\" is not a value of an implicit feature ; - feature = "" ; # keep testing happy; it expects a result. - } - return $(feature) ; -} - -local rule find-implied-subfeature ( feature subvalue : value-string ? ) -{ - # feature should be of the form - if $(feature) != $(feature:G) - { - error invalid feature $(feature) ; - } - - return $($(feature)$(value-string:E="")<>$(subvalue).subfeature) ; -} - -# Given a feature and a value of one of its subfeatures, find the name -# of the subfeature. If value-string is supplied, looks for implied -# subfeatures that are specific to that value of feature -rule implied-subfeature ( - feature # The main feature name - subvalue # The value of one of its subfeatures - : value-string ? # The value of the main feature -) -{ - local subfeature = [ find-implied-subfeature $(feature) $(subvalue) - : $(value-string) ] ; - - if ! $(subfeature) - { - value-string ?= "" ; - error \"$(subvalue)\" is not a known subfeature value of - $(feature)$(value-string) ; - } - - return $(subfeature) ; -} - -# generate an error if the feature is unknown -local rule validate-feature ( feature ) -{ - if ! $(feature) in $(.all-features) - { - error unknown feature \"$(feature)\" ; - } -} - -# Given a feature and value, or just a value corresponding to an -# implicit feature, returns a property set consisting of all component -# subfeatures and their values. For example: -# -# expand-subfeatures gcc-2.95.2-linux-x86 -# -> gcc 2.95.2 linux x86 -# -# equivalent to: -# expand-subfeatures gcc-2.95.2-linux-x86 -local rule expand-subfeatures-aux ( - feature ? # The name of the feature, or empty if value corresponds to an implicit property - : value # The value of the feature. - : dont-validate ? # If set, no validation of value string will be done -) -{ - if $(feature) - { - feature = $(feature) ; - } - - if ! $(feature) - { - feature = [ implied-feature $(value) ] ; - } - else - { - validate-feature $(feature) ; - } - if ! $(dont-validate) - { - validate-value-string $(feature) $(value) ; - } - - local components = [ regex.split $(value) "-" ] ; - - # get the top-level feature's value - local value = $(components[1]:G=) ; - - local result = $(components[1]:G=$(feature)) ; - - local subvalues = $(components[2-]) ; - while $(subvalues) - { - local subvalue = $(subvalues[1]) ; # pop the head off of subvalues - subvalues = $(subvalues[2-]) ; - - local subfeature = [ find-implied-subfeature $(feature) $(subvalue) : $(value) ] ; - - # If no subfeature was found, reconstitute the value string and use that - if ! $(subfeature) - { - result = $(components:J=-) ; - result = $(result:G=$(feature)) ; - subvalues = ; # stop looping - } - else - { - local f = [ MATCH ^<(.*)>$ : $(feature) ] ; - result += $(subvalue:G=$(f)-$(subfeature)) ; - } - } - - return $(result) ; -} - -# Make all elements of properties corresponding to implicit features -# explicit, and express all subfeature values as separate properties -# in their own right. For example, the property -# -# gcc-2.95.2-linux-x86 -# -# might expand to -# -# gcc 2.95.2 linux x86 -# -rule expand-subfeatures ( - properties * # property set with elements of the form - # value-string or just value-string in the - # case of implicit features. - : dont-validate ? -) -{ - local result ; - for local p in $(properties) - { - # Don't expand subfeatures in subfeatures - if ! [ MATCH "(:)" : $(p:G) ] - { - result += [ expand-subfeatures-aux $(p:G) : $(p:G=) : $(dont-validate) ] ; - } - else - { - result += $(p) ; - } - } - return $(result) ; -} - -# Helper for extend, below. Handles the feature case. -local rule extend-feature ( feature : values * ) -{ - feature = [ grist $(feature) ] ; - validate-feature $(feature) ; - if implicit in $($(feature).attributes) - { - for local v in $(values) - { - if $($(v).implicit-feature) - { - error $(v) is already associated with the \"$($(v).implicit-feature)\" feature ; - } - $(v).implicit-feature = $(feature) ; - } - - .all-implicit-values += $(values) ; - } - if ! $($(feature).values) - { - # This is the first value specified for this feature, - # take it as default value - $(feature).default = $(values[1]) ; - } - $(feature).values += $(values) ; -} - -# Checks that value-string is a valid value-string for the given feature. -rule validate-value-string ( feature value-string ) -{ - if ! ( - free in $($(feature).attributes) - || ( $(value-string) in $(feature).values ) - ) - { - local values = $(value-string) ; - - if $($(feature).subfeatures) - { - values = [ regex.split $(value-string) - ] ; - } - - if ! ( $(values[1]) in $($(feature).values) ) && - - # An empty value is allowed for optional features - ( $(values[1]) || ! ( optional in $($(feature).attributes) ) ) - { - error \"$(values[1])\" is not a known value of feature $(feature) - : legal values: \"$($(feature).values)\" ; - } - - for local v in $(values[2-]) - { - # this will validate any subfeature values in value-string - implied-subfeature $(feature) $(v) : $(values[1]) ; - } - } -} - -# A helper that computes: -# * the name(s) of the module-local variable(s) used to record the -# correspondence between subvalue(s) and a subfeature -# -# * the value of that variable when such a subfeature/subvalue has -# been defined -# -# Returns a list consisting of the latter followed by the former -local rule subvalue-var ( - feature # Main feature name - - value-string ? # If supplied, specifies a specific value of the - # main feature for which the subfeature values - # are valid - - : subfeature # The name of the subfeature - : subvalues * # The subfeature values -) -{ - feature = [ grist $(feature) ] ; - validate-feature $(feature) ; - if $(value-string) - { - validate-value-string $(feature) $(value-string) ; - } - - local subfeature-name = [ get-subfeature-name $(subfeature) $(value-string) ] ; - - return $(subfeature-name) - $(feature)$(value-string:E="")<>$(subvalues).subfeature ; -} - -# Extends the given subfeature with the subvalues. If the optional -# value-string is provided, the subvalues are only valid for the given -# value of the feature. Thus, you could say that -# mingw is specifc to gcc-2.95.2 as follows: -# -# extend-subfeature toolset gcc-2.95.2 : target-platform : mingw ; -# -rule extend-subfeature ( - feature # The feature whose subfeature is being extended - - value-string ? # If supplied, specifies a specific value of the - # main feature for which the new subfeature values - # are valid - - : subfeature # The name of the subfeature - : subvalues * # The additional values of the subfeature being defined. -) -{ - local subfeature-vars = [ - subvalue-var $(feature) $(value-string) : $(subfeature) : $(subvalues) ] ; - - local f = [ utility.ungrist [ grist $(feature) ] ] ; - extend $(f)-$(subfeature-vars[1]) : $(subvalues) ; - - # provide a way to get from the given feature or property and - # subfeature value to the subfeature name. - $(subfeature-vars[2-]) = $(subfeature-vars[1]) ; -} - -# Returns true iff the subvalues are valid for the feature. When the -# optional value-string is provided, returns true iff the subvalues -# are valid for the given value of the feature. -rule is-subvalue ( feature : value-string ? : subfeature : subvalue ) -{ - local subfeature-vars = [ - subvalue-var $(feature) $(value-string) : $(subfeature) : $(subvalue) ] ; - - if $($(subfeature-vars[2])) = $(subfeature-vars[1]) - { - return true ; - } -} - -# Can be called three ways: -# -# 1. extend feature : values * -# 2. extend subfeature : values * -# 3. extend value-string subfeature : values * -# -# * Form 1 adds the given values to the given feature -# * Forms 2 and 3 add subfeature values to the given feature -# * Form 3 adds the subfeature values as specific to the given -# property value-string. -# -rule extend ( feature-or-property subfeature ? : values * ) -{ - local - feature # If a property was specified this is its feature - value-string # E.G., the gcc-2.95-2 part of gcc-2.95.2 - ; - - # if a property was specified - if $(feature-or-property:G) && $(feature-or-property:G=) - { - # Extract the feature and value-string, if any. - feature = $(feature-or-property:G) ; - value-string = $(feature-or-property:G=) ; - } - else - { - feature = [ grist $(feature-or-property) ] ; - } - - # Dispatch to the appropriate handler - if $(subfeature) - { - extend-subfeature $(feature) $(value-string) - : $(subfeature) : $(values) ; - } - else - { - # If no subfeature was specified, we didn't expect to see a - # value-string - if $(value-string) - { - error can only be specify a property as the first argument - when extending a subfeature - : usage: - : " extend" feature ":" values... - : " | extend" value-string subfeature ":" values... - ; - } - - extend-feature $(feature) : $(values) ; - } -} - -local rule get-subfeature-name ( subfeature value-string ? ) -{ - local prefix = $(value-string): ; - return $(prefix:E="")$(subfeature) ; -} - -# Declares a subfeature -rule subfeature ( - feature # Root feature that is not a subfeature - value-string ? # A value-string specifying which feature or - # subfeature values this subfeature is specific to, - # if any - - : subfeature # The name of the subfeature being declared - : subvalues * # The allowed values of this subfeature - : attributes * # The attributes of the subfeature -) -{ - feature = [ grist $(feature) ] ; - validate-feature $(feature) ; - - # Add grist to the subfeature name if a value-string was supplied - local subfeature-name = [ get-subfeature-name $(subfeature) $(value-string) ] ; - - if $(subfeature-name) in $($(feature).subfeatures) - { - error \"$(subfeature)\" already declared as a subfeature of \"$(feature)\" - "specific to "$(value-string) ; - } - $(feature).subfeatures += $(subfeature-name) ; - - # First declare the subfeature as a feature in its own right - local f = [ utility.ungrist $(feature) ] ; - feature $(f)-$(subfeature-name) : $(subvalues) : $(attributes) subfeature ; - - # Now make sure the subfeature values are known. - extend-subfeature $(feature) $(value-string) : $(subfeature) : $(subvalues) ; -} - -# Set the components of the given composite property -rule compose ( composite-property : component-properties * ) -{ - local feature = $(composite-property:G) ; - if ! ( composite in [ attributes $(feature) ] ) - { - error "$(feature)" is not a composite feature ; - } - - $(composite-property).components ?= ; - if $($(composite-property).components) - { - error components of "$(composite-property)" already set: - $($(composite-property).components) ; - } - - if $(composite-property) in $(component-properties) - { - error composite property "$(composite-property)" cannot have itself as a component ; - } - $(composite-property).components = $(component-properties) ; -} - -local rule expand-composite ( property ) -{ - return $(property) - [ sequence.transform expand-composite : $($(property).components) ] ; -} - -# return all values of the given feature specified by the given property set. -rule get-values ( feature : properties * ) -{ - local result ; - - feature = $(:E=:G=$(feature)) ; # add <> if necessary. - for local p in $(properties) - { - if $(p:G) = $(feature) - { - #~ Use MATCH instead if :G= to get the value, in order to preserve - #~ the value intact instead of having bjam treat it as a decompossible - #~ path. - result += [ MATCH ">(.*)" : $(p) ] ; - } - } - return $(result) ; -} - -rule free-features ( ) -{ - return $(free.features) ; -} - -# Expand all composite properties in the set so that all components -# are explicitly expressed. -rule expand-composites ( properties * ) -{ - local explicit-features = $(properties:G) ; - - local result ; - # now expand composite features - for local p in $(properties) - { - local expanded = [ expand-composite $(p) ] ; - - for local x in $(expanded) - { - if ! $(x) in $(result) - { - local f = $(x:G) ; - - if $(f) in $(free.features) - { - result += $(x) ; - } - else if ! $(x) in $(properties) # x is the result of expansion - { - if ! $(f) in $(explicit-features) # not explicitly-specified - { - if $(f) in $(result:G) - { - error expansions of composite features result in conflicting - values for $(f) - : values: [ get-values $(f) : $(result) ] $(x:G=) - : one contributing composite property was $(p) ; - } - else - { - result += $(x) ; - } - } - } - else if $(f) in $(result:G) - { - error explicitly-specified values of non-free feature - $(f) conflict : - "existing values:" [ get-values $(f) : $(properties) ] : - "value from expanding " $(p) ":" $(x:G=) ; - } - else - { - result += $(x) ; - } - } - } - } - return $(result) ; -} - -# Return true iff f is an ordinary subfeature of the parent-property's -# feature, or if f is a subfeature fo the parent-property's feature -# specific to the parent-property's value -local rule is-subfeature-of ( parent-property f ) -{ - if subfeature in $($(f).attributes) - { - local specific-subfeature = [ MATCH <(.*):(.*)> : $(f) ] ; - if $(specific-subfeature) - { - # The feature has the form - # , - # e.g. - local feature-value = [ split-top-feature $(specific-subfeature[1]) ] ; - if <$(feature-value[1])>$(feature-value[2]) = $(parent-property) - { - return true ; - } - } - else - { - # The feature has the form , - # e.g. - local top-sub = [ split-top-feature [ utility.ungrist $(f) ] ] ; - - if $(top-sub[2]) && <$(top-sub[1])> = $(parent-property:G) - { - return true ; - } - } - } -} - -# as above, for subproperties -local rule is-subproperty-of ( parent-property p ) -{ - return [ is-subfeature-of $(parent-property) $(p:G) ] ; -} - -# Given a property, return the subset of features consisting of all -# ordinary subfeatures of the property's feature, and all specific -# subfeatures of the property's feature which are conditional on the -# property's value. -local rule select-subfeatures ( parent-property : features * ) -{ - return [ sequence.filter is-subfeature-of $(parent-property) : $(features) ] ; -} - -# as above, for subproperties -local rule select-subproperties ( parent-property : properties * ) -{ - return [ sequence.filter is-subproperty-of $(parent-property) : $(properties) ] ; -} - -# Given a property set which may consist of composite and implicit -# properties and combined subfeature values, returns an expanded, -# normalized property set with all implicit features expressed -# explicitly, all subfeature values individually expressed, and all -# components of composite properties expanded. Non-free features -# directly expressed in the input properties cause any values of -# those features due to composite feature expansion to be dropped. If -# two values of a given non-free feature are directly expressed in the -# input, an error is issued. -rule expand ( properties * ) -{ - local expanded = [ expand-subfeatures $(properties) ] ; - - return [ expand-composites $(expanded) ] ; -} - - -# Helper rule for minimize, below - return true iff property's feature -# is present in the contents of the variable named by feature-set-var. -local rule in-features ( feature-set-var property ) -{ - if $(property:G) in $($(feature-set-var)) - { - return true ; - } -} - -# Helper for minimize, below - returns the list with -# the same properties, but where all subfeatures -# are in the end of the list -local rule move-subfeatures-to-the-end ( properties * ) -{ - local x1 ; - local x2 ; - for local p in $(properties) - { - if subfeature in $($(p:G).attributes) - { - x2 += $(p) ; - } - else - { - x1 += $(p) ; - } - } - return $(x1) $(x2) ; -} - - -# Given an expanded property set, eliminate all redundancy: properties -# which are elements of other (composite) properties in the set will -# be eliminated. Non-symmetric properties equal to default values will be -# eliminated, unless the override a value from some composite property. -# Implicit properties will be expressed without feature -# grist, and sub-property values will be expressed as elements joined -# to the corresponding main property. -rule minimize ( properties * ) -{ - # Precondition checking - local implicits = [ set.intersection $(p:G=) : $(p:G) ] ; - if $(implicits) - { - error minimize requires an expanded property set, but \"$(implicits[1])\" - appears to be the value of an un-expanded implicit feature ; - } - - # remove properties implied by composite features - local components = $($(properties).components) ; - local x = [ set.difference $(properties) : $(components) ] ; - - # handle subfeatures and implicit features - x = [ move-subfeatures-to-the-end $(x) ] ; - local result ; - while $(x) - { - local p fullp = $(x[1]) ; - local f = $(p:G) ; - local v = $(p:G=) ; - - # eliminate features in implicit properties. - if implicit in [ attributes $(f) ] - { - p = $(v) ; - } - - # locate all subproperties of $(x[1]) in the property set - local subproperties = [ select-subproperties $(fullp) : $(x) ] ; - if $(subproperties) - { - # reconstitute the joined property name - local sorted = [ sequence.insertion-sort $(subproperties) ] ; - result += $(p)-$(sorted:G="":J=-) ; - - x = [ set.difference $(x[2-]) : $(subproperties) ] ; - } - else - { - # eliminate properties whose value is equal to feature's - # default and which are not symmetric and which do not - # contradict values implied by composite properties. - - # since all component properties of composites in the set - # have been eliminated, any remaining property whose - # feature is the same as a component of a composite in the - # set must have a non-redundant value. - if $(fullp) != [ defaults $(f) ] - || symmetric in [ attributes $(f) ] - || $(fullp:G) in $(components:G) - { - result += $(p) ; - } - - x = $(x[2-]) ; - } - } - return $(result) ; -} - -# Combine all subproperties into their parent properties -# -# Requires: for every subproperty, there is a parent property. All -# features are explicitly expressed. -# -# This rule probably shouldn't be needed, but -# build-request.expand-no-defaults is being abused for unintended -# purposes and it needs help -rule compress-subproperties ( properties * ) -{ - local all-subs matched-subs result ; - - for local p in $(properties) - { - if ! $(p:G) - { - assert.nonempty-variable p:G ; # expecting fully-gristed properties - } - - - if ! subfeature in $($(p:G).attributes) - { - local subs = [ - sequence.insertion-sort - [ sequence.filter is-subproperty-of $(p) : $(properties) ] - ] ; - - matched-subs += $(subs) ; - - local subvalues = -$(subs:G=:J=-) ; - subvalues ?= "" ; - result += $(p)$(subvalues) ; - } - else - { - all-subs += $(p) ; - } - } - assert.result true : set.equal $(all-subs) : $(matched-subs) ; - return $(result) ; -} - -# given an ungristed string, finds the longest prefix which is a -# top-level feature name followed by a dash, and return a pair -# consisting of the parts before and after that dash. More -# interesting than a simple split because feature names can contain -# dashes. -local rule split-top-feature ( feature-plus ) -{ - local e = [ regex.split $(feature-plus) - ] ; - local f = $(e[1]) ; - - local v ; - while $(e) - { - if <$(f)> in $(.all-top-features) - { - v = $(f) $(e[2-]:J=-) ; - } - e = $(e[2-]) ; - f = $(f)-$(e[1]) ; - } - return $(v) ; -} - -# Given a set of properties, add default values for features not -# represented in the set. -# Note: if there's there's ordinary feature F1 and composite feature -# F2, which includes some value for F1, and both feature have default values, -# then the default value of F1 will be added, not the value in F2. This might -# not be right idea: consider -# -# feature variant : debug ... ; -# debug : .... on -# feature : off on ; -# -# Here, when adding default for an empty property set, we'll get -# -# debug off -# -# and that's kind of strange. -rule add-defaults ( properties * ) -{ - for local v in $(properties:G=) - { - if $(v) in $(properties) - { - error add-defaults requires explicitly specified features, - but \"$(v)\" appears to be the value of an un-expanded implicit feature ; - } - } - # We don't add default for elements with ":" inside. This catches: - # 1. Conditional properties --- we don't want debug:DEBUG - # to be takes as specified value for - # 2. Free properties with ":" in values. We don't care, since free properties - # don't have defaults. - local xproperties = [ MATCH "^([^:]+)$" : $(properties) ] ; - local missing-top = [ set.difference $(.all-top-features) : $(xproperties:G) ] ; - local more = [ defaults $(missing-top) ] ; - properties += $(more) ; - xproperties += $(more) ; - - # Add defaults for subfeatures of features which are present - for local p in $(xproperties) - { - local s = $($(p:G).subfeatures) ; - local f = [ utility.ungrist $(p:G) ] ; - local missing-subs = [ set.difference <$(f)-$(s)> : $(properties:G) ] ; - properties += [ defaults [ select-subfeatures $(p) : $(missing-subs) ] ] ; - } - - return $(properties) ; -} - -# Given a property-set of the form -# v1/v2/...vN-1/vN/vN+1/...vM -# -# Returns -# v1 v2 ... vN-1 vN vN+1 ... vM -# -# Note that vN...vM may contain slashes. This is resilient to the -# substitution of backslashes for slashes, since Jam, unbidden, -# sometimes swaps slash direction on NT. -rule split ( property-set ) -{ - local pieces = [ regex.split $(property-set) [\\/] ] ; - local result ; - - for local x in $(pieces) - { - if ( ! $(x:G) ) && $(result[-1]:G) - { - result = $(result[1--2]) $(result[-1])/$(x) ; - } - else - { - result += $(x) ; - } - } - - return $(result) ; -} - -# tests of module feature -local rule __test__ ( ) -{ - # use a fresh copy of the feature module - prepare-test feature-test-temp ; - - # These are local rules and so must be explicitly reimported into - # the testing module - import feature : extend-feature validate-feature select-subfeatures ; - - import errors : try catch ; - import assert ; - - feature toolset : gcc : implicit ; - feature define : : free ; - feature runtime-link : dynamic static : symmetric ; - feature optimization : on off ; - feature variant : debug release profile : implicit composite symmetric ; - feature stdlib : native stlport ; - feature magic : : free ; - - compose debug : _DEBUG off ; - compose release : NDEBUG on ; - - assert.result dynamic static : values ; - assert.result dynamic static : values runtime-link ; - - try ; - { - compose profile : profile ; - } - catch composite property profile cannot have itself as a component ; - - extend-feature toolset : msvc metrowerks ; - subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4 - 3.0 3.0.1 3.0.2 ; - - assert.true is-subvalue toolset : gcc : version : 2.95.3 ; - assert.false is-subvalue toolset : gcc : version : 1.1 ; - - assert.false is-subvalue toolset : msvc : version : 2.95.3 ; - assert.false is-subvalue toolset : : version : yabba ; - - feature yabba ; - subfeature yabba : version : dabba ; - assert.true is-subvalue yabba : : version : dabba ; - - - subfeature toolset gcc : platform : linux cygwin : optional ; - - assert.result - : select-subfeatures gcc - : - - - - ; - - subfeature stdlib : version : 3 4 : optional ; - - assert.result - : select-subfeatures native - : - - - - ; - - assert.result gcc 3.0.1 - : expand-subfeatures gcc-3.0.1 ; - - assert.result gcc 3.0.1 linux - : expand-subfeatures gcc-3.0.1-linux ; - - - assert.result gcc 3.0.1 - : expand gcc 3.0.1 ; - - assert.result foo=x-y - : expand-subfeatures foo=x-y ; - - assert.result gcc 3.0.1 - : expand-subfeatures gcc-3.0.1 ; - - assert.result a c e - : get-values : a b c d e ; - - assert.result gcc 3.0.1 - debug _DEBUG on - : expand gcc-3.0.1 debug on - ; - - assert.result debug _DEBUG on - : expand debug on - ; - - assert.result on debug _DEBUG - : expand on debug - ; - - assert.result dynamic on - : defaults - ; - - # make sure defaults is resilient to missing grist. - assert.result dynamic on - : defaults runtime-link define optimization - ; - - feature dummy : dummy1 dummy2 ; - subfeature dummy : subdummy : x y z : optional ; - - feature fu : fu1 fu2 : optional ; - subfeature fu : subfu : x y z : optional ; - subfeature fu : subfu2 : q r s ; - - assert.result optional : attributes ; - assert.result optional : attributes fu ; - - assert.result static foobar on gcc:FOO - gcc debug native dummy1 2.95.2 - - : add-defaults static foobar - on gcc:FOO - ; - - assert.result static foobar on gcc:FOO - fu1 gcc debug native dummy1 q - 2.95.2 - - : add-defaults static foobar - on gcc:FOO fu1 - ; - - set-default : static ; - assert.result static - : defaults - ; - - assert.result gcc-3.0.1 debug on - : minimize [ expand gcc-3.0.1 debug on native ] - ; - - assert.result gcc-3.0.1 debug dynamic - : minimize [ expand gcc-3.0.1 debug off dynamic ] - ; - - assert.result gcc-3.0.1 debug - : minimize [ expand gcc-3.0.1 debug off ] - ; - - assert.result debug on - : minimize [ expand debug on ] - ; - - assert.result gcc-3.0 - : minimize gcc 3.0 - ; - - assert.result gcc-3.0 - : minimize 3.0 gcc - ; - - assert.result y/z b/c e/f - : split y/z/b/c/e/f - ; - - assert.result y/z b/c e/f - : split y\\z\\b\\c\\e\\f - ; - - assert.result a b c e/f/g i/j/k - : split a/b/c/e/f/g/i/j/k - ; - - assert.result a b c e/f/g i/j/k - : split a\\b\\c\\e\\f\\g\\i\\j\\k - ; - - # test error checking - - try ; - { - expand release off on ; - } - catch explicitly-specified values of non-free feature conflict ; - - try ; - { - validate-feature ; - } - catch unknown feature ; - - validate-value-string gcc ; - validate-value-string gcc-3.0.1 ; - - try ; - { - validate-value-string digital_mars ; - } - catch \"digital_mars\" is not a known value of ; - - try ; - { - feature foobar : : baz ; - } - catch unknown attributes: baz ; - - feature feature1 ; - try ; - { - feature feature1 ; - } - catch feature already defined: ; - - try ; - { - feature feature2 : : free implicit ; - } - catch free features cannot also be implicit ; - - try ; - { - feature feature3 : : free propagated ; - } - catch free features cannot be propagated ; - - try ; - { - implied-feature lackluster ; - } - catch \"lackluster\" is not a value of an implicit feature ; - - try ; - { - implied-subfeature 3.0.1 ; - } - catch \"3.0.1\" is not a known subfeature value of - ; - - try ; - { - implied-subfeature not-a-version : gcc ; - } - catch \"not-a-version\" is not a known subfeature value of - gcc ; - - # leave a clean copy of the features module behind - finish-test feature-test-temp ; -} diff --git a/v2/build/generators.jam b/v2/build/generators.jam deleted file mode 100644 index d181ebf05..000000000 --- a/v2/build/generators.jam +++ /dev/null @@ -1,1191 +0,0 @@ -# Copyright Vladimir Prus 2002. -# Copyright Rene Rivera 2006. -# -# 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) - -# Manages 'generators' --- objects which can do transformation between different -# target types and contain algorithm for finding transformation from sources -# to targets. -# -# The main entry point to this module is generators.construct rule. It is given -# a list of source targets, desired target type and a set of properties. -# It starts by selecting 'viable generators', which have any chances of producing -# the desired target type with the required properties. Generators are ranked and -# a set of most specific ones is selected. -# -# The most specific generators have their 'run' methods called, with the properties -# and list of sources. Each one selects target which can be directly consumed, and -# tries to convert the remaining ones to the types it can consume. This is done -# by recursively calling 'construct' with all consumable types. -# -# If the generator has collected all the targets it needs, it creates targets -# corresponding to result, and returns it. When all generators have been run, -# results of one of them are selected and returned as result. -# -# It's quite possible that 'construct' returns more targets that it was asked for. -# For example, it was asked to target type EXE, but the only found generators produces -# both EXE and TDS (file with debug) information. The extra target will be returned. -# -# Likewise, when generator tries to convert sources to consumable types, it can get -# more targets that it was asked for. The question is what to do with extra targets. -# Boost.Build attempts to convert them to requested types, and attempts as early as -# possible. Specifically, this is done after invoking each generator. (Later I'll -# document the rationale for trying extra target conversion at that point). -# -# That early conversion is not always desirable. Suppose a generator got a source of -# type Y and must consume one target of type X_1 and one target of type X_2. -# When converting Y to X_1 extra target of type Y_2 is created. We should not try to -# convert it to type X_1, because if we do so, the generator will get two targets -# of type X_1, and will be at loss as to which one to use. Because of that, the -# 'construct' rule has a parameter, telling if multiple targets can be returned. If -# the parameter is false, conversion of extra targets is not performed. - -import "class" : is-a new ; -import container ; -import utility : str equal ; -import set sequence ; -import assert ; -import virtual-target ; -import property-set ; - -if "--debug-generators" in [ modules.peek : ARGV ] -{ - .debug = true ; -} - -# Outputs a debug message if generators debugging is on. -# Each element of 'message' is checked to see if it's class instance. -# If so, instead of the value, the result of 'str' call is output. -local rule generators.dout ( message * ) -{ - if $(.debug) - { - ECHO [ sequence.transform utility.str : $(message) ] ; - } -} - - -local rule indent ( ) -{ - return $(.indent:J="") ; -} - -local rule increase-indent ( ) -{ - .indent += " " ; -} - -local rule decrease-indent ( ) -{ - .indent = $(.indent[2-]) ; -} - -# Takes a vector of 'virtual-target' instances and makes a normalized -# representation, which is the same for given set of targets, -# regardless of their order. -rule normalize-target-list ( targets ) -{ - local v = [ $(targets).get ] ; - $(targets).set $(v[1]) [ sequence.insertion-sort $(v[2-]) : utility.less ] ; -} - -# Creates a generator -class generator -{ - import generators ; - import assert ; - import generators : indent increase-indent decrease-indent generators.dout ; - import generators ; - import set ; - import utility : equal ; - import feature ; - import errors : error ; - import sequence ; - import type ; - import virtual-target ; - import "class" : new ; - import property ; - - EXPORT class@generator : indent increase-indent decrease-indent generators.dout ; - - rule __init__ ( - id # identifies the generator - should be name of the rule which - # sets up build actions - composing ? # whether generator processes each source target in - # turn, converting it to required types. - # Ordinary generators pass all sources together to - # recusrive generators.construct-types call. - - : source-types * # types that this generator can handle. If - # empty, the generator can consume anything. - - : target-types-and-names + - # types the generator will create and, optionally, names for - # created targets. Each element should have the form - # type["(" name-pattern ")"] - # for example, obj(%_x). Name of generated target will be found - # by replacing % with the name of source, provided explicit name - # was not specified. - - : requirements * - ) - { - self.id = $(id) ; - self.composing = $(composing) ; - self.source-types = $(source-types) ; - self.target-types-and-names = $(target-types-and-names) ; - self.requirements = $(requirements) ; - - for local e in $(target-types-and-names) - { - # Create three parallel lists: one with the list of target types, - # and two other with prefixes and postfixes to be added to target - # name. We use parallel lists for prefix and postfix (as opposed - # to mapping), because given target type might occur several times, - # for example "H H(%_symbols)". - local m = [ MATCH ([^\\(]*)(\\((.*)%(.*)\\))? : $(e) ] ; - self.target-types += $(m[1]) ; - self.name-prefix += $(m[3]:E="") ; - self.name-postfix += $(m[4]:E="") ; - } - - # Note that 'transform' here, is the same as 'for_each'. - sequence.transform type.validate : $(self.source-types) ; - sequence.transform type.validate : $(self.target-types) ; - } - - ############## End of constructor ################# - - rule id ( ) - { - return $(self.id) ; - } - - # Returns the list of target type the generator accepts. - rule source-types ( ) - { - return $(self.source-types) ; - } - - # Returns the list of target types that this generator produces. - # It is assumed to be always the same -- i.e. it cannot change depending - # list of sources. - rule target-types ( ) - { - return $(self.target-types) ; - } - - # Returns the required properties for this generator. Properties - # in returned set must be present in build properties if this - # generator is to be used. If result has grist-only element, - # that build properties must include some value of that feature. - # XXX: remove this method? - rule requirements ( ) - { - return $(self.requirements) ; - } - - # Returns a true value if the generator can be run with the specified - # properties. - rule match-rank ( property-set-to-match ) - { - # See if generator's requirements are satisfied by - # 'properties'. Treat a feature name in requirements - # (i.e. grist-only element), as matching any value of the - # feature. - local all-requirements = [ requirements ] ; - - local property-requirements feature-requirements ; - for local r in $(all-requirements) - { - if $(r:G=) - { - property-requirements += $(r) ; - } - else - { - feature-requirements += $(r) ; - } - } - - local properties-to-match = [ $(property-set-to-match).raw ] ; - if $(property-requirements) in $(properties-to-match) - && $(feature-requirements) in $(properties-to-match:G) - { - return true ; - } - else - { - return ; - } - } - - # Returns another generator which differers from $(self) in - # - id - # - value to feature in properties - rule clone ( new-id : new-toolset-properties + ) - { - return [ new $(__class__) $(new-id) $(self.composing) - : $(self.source-types) - : $(self.target-types-and-names) - # Note: this does not remove any subfeatures of - # which might cause problems - : [ property.change $(self.requirements) : ] - $(new-toolset-properties) - ] ; - } - - # Creates another generator that is the same as $(self), except that - # if 'base' is in target types of $(self), 'type' will in target types - # of the new generator. - rule clone-and-change-target-type ( base : type ) - { - local target-types ; - for local t in $(self.target-types-and-names) - { - local m = [ MATCH ([^\\(]*)(\\(.*\\))? : $(t) ] ; - if $(m) = $(base) - { - target-types += $(type)$(m[2]:E="") ; - } - else - { - target-types += $(t) ; - } - } - - return [ new $(__class__) $(self.id) $(self.composing) - : $(self.source-types) - : $(target-types) - : $(self.requirements) - ] ; - } - - - # Tries to invoke this generator on the given sources. Returns a - # list of generated targets (instances of 'virtual-target'). - # Returning nothing from run indicates that the generator was - # unable to create the target. - rule run ( project # Project for which the targets are generated - name ? # Determines the name of 'name' attribute for - # all generated targets. See 'generated-targets' method. - : property-set # Desired properties for generated targets. - : sources + # Source targets. - ) - { - generators.dout [ indent ] " ** generator" $(self.id) ; - generators.dout [ indent ] " multiple:" $(mutliple) ; - generators.dout [ indent ] " composing:" $(self.composing) ; - - if ! $(self.composing) && $(sources[2]) && $(self.source-types[2]) - { - errors.error "Unsupported source/source-type combination" ; - } - - # We don't run composing generators if no name is specified. The reason - # is that composing generator combines several targets, which can have - # different names, and it cannot decide which name to give for produced - # target. Therefore, the name must be passed. - # - # This in effect, means that composing generators are runnable only - # at top-level of transofrmation graph, or if name is passed explicitly. - # Thus, we dissallow composing generators in the middle. For example, the - # transofrmation CPP -> OBJ -> STATIC_LIB -> RSP -> EXE won't be allowed - # (the OBJ -> STATIC_LIB generator is composing) - if ! $(self.composing) || $(name) - { - run-really $(project) $(name) : $(property-set) : $(sources) ; - } - } - - - rule run-really ( project name ? : property-set : sources + ) - { - # Targets that this generator will consume directly. - local consumed = ; - # Targets that can't be consumed and will be returned as-is. - local bypassed = ; - - if $(self.composing) - { - convert-multiple-sources-to-consumable-types $(project) - : $(property-set) : $(sources) : consumed bypassed ; - } - else - { - convert-to-consumable-types $(project) $(name) : - $(property-set) : $(sources) - : - : consumed bypassed ; - } - - local result ; - if $(consumed) - { - result = [ construct-result $(consumed) : $(project) $(name) - : $(property-set) ] ; - } - - - if $(result) - { - generators.dout [ indent ] " SUCCESS: " $(result) ; - } - else - { - generators.dout [ indent ] " FAILURE" ; - } - generators.dout ; - return $(result) ; - } - - # Constructs the dependency graph that will be returned by this - # generator - rule construct-result ( - consumed + # Already prepared list of consumable targets - # If generator requires several source files will contain - # exactly len $(self.source-types) targets with matching types - # Otherwise, might contain several targets with the type of - # $(self.source-types[1]) - : project name ? - : property-set # Properties to be used for all actions create here - ) - { - local result ; - # If this is 1->1 transformation, apply it to all consumed targets in order. - if ! $(self.source-types[2]) && ! $(self.composing) - { - for local r in $(consumed) - { - result += [ generated-targets $(r) : $(property-set) : $(project) $(name) ] ; #(targets) ; - } - } - else - { - if $(consumed) - { - result += [ generated-targets $(consumed) : $(property-set) - : $(project) $(name) ] ; - } - } - return $(result) ; - } - - # Determine the name of the produced target from the - # names of the sources. - rule determine-output-name ( sources + ) - { - # The simple case if when a name - # of source has single dot. Then, we take the part before - # dot. Several dots can be caused by: - # - Using source file like a.host.cpp - # - A type which suffix has a dot. Say, we can - # type 'host_cpp' with extension 'host.cpp'. - # In the first case, we want to take the part till the last - # dot. In the second case -- no sure, but for now take - # the part till the last dot too. - name = [ utility.basename [ $(sources[1]).name ] ] ; - - for local s in $(sources[2]) - { - local n2 = [ utility.basename [ $(s).name ] ] ; - if $(n2) != $(name) - { - error "$(self.id): source targets have different names: cannot determine target name" ; - } - } - - # Names of sources might include directory. We should strip it. - name = $(name:D=) ; - - return $(name) ; - } - - # Constructs targets that are created after consuming 'sources'. - # The result will be the list of virtual-target, which the same length - # as 'target-types' attribute and with corresponding types. - # - # When 'name' is empty, all source targets must have the same value of - # the 'name' attribute, which will be used instead of the 'name' argument. - # - # The value of 'name' attribute for each generated target will be equal to - # the 'name' parameter if there's no name pattern for this type. Otherwise, - # the '%' symbol in the name pattern will be replaced with the 'name' parameter - # to obtain the 'name' attribute. - # - # For example, if targets types are T1 and T2(with name pattern "%_x"), suffixes - # for T1 and T2 are .t1 and t2, and source if foo.z, then created files would - # be "foo.t1" and "foo_x.t2". The 'name' attribute actually determined the - # basename of a file. - # - # Note that this pattern mechanism has nothing to do with implicit patterns - # in make. It's a way to produce target which name is different for name of - # source. - rule generated-targets ( sources + : property-set : project name ? ) - { - if ! $(name) - { - name = [ determine-output-name $(sources) ] ; - } - - # Assign an action for each target - local action = [ action-class ] ; - local a = [ class.new $(action) $(sources) : $(self.id) : - $(property-set) ] ; - - # Create generated target for each target type. - local targets ; - local pre = $(self.name-prefix) ; - local post = $(self.name-postfix) ; - for local t in $(self.target-types) - { - local generated-name = $(pre[1])$(name)$(post[1]) ; - pre = $(pre[2-]) ; - post = $(post[2-]) ; - - targets += [ class.new file-target $(generated-name) - : $(t) : $(project) : $(a) ] ; - } - - return [ sequence.transform virtual-target.register : $(targets) ] ; - } - - # Attempts to convert 'source' to the types that this generator can - # handle. The intention is to produce the set of targets can should be - # used when generator is run. - rule convert-to-consumable-types ( project name ? : - property-set : sources + - : only-one ? # convert 'source' to only one of source types - # if there's more that one possibility, report an - # error - : consumed-var # name of variable which recieves all targets which - # can be consumed. - bypassed-var # name variable which recieves all targets which - # cannot be consumed - ) - { - # We're likely to be passed 'consumed' and 'bypassed' - # var names. Use "_" to avoid name conflicts. - local _consumed ; - local _bypassed ; - local missing-types ; - - if $(sources[2]) - { - # Don't know how to handle several sources yet. Just try - # to pass the request to other generator - missing-types = $(self.source-types) ; - } - else - { - consume-directly $(sources) : _consumed : missing-types ; - } - - # No need to search for transformation if - # some source type has consumed source and - # no more source types are needed. - if $(only-one) && $(_consumed) - { - missing-types = ; - } - - #TODO: we should check that only one source type - #if create of 'only-one' is true. - # TODO: consider if consuned/bypassed separation should - # be done by 'construct-types'. - - if $(missing-types) - { - local transformed = [ generators.construct-types $(project) $(name) - : $(missing-types) : $(property-set) : $(sources) ] ; - - # Add targets of right type to 'consumed'. Add others to - # 'bypassed'. The 'generators.construct' rule has done - # its best to convert everything to the required type. - # There's no need to rerun it on targets of different types. - - # NOTE: ignoring usage requirements - for local t in $(transformed[2-]) - { - if [ $(t).type ] in $(missing-types) - { - _consumed += $(t) ; - } - else - { - _bypassed += $(t) ; - } - } - } - - _consumed = [ sequence.unique $(_consumed) ] ; - _bypassed = [ sequence.unique $(_bypassed) ] ; - - # remove elements of '_bypassed' that are in '_consumed' - - # Suppose the target type of current generator, X is produced from - # X_1 and X_2, which are produced from Y by one generator. - # When creating X_1 from Y, X_2 will be added to 'bypassed' - # Likewise, when creating X_2 from Y, X_1 will be added to 'bypassed' - # But they are also in 'consumed'. We have to remove them from - # bypassed, so that generators up the call stack don't try to convert - # them. - - # In this particular case, X_1 instance in 'consumed' and X_1 instance - # in 'bypassed' will be the same: because they have the same source and - # action name, and 'virtual-target.register' won't allow two different - # instances. Therefore, it's OK to use 'set.difference'. - - _bypassed = [ set.difference $(_bypassed) : $(_consumed) ] ; - - - $(consumed-var) += $(_consumed) ; - $(bypassed-var) += $(_bypassed) ; - } - - # Converts several files to consumable types. - rule convert-multiple-sources-to-consumable-types - ( project : property-set : sources * : consumed-var bypassed-var ) - { - # We process each source one-by-one, trying to convert it to - # a usable type. - for local source in $(sources) - { - local _c ; - local _b ; - # TODO: need to check for failure on each source. - convert-to-consumable-types $(project) : $(property-set) - : $(source) : true : _c _b ; - if ! $(_c) - { - generators.dout [ indent ] " failed to convert " $(source) ; - } - $(consumed-var) += $(_c) ; - $(bypassed-var) += $(_b) ; - } - } - - rule consume-directly ( source : consumed-var : missing-types-var ) - { - local real-source-type = [ $(source).type ] ; - - # If there are no source types, we can consume anything - local source-types = $(self.source-types) ; - source-types ?= $(real-source-type) ; - - for local st in $(source-types) - { - # The 'source' if of right type already) - if $(real-source-type) = $(st) || - [ type.is-derived $(real-source-type) $(st) ] - { - $(consumed-var) += $(source) ; - } - else - { - $(missing-types-var) += $(st) ; - } - } - } - - - # Returns the class to be used to actions. Default implementation - # returns "action". - rule action-class ( ) - { - return "action" ; - } -} - -import errors : error ; - -.generators = ; - -# Registers new generator instance 'g'. -rule register ( g ) -{ - .generators += $(g) ; - - # A generator can produce several targets of the - # same type. We want unique occurence of that generator - # in .generators.$(t) in that case, otherwise, it will - # be tried twice and we'll get false ambiguity. - for local t in [ sequence.unique [ $(g).target-types ] ] - { - .generators.$(t) += $(g) ; - } - - # Update the set of generators for toolset - - # TODO: should we check that generator with this id - # is not already registered. For example, the fop.jam - # module intentionally declared two generators with the - # same id, so such check will break it. - local id = [ $(g).id ] ; - - # Some generators have multiple periods in their name, so the - # normal $(id:S=) won't generate the right toolset name. - # e.g. if id = gcc.compile.c++, then - # .generators-for-toolset.$(id:S=) will append to - # .generators-for-toolset.gcc.compile, which is a separate - # value from .generators-for-toolset.gcc. Correcting this - # makes generator inheritance work properly. - # See also inherit-generators in module toolset - local base = $(id) ; - while $(base:S) - { - base = $(base:B) ; - } - .generators-for-toolset.$(base) += $(g) ; -} - -# Creates new instance of the 'generator' class and registers it. -# Retursn the creates instance. -# Rationale: the instance is returned so that it's possible to first register -# a generator and then call 'run' method on that generator, bypassing all -# generator selection. -rule register-standard ( id : source-types * : target-types + : requirements * ) -{ - local g = [ new generator $(id) : $(source-types) : $(target-types) - : $(requirements) ] ; - register $(g) ; - return $(g) ; -} - -# Creates new instance of the 'composing-generator' class and -# registers it. -rule register-composing ( id : source-types * : target-types + : requirements * ) -{ - local g = [ new generator $(id) true : $(source-types) - : $(target-types) : $(requirements) ] ; - register $(g) ; - return $(g) ; -} - -# Returns all generators which belong to 'toolset', i.e. which -# ids are $(toolset). -rule generators-for-toolset ( toolset ) -{ - return $(.generators-for-toolset.$(toolset)) ; -} - -# Make generator 'overrider-id' be preferred to -# 'overridee-id'. If, when searching for generators -# that could produce a target of certain type, -# both those generators are amoung viable generators, -# the overridden generator is immediately discarded. -# -# The overridden generators are discarded immediately -# after computing the list of viable generators, before -# running any of them. -rule override ( overrider-id : overridee-id ) -{ - .override.$(overrider-id) += $(overridee-id) ; -} - - - - -# Set if results of the current generators search are going to be cached -# This means no futher attempts to cache generators search should be -# made. -.caching = ; - -# Returns a list of source type which can possibly be converted -# to 'target-type' by some chain of generator invocation. -# -# More formally, takes all generators for 'target-type' and -# returns union of source types for those generators and result -# of calling itself recusrively on source types. -local rule viable-source-types-real ( target-type ) -{ - local generators ; - - local t = [ type.all-bases $(target-type) ] ; - - local result ; - # 't' is the list of types which are not yet processed - while $(t) - { - # Find all generators for current type. - # Unlike 'find-viable-generators' we don't care about property-set. - local generators = $(.generators.$(t[1])) ; - t = $(t[2-]) ; - - - - while $(generators) - { - local g = $(generators[1]) ; - generators = $(generators[2-]) ; - - if ! [ $(g).source-types ] - { - # Empty source types -- everything can be accepted - result = * ; - # This will terminate this loop. - generators = ; - # This will terminate outer loop. - t = ; - } - - for local source-type in [ $(g).source-types ] - { - if ! $(source-type) in $(result) - { - # If generator accepts 'source-type' it - # will happily accept any type derived from it - local all = [ type.all-derived $(source-type) ] ; - for local n in $(all) - { - if ! $(n) in $(result) - { - t += $(n) ; - result += $(n) ; - } - } - } - } - } - } - - result = [ sequence.unique $(result) ] ; - - return $(result) ; -} - -# Helper rule, caches the result of 'viable-source-types-real'. -rule viable-source-types ( target-type ) -{ - local key = .vst.$(target-type) ; - if ! $($(key)) - { - local v = [ viable-source-types-real $(target-type) ] ; - if ! $(v) - { - v = none ; - } - $(key) = $(v) ; - } - - if $($(key)) != none - { - return $($(key)) ; - } -} - -# Returns the list of source types, which, when passed to 'run' -# method of 'generator', has some change of being eventually used -# (probably after conversion by other generators) -rule viable-source-types-for-generator-real ( generator ) -{ - local source-types = [ $(generator).source-types ] ; - if ! $(source-types) - { - # If generator does not specify any source types, - # it might be special generator like builtin.lib-generator - # which just relays to other generators. Return '*' to - # indicate that any source type is possibly OK, since we don't - # know for sure. - return * ; - } - else - { - local result ; - for local s in $(source-types) - { - result += [ type.all-derived $(s) ] - [ generators.viable-source-types $(s) ] ; - } - result = [ sequence.unique $(result) ] ; - if * in $(result) - { - result = * ; - } - return $(result) ; - } -} - -# Helper rule, caches the result of 'viable-source-types-for-genrator'. -local rule viable-source-types-for-generator ( generator ) -{ - local key = .vstg.$(generator) ; - if ! $($(key)) - { - local v = [ viable-source-types-for-generator-real $(generator) ] ; - if ! $(v) - { - v = none ; - } - $(key) = $(v) ; - } - - if $($(key)) != none - { - return $($(key)) ; - } -} - - - -# Returns usage requirements + list of created targets -local rule try-one-generator-really ( project name ? : generator : - target-type : property-set : sources * ) -{ - local targets = - [ $(generator).run $(project) $(name) - : $(property-set) - : $(sources) - ] ; - - local usage-requirements ; - local success ; - - generators.dout [ indent ] returned $(targets) ; - - if $(targets) - { - success = true ; - - if [ class.is-a $(targets[1]) : property-set ] - { - usage-requirements = $(targets[1]) ; - targets = $(targets[2-]) ; - } - else - { - usage-requirements = [ property-set.empty ] ; - } - } - - generators.dout [ indent ] " generator" [ $(generator).id ] " spawned " ; - generators.dout [ indent ] " " $(targets) ; - if $(usage-requirements) - { - generators.dout [ indent ] " with usage requirements:" $(x) ; - } - - - if $(success) - { - return $(usage-requirements) $(targets) ; - } -} - -# Checks if generator invocation can be pruned, because it's guaranteed -# to fail. If so, quickly returns empty list. Otherwise, calls -# try-one-generator-really. -local rule try-one-generator ( project name ? : generator : - target-type : property-set : sources * ) -{ - local source-types ; - for local s in $(sources) - { - source-types += [ $(s).type ] ; - } - local viable-source-types = - [ viable-source-types-for-generator $(generator) ] ; - - if $(source-types) && $(viable-source-types) != * && - ! [ set.intersection $(source-types) : $(viable-source-types) ] - { - local id = [ $(generator).id ] ; - generators.dout [ indent ] " ** generator '$(id)' pruned" ; - #generators.dout [ indent ] "source-types" '$(source-types)' ; - #generators.dout [ indent ] "viable-source-types" '$(viable-source-types)' ; - } - else { - return [ try-one-generator-really $(project) $(name) - : $(generator) - : $(target-type) : $(property-set) : $(sources) ] ; - } -} - -rule construct-types ( project name ? : target-types + : - property-set : sources + ) -{ - local result ; - local matched-types ; - local usage-requirements = [ property-set.empty ] ; - for local t in $(target-types) - { - local r = [ construct $(project) $(name) : $(t) : $(property-set) : - $(sources) ] ; - if $(r) - { - usage-requirements = [ $(usage-requirements).add $(r[1]) ] ; - result += $(r[2-]) ; - matched-types += $(t) ; - } - } - # TODO: have to introduce parameter controlling if - # several types can be matches and add appropriate - # checks - - # TODO: need to review the documentation for - # 'construct' to see if it should return $(source) even - # if nothing can be done with it. Currents docs seem to - # imply that, contrary to the behaviour. - if $(result) - { - return $(usage-requirements) $(result) ; - } - else - { - return $(usage-requirements) $(sources) ; - } -} - -# Ensures all 'targets' have types. If this is not so, exists with -# error. -local rule ensure-type ( targets * ) -{ - for local t in $(targets) - { - if ! [ $(t).type ] - { - errors.error "target" [ $(t).str ] "has no type" ; - } - } -} - -# Returns generators which can be used to construct target of specified type -# with specified properties. Uses the following algorithm: -# - iterates over requested target-type and all it's bases (in the order returned bt -# type.all-bases. -# - for each type find all generators that generate that type and which requirements -# are satisfied by properties. -# - if the set of generators is not empty, returns that set. -# -# Note: this algorithm explicitly ignores generators for base classes if there's -# at least one generator for requested target-type. -local rule find-viable-generators-aux ( target-type : property-set ) -{ - # Select generators that can create the required target type. - local viable-generators = ; - local generator-rank = ; - - import type ; - local t = [ type.all-bases $(target-type) ] ; - - generators.dout [ indent ] find-viable-generators target-type= $(target-type) - property-set= [ $(property-set).as-path ] - ; - - # Get the lit of generators for the requested type. - # If no generator is registered, try base type, and so on. - local generators ; - while $(t[1]) - { - generators.dout [ indent ] "trying type" $(t[1]) ; - if $(.generators.$(t[1])) - { - generators.dout [ indent ] "there are generators for this type" ; - generators = $(.generators.$(t[1])) ; - - if $(t[1]) != $(target-type) - { - # We're here, when no generators for target-type are found, - # but there are some generators for a base type. - # We'll try to use them, but they will produce targets of - # base type, not of 'target-type'. So, we clone the generators - # and modify the list of target types. - local generators2 ; - for local g in $(generators) - { - # generators.register adds generator to the list of generators - # for toolsets, which is a bit strange, but should work. - # That list is only used when inheriting toolset, which - # should have being done before generators are run. - generators2 += [ - $(g).clone-and-change-target-type $(t[1]) : $(target-type) ] ; - generators.register $(generators2[-1]) ; - } - generators = $(generators2) ; - } - t = ; - } - t = $(t[2-]) ; - } - - - for local g in $(generators) - { - generators.dout [ indent ] "trying generator" [ $(g).id ] "(" [ $(g).source-types ] -> [ $(g).target-types ] ")" ; - - local m = [ $(g).match-rank $(property-set) ] ; - if $(m) - { - generators.dout [ indent ] " is viable" ; - viable-generators += $(g) ; - } - } - - return $(viable-generators) ; -} - -rule find-viable-generators ( target-type : property-set ) -{ - local key = $(target-type).$(property-set) ; - local l = $(.fv.$(key)) ; - if ! $(l) - { - l = [ find-viable-generators-aux $(target-type) : $(property-set) ] ; - if ! $(l) - { - l = none ; - } - .fv.$(key) = $(l) ; - } - - if $(l) = none - { - l = ; - } - - local viable-generators ; - for local g in $(l) - { - # Avoid trying the same generator twice on different levels. - if ! $(g) in $(.active-generators) - { - viable-generators += $(g) ; - } - } - - # Generators which override 'all'. - local all-overrides ; - # Generators which are overriden - local overriden-ids ; - for local g in $(viable-generators) - { - local id = [ $(g).id ] ; - local this-overrides = $(.override.$(id)) ; - overriden-ids += $(this-overrides) ; - if all in $(this-overrides) - { - all-overrides += $(g) ; - } - } - if $(all-overrides) - { - viable-generators = $(all-overrides) ; - } - local result ; - for local g in $(viable-generators) - { - if ! [ $(g).id ] in $(overriden-ids) - { - result += $(g) ; - } - } - - return $(result) ; -} - -.construct-stack = ; - -# Attempts to construct target by finding viable generators, running them -# and selecting the dependency graph -local rule construct-really ( - project name ? : target-type : property-set : sources * ) -{ - viable-generators = [ find-viable-generators $(target-type) : $(property-set) ] ; - - generators.dout [ indent ] "*** " [ sequence.length $(viable-generators) ] - " viable generators" ; - - local result ; - local generators-that-succeeded ; - for local g in $(viable-generators) - { - # This variable will be restored on exit from this scope. - local .active-generators = $(g) $(.active-generators) ; - - local r = [ try-one-generator $(project) $(name) : $(g) : $(target-type) : - $(property-set) : $(sources) ] ; - - if $(r) - { - generators-that-succeeded += $(g) ; - if $(result) - { - ECHO "Error: ambiguity found when searching for best transformation" ; - ECHO "Trying to produce type '$(target-type)' from: " ; - for local s in $(sources) - { - ECHO " - " [ $(s).str ] ; - } - ECHO "Generators that succeeded:" ; - for local g in $(generators-that-succeeded) - { - ECHO " - " [ $(g).id ] ; - } - ECHO "First generator produced: " ; - for local t in $(result[2-]) - { - ECHO " - " [ $(t).str ] ; - } - ECHO "Second generator produced: " ; - for local t in $(r[2-]) - { - ECHO " - " [ $(t).str ] ; - } - EXIT ; - } - else - { - result = $(r) ; - } - } - } - - return $(result) ; -} - - -# Attempts to create target of 'target-type' with 'properties' -# from 'sources'. The 'sources' are treated as a collection of -# *possible* ingridients -- i.e. it is not required to consume -# them all. If 'multiple' is true, the rule is allowed to return -# several targets of 'target-type'. -# -# -# Returns a list of target. When this invocation is first instance of -# 'construct' in stack, returns only targets of requested 'target-type', -# otherwise, returns also unused sources and additionally generated -# targets. -rule construct ( project name ? : target-type : property-set * : sources * ) -{ - if (.construct-stack) - { - ensure-type $(sources) ; - } - - .construct-stack += 1 ; - - increase-indent ; - - if $(.debug) - { - generators.dout [ indent ] "*** construct" $(target-type) ; - - for local s in $(sources) - { - generators.dout [ indent ] " from" $(s) ; - } - generators.dout [ indent ] " properties:" [ $(property-set).raw ] ; - } - - - local result = [ construct-really $(project) $(name) - : $(target-type) : $(property-set) : $(sources) ] ; - - decrease-indent ; - - .construct-stack = $(.construct-stack[2-]) ; - - return $(result) ; -} diff --git a/v2/build/modifiers.jam b/v2/build/modifiers.jam deleted file mode 100644 index 40bed930d..000000000 --- a/v2/build/modifiers.jam +++ /dev/null @@ -1,240 +0,0 @@ -# Copyright 2003 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) - -# Modifiers are generalized generators that mutate targets in specific ways. -# This structure allows for grouping a variety of functionality in an -# orthogonal way to the functionality in toolsets, and without specifying -# more target variations. In turn the modifiers can be used as building -# blocks to implement simple requests, like the feature. - -import modules ; -import feature ; -import errors ; -import type ; -import "class" : new ; -import generators ; -import property ; -import virtual-target ; -import numbers ; -import sequence ; -import symlink ; -import property-set ; - -# Base generator for creating targets that are modifications of existing -# targets. -# -class modifier : generator -{ - rule __init__ ( - id - composing ? - : source-types * - : target-types-and-names + - : requirements * - ) - { - generator.__init__ $(id) $(composing) - : $(source-types) - : $(target-types-and-names) - : $(requirements) ; - - self.targets-in-progress = ; - } - - # Wraps the generation of the target to call before and after rules to - # affect the real target. - # - rule run ( project name ? : property-set : sources + : multiple ? ) - { - local result ; - local current-target = $(project)^$(name) ; - if ! $(current-target) in $(self.targets-in-progress) - { - # Before modifications... - local project_ = - [ modify-project-before - $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ; - local name_ = - [ modify-name-before - $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ; - local property-set_ = - [ modify-properties-before - $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ; - local sources_ = - [ modify-sources-before - $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ; - local multiple_ = - [ modify-multiple-before - $(project) $(name) : $(property-set) : $(sources) : $(multiple) ] ; - project = $(project_) ; - name = $(name_) ; - property-set = $(property-set_) ; - sources = $(sources_) ; - multiple = $(multiple_) ; - - # Generate the real target... - local target-type-p = - [ property.select : [ $(property-set).raw ] ] ; - self.targets-in-progress += $(current-target) ; - result = - [ generators.construct $(project) $(name) - : $(target-type-p:G=) $(multiple) - : $(property-set) - : $(sources) ] ; - self.targets-in-progress = $(self.targets-in-progress[1--2]) ; - - # After modifications... - result = - [ modify-target-after $(result) - : $(project) $(name) - : $(property-set) - : $(sources) - : $(multiple) ] ; - } - return $(result) ; - } - - rule modify-project-before ( project name ? : property-set : sources + : multiple ? ) - { - return $(project) ; - } - - rule modify-name-before ( project name ? : property-set : sources + : multiple ? ) - { - return $(name) ; - } - - rule modify-properties-before ( project name ? : property-set : sources + : multiple ? ) - { - return $(property-set) ; - } - - rule modify-sources-before ( project name ? : property-set : sources + : multiple ? ) - { - return $(sources) ; - } - - rule modify-multiple-before ( project name ? : property-set : sources + : multiple ? ) - { - return $(multiple) ; - } - - rule modify-target-after ( target : project name ? : property-set : sources + : multiple ? ) - { - return $(target) ; - } - - # Utility, clones a file-target with optional changes to the name, type, and project - # of the target. - # NOTE: This functionality should be moved, and generalized, to virtual-targets. - # - rule clone-file-target ( target : new-name ? : new-type ? : new-project ? ) - { - # Need a MUTCH better way to clone a target... - new-name ?= [ $(target).name ] ; - new-type ?= [ $(target).type ] ; - new-project ?= [ $(target).project ] ; - local result = [ new file-target $(new-name) : $(new-type) : $(new-project) ] ; - - if [ $(target).dependencies ] { $(result).depends [ $(target).dependencies ] ; } - $(result).root [ $(target).root ] ; - $(result).set-usage-requirements [ $(target).usage-requirements ] ; - - local action = [ $(target).action ] ; - local action-class = [ modules.peek $(action) : __class__ ] ; - - local ps = [ $(action).properties ] ; - local cloned-action = [ new $(action-class) $(result) : - [ $(action).sources ] : [ $(action).action-name ] : $(ps) ] ; - $(result).action $(cloned-action) ; - - return $(result) ; - } -} - -# A modifier that changes the name of a target, after it's generated, given -# a regular expression to slpit the name, and a set of token to insert -# between the split tokens of the name. This also exposes the target for other -# uses with a symlink to the original name (optionally). -# -class name-modifier : modifier -{ - rule __init__ ( ) - { - # Apply ourselves to EXE targets, for now. - modifier.__init__ name.modifier : : EXE LIB : yes ; - } - - # Modifies the name, by cloning the target with the new name. - # - rule modify-target-after ( target : project name ? : property-set : sources + : multiple ? ) - { - local result = $(target) ; - - local name-mod-p = [ property.select : [ $(property-set).raw ] ] ; - if $(name-mod-p) - { - local new-name = [ modify-name [ $(target).name ] : $(name-mod-p:G=) ] ; - if $(new-name) != [ $(target).name ] - { - result = [ clone-file-target $(target) : $(new-name) ] ; - } - local expose-original-as-symlink = [ MATCH "(.*)" : $(name-mod-p) ] ; - if $(expose-original-as-symlink) - { - local symlink-t = [ new symlink-targets $(project) : $(name) : [ $(result).name ] ] ; - result = [ $(symlink-t).construct $(result) - : [ property-set.create [ $(property-set).raw ] build-relative ] ] ; - } - } - - return $(result) ; - } - - # Do the transformation of the name. - # - rule modify-name ( name : modifier-spec + ) - { - local match = [ MATCH "(.*)" : $(modifier-spec) ] ; - local name-parts = [ MATCH $(match) : $(name) ] ; - local insertions = [ sequence.insertion-sort [ MATCH "(<[0123456789]+>.*)" : $(modifier-spec) ] ] ; - local new-name-parts ; - local insert-position = 1 ; - while $(insertions) - { - local insertion = [ MATCH "<$(insert-position)>(.*)" : $(insertions[1]) ] ; - if $(insertion) - { - new-name-parts += $(insertion) ; - insertions = $(insertions[2-]) ; - } - new-name-parts += $(name-parts[1]) ; - name-parts = $(name-parts[2-]) ; - insert-position = [ numbers.increment $(insert-position) ] ; - } - new-name-parts += $(name-parts) ; - return [ sequence.join $(new-name-parts) ] ; - } - - rule optional-properties ( ) - { - return yes ; - } -} -feature.feature name-modifier : : free ; -feature.feature name-modify : no yes : incidental optional ; -generators.register [ new name-modifier ] ; - -# Translates property to a set of modification properties -# that are applied by the name-modifier, and symlink-modifier. -# -rule version-to-modifier ( property : properties * ) -{ - return - yes - "^([^.]*)(.*)" <2>.$(property:G=) - yes - ; -} -feature.action : version-to-modifier ; diff --git a/v2/build/project.jam b/v2/build/project.jam deleted file mode 100644 index ec9826828..000000000 --- a/v2/build/project.jam +++ /dev/null @@ -1,1026 +0,0 @@ -# Copyright 2002, 2003 Dave Abrahams -# Copyright 2002, 2005, 2006 Rene Rivera -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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) - -# Implements project representation and loading. -# Each project is represented by -# - a module where all the Jamfile content live. -# - an instance of 'project-attributes' class. -# (given module name, can be obtained by 'attributes' rule) -# - an instance of 'project-target' class (from targets.jam) -# (given a module name, can be obtained by 'target' rule) -# -# Typically, projects are created as result of loading Jamfile, which is -# do by rules 'load' and 'initialize', below. First, module for Jamfile -# is loaded and new project-attributes instance is created. Some rules -# necessary for project are added to the module (see 'project-rules' module) -# at the bottom of this file. -# Default project attributes are set (inheriting attributes of parent project, if -# it exists). After that, Jamfile is read. It can declare its own attributes, -# via 'project' rule, which will be combined with already set attributes. -# -# -# The 'project' rule can also declare project id, which will be associated with -# the project module. -# -# There can also be 'standalone' projects. They are created by calling 'initialize' -# on arbitrary module, and not specifying location. After the call, the module can -# call 'project' rule, declare main target and behave as regular projects. However, -# since it's not associated with any location, it's better declare only prebuilt -# targets. -# -# The list of all loaded Jamfile is stored in variable .project-locations. It's possible -# to obtain module name for a location using 'module-name' rule. The standalone projects -# are not recorded, the only way to use them is by project id. - - -import modules : peek poke ; -import numbers ; -import path ; -import sequence ; -import errors : error ; - -import print ; -import "class" : new ; -import errors ; -import assert ; -import property-set ; - -# -# Loads jamfile at the given location. After loading, project global -# file and jamfile needed by the loaded one will be loaded recursively. -# If the jamfile at that location is loaded already, does nothing. -# Returns the project module for the Jamfile. -# -rule load ( jamfile-location ) -{ - if --debug-loading in [ modules.peek : ARGV ] - { - ECHO "Loading Jamfile at" '$(jamfile-location)' ; - } - - local module-name = [ module-name $(jamfile-location) ] ; - # If Jamfile is already loaded, don't try again. - if ! $(module-name) in $(.jamfile-modules) - { - load-jamfile $(jamfile-location) ; - - # We want to make sure that child project are loaded only - # after parent projects. In particular, because parent projects - # define attributes whch are inherited by children, and we don't - # want children to be loaded before parents has defined everything. - # - # While "build-project" and "use-project" can potentially refer - # to child projects from parent projects, we don't immediately - # loading child projects when seing those attributes. Instead, - # we record the minimal information that will be used only later. - load-used-projects $(module-name) ; - } - return $(module-name) ; -} - -rule load-used-projects ( module-name ) -{ - local used = [ modules.peek $(module-name) : .used-projects ] ; - local location = [ attribute $(module-name) location ] ; - import project ; - while $(used) - { - local id = $(used[1]) ; - local where = $(used[2]) ; - - project.use $(id) : [ path.root - [ path.make $(where) ] $(location) ] ; - used = $(used[3-]) ; - } -} - - -# Note the use of character groups, as opposed to listing -# 'Jamroot' and 'jamroot'. With the latter, we'd get duplicate -# matches on windows and would have to eliminate duplicates. -JAMROOT ?= [ peek : JAMROOT ] ; -JAMROOT ?= project-root.jam [Jj]amroot [Jj]amroot.jam ; - -# Loads parent of Jamfile at 'location'. Issues an error if nothing is found. -rule load-parent ( location ) -{ - local found = [ path.glob-in-parents $(location) : - $(JAMROOT) $(JAMFILE) ] ; - - if ! $(found) - { - ECHO "error: Could not find parent for project at '$(location)'" ; - ECHO "error: Did not find Jamfile or project-root.jam in any parent directory." ; - EXIT ; - } - - return [ load $(found[1]:D) ] ; -} - -# Makes the specified 'module' act as if it were a regularly loaded Jamfile -# at 'location'. If Jamfile is already located for that location, it's an -# error. -rule act-as-jamfile ( module : location ) -{ - if [ module-name $(location) ] in $(.jamfile-modules) - { - errors.error "Jamfile was already loaded for '$(location)'" ; - } - # Set up non-default mapping from location to module. - .module.$(location) = $(module) ; - - # Add the location to the list of project locations - # so that we don't try to load Jamfile in future - .jamfile-modules += [ module-name $(location) ] ; - - initialize $(module) : $(location) ; -} - - -# Given 'name' which can be project-id or plain directory name, -# return project module corresponding to that id or directory. -# Returns nothing of project is not found. -rule find ( name : current-location ) -{ - local project-module ; - - # Try interpreting name as project id. - if [ path.is-rooted $(name) ] - { - project-module = $($(name).jamfile-module) ; - } - - if ! $(project-module) - { - local location = [ path.root - [ path.make $(name) ] $(current-location) ] ; - # If no project is registered for the given location, try to - # load it. First see if we have Jamfile. If not we might have project - # root, willing to act as Jamfile. In that case, project-root - # must be placed in the directory referred by id. - - project-module = [ module-name $(location) ] ; - if ! $(project-module) in $(.jamfile-modules) - { - if [ path.glob $(location) : $(JAMROOT) $(JAMFILE) ] - { - project-module = [ load $(location) ] ; - } - else - { - project-module = ; - } - } - } - - return $(project-module) ; -} - -# -# Returns the name of module corresponding to 'jamfile-location'. -# If no module corresponds to location yet, associates default -# module name with that location. -# -rule module-name ( jamfile-location ) -{ - if ! $(.module.$(jamfile-location)) - { - # Root the path, so that locations are always umbiguious. - # Without this, we can't decide if '../../exe/program1' and '.' - # are the same paths, or not. - jamfile-location = [ path.root $(jamfile-location) [ path.pwd ] ] ; - .module.$(jamfile-location) = Jamfile<$(jamfile-location)> ; - } - return $(.module.$(jamfile-location)) ; -} - -# Default patterns to search for the Jamfiles to use for build -# declarations. -# -JAMFILE = [ modules.peek : JAMFILE ] ; -JAMFILE ?= [Bb]uild.jam [Jj]amfile.v2 [Jj]amfile [Jj]amfile.jam ; - -# Find the Jamfile at the given location. This returns the exact names of -# all the Jamfiles in the given directory. The optional parent-root argument -# causes this to search not the given directory but the ones above it up -# to the directory given in it. -# -rule find-jamfile ( - dir # The directory(s) to look for a Jamfile. - parent-root ? # Optional flag indicating to search for the parent Jamfile. - : no-errors ? - ) -{ - # Glob for all the possible Jamfiles according to the match pattern. - # - local jamfile-glob = ; - if $(parent-root) - { - if ! $(.parent-jamfile.$(dir)) - { - .parent-jamfile.$(dir) = - [ path.glob-in-parents $(dir) : $(JAMFILE) ] ; - } - jamfile-glob = $(.parent-jamfile.$(dir)) ; - } - else - { - if ! $(.jamfile.$(dir)) - { - .jamfile.$(dir) = [ path.glob $(dir) : $(JAMFILE) ] ; - } - jamfile-glob = $(.jamfile.$(dir)) ; - - } - - local jamfile-to-load = $(jamfile-glob) ; - # Multiple Jamfiles found in the same place. Warn about this. - # And ensure we use only one of them. - # As a temporary convenience measure, if there's Jamfile.v2 amount - # found files, suppress the warning and use it. - # - if $(jamfile-to-load[2-]) - { - local v2-jamfiles = [ MATCH (.*[Jj]amfile\\.v2)|(.*[Bb]uild\\.jam) : $(jamfile-to-load) ] ; - - if $(v2-jamfiles) && ! $(v2-jamfiles[2]) - { - jamfile-to-load = $(v2-jamfiles) ; - } - else - { - ECHO - "warning: Found multiple Jamfiles at '"$(dir)"'!" - "Loading the first one: '" [ path.basename $(jamfile-to-load[1]) ] "'." ; - } - - jamfile-to-load = $(jamfile-to-load[1]) ; - } - - # Could not find it, error. - # - if ! $(no-errors) && ! $(jamfile-to-load) - { - errors.error - "Unable to load Jamfile." : - "Could not find a Jamfile in directory '$(dir)'". : - "Attempted to find it with pattern '"$(JAMFILE:J=" ")"'." : - "Please consult the documentation at 'http://www.boost.org'." ; - } - - return $(jamfile-to-load) ; -} - -# Load a Jamfile at the given directory. Returns nothing. -# Will attempt to load the file as indicated by the JAMFILE patterns. -# Effect of calling this rule twice with the same 'dir' is underfined. - -local rule load-jamfile ( - dir # The directory of the project Jamfile. - ) -{ - # See if the Jamfile is where it should be. - # - local jamfile-to-load = [ path.glob $(dir) : $(JAMROOT) ] ; - if ! $(jamfile-to-load) - { - jamfile-to-load = [ find-jamfile $(dir) ] ; - } - - - # The module of the jamfile. - # - local jamfile-module = [ module-name [ path.parent $(jamfile-to-load) ] ] ; - - # Initialize the jamfile module before loading. - # - initialize $(jamfile-module) : [ path.parent $(jamfile-to-load) ] - : $(jamfile-to-load:BS) ; - - local saved-project = $(.current-project) ; - # Now load the Jamfile in it's own context. - # Initialization might have load parent Jamfiles, which might have - # loaded the current Jamfile with use-project. Do a final check to make - # sure it's not loaded already. - if ! $(jamfile-module) in $(.jamfile-modules) - { - .jamfile-modules += $(jamfile-module) ; - mark-as-user $(jamfile-module) ; - modules.load $(jamfile-module) : [ path.native $(jamfile-to-load) ] : . ; - if [ MATCH ($(JAMROOT)) : $(jamfile-to-load:BS) ] - { - jamfile = [ find-jamfile $(dir) : no-errors ] ; - if $(jamfile) - { - load-aux $(jamfile-module) : [ path.native $(jamfile) ] ; - } - } - } - # Now do some checks - if $(.current-project) != $(saved-project) - { - errors.error "The value of the .current-project variable" - : "has magically changed after loading a Jamfile." - : "This means some of the targets might be defined a the wrong project." - : "after loading " $(jamfile-module) - : "expected value " $(saved-project) - : "actual value " $(.current-project) - ; - } - - if $(.global-build-dir) - { - local id = [ attribute $(jamfile-module) id ] ; - local project-root = [ attribute $(jamfile-module) project-root ] ; - local location = [ attribute $(jamfile-module) location ] ; - - if $(location) && $(project-root) = $(dir) - { - # This is Jamroot - if ! $(id) - { - ECHO "warning: the --build-dir option was specified" ; - ECHO "warning: but Jamroot at '$(dir)'" ; - ECHO "warning: specified no project id" ; - ECHO "warning: the --build-dir option will be ignored" ; - } - } - } - - - - -} - -rule mark-as-user ( module-name ) -{ - if USER_MODULE in [ RULENAMES ] - { - USER_MODULE $(module-name) ; - } -} - - -rule load-aux ( module-name : file ) -{ - mark-as-user $(module-name) ; - - module $(module-name) - { - include $(2) ; - local rules = [ RULENAMES $(1) ] ; - IMPORT $(1) : $(rules) : $(1) : $(1).$(rules) ; - } -} - -.global-build-dir = [ MATCH --build-dir=(.*) : [ modules.peek : ARGV ] ] ; -if $(.global-build-dir) -{ - # If the option is specified several times, take the last value. - .global-build-dir = [ path.make $(.global-build-dir[-1]) ] ; -} - - -# Initialize the module for a project. -# -rule initialize ( - module-name # The name of the project module. - : location ? # The location (directory) of the project to initialize. - # If not specified, stanalone project will be initialized. - : basename ? - ) -{ - if --debug-loading in [ modules.peek : ARGV ] - { - ECHO "Initializing project '$(module-name)'" ; - } - - # TODO: need to consider if standalone projects can do anything but defining - # prebuilt targets. If so, we need to give more sensible "location", so that - # source paths are correct. - location ?= "" ; - # Create the module for the Jamfile first. - module $(module-name) - { - } - $(module-name).attributes = [ new project-attributes $(location) - $(module-name) ] ; - local attributes = $($(module-name).attributes) ; - - if $(location) - { - $(attributes).set source-location : [ path.make $(location) ] : exact ; - } - else - { - $(attributes).set source-location : "" : exact ; - } - - $(attributes).set requirements : [ property-set.empty ] : exact ; - $(attributes).set usage-requirements : [ property-set.empty ] : exact ; - - # Import rules common to all project modules from project-rules module, - # defined at the end of this file. - modules.clone-rules project-rules $(module-name) ; - - local jamroot ; - - local parent-module ; - if $(module-name) = site-config - { - # No parent. - } - else if $(module-name) = user-config - { - parent-module = site-config ; - } - else - { - # We search for parent/project-root only if jamfile was specified - # --- i.e - # if the project is not standalone. - if $(location) && ! [ MATCH ($(JAMROOT)) : $(basename) ] - { - parent-module = [ load-parent $(location) ] ; - } - else - { - # It's either jamroot, or standalone project. - # If it's jamroot, inherit from user-config. - if $(location) - { - parent-module = user-config ; - jamroot = true ; - } - } - } - - if $(parent-module) - { - inherit-attributes $(module-name) : $(parent-module) ; - $(attributes).set parent-module : $(parent-module) : exact ; - } - - if $(jamroot) - { - $(attributes).set project-root : $(location) : exact ; - } - - local parent ; - if $(parent-module) - { - parent = [ target $(parent-module) ] ; - } - - if ! $(.target.$(module-name)) - { - .target.$(module-name) = [ new project-target $(module-name) - : $(module-name) $(parent) - : [ attribute $(module-name) requirements ] ] ; - - if --debug-loading in [ modules.peek : ARGV ] - { - ECHO "Assigned project target" $(.target.$(module-name)) - "to '$(module-name)'" ; - } - } - - .current-project = [ target $(module-name) ] ; -} - -# Make 'project-module' inherit attributes of project root and parent module. -rule inherit-attributes ( project-module : parent-module ) -{ - local attributes = $($(project-module).attributes) ; - local pattributes = [ attributes $(parent-module) ] ; - # Parent module might be locationless user-config. - if [ modules.binding $(parent-module) ] - { - $(attributes).set parent : [ path.parent - [ path.make [ modules.binding $(parent-module) ] ] ] ; - } - local v = [ $(pattributes).get project-root ] ; - $(attributes).set project-root : $(v) : exact ; - $(attributes).set default-build - : [ $(pattributes).get default-build ] ; - $(attributes).set requirements - : [ $(pattributes).get requirements ] : exact ; - $(attributes).set usage-requirements - : [ $(pattributes).get usage-requirements ] : exact ; - - local parent-build-dir = [ $(pattributes).get build-dir ] ; - if $(parent-build-dir) - { - # Have to compute relative path from parent dir to our dir - # Convert both paths to absolute, since we cannot - # find relative path from ".." to "." - - local location = [ attribute $(project-module) location ] ; - local parent-location = [ attribute $(parent-module) location ] ; - - local pwd = [ path.pwd ] ; - local parent-dir = [ path.root $(parent-location) $(pwd) ] ; - local our-dir = [ path.root $(location) $(pwd) ] ; - $(attributes).set build-dir : [ path.join $(parent-build-dir) - [ path.relative $(our-dir) $(parent-dir) ] ] : exact ; - } -} - - -# Associate the given id with the given project module -rule register-id ( id : module ) -{ - $(id).jamfile-module = $(module) ; -} - -# Class keeping all the attributes of a project. -# -# The standard attributes are "id", "location", "project-root", "parent" -# "requirements", "default-build", "source-location" and "projects-to-build". -class project-attributes -{ - import property ; - import property-set ; - import errors ; - import path ; - import print ; - import sequence ; - import project ; - - rule __init__ ( location project-module ) - { - self.location = $(location) ; - self.project-module = $(project-module) ; - } - - # Set the named attribute from the specification given by the user. - # The value actually set may be different. - rule set ( attribute : specification * - : exact ? # Sets value from 'specification' without any processing - ) - { - if $(exact) - { - self.$(attribute) = $(specification) ; - } - else if $(attribute) = "requirements" - { - local result = [ property-set.refine-from-user-input - $(self.requirements) : $(specification) - : $(self.project-module) : $(self.location) ] ; - - if $(result[1]) = "@error" - { - errors.error - "Requirements for project at '$(self.location)'" - "conflict with parent's." : - "Explanation: " $(result[2-]) ; - } - else - { - self.requirements = $(result) ; - } - } - else if $(attribute) = "usage-requirements" - { - local unconditional ; - for local p in $(specification) - { - local split = [ property.split-conditional $(p) ] ; - split ?= nothing $(p) ; - unconditional += $(split[2]) ; - } - - local non-free = [ property.remove free : $(unconditional) ] ; - if $(non-free) - { - errors.error "usage-requirements" $(specification) "have non-free properties" $(non-free) ; - } - local t = [ property.translate-paths $(specification) - : $(self.location) ] ; - if $(self.usage-requirements) - { - self.usage-requirements = [ property-set.create - [ $(self.usage-requirements).raw ] $(t) ] ; - } - else - { - self.usage-requirements = [ property-set.create $(t) ] ; - } - } - else if $(attribute) = "default-build" - { - self.default-build = [ property.make $(specification) ] ; - } - else if $(attribute) = "source-location" - { - self.source-location = ; - for local src-path in $(specification) - { - self.source-location += [ path.root - [ path.make $(src-path) ] $(self.location) ] ; - } - } - else if $(attribute) = "build-dir" - { - self.build-dir = [ path.root - [ path.make $(specification) ] $(self.location) ] ; - } - else if ! $(attribute) in "id" "default-build" "location" "source-location" - "parent" "projects-to-build" "project-root" - { - errors.error "Invalid project attribute '$(attribute)' specified " - "for project at '$(self.location)'" ; - } - else - { - self.$(attribute) = $(specification) ; - } - } - - # Returns the value of the given attribute. - rule get ( attribute ) - { - return $(self.$(attribute)) ; - } - - # Prints the project attributes. - rule print ( ) - { - local id = $(self.id) ; id ?= (none) ; - local parent = $(self.parent) ; parent ?= (none) ; - print.section "'"$(id)"'" ; - print.list-start ; - print.list-item "Parent project:" $(parent) ; - print.list-item "Requirements:" [ $(self.requirements).raw ] ; - print.list-item "Default build:" $(self.default-build) ; - print.list-item "Source location:" $(self.source-location) ; - print.list-item "Projects to build:" - [ sequence.insertion-sort $(self.projects-to-build) ] ; - print.list-end ; - } - -} - -# Returns the project which is currently being loaded -rule current ( ) -{ - return $(.current-project) ; -} - -# Temporary changes the current project to 'project'. Should -# be followed by 'pop-current'. -rule push-current ( project ) -{ - .saved-current-project += $(.current-project) ; - .current-project = $(project) ; -} - -rule pop-current ( ) -{ - .current-project = $(.saved-current-project[-1]) ; - .saved-current-project = $(.saved-current-project[1--2]) ; -} - - - -# Returns the project-attribute instance for the specified jamfile module. -rule attributes ( project ) -{ - return $($(project).attributes) ; -} - -# Returns the value of the specified attribute in the specified jamfile module. -rule attribute ( project attribute ) -{ - return [ $($(project).attributes).get $(attribute) ] ; -} - -# Returns the project target corresponding to the 'project-module'. -rule target ( project-module ) -{ - if ! $(.target.$(project-module)) - { - .target.$(project-module) = [ new project-target $(project-module) - : $(project-module) - : [ attribute $(project-module) requirements ] ] ; - } - return $(.target.$(project-module)) ; -} - -# Use/load a project. -rule use ( id : location ) -{ - local saved-project = $(.current-project) ; - local project-module = [ project.load $(location) ] ; - local declared-id = [ project.attribute $(project-module) id ] ; - - if ! $(declared-id) || $(declared-id) != $(id) - { - # The project at 'location' either have no id or - # that id is not equal to the 'id' parameter. - if $($(id).jamfile-module) - && $($(id).jamfile-module) != $(project-module) - { - errors.user-error - "Attempt to redeclare already existing project id '$(id)'" ; - } - $(id).jamfile-module = $(project-module) ; - } - .current-project = $(saved-project) ; -} - -# Defines a Boost.Build extension project. Such extensions usually -# contain library targets and features that can be used by many people. -# Even though extensions are really projects, they can be initialize as -# a module would be with the "using" (project.project-rules.using) -# mechanism. -rule extension ( id : options * : * ) -{ - # The caller is a standalone module for the extension. - local mod = [ CALLER_MODULE ] ; - - # We need to do the rest within the extension module. - module $(mod) - { - import path ; - - # Find the root project. - local root-project = [ project.current ] ; - root-project = [ $(root-project).project-module ] ; - while - [ project.attribute $(root-project) parent-module ] && - [ project.attribute $(root-project) parent-module ] != user-config - { - root-project = [ project.attribute $(root-project) parent-module ] ; - } - - # Create the project data, and bring in the project rules - # into the module. - project.initialize $(__name__) : - [ path.join [ project.attribute $(root-project) location ] ext $(1:L) ] ; - - # Create the project itself, i.e. the attributes. - # All extensions are created in the "/ext" project space. - project /ext/$(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - local attributes = [ project.attributes $(__name__) ] ; - - # Inherit from the root project of whomever is defining us. - project.inherit-attributes $(__name__) : $(root-project) ; - $(attributes).set parent-module : $(root-project) : exact ; - } -} - -rule glob-internal ( project : wildcards + : excludes * : rule-name ) -{ - local location = [ $(project).get source-location ] ; - - local result ; - local paths = [ path.$(rule-name) $(location) - : [ sequence.transform path.make : $(wildcards) ] - : [ sequence.transform path.make : $(excludes) ] ] ; - if $(wildcards:D) || $(rule-name) != glob - { - # The paths we've found are relative to current directory, - # but the names specified in sources list are assumed to - # be relative to source directory of the corresponding - # prject. So, just make the name absolute. - for local p in $(paths) - { - result += [ path.root $(p) [ path.pwd ] ] ; - } - } - else - { - # There were not directory in wildcard, so the files are all - # in the source directory of the project. Just drop the - # directory, instead of making paths absolute. - result = $(paths:D="") ; - } - - return $(result) ; -} - - -# This module defines rules common to all projects -module project-rules -{ - rule using ( toolset-module : * ) - { - import toolset ; - import modules ; - import project ; - - # The module referred by 'using' can be placed in - # the same directory as Jamfile, and the user - # will expect the module to be found even though - # the directory is not in BOOST_BUILD_PATH. - # So temporary change the search path. - local x = [ modules.peek : BOOST_BUILD_PATH ] ; - local caller = [ modules.binding $(__name__) ] ; - modules.poke : BOOST_BUILD_PATH : $(caller:D) $(x) ; - toolset.using $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - modules.poke : BOOST_BUILD_PATH : $(x) ; - - # The above might have clobbered .current-project - # Restore the the right value. - modules.poke project : .current-project - : [ project.target $(__name__) ] ; - } - - import modules ; - - rule import ( * : * : * ) - { - modules.import project ; - - local caller = [ CALLER_MODULE ] ; - local saved = [ modules.peek project : .current-project ] ; - module $(caller) - { - modules.import $(1) : $(2) : $(3) ; - } - modules.poke project : .current-project : $(saved) ; - } - - - rule project ( id ? : options * : * ) - { - import project ; - import path ; - import errors ; - - local attributes = [ project.attributes $(__name__) ] ; - if $(id) - { - id = [ path.root $(id) / ] ; - project.register-id $(id) : $(__name__) ; - $(attributes).set id : $(id) ; - } - - local explicit-build-dir ; - - for n in 2 3 4 5 6 7 8 9 - { - local option = $($(n)) ; - if $(option) - { - $(attributes).set $(option[1]) : $(option[2-]) ; - } - if $(option[1]) = "build-dir" - { - explicit-build-dir = [ path.make $(option[2-]) ] ; - } - } - - # If '--build-dir' is specified, change the build dir for the project. - local global-build-dir = - [ modules.peek project : .global-build-dir ] ; - - if $(global-build-dir) - { - local location = [ $(attributes).get location ] ; - # Project with empty location is 'standalone' project, like - # user-config, or qt. It has no build dir. - # If we try to set build dir for user-config, we'll then - # try to inherit it, with either weird, or wrong consequences. - if $(location) && $(location) = [ $(attributes).get project-root ] - { - # This is Jamroot. - if $(id) - { - if $(explicit-build-dir) - && [ path.is-rooted $(explicit-build-dir) ] - { - errors.user-error "Absolute directory specified via 'build-dir' project attribute" - : "Don't know how to combine that with the --build-dir option." - ; - } - # Strip the leading slash from id. - local rid = [ MATCH /(.*) : $(id) ] ; - local p = [ path.join - $(global-build-dir) $(rid) $(explicit-build-dir) ] ; - - $(attributes).set build-dir : $(p) : exact ; - } - } - else - { - # Not Jamroot - if $(explicit-build-dir) - { - errors.user-error "When --build-dir is specified, the 'build-project'" - : "attribute is allowed only for top-level 'project' invocations" ; - } - } - } - - - } - - # Declare and set a project global constant. Project global constants are - # normal variables but should not be changed. They are applied to every - # child Jamfile. - # - rule constant ( - name # Variable name of the constant. - : value + # Value of the constant. - ) - { - import project ; - local p = [ project.target $(__name__) ] ; - $(p).add-constant $(name) : $(value) ; - } - - # Declare and set a project global constant, whose value is a path. The - # path is adjusted to be relative to the invocation directory. The given - # value path is taken to be either absolute, or relative to this project - # root. - rule path-constant ( - name # Variable name of the constant. - : value + # Value of the constant. - ) - { - import project ; - local p = [ project.target $(__name__) ] ; - $(p).add-constant $(name) : $(value) : path ; - } - - - rule use-project ( id : where ) - { - # See comment in 'load' for explanation. - .used-projects += $(id) $(where) ; - } - - rule build-project ( dir ) - { - import project ; - local attributes = [ project.attributes $(__name__) ] ; - - local now = [ $(attributes).get projects-to-build ] ; - $(attributes).set projects-to-build : $(now) $(dir) ; - } - - rule explicit ( target-names * ) - { - import project ; - # If 'explicit' is used in a helper rule defined in Jamroot, - # and inherited by children, then most of the time - # we want 'explicit' to operate on the Jamfile where - # the helper rule is invoked. - local t = [ project.current ] ; - for local n in $(target-names) - { - $(t).mark-target-as-explicit $(n) ; - } - } - - rule glob ( wildcards + : excludes * ) - { - import project ; - return [ project.glob-internal [ project.current ] - : $(wildcards) : $(excludes) : glob ] ; - } - - rule glob-tree ( wildcards + : excludes * ) - { - import project ; - - if $(wildcards:D) || $(excludes:D) - { - errors.user-error "The patterns to 'glob-tree' may not include directory" ; - } - return [ project.glob-internal [ project.current ] - : $(wildcards) : $(excludes) : glob-tree ] ; - } - - # Calculates conditional requirements for multiple requirements - # at once. This is a shorthand to be reduce duplication and to - # keep an inline declarative syntax. For example: - # - # lib x : x.cpp : [ conditional gcc debug : - # DEBUG_EXCEPTION DEBUG_TRACE ] ; - # - rule conditional ( condition + : requirements * ) - { - local condition = $(condition:J=,) ; - if [ MATCH (:) : $(condition) ] - { - return $(condition)$(requirements) ; - } - else - { - return $(condition):$(requirements) ; - } - } -} - - -local rule __test__ ( ) -{ - import assert ; -} diff --git a/v2/build/property-set.jam b/v2/build/property-set.jam deleted file mode 100644 index 9ccf8677f..000000000 --- a/v2/build/property-set.jam +++ /dev/null @@ -1,464 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2003, 2004, 2005, 2006 Vladimir Prus -# 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 "class" : new ; -import feature ; -import property ; -import sequence ; -import set ; - -# Class for storing a set of properties. -# - there's 1<->1 correspondence between identity and value. No -# two instances of the class are equal. To maintain this property, -# the 'property-set.create' rule should be used to create new instances. -# Instances are immutable. -# -# - each property is classified with regard to it's effect on build -# results. Incidental properties have no effect on build results, from -# Boost.Build point of view. Others are either free, or non-free, which we -# call 'base'. Each property belong to exactly one of those categories and -# it's possible to get list of properties in each category. -# -# In addition, it's possible to get list of properties with specific -# attribute. -# -# - several operations, like and refine and as-path are provided. They all use -# caching whenever possible. -# -class property-set -{ - import feature ; - import property-set ; - import property ; - import set ; - import path ; - import errors ; - - rule __init__ ( raw-properties * ) - { - self.raw = $(raw-properties) ; - - for local p in $(raw-properties) - { - if ! $(p:G) - { - errors.error "Invalid property: '$(p)'" ; - } - - local att = [ feature.attributes $(p:G) ] ; - # A feature can be both incidental and free, - # in which case we add it to incidental. - if incidental in $(att) - { - self.incidental += $(p) ; - } - else if free in $(att) - { - self.free += $(p) ; - } - else - { - self.base += $(p) ; - } - - if dependency in $(att) - { - self.dependency += $(p) ; - } - else - { - self.non-dependency += $(p) ; - } - - if [ MATCH (:) : $(p:G=) ] - { - self.conditional += $(p) ; - } - else - { - self.non-conditional += $(p) ; - } - - - if propagated in $(att) - { - self.propagated += $(p) ; - } - if link-incompatible in $(att) - { - self.link-incompatible += $(p) ; - } - } - - } - - - # Returns Jam list of stored properties - rule raw ( ) - { - return $(self.raw) ; - } - - rule str ( ) - { - return "[" $(self.raw) "]" ; - } - - # Returns properties that are neither incidental nor free - rule base ( ) - { - return $(self.base) ; - } - - - # Returns free properties which are not dependency properties - rule free ( ) - { - return $(self.free) ; - } - - # Returns dependency properties - rule dependency ( ) - { - return $(self.dependency) ; - } - - rule non-dependency ( ) - { - return $(self.non-dependency) ; - } - - rule conditional ( ) - { - return $(self.conditional) ; - } - - rule non-conditional ( ) - { - return $(self.non-conditional) ; - } - - # Returns incidental properties - rule incidental ( ) - { - return $(self.incidental) ; - } - - rule refine ( ps ) - { - if ! $(self.refined.$(ps)) - { - local r = [ property.refine $(self.raw) : [ $(ps).raw ] ] ; - if $(r[1]) != "@error" - { - self.refined.$(ps) = [ property-set.create $(r) ] ; - } - else - { - self.refined.$(ps) = $(r) ; - } - } - return $(self.refined.$(ps)) ; - } - - rule expand ( ) - { - if ! $(self.expanded) - { - self.expanded = [ property-set.create [ feature.expand $(self.raw) ] ] ; - } - return $(self.expanded) ; - } - - - rule expand-composites ( ) - { - if ! $(self.composites) - { - self.composites = [ property-set.create - [ feature.expand-composites $(self.raw) ] ] ; - } - return $(self.composites) ; - } - - rule evaluate-conditionals ( context ? ) - { - context ?= $(__name__) ; - if ! $(self.evaluated.$(context)) - { - self.evaluated.$(context) = [ property-set.create - [ property.evaluate-conditionals-in-context $(self.raw) : [ $(context).raw ] ] ] ; - } - return $(self.evaluated.$(context)) ; - } - - rule propagated ( ) - { - if ! $(self.propagated-ps) - { - self.propagated-ps = [ property-set.create $(self.propagated) ] ; - } - return $(self.propagated-ps) ; - } - - rule link-incompatible ( ) - { - if ! $(self.link-incompatible-ps) - { - self.link-incompatible-ps = - [ property-set.create $(self.link-incompatible) ] ; - } - return $(self.link-incompatible-ps) ; - } - - - rule run-actions ( ) - { - if ! $(self.run) - { - self.run = [ property-set.create [ feature.run-actions $(self.raw) ] ] ; - } - return $(self.run) ; - } - - rule add-defaults ( ) - { - if ! $(self.defaults) - { - self.defaults = [ property-set.create - [ feature.add-defaults $(self.raw) ] ] ; - } - return $(self.defaults) ; - } - - - rule as-path ( ) - { - if ! $(self.as-path) - { - self.as-path = [ property.as-path $(self.base) ] ; - } - return $(self.as-path) ; - } - - # Computes the target path that should be used for - # target with these properties. - # Returns a list of - # - the computed path - # - if the path is relative to build directory, a value of - # 'true'. - rule target-path ( ) - { - if ! $(self.target-path) - { - # The feature can be used to explicitly - # change the location of generated targetsv - local l = [ get ] ; - if $(l) - { - self.target-path = $(l) ; - } - else - { - local p = [ as-path ] ; - # Really, an ugly hack. Boost regression test system requires - # specific target paths, and it seems that changing it to handle - # other directory layout is really hard. For that reason, - # we teach V2 to do the things regression system requires. - # The value o '' is predended to the path. - local prefix = [ get ] ; - if $(prefix) - { - self.target-path = [ path.join $(prefix) $(p) ] ; - } - else - { - self.target-path = $(p) ; - } - if ! $(self.target-path) - { - self.target-path = . ; - } - # The path is relative to build dir. - self.target-path += true ; - } - } - return $(self.target-path) ; - } - - - rule add ( ps ) - { - if ! $(self.added.$(ps)) - { - self.added.$(ps) = [ property-set.create $(self.raw) [ $(ps).raw ] ] ; - } - return $(self.added.$(ps)) ; - } - - rule add-raw ( properties * ) - { - return [ add [ property-set.create $(properties) ] ] ; - } - - rule link-incompatible-with ( ps ) - { - if ! $(.li.$(ps)) - { - local li1 = [ $(__name__).link-incompatible ] ; - local li2 = [ $(ps).link-incompatible ] ; - if [ set.equal $(li1) : $(li2) ] - { - .li.$(ps) = false ; - } - else - { - .li.$(ps) = true ; - } - } - if $(.li.$(ps)) = true - { - return true ; - } - else - { - return ; - } - } - - - - # Returns all values of 'feature'. - rule get ( feature ) - { - if ! $(self.map-built) - { - # For each feature, create member var and assign all - # values to it. Since all regular member vars start with - # 'self', there will be no conflicts between names. - self.map-built = true ; - for local v in $(self.raw) - { - $(v:G) += $(v:G=) ; - } - } - - return $($(feature)) ; - } - -} - -# Creates new 'property-set' instance for the given raw properties, -# or returns an already existing ones. -rule create ( raw-properties * ) -{ - raw-properties = [ sequence.unique - [ sequence.insertion-sort $(raw-properties) ] ] ; - - local key = $(raw-properties:J=-:E=) ; - - if ! $(.ps.$(key)) - { - .ps.$(key) = [ new property-set $(raw-properties) ] ; - } - return $(.ps.$(key)) ; -} -NATIVE_RULE property-set : create ; - -# Creates new 'property-set' instances after checking -# that all properties are valid and converting incidental -# properties into gristed form. -rule create-with-validation ( raw-properties * ) -{ - property.validate $(raw-properties) ; - - return [ create [ property.make $(raw-properties) ] ] ; -} - -# Creates a property-set from the input given by the user, in the -# context of 'jamfile-module' at 'location' -rule create-from-user-input ( raw-properties * : jamfile-module location ) -{ - local specification = [ property.translate-paths $(raw-properties) - : $(location) ] ; - specification = [ property.translate-indirect $(specification) - : $(jamfile-module) ] ; - specification = - [ property.expand-subfeatures-in-conditions $(specification) ] ; - specification = [ property.make $(specification) ] ; - result = [ property-set.create $(specification) ] ; - return $(result) ; -} - -# Refines requirements with requirements provided by the user. -# Specially handles "-value" syntax in specification -# to remove given requirements. -# - parent-requirements -- property-set object with requirements -# to refine -# - specification -- string list of requirements provided by the use -# - project-module -- the module to which context indirect features -# will be bound. -# - location -- the path to which path features are relative. -# -# -rule refine-from-user-input ( parent-requirements : specification * - : project-module : location ) -{ - if ! $(specification) - { - return $(parent-requirements) ; - } - else - { - local add-requirements ; - local remove-requirements ; - - for local r in $(specification) - { - local m = [ MATCH "^-(.*)" : $(r) ] ; - if $(m) - { - remove-requirements += $(m) ; - } - else - { - add-requirements += $(r) ; - } - } - - if $(remove-requirements) - { - # Need to create property set, so that path features - # and indirect features are translated just like they - # are in project requirements. - local ps = [ property-set.create-from-user-input - $(remove-requirements) : $(project-module) $(location) ] ; - - parent-requirements = [ property-set.create - [ set.difference [ $(parent-requirements).raw ] - : [ $(ps).raw ] ] ] ; - specification = $(add-requirements) ; - } - - local requirements = [ property-set.create-from-user-input - $(specification) : $(project-module) $(location) ] ; - - requirements = [ $(parent-requirements).refine $(requirements) ] ; - return $(requirements) ; - } -} - - - -# Returns property-set with empty set of properties. -rule empty ( ) -{ - if ! $(.empty) - { - .empty = [ create ] ; - } - - return $(.empty) ; -} diff --git a/v2/build/property.jam b/v2/build/property.jam deleted file mode 100644 index 1abc3043a..000000000 --- a/v2/build/property.jam +++ /dev/null @@ -1,704 +0,0 @@ -# Copyright 2001, 2002, 2003 Dave Abrahams -# Copyright 2006 Rene Rivera -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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 utility : ungrist ; -import sequence : unique ; -import errors : error ; -import feature ; -import regex ; -import string ; -import sequence ; -import set ; -import path ; -import assert ; -import indirect ; - -# Refines 'properties' by overriding any non-free properties -# for which a different value is specified in 'requirements'. -# Conditional requirements are just added without modification. -# Returns the resulting list of properties. -rule refine ( properties * : requirements * ) -{ - local result ; - local error ; - - # All the elements of requirements should be present in the result - # Record them so that we can handle 'properties'. - for local r in $(requirements) - { - # Don't consider conditional requirements. - if ! [ MATCH (:) : $(r:G=) ] - { - # Note: cannot use local here, so take an ugly name - __require__$(r:G) = $(r:G=) ; - } - } - - for local p in $(properties) - { - # No processing for free properties - if [ MATCH (:) : $(p:G=) ] - { - # Skip conditional properties - result += $(p) ; - } - else if free in [ feature.attributes $(p:G) ] - { - result += $(p) ; - } - else - { - local required-value = $(__require__$(p:G)) ; - if $(required-value) - { - local value = $(p:G=) ; - if $(value) != $(required-value) - { - result += $(p:G)$(required-value) ; - } - else - { - result += $(p) ; - } - } - else - { - result += $(p) ; - } - } - } - - # Unset our ugly map. - for local r in $(requirements) - { - __require__$(r:G) = ; - } - - if $(error) - { - return $(error) ; - } - else - { - return [ unique $(result) $(requirements) ] ; - } -} - -# Removes all conditional properties which conditions are not met -# For those with met conditions, removes the condition. Properies -# in conditions are looked up in 'context' -rule evaluate-conditionals-in-context ( properties * : context * ) -{ - local base ; - local conditionals ; - for local p in $(properties) - { - if [ MATCH (:<) : $(p) ] - { - conditionals += $(p) ; - } - else - { - base += $(p) ; - } - } - - local result = $(base) ; - for local p in $(conditionals) - { - # Separate condition and property - local s = [ MATCH (.*):(<.*) : $(p) ] ; - # Split condition into individual properties - local c = [ regex.split $(s[1]) "," ] ; - # Evaluate condition - if $(c) in $(context) - { - result += $(s[2]) ; - } - } - return $(result) ; -} - -rule expand-subfeatures-in-conditions ( properties * ) -{ - local result ; - for local p in $(properties) - { - local s = [ MATCH (.*):(<.*) : $(p) ] ; - if ! $(s) - { - result += $(p) ; - } - else - { - local condition = $(s[1]) ; - # Condition might include several elements - condition = [ regex.split $(condition) "," ] ; - local value = $(s[2]) ; - local e ; - for local c in $(condition) - { - # It common that condition includes a toolset which - # was never defined, or mentiones subfeatures which - # were never defined. In that case, validation will - # only produce an spirious error, so prevent - # validation by passing 'true' as second parameter. - e += [ feature.expand-subfeatures $(c) : true ] ; - } - - if $(e) = $(condition) - { - result += $(p) ; - } - else - { - local individual-subfeatures = [ set.difference $(e) : $(condition) ] ; - result += $(individual-subfeatures:J=,):$(value) ; - } - } - } - return $(result) ; -} - - - -# Helper for as-path, below. Orders properties with the implicit ones -# first, and within the two sections in alphabetical order of feature -# name. -local rule path-order ( x y ) -{ - if $(y:G) && ! $(x:G) - { - return true ; - } - else if $(x:G) && ! $(y:G) - { - return ; - } - else - { - if ! $(x:G) - { - x = [ feature.expand-subfeatures $(x) ] ; - y = [ feature.expand-subfeatures $(y) ] ; - } - - if $(x[1]) < $(y[1]) - { - return true ; - } - } -} - -local rule abbreviate-dashed ( string ) -{ - local r ; - for local part in [ regex.split $(string) - ] - { - r += [ string.abbreviate $(part) ] ; - } - return $(r:J=-) ; -} - -local rule identity ( string ) -{ - return $(string) ; -} - -if --abbreviate-paths in [ modules.peek : ARGV ] -{ - .abbrev = abbreviate-dashed ; -} -else -{ - .abbrev = identity ; -} - -# Returns a path which represents the given expanded property set. -rule as-path ( properties * ) -{ - local entry = .result.$(properties:J=-) ; - - if ! $($(entry)) - { - # trim redundancy - properties = [ feature.minimize $(properties) ] ; - - # sort according to path-order - properties = [ sequence.insertion-sort $(properties) : path-order ] ; - - local components ; - for local p in $(properties) - { - if $(p:G) - { - local f = [ ungrist $(p:G) ] ; - p = $(f)-$(p:G=) ; - } - - components += [ $(.abbrev) $(p) ] ; - } - - $(entry) = $(components:J=/) ; - } - - return $($(entry)) ; -} - -# Exit with error if property is not valid. -local rule validate1 ( property ) -{ - local msg ; - if $(property:G) - { - local feature = $(property:G) ; - local value = $(property:G=) ; - - if ! [ feature.valid $(feature) ] - { - feature = [ ungrist $(property:G) ] ; # Ungrist for better error messages - msg = "unknown feature '$(feature)'" ; - } - else if $(value) && ! free in [ feature.attributes $(feature) ] - { - feature.validate-value-string $(feature) $(value) ; - } - else if ! ( $(value) || ( optional in [ feature.attributes $(feature) ] ) ) - { - feature = [ ungrist $(property:G) ] ; # Ungrist for better error messages - msg = "No value specified for feature '$(feature)'" ; - } - } - else - { - local feature = [ feature.implied-feature $(property) ] ; - feature.validate-value-string $(feature) $(property) ; - } - if $(msg) - { - error "Invalid property "'$(property:J=" ")'": "$(msg:J=" "). ; - } -} - -rule validate ( properties * ) -{ - for local p in $(properties) - { - validate1 $(p) ; - } -} - -rule validate-property-sets ( property-sets * ) -{ - for local s in $(property-sets) - { - validate [ feature.split $(s) ] ; - } -} - -# Makes a property set from 'specification', converting implicit values into -# full properties. -rule make ( specification * ) -{ - local result ; - for local e in $(specification) - { - if $(e:G) - { - result += $(e) ; - } - else if [ feature.is-implicit-value $(e) ] - { - local feature = [ feature.implied-feature $(e) ] ; - result += $(feature)$(e) ; - } - else - { - error "'$(e)' is not a valid for property specification" ; - } - } - return $(result) ; -} - -# Returns a property sets which include all the elements in 'properties' that -# do not have attributes listed in 'attributes'. -rule remove ( attributes + : properties * ) -{ - local result ; - for local e in $(properties) - { - if ! [ set.intersection $(attributes) : [ feature.attributes $(e:G) ] ] - { - result += $(e) ; - } - } - return $(result) ; -} - -# Returns a property set which include all properties in 'properties' that have -# any of 'attributes'. -rule take ( attributes + : properties * ) -{ - local result ; - for local e in $(properties) - { - if [ set.intersection $(attributes) : [ feature.attributes $(e:G) ] ] - { - result += $(e) ; - } - } - return $(result) ; -} - -# Selects properties which correspond to any of the given features. -rule select ( features * : properties * ) -{ - local result ; - - # add any missing angle brackets - local empty = "" ; - features = $(empty:G=$(features)) ; - - for local p in $(properties) - { - if $(p:G) in $(features) - { - result += $(p) ; - } - } - return $(result) ; -} - -# Returns a modified version of properties with all values of the -# given feature replaced by the given value. -# If 'value' is empty the feature will be removed -rule change ( properties * : feature value ? ) -{ - local result ; - for local p in $(properties) - { - if $(p:G) = $(feature) - { - result += $(value:G=$(feature)) ; - } - else - { - result += $(p) ; - } - } - return $(result) ; -} - -# If 'property' is conditional property, returns -# condition and the property, e.g -# debug,gcc:full will become -# debug,gcc full. -# Otherwise, returns empty string. -rule split-conditional ( property ) -{ - local m = [ MATCH "(.+):<(.+)" : $(property) ] ; - if $(m) - { - return $(m[1]) <$(m[2]) ; - } -} - - -# Interpret all path properties in 'properties' as relative to 'path' -# The property values are assumed to be in system-specific form, and -# will be translated into normalized form. -rule translate-paths ( properties * : path ) -{ - local result ; - for local p in $(properties) - { - local split = [ split-conditional $(p) ] ; - local condition = "" ; - if $(split) - { - condition = $(split[1]): ; - p = $(split[2]) ; - } - - if path in [ feature.attributes $(p:G) ] - { - local values = [ regex.split $(p:TG=) "&&" ] ; - local t ; - for local v in $(values) - { - t += [ path.root [ path.make $(v) ] $(path) ] ; - } - t = $(t:J="&&") ; - result += $(condition)$(t:TG=$(p:G)) ; - } - else - { - result += $(condition)$(p) ; - } - } - return $(result) ; -} - -# Assumes that all feature values that start with '@' are -# names of rules, used in 'context-module'. Such rules -# can be either local to the module or global. Converts such -# values into 'indirect-rule' format (see indirect.jam), so -# that they can be called from other modules. -rule translate-indirect ( specification * : context-module ) -{ - local result ; - for local p in $(specification) - { - local m = [ MATCH ^@(.+) : $(p:G=) ] ; - if $(m) - { - local v ; - if [ MATCH "^([^%]*)%([^%]+)$" : $(m) ] - { - # Rule is already in indirect format - v = $(m) ; - } - else - { - if ! [ MATCH ".*([.]).*" : $(m) ] - { - # This is unqualified rule name. The user might want - # to set flags on this rule name, and toolset.flag - # auto-qualifies the rule name. Need to do the same - # here so set flag setting work. - # We can arrange for toolset.flag to *not* auto-qualify - # the argument, but then two rules defined in two Jamfiles - # will conflict. - m = $(context-module).$(m) ; - } - - v = [ indirect.make $(m) : $(context-module) ] ; - } - - v = @$(v) ; - result += $(v:G=$(p:G)) ; - } - else - { - result += $(p) ; - } - } - return $(result) ; -} - - -# Class which maintains a property set -> string -# mapping -class property-map -{ - import numbers ; - import sequence ; - import errors : error ; - - rule __init__ ( ) - { - self.next-flag = 1 ; - } - - # Associate 'value' with 'properties' - rule insert ( properties + : value ) - { - self.all-flags += $(self.next-flag) ; - self.properties.$(self.next-flag) = $(properties) ; - self.value.$(self.next-flag) = $(value) ; - - self.next-flag = [ numbers.increment $(self.next-flag) ] ; - } - - # Return the value associated with 'properties' - # or any subset of it. If more than one - # subset has value assigned to it, return the - # value for the longest subset, if it's unique. - rule find ( properties + ) - { - return [ find-replace $(properties) ] ; - } - - # Find the value associated with 'properties'. - # If 'value' parameter is given, replaces the found value - # Returns the value that were stored originally. - rule find-replace ( properties + : value ? ) - { - # First find all matches - local matches ; - local match-ranks ; - for local i in $(self.all-flags) - { - if $(self.properties.$(i)) in $(properties) - { - matches += $(i) ; - match-ranks += [ sequence.length - $(self.properties.$(i)) ] ; - } - } - local best = [ sequence.select-highest-ranked - $(matches) : $(match-ranks) ] ; - if $(best[2]) - { - error "Ambiguous key" ; - } - local original = $(self.value.$(best)) ; - if $(value) - { - self.value.$(best) = $(value) ; - } - return $(original) ; - } -} - -local rule __test__ ( ) -{ - import errors : try catch ; - import feature ; - import feature : feature subfeature compose ; - - # local rules must be explicitly re-imported - import property : path-order abbreviate-dashed ; - - feature.prepare-test property-test-temp ; - - feature toolset : gcc : implicit symmetric ; - subfeature toolset gcc : version : 2.95.2 2.95.3 2.95.4 - 3.0 3.0.1 3.0.2 : optional ; - feature define : : free ; - feature runtime-link : dynamic static : symmetric link-incompatible ; - feature optimization : on off ; - feature variant : debug release : implicit composite symmetric ; - feature rtti : on off : link-incompatible ; - - compose debug : _DEBUG off ; - compose release : NDEBUG on ; - - import assert ; - import "class" : new ; - - validate gcc gcc-3.0.1 : $(test-space) ; - - assert.true path-order $(test-space) debug foo ; - assert.false path-order $(test-space) foo debug ; - assert.true path-order $(test-space) gcc debug ; - assert.false path-order $(test-space) debug gcc ; - assert.true path-order $(test-space) on on ; - assert.false path-order $(test-space) on on ; - - assert.result-equal gcc off FOO - : refine gcc off - : FOO - : $(test-space) - ; - - assert.result-equal gcc on - : refine gcc off - : on - : $(test-space) - ; - - assert.result-equal gcc off - : refine gcc : off : $(test-space) - ; - - assert.result-equal gcc off off:FOO - : refine gcc : off off:FOO - : $(test-space) - ; - - assert.result-equal gcc:foo gcc:bar - : refine gcc:foo : gcc:bar - : $(test-space) - ; - - assert.result MY_RELEASE - : evaluate-conditionals-in-context - release,off:MY_RELEASE - : gcc release off - - ; - - assert.result debug - : as-path off debug - : $(test-space) - ; - - assert.result gcc/debug/rtti-off - : as-path gcc off off debug - : $(test-space) - ; - - assert.result optmz-off : abbreviate-dashed optimization-off ; - assert.result rntm-lnk-sttc : abbreviate-dashed runtime-link-static ; - - try ; - validate value : $(test-space) ; - catch "Invalid property 'value': unknown feature 'feature'." ; - - try ; - validate default : $(test-space) ; - catch \"default\" is not a known value of feature ; - - validate WHATEVER : $(test-space) ; - - try ; - validate : $(test-space) ; - catch "Invalid property '': No value specified for feature 'rtti'." ; - - try ; - validate value : $(test-space) ; - catch "value" is not a value of an implicit feature ; - - - assert.result-equal on - : remove free implicit : gcc foo on : $(test-space) ; - - assert.result-equal a - : select include : a gcc ; - - assert.result-equal a - : select include bar : a gcc ; - - assert.result-equal a gcc - : select include : a gcc ; - - assert.result-equal kylix a - : change gcc a : kylix ; - - pm = [ new property-map ] ; - $(pm).insert gcc : o ; - $(pm).insert gcc NT : obj ; - $(pm).insert gcc CYGWIN : obj ; - - assert.equal o - : [ $(pm).find gcc ] ; - - assert.equal obj - : [ $(pm).find gcc NT ] ; - - try ; - $(pm).find gcc NT CYGWIN ; - catch "Ambiguous key" ; - - # Test ordinary properties - assert.result - : split-conditional gcc - ; - - # Test properties with ":" - assert.result - : split-conditional FOO=A::B - ; - - # Test conditional feature - assert.result-equal gcc,3.0 FOO - : split-conditional gcc,3.0:FOO - ; - - feature.finish-test property-test-temp ; -} - diff --git a/v2/build/readme.txt b/v2/build/readme.txt deleted file mode 100644 index c3dddd8d7..000000000 --- a/v2/build/readme.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2001, 2002 Dave Abrahams -Copyright 2002 Vladimir Prus -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) - -Development code for new build system. To run unit tests for jam code, execute: - - bjam --debug --build-system=test - -Comprehensive tests require Python. See ../test/readme.txt - - - diff --git a/v2/build/scanner.jam b/v2/build/scanner.jam deleted file mode 100644 index 2dae65d29..000000000 --- a/v2/build/scanner.jam +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2002, 2003, 2004, 2005 Vladimir Prus -# 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) - -# Implements scanners: objects that compute implicit dependencies for -# files, such as includes in C++. -# -# Scanner has a regular expression used to find dependencies, some -# data needed to interpret those dependencies (for example, include -# paths), and a code which actually established needed relationship -# between actual jam targets. -# -# Scanner objects are created by actions, when they try to actualize -# virtual targets, passed to 'virtual-target.actualize' method and are -# then associated with actual targets. It is possible to use -# several scanners for a virtual-target. For example, a single source -# might be used by to compile actions, with different include paths. -# In this case, two different actual targets will be created, each -# having scanner of its own. -# -# Typically, scanners are created from target type and action's -# properties, using the rule 'get' in this module. Directly creating -# scanners is not recommended, because it might create many equvivalent -# but different instances, and lead in unneeded duplication of -# actual targets. However, actions can also create scanners in a special -# way, instead of relying on just target type. - -import "class" : new ; -import property virtual-target property-set ; - -# Base scanner class. -class scanner -{ - rule __init__ ( ) - { - } - - # Returns a pattern to use for scanning - rule pattern ( ) - { - error "method must be overriden" ; - } - - # Establish necessary relationship between targets, - # given actual target beeing scanned, and a list of - # pattern matches in that file. - rule process ( target : matches * ) - { - error "method must be overriden" ; - } -} - -# Registers a new generator class, specifying a set of -# properties relevant to this scanner. Ctor for that class -# should have one parameter: list of properties. -rule register ( scanner-class : relevant-properties * ) -{ - .registered += $(scanner-class) ; - .relevant-properties.$(scanner-class) = $(relevant-properties) ; -} - -# Common scanner class, which can be used when there's only one -# kind of includes (unlike C, where "" and <> includes have different -# search paths). -class common-scanner : scanner -{ - import scanner ; - rule __init__ ( includes * ) - { - scanner.__init__ ; - self.includes = $(includes) ; - } - - rule process ( target : matches * : binding ) - { - local target_path = [ NORMALIZE_PATH $(binding:D) ] ; - - NOCARE $(matches) ; - INCLUDES $(target) : $(matches) ; - SEARCH on $(matches) = $(target_path) $(self.includes:G=) ; - - scanner.propagate $(__name__) : $(matches) : $(target) ; - } -} - - -# Returns an instance of previously registered scanner, -# with the specified properties. -rule get ( scanner-class : property-set ) -{ - if ! $(scanner-class) in $(.registered) - { - error "attempt to get unregisted scanner" ; - } - - local r = $(.rv-cache.$(property-set)) ; - if ! $(r) - { - r = [ property-set.create - [ property.select $(.relevant-properties.$(scanner-class)) : - [ $(property-set).raw ] ] ] ; - .rv-cache.$(property-set) = $(r) ; - } - - if ! $(scanner.$(scanner-class).$(r:J=-)) - { - scanner.$(scanner-class).$(r:J=-) = [ new $(scanner-class) [ $(r).raw ] ] ; - } - return $(scanner.$(scanner-class).$(r:J=-)) ; -} - - -# Installs the specified scanner on actual target 'target'. -rule install ( scanner : target - vtarget # virtual target from which 'target' was actualized -) -{ - HDRSCAN on $(target) = [ $(scanner).pattern ] ; - SCANNER on $(target) = $(scanner) ; - HDRRULE on $(target) = scanner.hdrrule ; - - # scanner reflects difference in properties affecting - # binding of 'target', which will be known when processing - # includes for it, will give information on how to - # interpret quoted includes. - HDRGRIST on $(target) = $(scanner) ; -} - -# Propagate scanner setting from 'including-target' to 'targets'. -rule propagate ( scanner : targets * : including-target ) -{ - HDRSCAN on $(targets) = [ on $(including-target) return $(HDRSCAN) ] ; - SCANNER on $(targets) = $(scanner) ; - HDRRULE on $(targets) = scanner.hdrrule ; - HDRGRIST on $(targets) = [ on $(including-target) return $(HDRGRIST) ] ; -} - - -rule hdrrule ( target : matches * : binding ) -{ - local scanner = [ on $(target) return $(SCANNER) ] ; - $(scanner).process $(target) : $(matches) : $(binding) ; -} -# hdrrule must be available at global scope so that it can be invoked -# by header scanning -IMPORT scanner : hdrrule : : scanner.hdrrule ; - - - - diff --git a/v2/build/targets.jam b/v2/build/targets.jam deleted file mode 100644 index 283c9d627..000000000 --- a/v2/build/targets.jam +++ /dev/null @@ -1,1550 +0,0 @@ -# Copyright Vladimir Prus 2002. -# Copyright Rene Rivera 2006. -# -# 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) - - -# Supports 'abstract' targets, which are targets explicitly defined in Jamfile. -# -# Abstract targets are represented by classes derived from 'abstract-target' class. -# The first abstract target is 'project-target', which is created for each -# Jamfile, and can be obtained by the 'target' rule in the Jamfile's module. -# (see project.jam). -# -# Project targets keep a list of 'main-target' instances. -# A main target is what the user explicitly defines in a Jamfile. It is -# possible to have several definitions for a main target, for example to have -# different lists of sources for different platforms. So, main targets -# keep a list of alternatives. -# -# Each alternative is an instance of 'abstract-target'. When a main target -# subvariant is defined by some rule, that rule will decide what class to -# use, create an instance of that class and add it to the list of alternatives -# for the main target. -# -# Rules supplied by the build system will use only targets derived -# from 'basic-target' class, which will provide some default behaviour. -# There will be two classes derived from it, 'make-target', created by the -# 'make' rule, and 'typed-target', created by rules such as 'exe' and 'dll'. - -# -# +------------------------+ -# |abstract-target | -# +========================+ -# |name | -# |project | -# | | -# |generate(properties) = 0| -# +-----------+------------+ -# | -# ^ -# / \ -# +-+-+ -# | -# | -# +------------------------+------+------------------------------+ -# | | | -# | | | -# +----------+-----------+ +------+------+ +------+-------+ -# | project-target | | main-target | | basic-target | -# +======================+ 1 * +=============+ alternatives +==============+ -# | generate(properties) |o-----------+ generate |<>------------->| generate | -# | main-target | +-------------+ | construct = 0| -# +----------------------+ +--------------+ -# | -# ^ -# / \ -# +-+-+ -# | -# | -# ...--+----------------+------------------+----------------+---+ -# | | | | -# | | | | -# ... ---+-----+ +------+-------+ +------+------+ +--------+-----+ -# | | typed-target | | make-target | | stage-target | -# . +==============+ +=============+ +==============+ -# . | construct | | construct | | construct | -# +--------------+ +-------------+ +--------------+ - -import "class" : new ; -import sequence ; -import regex ; -import property ; -import errors ; -import common ; -import property-set ; -import project ; -import feature ; -import virtual-target ; -import path ; -import set ; -import assert ; -import indirect ; -import toolset ; - -# Base class for all abstract targets. -class abstract-target -{ - import project assert "class" errors ; - - rule __init__ ( name # name of the target in Jamfile - : project-target # the project target to which this one belongs - ) - { - # Note: it might seem that we don't need either name or project at all. - # However, there are places where we really need it. One example is error - # messages which should name problematic targets. Another is setting correct - # paths for sources and generated files. - - self.name = $(name) ; - self.project = $(project-target) ; - self.location = [ errors.nearest-user-location ] ; - } - - # Returns the name of this target. - rule name ( ) - { - return $(self.name) ; - } - - # Returns the project for this target. - rule project ( ) - { - return $(self.project) ; - } - - # Return the location where the target was declared - rule location ( ) - { - return $(self.location) ; - } - - # Returns a user-readable name for this target. - rule full-name ( ) - { - local location = [ $(self.project).get location ] ; - return $(location)/$(self.name) ; - } - - # Takes a property set. Generates virtual targets for this abstract - # target, using the specified properties, unless a different value of some - # feature is required by the target. - # On - # success, returns: - # - a property-set with the usage requirements to be - # applied to dependents - # - a list of produced virtual targets, which may be - # empty. - # If 'property-set' are empty, performs default build of this - # target, in a way specific to derived class. - rule generate ( property-set ) - { - errors.error "method should be defined in derived classes" ; - } - - rule rename ( new-name ) - { - self.name = $(new-name) ; - } -} - -if --debug-building in [ modules.peek : ARGV ] -{ - modules.poke : .debug-building : true ; -} - - -rule indent ( ) -{ - return $(.indent:J="") ; -} - -rule increase-indent ( ) -{ - .indent += " " ; -} - -rule decrease-indent ( ) -{ - .indent = $(.indent[2-]) ; -} - -# Project target class (derived from 'abstract-target') -# -# This class these responsibilities: -# - maintaining a list of main target in this project and -# building it -# -# Main targets are constructed in two stages: -# - When Jamfile is read, a number of calls to 'add-alternative' is made. -# At that time, alternatives can also be renamed to account for inline -# targets. -# - The first time 'main-target' or 'has-main-target' rule is called, -# all alternatives are enumerated an main targets are created. -class project-target : abstract-target -{ - import project targets ; - import path ; - import print ; - import property-set ; - import set : difference : set.difference ; - import sequence ; - import "class" : new ; - import errors ; - - rule __init__ ( name : project-module parent-project ? - : requirements * : default-build * ) - { - abstract-target.__init__ $(name) : $(__name__) ; - - self.project-module = $(project-module) ; - self.location = [ project.attribute $(project-module) location ] ; - self.requirements = $(requirements) ; - self.default-build = $(default-build) ; - - if $(parent-project) - { - inherit $(parent-project) ; - } - } - - # This is needed only by the 'make' rule. Need to find the - # way to make 'make' work without this method. - rule project-module ( ) - { - return $(self.project-module) ; - } - - rule get ( attribute ) - { - return [ project.attribute $(self.project-module) $(attribute) ] ; - } - - rule build-dir ( ) - { - if ! $(self.build-dir) - { - self.build-dir = [ get build-dir ] ; - if ! $(self.build-dir) - { - self.build-dir = [ path.join - [ $(self.project).get location ] - bin - ] ; - } - } - return $(self.build-dir) ; - } - - # Generates all possible targets contained in this project. - rule generate ( property-set * ) - { - if [ modules.peek : .debug-building ] - { - ECHO [ targets.indent ] "building project" [ name ] " ('$(__name__)') with" [ $(property-set).raw ] ; - targets.increase-indent ; - } - - local usage-requirements = [ property-set.empty ] ; - local targets ; - - for local t in [ targets-to-build ] - { - local g = [ $(t).generate $(property-set) ] ; - usage-requirements = [ $(usage-requirements).add $(g[1]) ] ; - targets += $(g[2-]) ; - } - targets.decrease-indent ; - return $(usage-requirements) [ sequence.unique $(targets) ] ; - } - - # Computes and returns a list of abstract-target instances which - # must be built when this project is built. - rule targets-to-build ( ) - { - local result ; - - if ! $(self.built-main-targets) - { - build-main-targets ; - } - - # Collect all main targets here, except for "explicit" ones. - for local t in $(self.main-targets) - { - if ! [ $(t).name ] in $(self.explicit-targets) - { - result += $(t) ; - } - } - - # Collect all projects referenced via "projects-to-build" attribute. - local self-location = [ get location ] ; - for local pn in [ get projects-to-build ] - { - result += [ find $(pn) ] ; - } - - return $(result) ; - } - - # Add 'target' to the list of targets in this project that should be build - # only by explicit request - rule mark-target-as-explicit ( target-name ) - { - # Record the name of the target, not instance, since this - # rule is called before main target instaces are created. - self.explicit-targets += $(target-name) ; - } - - # Add new target alternative - rule add-alternative ( target-instance ) - { - if $(self.built-main-targets) - { - errors.error "add-alternative called when main targets are already created." - : "in project" [ full-name ] ; - } - self.alternatives += $(target-instance) ; - } - - - # Returns a 'main-target' class instance corresponding to the 'name'. - rule main-target ( name ) - { - if ! $(self.built-main-targets) - { - build-main-targets ; - } - - return $(self.main-target.$(name)) ; - } - - # Tells if a main target with the specified name exists. - rule has-main-target ( name ) - { - if ! $(self.built-main-targets) - { - build-main-targets ; - } - - if $(self.main-target.$(name)) - { - return true ; - } - } - - # Find and return the target with the specified id, treated - # relative to self. - rule find-really ( id ) - { - local result ; - local project = $(self.project) ; - local current-location = [ get location ] ; - - local split = [ MATCH (.*)//(.*) : $(id) ] ; - local project-part = $(split[1]) ; - local target-part = $(split[2]) ; - - local extra-error-message ; - if $(project-part) - { - # There's explicit project part in id. Looks up the - # project and pass the request to it. - local pm = [ project.find $(project-part) : $(current-location) ] ; - if $(pm) - { - project-target = [ project.target $(pm) ] ; - result = [ $(project-target).find $(target-part) : no-error ] ; - } - else - { - extra-error-message = "error: could not find project '$(project-part)'" ; - } - } - else - { - # Interpret target-name as name of main target - # Need to do this before checking for file. Consider this: - # - # exe test : test.cpp ; - # install s : test : . ; - # - # After first build we'll have target 'test' in Jamfile and file - # 'test' on the disk. We need target to override the file. - result = [ main-target $(id) ] ; - - if ! $(result) - { - result = [ new file-reference [ path.make $(id) ] : $(project) ] ; - - if ! [ $(result).exists ] - { - # File actually does not exist. - # Reset 'target' so that an error is issued. - result = ; - } - } - - # Interpret id as project-id - if ! $(result) - { - local project-module = [ project.find $(id) : $(current-location) ] ; - if $(project-module) - { - result = [ project.target $(project-module) ] ; - } - } - } - - return $(result) ; - } - - rule find ( id : no-error ? ) - { - local v = $(.id.$(id)) ; - if ! $(v) - { - v = [ find-really $(id) ] ; - if ! $(v) - { - v = none ; - } - .id.$(id) = $(v) ; - } - - if $(v) != none - { - return $(v) ; - } - else - { - if ! $(no-error) - { - local current-location = [ get location ] ; - ECHO "error: Unable to find file or target named" ; - ECHO "error: '$(id)'" ; - ECHO "error: referred from project at" ; - ECHO "error: '$(current-location)'" ; - ECHO $(extra-error-message) ; - EXIT ; - } - } - } - - - - rule build-main-targets ( ) - { - self.built-main-targets = true ; - for local a in $(self.alternatives) - { - local name = [ $(a).name ] ; - local target = $(self.main-target.$(name)) ; - if ! $(target) - { - local t = [ new main-target $(name) : $(self.project) ] ; - self.main-target.$(name) = $(t) ; - self.main-targets += $(t) ; - target = $(self.main-target.$(name)) ; - } - - $(target).add-alternative $(a) ; - } - } - - # Accessor, add a constant. - rule add-constant ( - name # Variable name of the constant. - : value + # Value of the constant. - : type ? # Optional type of value. - ) - { - switch $(type) - { - case path : - local r ; - for local v in $(value) - { - v = [ path.root [ path.make $(v) ] $(self.location) ] ; - # Now make the value absolute path - v = [ path.root $(v) [ path.pwd ] ] ; - # Constants should be in platform-native form - v = [ path.native $(v) ] ; - r += $(v) ; - } - value = $(r) ; - } - if ! $(name) in $(self.constants) - { - self.constants += $(name) ; - } - self.constant.$(name) = $(value) ; - # Inject the constant in the scope of project-root module - modules.poke $(self.project-module) : $(name) : $(value) ; - } - - rule inherit ( parent ) - { - for local c in [ modules.peek $(parent) : self.constants ] - { - # No need to pass the type. Path constants were converted to - # absolute paths already by parent. - add-constant $(c) - : [ modules.peek $(parent) : self.constant.$(c) ] ; - } - - # Import rules from parent - local this-module = [ project-module ] ; - local parent-module = [ $(parent).project-module ] ; - # Don't import rules which comes from 'project-rules', they - # must be imported localized. - local user-rules = [ set.difference - [ RULENAMES $(parent-module) ] : - [ RULENAMES project-rules ] ] ; - IMPORT $(parent-module) : $(user-rules) : $(this-module) : $(user-rules) ; - EXPORT $(this-module) : $(user-rules) ; - } -} - - -# Helper rules to detect cycles in main target references -local rule start-building ( main-target-instance ) -{ - if $(main-target-instance) in $(.targets-being-built) - { - local names ; - for local t in $(.targets-being-built) $(main-target-instance) - { - names += [ $(t).full-name ] ; - } - - errors.error "Recursion in main target references" - : "the following target are being built currently:" - : $(names) ; - } - .targets-being-built += $(main-target-instance) ; -} - -local rule end-building ( main-target-instance ) -{ - .targets-being-built = $(.targets-being-built[1--2]) ; -} - - -# A named top-level target in Jamfile -class main-target : abstract-target -{ - import errors : error ; - import assert ; - import sequence ; - import print ; - import build-request feature property-set ; - import targets : start-building end-building ; - import "class" : is-a ; - - rule __init__ ( name : project ) - { - abstract-target.__init__ $(name) : $(project) ; - } - - - # Add a new alternative for this target - rule add-alternative ( target ) - { - local d = [ $(target).default-build ] ; - if $(self.alternatives) && ( $(self.default-build) != $(d) ) - { - errors.error "default build must be identical in all alternatives" - : "main target is" [ full-name ] - : "with" [ $(d).raw ] - : "differing from previous default build" [ $(self.default-build).raw ] ; - } - else - { - self.default-build = $(d) ; - } - self.alternatives += $(target) ; - } - - # Returns the best viable alternative for this property-set - # See the documentation for selection rules. - local rule select-alternatives ( property-set debug ? ) - { - # When selecting alternatives we have to consider defaults, - # for example: - # lib l : l.cpp : debug ; - # lib l : l_opt.cpp : release ; - # won't work unless we add default value debug. - property-set = [ $(p).add-defaults ] ; - - # The algorithm: we keep the current best viable alternative. - # When we've got new best viable alternative, we compare it - # with the current one. - - local best ; - local best-properties ; - - if $(self.alternatives[2-]) - { - local bad ; - local worklist = $(self.alternatives) ; - while $(worklist) && ! $(bad) - { - local v = $(worklist[1]) ; - local properties = [ $(v).match $(property-set) $(debug) ] ; - - if $(properties) != no-match - { - if ! $(best) - { - best = $(v) ; - best-properties = $(properties) ; - } - else - { - if $(properties) = $(best-properties) - { - bad = true ; - } - else if $(properties) in $(best-properties) - { - # Do nothing, this alternative is worse - } - else if $(best-properties) in $(properties) - { - best = $(v) ; - best-properties = $(properties) ; - } - else - { - bad = true ; - } - } - } - worklist = $(worklist[2-]) ; - } - if ! $(bad) - { - return $(best) ; - } - } - else - { - return $(self.alternatives) ; - } - } - - - rule apply-default-build ( property-set ) - { - # 1. First, see what properties from default-build - # are already present in property-set. - - local raw = [ $(property-set).raw ] ; - local specified-features = $(raw:G) ; - - local defaults-to-apply ; - for local d in [ $(self.default-build).raw ] - { - if ! $(d:G) in $(specified-features) - { - defaults-to-apply += $(d) ; - } - } - - # 2. If there's any defaults to be applied, form the new - # build request. Pass it throw 'expand-no-defaults', since - # default-build might contain "release debug", which will - # result in two property-sets. - local result ; - if $(defaults-to-apply) - { - properties = [ - build-request.expand-no-defaults - - # We have to compress subproperties here to prevent - # property lists like: - # - # msvc 7.1 multi - # - # from being expanded into: - # - # 7.1/multi - # msvc/7.1/multi - # - # due to cross-product property combination. That may - # be an indication that - # build-request.expand-no-defaults is the wrong rule - # to use here. - [ feature.compress-subproperties $(raw) ] - $(defaults-to-apply) - ] ; - - if $(properties) - { - for local p in $(properties) - { - result += [ property-set.create - [ feature.expand [ feature.split $(p) ] ] ] ; - } - } - else - { - result = [ property-set.empty ] ; - } - - } - else - { - result = $(property-set) ; - } - return $(result) ; - } - - # Select an alternative for this main target, by finding all alternatives - # which requirements are satisfied by 'properties' and picking the one with - # longest requirements set. - # Returns the result of calling 'generate' on that alternative. - rule generate ( property-set ) - { - start-building $(__name__) ; - - # We want composite properties in build request act as if - # all the properties it expands too are explicitly specified. - property-set = [ $(property-set).expand ] ; - - local all-property-sets = [ apply-default-build $(property-set) ] ; - local usage-requirements = [ property-set.empty ] ; - local result ; - for local p in $(all-property-sets) - { - local r = [ generate-really $(p) ] ; - if $(r) - { - usage-requirements = [ $(usage-requirements).add $(r[1]) ] ; - result += $(r[2-]) ; - } - } - end-building $(__name__) ; - return $(usage-requirements) [ sequence.unique $(result) ] ; - } - - # Generates the main target with the given property set - # and returns a list which first element is property-set object - # containing usage-requirements of generated target and with - # generated virtual target in other elements. It's possible - # that no targets are generated. - local rule generate-really ( property-set ) - { - local best-alternatives = [ select-alternatives $(property-set) ] ; - if ! $(best-alternatives) - { - ECHO "error: No best alternative for" [ full-name ] ; - select-alternatives $(property-set) debug ; - return [ property-set.empty ] ; - } - else - { - local result = [ $(best-alternatives).generate $(property-set) ] ; - - # Now return virtual targets for the only alternative - return $(result) ; - } - } - - rule rename ( new-name ) - { - abstract-target.rename $(new-name) ; - for local a in $(self.alternatives) - { - $(a).rename $(new-name) ; - } - - } - -} - -# Abstract target which refers to a source file. -# This is artificial creature; it's usefull so that sources to -# a target can be represented as list of abstract target instances. -class file-reference : abstract-target -{ - import virtual-target ; - import property-set ; - import path ; - - rule __init__ ( file : project ) - { - abstract-target.__init__ $(file) : $(project) ; - } - - rule generate ( properties ) - { - location ; - return [ property-set.empty ] - [ virtual-target.from-file $(self.name) - : $(self.file-location) - : $(self.project) ] ; - } - - # Returns true if the referred file really exists; - rule exists ( ) - { - location ; - return $(self.file-path) ; - } - - # Returns the location of target. Needed by 'testing.jam' - rule location ( ) - { - if ! $(self.file-location) - { - local source-location = [ $(self.project).get source-location ] ; - - for local src-dir in $(source-location) - { - if ! $(self.file-location) - { - local location = [ path.root $(self.name) $(src-dir) ] ; - if [ CHECK_IF_FILE [ path.native $(location) ] ] - { - self.file-location = $(src-dir) ; - self.file-path = $(location) ; - } - } - } - } - return $(self.file-location) ; - } -} - -# Given a target-reference, made in context of 'project', -# returns the abstract-target instance that is referred to, as well -# as properties explicitly specified for this reference. -rule resolve-reference ( target-reference : project ) -{ - # Separate target name from properties override - local split = [ MATCH "^([^<]*)(/(<.*))?$" : $(target-reference) ] ; - local id = $(split[1]) ; - local sproperties = ; - if $(split[3]) - { - sproperties = [ property.make [ feature.split $(split[3]) ] ] ; - sproperties = [ feature.expand-composites $(sproperties) ] ; - } - - # Find the target - local target = [ $(project).find $(id) ] ; - - return $(target) [ property-set.create $(sproperties) ] ; -} - - - -# Attempts to generate the target given by target reference, which -# can refer both to a main target or to a file. -# Returns a list consisting of -# - usage requirements -# - generated virtual targets, if any -rule generate-from-reference - ( target-reference # Target reference - : project # Project where the reference is made - : property-set # Properties of the main target that - # makes the reference - ) -{ - local r = [ resolve-reference $(target-reference) : $(project) ] ; - local target = $(r[1]) ; - local sproperties = $(r[2]) ; - - # Take properties which should be propagated and refine them - # with source-specific requirements. - local propagated = [ $(property-set).propagated ] ; - local rproperties = [ $(propagated).refine $(sproperties) ] ; - if $(rproperties[1]) = "@error" - { - errors.error - "When building" [ full-name ] " with properties " $(properties) : - "Invalid properties specified for " $(source) ":" - $(rproperties[2-]) ; - } - return [ $(target).generate $(rproperties) ] ; -} - -# Given build request and requirements, return properties -# common to dependency build request and target build -# properties -rule common-properties ( build-request requirements ) -{ - # For optimization, we add free requirements directly, - # without using complex algorithsm. - # This gives the complex algorithm better chance of caching results. - local free = [ $(requirements).free ] ; - local non-free = [ property-set.create - [ $(requirements).base ] [ $(requirements).incidental ] ] ; - - local key = .rp.$(build-request)-$(non-free) ; - if ! $($(key)) - { - $(key) = [ common-properties2 $(build-request) $(non-free) ] ; - } - result = [ $($(key)).add-raw $(free) ] ; -} - -# Given 'context' -- a set of already present properties, and 'requirements', -# decide which extra properties should be applied to 'context'. -# For conditional requirements, this means evaluating condition. For -# indirect conditional requirements, this means calling a rule. Ordinary -# requirements are always applied. -# -# Handles situation where evaluating one conditional requirements affects -# condition of another conditional requirements, for example: -# -# gcc:release release:RELEASE -# -# If 'what' is 'refined' returns context refined with new requirements. -# If 'what' is 'added' returns just the requirements that must be applied. -rule evaluate-requirements ( requirements : context : what ) -{ - # Apply non-conditional requirements. - # It's possible that that further conditional requirement change - # a value set by non-conditional requirements. For example: - # - # exe a : a.cpp : single foo:multi ; - # - # I'm not sure if this should be an error, or not, especially given that - # - # single - # - # might come from project's requirements. - - local unconditional = [ feature.expand [ $(requirements).non-conditional ] ] ; - - local raw = [ $(context).raw ] ; - raw = [ property.refine $(raw) : $(unconditional) ] ; - - # We've collected properties that surely must be present in common - # properties. We now try to figure out what other properties - # should be added in order to satisfy rules (4)-(6) from the docs. - - local conditionals = [ $(requirements).conditional ] ; - # The 'count' variable has one element for each conditional feature - # and for each occurence of '' feature. - # It's used as a loop counter: for each iteration of the loop - # before we remove one element and the property set should - # stabilize before we've done. It's supposed to #conditionals iterations - # should be enough for properties to propagate along conditions in any - # direction. - local count = $(conditionals) - [ $(requirements).get ] - and-once-more ; - - local added-requirements ; - - local current = $(raw) ; - - # It's assumed that ordinary conditional requirements can't add - # properties, and that rules referred - # by properties can't add new - # properties. So the list of indirect conditionals - # does not change. - local indirect = [ $(requirements).get ] ; - indirect = [ MATCH @(.*) : $(indirect) ] ; - - local ok ; - while $(count) - { - # Evaluate conditionals in context of current properties - local e = [ property.evaluate-conditionals-in-context $(conditionals) - : $(current) ] ; - - # Evaluate indirect conditionals. - for local i in $(indirect) - { - e += [ indirect.call $(i) $(current) ] ; - } - - if $(e) = $(added-requirements) - { - # If we got the same result, we've found final properties. - count = ; - ok = true ; - } - else - { - # Oops, results of evaluation of conditionals has changed. - # Also 'current' contains leftover from previous evaluation. - # Recompute 'current' using initial properties and conditional - # requirements. - added-requirements = $(e) ; - current = [ property.refine $(raw) : [ feature.expand $(e) ] ] ; - } - count = $(count[2-]) ; - } - if ! $(ok) - { - errors.error "Can't evaluate conditional properties " $(conditionals) ; - } - - - if $(what) = added - { - return [ property-set.create $(unconditional) $(added-requirements) ] ; - } - else if $(what) = refined - { - return [ property-set.create $(current) ] ; - } - else - { - errors.error "Invalid value of the 'what' parameter" ; - } -} - - -rule common-properties2 ( build-request requirements ) -{ - # This guarantees that default properties are present - # in result, unless they are overrided by some requirement. - # FIXME: There is possibility that we've added bar, which is composite - # and expands to bar2, but default value of is not bar2, - # in which case it's not clear what to do. - # - build-request = [ $(build-request).add-defaults ] ; - # Featured added by 'add-default' can be composite and expand - # to features without default values -- so they are not added yet. - # It could be clearer/faster to expand only newly added properties - # but that's not critical. - build-request = [ $(build-request).expand ] ; - - return [ evaluate-requirements $(requirements) - : $(build-request) : refined ] ; -} - -# Implements the most standard way of constructing main target -# alternative from sources. Allows sources to be either file or -# other main target and handles generation of those dependency -# targets. -class basic-target : abstract-target -{ - import build-request ; - import virtual-target targets ; - import property-set ; - import set sequence errors ; - import "class" : new ; - import property feature ; - import build-system ; - - rule __init__ ( name : project - : sources * : requirements * : - default-build * : usage-requirements * ) - { - abstract-target.__init__ $(name) : $(project) ; - - self.sources = $(sources) ; - if ! $(requirements) { - requirements = [ property-set.empty ] ; - } - self.requirements = $(requirements) ; - if ! $(default-build) - { - default-build = [ property-set.empty ] ; - } - self.default-build = $(default-build) ; - if ! $(usage-requirements) - { - usage-requirements = [ property-set.empty ] ; - } - self.usage-requirements = $(usage-requirements) ; - - if $(sources:G) - { - errors.user-error "properties found in the 'sources' parameter for" [ full-name ] ; - } - } - - # Returns the list of abstract-targets which are used as sources. - # The extra properties specified for sources are not represented. - # The only used of this rule at the moment is the "--dump-test" - # feature of the test system. - rule sources ( ) - { - if ! $(self.source-targets) { - for local s in $(self.sources) - { - self.source-targets += - [ targets.resolve-reference $(s) : $(self.project) ] ; - } - } - return $(self.source-targets) ; - } - - rule requirements ( ) - { - return $(self.requirements) ; - } - - rule default-build ( ) - { - return $(self.default-build) ; - } - - # Returns the alternative condition for this alternative, if - # the condition is satisfied by 'property-set'. - rule match ( property-set debug ? ) - { - # The condition is composed of all base non-conditional properties. - # It's not clear if we should expand 'self.requirements' or not. - # For one thing, it would be nice to be able to put - # msvc-6.0 - # in requirements. - # On the other hand, if we have release in condition it - # does not make sense to require full to be in - # build request just to select this variant. - local bcondition = [ $(self.requirements).base ] ; - local ccondition = [ $(self.requirements).conditional ] ; - local condition = [ set.difference $(bcondition) : $(ccondition) ] ; - if $(debug) - { - ECHO " next alternative: required properties:" $(condition:E=(empty)) ; - } - - if $(condition) in [ $(property-set).raw ] - { - if $(debug) - { - ECHO " matched" ; - } - return $(condition) ; - } - else - { - if $(debug) - { - ECHO " not matched" ; - } - return no-match ; - } - } - - # Takes a target reference, which might be either target id - # or a dependency property, and generates that target using - # 'property-set' as build request. - # - # The results are added to to variable called 'result-var'. - # Usage requirements are added variable called 'usage-requirements-var'. - rule generate-dependencies ( dependencies * : property-set - : result-var usage-requirements-var ) - { - for local dependency in $(dependencies) - { - local grist = $(dependency:G) ; - local id = $(dependency:G=) ; - - local result = - [ targets.generate-from-reference $(id) : $(self.project) - : $(property-set) ] ; - - $(result-var) += $(result[2-]:G=$(grist)) ; - $(usage-requirements-var) += [ $(result[1]).raw ] ; - } - } - - - # Determines final build properties, generates sources, - # and calls 'construct'. This method should not be - # overridden. - rule generate ( property-set ) - { - if [ modules.peek : .debug-building ] - { - ECHO ; - local fn = [ full-name ] ; - ECHO [ targets.indent ] "Building target '$(fn)'" ; - targets.increase-indent ; - ECHO [ targets.indent ] "Build request: " [ $(property-set).raw ] ; - local cf = [ build-system.command-line-free-features ] ; - ECHO [ targets.indent ] "Command line free features: " - [ $(cf).raw ] ; - ECHO [ targets.indent ] "Target requirements: " [ $(self.requirements).raw ] ; - } - - if ! $(self.generated.$(property-set)) - { - # Apply free features form the command line. If user - # said - # define=FOO - # he most likely want this define to be set for all compiles. - property-set = [ $(property-set).refine - [ build-system.command-line-free-features ] ] ; - local rproperties = [ targets.common-properties $(property-set) - $(self.requirements) ] ; - - if [ modules.peek : .debug-building ] - { - ECHO ; - ECHO [ targets.indent ] "Common properties:" [ $(rproperties).raw ] ; - } - - if $(rproperties[1]) != "@error" && [ $(rproperties).get ] != no - { - local source-targets ; - local properties = [ $(rproperties).non-dependency ] ; - local usage-requirements ; - - generate-dependencies [ $(rproperties).dependency ] - : $(rproperties) - : properties usage-requirements ; - - generate-dependencies $(self.sources) : $(rproperties) - : source-targets usage-requirements ; - - if [ modules.peek : .debug-building ] - { - ECHO ; - ECHO [ targets.indent ] - "Usage requirements for $(self.name) are " $(usage-requirements) ; - } - - rproperties = [ property-set.create $(properties) - $(usage-requirements) ] ; - usage-requirements = [ property-set.create $(usage-requirements) ] ; - - if [ modules.peek : .debug-building ] - { - ECHO [ targets.indent ] - "Build properties: " [ $(rproperties).raw ] ; - } - - local extra = [ $(rproperties).get ] ; - source-targets += $(extra:G=) ; - # We might get duplicate sources, for example if - # we link to two library which have the same in - # usage requirements. - source-targets = [ sequence.unique $(source-targets) ] ; - - local result = - [ construct $(self.name) : - $(source-targets) : $(rproperties) ] ; - - if $(result) - { - local gur = $(result[1]) ; - result = $(result[2-]) ; - - local s = [ create-subvariant - $(result) : - [ virtual-target.recent-targets ] - : $(property-set) : $(source-targets) - : $(rproperties) : $(usage-requirements) ] ; - virtual-target.clear-recent-targets ; - - local ur = [ compute-usage-requirements $(s) ] ; - ur = [ $(ur).add $(gur) ] ; - $(s).set-usage-requirements $(ur) ; - if [ modules.peek : .debug-building ] - { - ECHO [ targets.indent ] - "Usage requirements from $(self.name) are " - [ $(ur).raw ] ; - } - - self.generated.$(property-set) = $(ur) $(result) ; - } - } - else - { - if $(rproperties[1]) = "@error" - { - ECHO [ targets.indent ] - "Skipping build of: " [ full-name ] " cannot compute common properties" ; - } - else if [ $(rproperties).get ] = no - { - ECHO [ targets.indent ] - "Skipping build of: " [ full-name ] " no in common properties" ; - } - else - { - ECHO [ targets.indent ] "Skipping build of: " [ full-name ] " unknown reason" ; - } - - # We're here either because there's error computing - # properties, or there's no in properties. - # In the latter case we don't want any diagnostic. - # In the former case, we need diagnostics. FIXME. - self.generated.$(property-set) = $(rproperties) ; - } - } - else - { - if [ modules.peek : .debug-building ] - { - ECHO [ targets.indent ] "Already built" ; - } - } - - targets.decrease-indent ; - return $(self.generated.$(property-set)) ; - } - - # Given the set of generated targets, and refined build - # properties, determines and sets appripriate usage requirements - # on those targets. - rule compute-usage-requirements ( subvariant ) - { - local rproperties = [ $(subvariant).build-properties ] ; - xusage-requirements = [ targets.evaluate-requirements - $(self.usage-requirements) - : $(rproperties) - : added ] ; - - # We generate all dependency properties and add them, - # as well as their usage requirements, to result. - local extra ; - generate-dependencies [ $(xusage-requirements).dependency ] : - $(rproperties) : extra extra ; - - local result = [ property-set.create - [ $(xusage-requirements).non-dependency ] $(extra) ] ; - - # Propagate usage requirements we've got from sources, except - # for the and features. - # - # That feature specifies which pch file to use, and should apply - # only to direct dependents. Consider: - # - # pch pch1 : ... - # lib lib1 : ..... pch1 ; - # pch pch2 : - # lib lib2 : pch2 lib1 ; - # - # Here, lib2 should not get property from pch1. - # - # Essentially, when those two features are in usage requirements, - # they are propagated only to direct dependents. We might need - # a more general mechanism, but for now, only those two - # features are special. - local raw = [ $(subvariant).sources-usage-requirements ] ; - raw = [ $(raw).raw ] ; - raw = [ property.change $(raw) : ] ; - raw = [ property.change $(raw) : ] ; - result = [ $(result).add [ property-set.create $(raw) ] ] ; - - return $(result) ; - } - - # Creates a new subvariant-dg instances for 'targets' - # - 'root-targets' the virtual targets will be returned to dependents - # - 'all-targets' all virtual - # targets created while building this main target - # - 'build-request' is property-set instance with requested build properties - local rule create-subvariant ( root-targets * - : all-targets * : build-request : sources * : - rproperties - : usage-requirements ) - { - for local e in $(root-targets) - { - $(e).root true ; - } - - # Process all vtargets that will be created if this main target - # is created. - local s = [ new subvariant $(__name__) : $(build-request) : $(sources) - : $(rproperties) : $(usage-requirements) : $(all-targets) ] ; - for local v in $(all-targets) - { - if ! [ $(v).creating-subvariant ] - { - $(v).creating-subvariant $(s) ; - } - } - return $(s) ; - } - - # Constructs the virtual targets for this abstract targets and - # the dependecy graph. Returns the list of virtual targets. - # Should be overrided in derived classes. - rule construct ( name : source-targets * : properties * ) - { - errors.error "method should be defined in derived classes" ; - } -} - -class typed-target : basic-target -{ - import generators ; - - rule __init__ ( name : project : type - : sources * : requirements * : default-build * : usage-requirements * ) - { - basic-target.__init__ $(name) : $(project) - : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ; - - self.type = $(type) ; - } - - rule type ( ) - { - return $(self.type) ; - } - - rule construct ( name : source-targets * : property-set ) - { - local r = [ generators.construct $(self.project) $(name:S=) : $(self.type) - : [ property-set.create [ $(property-set).raw ] # [ feature.expand - $(self.type) ] - # ] - : $(source-targets) ] ; - if ! $(r) - { - ECHO "warn: Unable to construct" [ full-name ] ; - - # Are there any top-level generators for this type/property set. - if ! [ generators.find-viable-generators - $(self.type) : $(property-set) ] - { - ECHO "error: no generators were found for type '$(self.type)'" ; - ECHO "error: and the requested properties" ; - ECHO "error: make sure you've configured the needed tools" ; - ECHO "See http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ; - - ECHO "To debug this problem, try the --debug-generators option." ; - EXIT ; - } - } - - return $(r) ; - } -} - -# Return the list of sources to use, if main target rule is invoked -# with 'sources'. If there are any objects in 'sources', they are treated -# as main target instances, and the name of such targets are adjusted to -# be '__'. Such renaming -# is disabled is non-empty value is passed for 'no-renaming' parameter. -# -rule main-target-sources ( sources * : main-target-name : no-renaming ? ) -{ - local result ; - for local t in $(sources) - { - if [ class.is-instance $(t) ] - { - local name = [ $(t).name ] ; - if ! $(no-renaming) - { - name = $(main-target-name)__$(name) ; - $(t).rename $(name) ; - } - # Inline targets are not built by default. - local p = [ $(t).project ] ; - $(p).mark-target-as-explicit $(name) ; - result += $(name) ; - } - else - { - result += $(t) ; - } - } - return $(result) ; -} - - -# Returns the requirement to use when declaring a main target, -# which are obtained by -# - translating all specified property paths, and -# - refining project requirements with the one specified for the target -rule main-target-requirements ( - specification * # Properties explicitly specified for a main target - : project # Project where the main target is to be declared - ) -{ - specification += [ toolset.requirements ] ; - - local requirements = [ property-set.refine-from-user-input - [ $(project).get requirements ] : $(specification) : - [ $(project).project-module ] : [ $(project).get location ] ] ; - - if $(requirements[1]) = "@error" - { - errors.error "Conflicting requirements for target:" $(requirements) ; - } - return $(requirements) ; -} - -# Returns the use requirement to use when declaraing a main target, -# which are obtained by -# - translating all specified property paths, and -# - adding project's usage requirements -rule main-target-usage-requirements ( - specification * # Use-properties explicitly specified for a main target - : project # Project where the main target is to be declared - ) -{ - local loc = [ $(project).get location ] ; - local project-usage-requirements = [ $(project).get usage-requirements ] ; - - # We don't use 'refine-from-user-input' because I'm not sure if: - # - removing of parent's usage requirements makes sense - # - refining of usage requirements is not needed, since usage requirements - # are always free. - local usage-requirements = [ property-set.create-from-user-input - $(specification) - : [ $(project).project-module ] [ $(project).get location ] ] ; - - return [ $(project-usage-requirements).add $(usage-requirements) ] ; -} - -# Return the default build value to use when declaring a main target, -# which is obtained by using specified value if not empty and parent's -# default build attribute otherwise. -rule main-target-default-build ( - specification * # Default build explicitly specified for a main target - : project # Project where the main target is to be declared - ) -{ - local result ; - if $(specification) - { - result = $(specification) ; - } - else - { - result = [ $(project).get default-build ] ; - } - return [ property-set.create-with-validation $(result) ] ; -} - -# Registers the specified target as a main target alternatives. -# Returns 'target'. -rule main-target-alternative ( target ) -{ - local ptarget = [ $(target).project ] ; - - $(ptarget).add-alternative $(target) ; - return $(target) ; -} - -# Creates a typed-target with the specified properties. -# The 'name', 'sources', 'requirements', 'default-build' and -# 'usage-requirements' are assumed to be in the form specified -# by the user in Jamfile corresponding to 'project'. -rule create-typed-target ( type : project : - name : sources * : requirements * : default-build * - : usage-requirements * ) -{ - return [ - targets.main-target-alternative - [ new typed-target $(name) : $(project) : $(type) - : [ targets.main-target-sources $(sources) : $(name) ] - : [ targets.main-target-requirements $(requirements) : $(project) ] - : [ targets.main-target-default-build $(default-build) : $(project) ] - : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ] - ] ] ; - -} diff --git a/v2/build/toolset.jam b/v2/build/toolset.jam deleted file mode 100644 index 6f25f86e6..000000000 --- a/v2/build/toolset.jam +++ /dev/null @@ -1,501 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2005 Rene Rivera -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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) - -# Support for toolset definition. - -import feature ; -import numbers ; -import errors : error ; -import property ; -import path ; -import generators ; -import set : difference ; -import regex ; -import sequence ; - -.flag-no = 1 ; - -.ignore-requirements = ; - -# This is used only for testing, to make sure -# we don't get random extra elements in paths. -if --ignore-toolset-requirements in [ modules.peek : ARGV ] -{ - .ignore-requirements = 1 ; -} - -# Initializes an additional toolset-like module. -# First load 'toolset-module' and then calls its 'init' -# rule with trailing arguments -rule using ( toolset-module : * ) -{ - import $(toolset-module) ; - $(toolset-module).init $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; -} - -# Expands subfeatures in each property sets. -# e.g -# gcc-3.2 -# will be converted to -# gcc/3.2 -local rule normalize-condition ( property-sets * ) -{ - local result ; - for local p in $(property-sets) - { - local split = [ feature.split $(p) ] ; - local expanded = [ feature.expand-subfeatures [ feature.split $(p) ] ] ; - result += $(expanded:J=/) ; - } - return $(result) ; -} - - -# Specifies if the 'flags' rule should do checking that -# the invoking module is the same as module we're setting -# flag for. -# 'v' can be either 'checked' or 'unchecked'. -# Subsequent call to 'pop-checking-for-flags-module' -# will restore the behaviour that was in effect before -# calling this rule. -rule push-checking-for-flags-module ( v ) -{ - .flags-module-checking = $(v) $(.flags-module-checking) ; -} - -rule pop-checking-for-flags-module ( ) -{ - .flags-module-checking = $(.flags-module-checking[2-]) ; -} - -# Specifies the flags (variables) that must be set on targets under certain -# conditions, described by arguments. -rule flags ( rule-or-module # If contains dot, should be a rule name. - # The flags will be applied when that rule is - # used to set up build actions. - # - # If does not contain dot, should be a module name. - # The flags will be applied for all rules in that - # module. - # If module for rule is different from the calling - # module, an error is issued. - - variable-name # Variable that should be set on target - condition * : # A condition when this flag should be applied. - # Should be set of property sets. If one of - # those property sets is contained in build - # properties, the flag will be used. - # Implied values are not allowed: - # "gcc" should be used, not just - # "gcc". Subfeatures, like in "gcc-3.2" - # are allowed. If left empty, the flag will - # always used. - # - # Propery sets may use value-less properties - # ('' vs. 'value') to match absent - # properties. This allows to separately match - # - # /64 - # ia64/ - # - # Where both features are optional. Without this - # syntax we'd be forced to define "default" value. - - - values * : # The value to add to variable. If - # is specified, then the value of 'feature' - # will be added. - unchecked ? # If value 'unchecked' is passed, will not test - # that flags are set for the calling module. - : hack-hack ? # For - # flags rule OPTIONS : -model ansi - # Treak as condition - # FIXME: ugly hack. - ) -{ - local caller = [ CALLER_MODULE ] ; - if ! [ MATCH ".*([.]).*" : $(rule-or-module) ] - && [ MATCH "(Jamfile<.*)" : $(caller) ] - { - # Unqualified rule name, used inside Jamfile. - # (most likely used with 'make' or 'notfile' rules. - # This prevents setting flags on entire Jamfile module - # (this will be considered as rule), but who cares? - # Probably, 'flags' rule should be split into 'flags' and - # 'flags-on-module'. - rule-or-module = $(caller).$(rule-or-module) ; - } - else - { - local module_ = [ MATCH "([^.]*).*" : $(rule-or-module) ] ; - if $(unchecked) != unchecked - && $(.flags-module-checking[1]) != unchecked - && $(module_) != $(caller) - { - errors.error "Module $(caller) attempted to set flags for module $(module_)" ; - } - } - - - if $(condition) && ! $(condition:G=) && ! $(hack-hack) - { - # We have condition in the form '', that is, without - # value. That's a previous syntax: - # - # flags gcc.link RPATH ; - # for compatibility, convert it to - # flags gcc.link RPATH : ; - values = $(condition) ; - condition = ; - } - - if $(condition) - { - property.validate-property-sets $(condition) ; - condition = [ normalize-condition $(condition) ] ; - } - - add-flag $(rule-or-module) : $(variable-name) - : $(condition) : $(values) ; -} - -# Adds new flag setting with the specified values -# Does no checking -local rule add-flag ( rule-or-module : - variable-name : condition * : values * ) -{ - .$(rule-or-module).flags += $(.flag-no) ; - - # Store all flags for a module - local module_ = [ MATCH "([^.]*).*" : $(rule-or-module) ] ; - .module-flags.$(module_) += $(.flag-no) ; - # Store flag-no -> rule-or-module mapping - .rule-or-module.$(.flag-no) = $(rule-or-module) ; - - .$(rule-or-module).variable.$(.flag-no) += $(variable-name) ; - .$(rule-or-module).values.$(.flag-no) += $(values) ; - .$(rule-or-module).condition.$(.flag-no) += $(condition) ; - - .flag-no = [ numbers.increment $(.flag-no) ] ; -} - - -# Returns the first element of 'property-sets' which is a subset of -# 'properties', or an empty list if no such element exists. -rule find-property-subset ( property-sets * : properties * ) -{ - # cut property values off - local prop-keys = $(properties:G) ; - - local result ; - for local s in $(property-sets) - { - if ! $(result) - { - # Handle value-less properties like '' (compare with - # 'x86'). - - local set = [ feature.split $(s) ] ; - - # Find the set of features that - # - have no property specified in required property set - # - are omitted in build property set - local default-props ; - for local i in $(set) - { - # If $(i) is a value-less property it should match default - # value of an optional property. See the first line in the - # example below: - # - # property set properties result - # foo foo match - # foo foo foo no match - # foo foo foo no match - # foo foo foo foo match - if ! ( $(i:G=) || ( $(i:G) in $(prop-keys) ) ) - { - default-props += $(i) ; - } - } - - if $(set) in $(properties) $(default-props) - { - result = $(s) ; - } - } - } - return $(result) ; -} - -rule handle-flag-value ( value * : properties * ) -{ - local result ; - if $(value:G) - { - local matches = [ property.select $(value) : $(properties) ] ; - for local p in $(matches) - { - local att = [ feature.attributes $(p:G) ] ; - if dependency in $(att) - { - # the value of a dependency feature is a target - # and must be actualized - result += [ $(p:G=).actualize ] ; - } - else if path in $(att) || free in $(att) - { - local values ; - # Treat features with && in the value - # specially -- each &&-separated element is considered - # separate value. This is needed to handle searched - # libraries, which must be in specific order. - if ! [ MATCH (&&) : $(p:G=) ] - { - values = $(p:G=) ; - } - else - { - values = [ regex.split $(p:G=) "&&" ] ; - } - if path in $(att) - { - result += [ sequence.transform path.native : $(values) ] ; - } - else - { - result += $(values) ; - } - } - else - { - result += $(p:G=) ; - } - } - } - else - { - result += $(value) ; - } - return $(result) ; -} - -# Given a rule name and a property set, returns a list of interleaved -# variables names and values which must be set on targets for that -# rule/property-set combination. -rule set-target-variables-aux ( rule-or-module : property-set ) -{ - local result ; - properties = [ $(property-set).raw ] ; - for local f in $(.$(rule-or-module).flags) - { - local variable = $(.$(rule-or-module).variable.$(f)) ; - local condition = $(.$(rule-or-module).condition.$(f)) ; - local values = $(.$(rule-or-module).values.$(f)) ; - - - if ! $(condition) || - [ find-property-subset $(condition) : $(properties) ] - { - local processed ; - for local v in $(values) - { - # The value might be so needs special - # treatment. - processed += [ - handle-flag-value $(v) : $(properties) ] ; - } - for local r in $(processed) - { - result += $(variable) $(r) ; - } - } - } - - # strip away last dot separated part and recurse. - local next = [ MATCH ^(.+)\\.([^\\.])* : $(rule-or-module) ] ; - if $(next) - { - result += [ - set-target-variables-aux $(next[1]) : $(property-set) ] ; - } - return $(result) ; -} - - -rule set-target-variables ( rule-or-module targets + : property-set ) -{ - properties = [ $(property-set).raw ] ; - local key = $(rule-or-module).$(property-set) ; - local settings = $(.stv.$(key)) ; - if ! $(settings) - { - settings = [ - set-target-variables-aux $(rule-or-module) : $(property-set) ] ; - - if ! $(settings) - { - settings = none ; - } - .stv.$(key) = $(settings) ; - } - - if $(settings) != none - { - local var-name = ; - for local name-or-value in $(settings) - { - if $(var-name) - { - $(var-name) on $(targets) += $(name-or-value) ; - var-name = ; - } - else - { - var-name = $(name-or-value) ; - } - } - } -} - -# Make toolset 'toolset', defined in a module of the same name, -# inherit from 'base' -# 1. The 'init' rule from 'base' is imported into 'toolset' with full -# name. Another 'init' is called, which forwards to the base one. -# 2. All generators from 'base' are cloned. The ids are adjusted and -# property in requires is adjusted too -# 3. All flags are inherited -# 4. All rules are imported. -rule inherit ( toolset : base ) -{ - import $(base) ; - - inherit-generators $(toolset) : $(base) ; - inherit-flags $(toolset) : $(base) ; - inherit-rules $(toolset) : $(base) ; -} - -rule inherit-generators ( toolset properties * : base : generators-to-ignore * ) -{ - properties ?= $(toolset) ; - local base-generators = [ generators.generators-for-toolset $(base) ] ; - for local g in $(base-generators) - { - local id = [ $(g).id ] ; - - if ! $(id) in $(generators-to-ignore) - { - # Some generator names have multiple periods in their name, so - # $(id:B=$(toolset)) doesn't generate the right new-id name. - # e.g. if id = gcc.compile.c++, $(id:B=darwin) = darwin.c++, - # which is not what we want. Manually parse the base and suffix - # (if there's a better way to do this, I'd love to see it.) - # See also register in module generators. - local base = $(id) ; - local suffix = "" ; - while $(base:S) - { - suffix = $(base:S)$(suffix) ; - base = $(base:B) ; - } - local new-id = $(toolset)$(suffix) ; - - generators.register [ $(g).clone $(new-id) : $(properties) ] ; - } - } -} - -# Brings all flag definitions from 'base' toolset into -# other toolset 'toolset'. Flag definitions which -# condition make use of properties in 'prohibited-properties' -# are ignored. Don't confuse property and feature, for -# example on and off, so blocking -# one of them does not block the other one. -# -# The flag conditions are not altered at all, so if condition -# includes name, or version of base toolset, it won't ever match -# the inheriting toolset. When such flag settings must be -# inherited, define a rule in base toolset module and call it -# as needed. -rule inherit-flags ( toolset : base : prohibited-properties * ) -{ - for local f in $(.module-flags.$(base)) - { - local rule-or-module = $(.rule-or-module.$(f)) ; - if [ set.difference - $(.$(rule-or-module).condition.$(f)) : - $(prohibited-properties) - ] || ! $(.$(rule-or-module).condition.$(f)) - { - local rule_ = [ MATCH "[^.]*\.(.*)" : $(rule-or-module) ] ; - local new-rule-or-module ; - if $(rule_) - { - new-rule-or-module = $(toolset).$(rule_) ; - } - else - { - new-rule-or-module = $(toolset) ; - } - - add-flag - $(new-rule-or-module) - : $(.$(rule-or-module).variable.$(f)) - : $(.$(rule-or-module).condition.$(f)) - : $(.$(rule-or-module).values.$(f)) - ; - } - } -} - -rule inherit-rules ( toolset : base ) -{ - # It appears that "action" creates local rule... - local base-generators = [ generators.generators-for-toolset $(base) ] ; - local rules ; - for local g in $(base-generators) - { - local id = [ MATCH "[^.]*\.(.*)" : [ $(g).id ] ] ; - rules += $(id) ; - } - IMPORT $(base) : $(rules) : $(toolset) : $(rules) ; - # Import the rules to the global scope - IMPORT $(toolset) : $(rules) : : $(toolset).$(rules) ; -} - -# Return the list of global 'toolset requirements'. -# Those requirements will be automatically added to -# the requirements of any main target. -rule requirements ( ) -{ - return $(.requirements) ; -} - -# Adds elements to the list of global 'toolset requirements'. -# The requirements will be automatically added to the requirements -# for all main targets, as if they were specified literally. -# For best results, all requirements added should be conditional or -# indirect conditional. -rule add-requirements ( requirements * ) -{ - if ! $(.ignore-requirements) - { - .requirements += $(requirements) ; - } -} - -local rule __test__ ( ) -{ - import assert ; - local p = 0 1 2 3 4 ; - assert.result 1/2/3 : find-property-subset 1/2/3 0/0/1 2/5 9 : $(p) ; - assert.result : find-property-subset 0/0/9/9/5 9 : $(p) ; - - local p-set = / 0/ /1 0/1 ; - assert.result / : find-property-subset $(p-set) : ; - assert.result 0/ : find-property-subset $(p-set) : 0 2 ; - assert.result /1 : find-property-subset $(p-set) : 1 2 ; - assert.result 0/1 : find-property-subset $(p-set) : 0 1 ; -} diff --git a/v2/build/type.jam b/v2/build/type.jam deleted file mode 100644 index 1d4d6b5ad..000000000 --- a/v2/build/type.jam +++ /dev/null @@ -1,370 +0,0 @@ -# Copyright 2002, 2003 Dave Abrahams -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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) - -# Deals with target type declaration and defines target class which supports -# typed targets. - -import feature ; -import generators : * ; -import "class" : new ; -import errors ; -import property ; -import scanner ; -import project ; - -# This creates a circular dependency -# project-test1 -> project -> project-root -> builtin -> type -> targets -> project -# import targets ; - -# The feature is optional so that it never implicitly added. -# It's used only for internal purposes, and in all cases we -# want to explicitly use it. -feature.feature target-type : : composite optional ; - -# feature.feature base-target-type : : composite optional ; -feature.feature main-target-type : : optional incidental ; -feature.feature base-target-type : : composite optional free ; -# feature.feature main-target-type : : composite optional incidental ; - -# Registers a target type, possible derived from a 'base-type'. -# If 'suffixes' are provided, they given all the suffixes that mean a file is of 'type'. -# Also, the first element gives the suffix to be used when constructing and object of -# 'type'. -rule register ( type : suffixes * : base-type ? ) -{ - # Type names cannot contain hyphens, because when used as - # feature-values they will be interpreted as composite features - # which need to be decomposed. - switch $(type) - { - case *-* : errors.error "type name \"$(type)\" contains a hyphen" ; - } - - if $(type) in $(.types) - { - errors.error "Type $(type) is already registered." ; - } - else - { - .types += $(type) ; - .bases.$(type) = $(base-type) ; - .derived.$(base-type) += $(type) ; - - if $(suffixes)-not-empty - { - # Generated targets of 'type' will use the first of 'suffixes' - # (this may be overriden) - $(.suffixes).insert $(type) : $(suffixes[1]) ; - # Specify mapping from suffixes to type - register-suffixes $(suffixes) : $(type) ; - } - - feature.extend target-type : $(type) ; - feature.extend main-target-type : $(type) ; - - feature.compose $(type) : $(base-type:G=) ; - feature.extend base-target-type : $(type) ; -# feature.compose $(type) : $(type) ; - feature.compose $(type) : $(base-type) ; - - # We used to declare main target rule only when 'main' parameter - # is specified. However, it's hard to decide that a type *never* - # will need a main target rule and so from time to time we needed - # to make yet another type 'main'. So, now main target rule is defined - # for each type. - main-rule-name = [ type-to-rule-name $(type) ] ; - .main-target-type.$(main-rule-name) = $(type) ; - - IMPORT $(__name__) : main-target-rule : : $(main-rule-name) ; - } -} - -# Given type, returns name of main target rule which creates -# targets of that type. -rule type-to-rule-name ( type ) -{ - # Lowercase everything. Convert underscores to dashes.ame. - import regex ; - local n = [ regex.split $(type:L) "_" ] ; - n = $(n:J=-) ; - return $(n) ; -} - -# Returns a type, given the name of a main rule. -rule type-from-rule-name ( main-target-name ) -{ - return $(.main-target-type.$(main-target-name)) ; -} - - - -# Specifies that targets with suffix from 'suffixes' has the type 'type'. -# If different type is already specified for any of syffixes, -# issues an error. -rule register-suffixes ( suffixes + : type ) -{ - for local s in $(suffixes) - { - if ! $(.type.$(s)) - { - .type.$(s) = $(type) ; - } - else if $(.type.$(s)) != type - { - errors.error Attempting to specify type for suffix \"$(s)\" - : "Old type $(.type.$(s)), New type $(type)" ; - } - } -} - - -# Returns true iff type has been registered. -rule registered ( type ) -{ - if $(type) in $(.types) - { - return true ; - } -} - -# Issues an error if 'type' is unknown. -rule validate ( type ) -{ - if ! $(type) in $(.types) - { - errors.error "Unknown target type $(type)" ; - } -} - - -# Sets a scanner class that will be used for this 'type'. -rule set-scanner ( type : scanner ) -{ - if ! $(type) in $(.types) - { - error "Type" $(type) "is not declared" ; - } - .scanner.$(type) = $(scanner) ; -} - -# Returns a scanner instance appropriate to 'type' and 'properties'. -rule get-scanner ( type : property-set ) -{ - if $(.scanner.$(type)) { - return [ scanner.get $(.scanner.$(type)) : $(property-set) ] ; - } -} - -# returns type and all of its bases in order of their distance from type. -rule all-bases ( type ) -{ - local result = $(type) ; - while $(type) - { - type = $(.bases.$(type)) ; - result += $(type) ; - } - return $(result) ; -} - -rule all-derived ( type ) -{ - local result = $(type) ; - for local d in $(.derived.$(type)) - { - result += [ all-derived $(d) ] ; - } - return $(result) ; -} - - -# Returns true if 'type' has 'base' as its direct or -# indirect base. -rule is-derived ( type base ) -{ - if $(base) in [ all-bases $(type) ] - { - return true ; - } -} - -# Returns true if 'type' is either derived from 'base', -# or 'type' is equal to 'base'. -rule is-subtype ( type base ) -{ - if $(type) = $(base) - { - return true ; - } - else - { - return [ is-derived $(type) $(base) ] ; - } -} - - -# Store suffixes for generated targets -.suffixes = [ new property-map ] ; - -# Store prefixes for generated targets (e.g. "lib" for library) -.prefixes = [ new property-map ] ; - - -# Sets a target suffix that should be used when generating target -# of 'type' with the specified properties. Can be called with -# empty properties if no suffix for 'type' was specified yet. -# This does not automatically specify that files 'suffix' have -# 'type' --- two different types can use the same suffix for -# generating, but only one type should be auto-detected for -# a file with that suffix. User should explicitly specify which -# one. -# -# The 'suffix' parameter can be empty string ("") to indicate that -# no suffix should be used. -rule set-generated-target-suffix ( type : properties * : suffix ) -{ - set-generated-target-ps suffix : $(type) : $(properties) : $(suffix) ; -} - -# Change the suffix previously registered for this type/properties -# combination. If suffix is not yet specified, sets it. -rule change-generated-target-suffix ( type : properties * : suffix ) -{ - change-generated-target-ps suffix : $(type) : $(properties) : $(suffix) ; -} - -rule generated-target-suffix ( type : property-set ) -{ - return [ generated-target-ps suffix : $(type) : $(property-set) ] ; -} - -# Sets a target prefix that should be used when generating target -# of 'type' with the specified properties. Can be called with -# empty properties if no prefix for 'type' was specified yet. -# -# The 'prefix' parameter can be empty string ("") to indicate that -# no prefix should be used. -# -# Example usage is for library names that have to have a "lib" -# prefix as in unix. -rule set-generated-target-prefix ( type : properties * : prefix ) -{ - set-generated-target-ps prefix : $(type) : $(properties) : $(prefix) ; -} - -# Change the prefix previously registered for this type/properties -# combination. If prefix is not yet specified, sets it. -rule change-generated-target-prefix ( type : properties * : prefix ) -{ - change-generated-target-ps prefix : $(type) : $(properties) : $(prefix) ; -} - -rule generated-target-prefix ( type : property-set ) -{ - return [ generated-target-ps prefix : $(type) : $(property-set) ] ; -} - -# Common rules for prefix/suffix provisioning follow - -rule set-generated-target-ps ( ps : type : properties * : psval ) -{ - properties = $(type) $(properties) ; - $(.$(ps)es).insert $(properties) : $(psval) ; -} - -rule change-generated-target-ps ( ps : type : properties * : psval ) -{ - properties = $(type) $(properties) ; - local prev = [ $(.$(ps)es).find-replace $(properties) : $(psval) ] ; - if ! $(prev) - { - set-generated-target-ps $(ps) : $(type) : $(properties) : $(psval) ; - } -} - -# Returns either prefix or suffix (as indicated by 'ps') that -# should be used when generating target of 'type' with the specified properties. -# Parameter 'ps' can be either "prefix" or "suffix". If no prefix/suffix is -# specified for 'type', returns prefix/suffix for base type, if any. -rule generated-target-ps-real ( ps : type : properties * ) -{ - local result ; - local found ; - while $(type) && ! $(found) - { - result = [ $(.$(ps)es).find $(type) $(properties) ] ; - # If the prefix/suffix is explicitly set to empty string, - # we consider prefix/suffix to be found. If we did not compare with "", - # there would be no way for user to set empty prefix/suffix. - if $(result)-is-not-empty - { - found = true ; - } - type = $(.bases.$(type)) ; - } - if $(result) = "" - { - result = ; - } - return $(result) ; -} - - -rule generated-target-ps ( ps : type : property-set ) -{ - local key = .$(ps).$(type).$(property-set) ; - local v = $($(key)) ; - if ! $(v) - { - v = [ generated-target-ps-real $(ps) : $(type) - : [ $(property-set).raw ] ] ; - if ! $(v) - { - v = none ; - } - $(key) = $(v) ; - } - - if $(v) != none - { - return $(v) ; - } -} - - -# Returns file type given it's name. If there are several dots in filename, -# tries each suffix. E.g. for name of "file.so.1.2" suffixes "2", "1", and -# "so" will be tried. -rule type ( filename ) -{ - local type ; - while ! $(type) && $(filename:S) - { - local suffix = $(filename:S) ; - type = $(.type$(suffix)) ; - filename = $(filename:S=) ; - } - return $(type) ; -} - - - -rule main-target-rule ( name : sources * : requirements * : default-build * - : usage-requirements * ) -{ - # First find required target type, which is equal to the name used - # to invoke us. - local bt = [ BACKTRACE 1 ] ; - local rulename = $(bt[4]) ; - - local project = [ project.current ] ; - - # This is a circular module dependency, so it must be imported here - import targets ; - return [ targets.create-typed-target $(.main-target-type.$(rulename)) : $(project) - : $(name) : $(sources) : $(requirements) - : $(default-build) : $(usage-requirements) ] ; -} - diff --git a/v2/build/version.jam b/v2/build/version.jam deleted file mode 100644 index 0afb4b860..000000000 --- a/v2/build/version.jam +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2002, 2003, 2004, 2006 Vladimir Prus -# 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) - -rule boost-build ( ) -{ - return "V2 (Milestone 12)" ; -} -rule jam ( ) -{ - local v = [ modules.peek : JAM_VERSION ] ; - return $(v:J=.) ; -} - - -rule print ( ) -{ - ECHO "Boost.Build" [ boost-build ] ; - ECHO "Boost.Jam" [ jam ] ; -} diff --git a/v2/build/virtual-target.jam b/v2/build/virtual-target.jam deleted file mode 100644 index 45b717d96..000000000 --- a/v2/build/virtual-target.jam +++ /dev/null @@ -1,1236 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2005, 2006 Rene Rivera -# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus -# 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) - -# Implements virtual targets, which correspond to actual files created during -# build, but are not yet targets in Jam sense. They are needed, for example, -# when searching for possible transormation sequences, when it's not known -# if particular target should be created at all. - -import "class" : new ; -import path property-set utility sequence errors set type os ; - -# +--------------------------+ -# | virtual-target | -# +==========================+ -# | actualize | -# +--------------------------+ -# | actualize-action() = 0 | -# | actualize-location() = 0 | -# +----------------+---------+ -# | -# ^ -# / \ -# +-+-+ -# | -# +---------------------+ +-------+--------------+ -# | action | | abstract-file-target | -# +=====================| * +======================+ -# | action-name | +--+ action | -# | properties | | +----------------------+ -# +---------------------+--+ | actualize-action() | -# | actualize() |0..1 +-----------+----------+ -# | path() | | -# | adjust-properties() | sources | -# | actualize-sources() | targets | -# +------+--------------+ ^ -# | / \ -# ^ +-+-+ -# / \ | -# +-+-+ +-------------+-------------+ -# | | | -# | +------+---------------+ +--------+-------------+ -# | | file-target | | searched-lib-target | -# | +======================+ +======================+ -# | | actualize-location() | | actualize-location() | -# | +----------------------+ +----------------------+ -# | -# +-+------------------------------+ -# | | -# +----+----------------+ +---------+-----------+ -# | compile-action | | link-action | -# +=====================+ +=====================+ -# | adjust-properties() | | adjust-properties() | -# +---------------------+ | actualize-sources() | -# +---------------------+ -# -# The 'compile-action' and 'link-action' classes are defined not here, -# but in builtin.jam modules. They are shown in the diagram to give -# the big picture. - -# Potential target. It can be converted into jam target and used in -# building, if needed. However, it can be also dropped, which allows -# to search for different transformation and select only one. -# -class virtual-target -{ - import virtual-target utility scanner ; - - rule __init__ ( name # Name of this target -- specifies the name of - : project # Project to which this target belongs - ) - { - self.name = $(name) ; - self.project = $(project) ; - self.dependencies = ; - } - - # Name of this target. - rule name ( ) { return $(self.name) ; } - - # Project of this target. - rule project ( ) { return $(self.project) ; } - - # Adds additional instances of 'virtual-target' that this - # one depends on. - rule depends ( d + ) - { - self.dependencies = [ sequence.merge $(self.dependencies) - : [ sequence.insertion-sort $(d) ] ] ; - } - - rule dependencies ( ) - { - return $(self.dependencies) ; - } - - # Generates all the actual targets and sets up build actions for - # this target. - # - # If 'scanner' is specified, creates an additional target - # with the same location as actual target, which will depend on the - # actual target and be associated with 'scanner'. That additional - # target is returned. See the docs (#dependency_scanning) for rationale. - # Target must correspond to a file if 'scanner' is specified. - # - # If scanner is not specified, then actual target is returned. - rule actualize ( scanner ? ) - { - local actual-name = [ actualize-no-scanner ] ; - - if ! $(scanner) - { - return $(actual-name) ; - } - else - { - # Add the scanner instance to the grist for name. - local g = [ sequence.join - [ utility.ungrist $(actual-name:G) ] $(scanner) : - ] ; - local name = $(actual-name:G=$(g)) ; - - if ! $(self.made.$(name)) { - self.made.$(name) = true ; - - DEPENDS $(name) : $(actual-name) ; - - actualize-location $(name) ; - - scanner.install $(scanner) : $(name) $(__name__) ; - } - return $(name) ; - } - - } - -# private: (overridables) - - # Sets up build actions for 'target'. Should call appropriate rules - # and set target variables. - rule actualize-action ( target ) - { - errors.error "method should be defined in derived classes" ; - } - - # Sets up variables on 'target' which specify its location. - rule actualize-location ( target ) - { - errors.error "method should be defined in derived classes" ; - } - - # If the target is generated one, returns the path where it will be - # generated. Otherwise, returns empty list. - rule path ( ) - { - errors.error "method should be defined in derived classes" ; - } - - # Return that actual target name that should be used - # (for the case where no scanner is involved) - rule actual-name ( ) - { - errors.error "method should be defined in derived classes" ; - } - -# implementation - rule actualize-no-scanner ( ) - { - # In fact, we just need to merge virtual-target with - # abstract-virtual-target and the latter is the only class - # derived from the former. But that's for later. - errors.error "method should be defined in derived classes" ; - } -} - - -# Target which correspond to a file. The exact mapping for file -# is not yet specified in this class. (TODO: Actually, the class name -# could be better...) -# -# May be a source file (when no action is specified), or -# derived file (otherwise). -# -# The target's grist is concatenation of project's location, -# properties of action (for derived files), and, optionally, -# value identifying the main target. -class abstract-file-target : virtual-target -{ - import project regex sequence path type ; - import property-set ; - import indirect ; - - rule __init__ ( - name # Name for this target - exact ? # If non-empty, the name is exactly the name - # created file should have. Otherwise, the '__init__' - # method will add suffix obtained from 'type' by - # calling 'type.generated-target-suffix'. - : type ? # The type of this target. - : project - : action ? - ) - { - virtual-target.__init__ $(name) : $(project) ; - - self.type = $(type) ; - self.action = $(action) ; - if $(action) - { - $(action).add-targets $(__name__) ; - - if $(self.type) && ! $(exact) - { - _adjust-name $(name) ; - } - } - } - - rule type ( ) { return $(self.type) ; } - - # Sets the path. When generating target name, it will override any path - # computation from properties. - rule set-path ( path ) - { - self.path = [ path.native $(path) ] ; - } - - # If 'a' is supplied, sets action to 'a'. - # Returns the action currently set. - rule action ( ) - { - return $(self.action) ; - } - - # Sets/gets the 'root' flag. Target is root if it directly correspods to some - # variant of a main target. - rule root ( set ? ) - { - if $(set) - { - self.root = true ; - } - return $(self.root) ; - } - - # Gets or sets the subvariant which created this target. Subvariant - # is set when target is brought into existance, and is never changed - # after that. In particual, if target is shared by subvariant, only - # the first is stored. - rule creating-subvariant ( s ? # If specified, specified the value to set, - # which should be instance of 'subvariant' - # class. - ) - { - if $(s) && ( ! $(self.creating-subvariant) && ! $(overwrite) ) - { - if $(self.creating-subvariant) - { - errors.error "Attempt to change 'dg'" ; - } - else - { - self.creating-subvariant = $(s) ; - } - } - return $(self.creating-subvariant) ; - } - - rule actualize-action ( target ) - { - if $(self.action) - { - $(self.action).actualize ; - } - } - - # Return a human-readable representation of this target - # - # If this target has an action, that's: - # - # { -. ... } - # - # otherwise, it's: - # - # { . } - # - rule str ( ) - { - local action = [ action ] ; - - local name-dot-type = [ sequence.join $(self.name) "." $(self.type) ] ; - - if $(action) - { - local sources = [ $(action).sources ] ; - - local action-name = [ $(action).action-name ] ; - - local ss ; - for local s in $(sources) - { - ss += [ $(s).str ] ; - } - - return "{" $(action-name)-$(name-dot-type) $(ss) "}" ; - } - else - { - return "{" $(name-dot-type) "}" ; - } - } - - rule less ( a ) - { - if [ str ] < [ $(a).str ] - { - return true ; - } - } - - rule equal ( a ) - { - if [ str ] = [ $(a).str ] - { - return true ; - } - } - -# private: - rule actual-name ( ) - { - if ! $(self.actual-name) - { - local grist = [ grist ] ; - - local basename = [ path.native $(self.name) ] ; - self.actual-name = <$(grist)>$(basename) ; - - } - return $(self.actual-name) ; - } - - # Helper to 'actual-name', above. Compute unique prefix used to distinguish - # this target from other targets with the same name which create different - # file. - rule grist ( ) - { - # Depending on target, there may be different approaches to generating - # unique prefixes. We'll generate prefixes in the form - # - local path = [ path ] ; - if $(path) - { - # The target will be generated to a known path. Just use the path - # for identification, since path is as unique as it can get. - return p$(path) ; - } - else - { - # File is either source, which will be searched for, or is not a file at - # all. Use the location of project for distinguishing. - local project-location = [ $(self.project).get location ] ; - local location-grist = - [ sequence.join [ regex.split $(project-location) "/" ] : "!" ] ; - - if $(self.action) - { - local ps = [ $(self.action).properties ] ; - local property-grist = [ $(ps).as-path ] ; - # 'property-grist' can be empty when 'ps' is an empty - # property set. - if $(property-grist) - { - location-grist = $(location-grist)/$(property-grist) ; - } - } - - return l$(location-grist) ; - } - } - - # Given the target name specified in constructor, returns the - # name which should be really used, by looking at the properties. - # The tag properties come in two flavour: - # - value, - # - @rule-name - # In the first case, value is just added to name - # In the second case, the specified rule is called with specified name, - # target type and properties and should return the new name. - # If not property is specified, or the rule specified by - # returns nothing, returns the result of calling - # virtual-target.add-suffix - rule _adjust-name ( specified-name ) - { - local ps ; - if $(self.action) - { - ps = [ $(self.action).properties ] ; - } - else - { - ps = [ property-set.empty ] ; - } - - #~ We add ourselves to the properties so that any tag rule can get - #~ more direct information about the target than just that available - #~ through the properties. This is useful in implementing - #~ name changes based on the sources of the target. For example to - #~ make unique names of object files based on the source file. - #~ --grafik - ps = [ property-set.create [ $(ps).raw ] $(__name__) ] ; - - local tag = [ $(ps).get ] ; - - if $(tag) - { - local rule-name = [ MATCH ^@(.*) : $(tag) ] ; - if $(rule-name) - { - if $(tag[2]) - { - errors.error "@rulename is present but is not the only feature" ; - } - - self.name = [ indirect.call $(rule-name) $(specified-name) : - $(self.type) : $(ps) ] ; - } - else - { - errors.error - "The value of the feature must be '@rule-nane'" ; - } - } - - # If there's no tag or the tag rule returned nothing. - if ! $(tag) || ! $(self.name) - { - self.name = [ virtual-target.add-prefix-and-suffix - $(specified-name) : $(self.type) : $(ps) ] ; - } - } - - rule actualize-no-scanner ( ) - { - local name = [ actual-name ] ; - - # Do anything only on the first invocation - if ! $(self.made.$(name)) { - self.made.$(name) = true ; - - if $(self.action) - { - # For non-derived target, we don't care if there - # are several virtual targets that refer to the same name. - # One case when this is unavoidable is when file name is - # main.cpp and two targets have types CPP (for compiling) - # and MOCCABLE_CPP (for convertion to H via Qt tools). - virtual-target.register-actual-name $(name) : $(__name__) ; - } - - for local i in $(self.dependencies) { - DEPENDS $(name) : [ $(i).actualize ] ; - } - - actualize-location $(name) ; - actualize-action $(name) ; - } - return $(name) ; - } - -} - -# Appends the suffix appropriate to 'type/property-set' combination -# to the specified name and returns the result. -rule add-prefix-and-suffix ( specified-name : type ? : property-set ) -{ - local suffix = [ type.generated-target-suffix $(type) : $(property-set) ] ; - - # Handle suffixes for which no leading dot is desired. Those are - # specified by enclosing them in <...>. Needed by python so it - # can create "_d.so" extensions, for example. - if $(suffix:G) - { - suffix = [ utility.ungrist $(suffix) ] ; - } - else - { - suffix = .$(suffix) ; - } - - local prefix = [ type.generated-target-prefix $(type) : $(property-set) ] ; - - if [ MATCH ^($(prefix)) : $(specified-name) ] - { - prefix = ; - } - return $(prefix:E="")$(specified-name)$(suffix:E="") ; -} - - -# File target with explicitly known location. -# -# The file path is determined as -# - value passed to the 'set-path' method, if any -# - for derived files, project's build dir, joined with components -# that describe action's properties. If the free properties -# are not equal to the project's reference properties -# an element with name of main target is added. -# - for source files, project's source dir -# -# The file suffix is -# - the value passed to the 'suffix' method, if any, or -# - the suffix which correspond to the target's type. -# -class file-target : abstract-file-target -{ - import common ; - import errors ; - import "class" : new ; - - rule __init__ ( - name exact ? - : type ? # Optional type for this target - : project - : action ? - : path ? - ) - { - abstract-file-target.__init__ $(name) $(exact) : $(type) : $(project) - : $(action) ; - - self.path = $(path) ; - } - - rule clone-with-different-type ( new-type ) - { - return [ new file-target $(self.name) exact : $(new-type) - : $(self.project) : $(self.action) : $(self.path) ] ; - } - - rule actualize-location ( target ) - { - if $(self.action) - { - # This is a derived file. - local path = [ path ] ; - LOCATE on $(target) = $(path) ; - - # Make sure the path exists. - DEPENDS $(target) : $(path) ; - common.MkDir $(path) ; - - # It's possible that the target name includes a directory - # too, for example when installing headers. Create that - # directory. - if $(target:D) - { - local d = $(target:D) ; - d = $(d:R=$(path)) ; - DEPENDS $(target) : $(d) ; - - common.MkDir $(d) ; - } - - # For real file target, we create a fake target that - # depends on the real target. This allows to run - # - # bjam hello.o - # - # without trying to guess the name of the real target. - # Note the that target has no directory name, and a special - # grist . - # - # First, that means that "bjam hello.o" will build all - # known hello.o targets. - # Second, the grist makes sure this target won't be confused - # with other targets, for example, if we have subdir 'test' - # with target 'test' in it that includes 'test.o' file, - # then the target for directory will be just 'test' the target - # for test.o will be test.o and the target - # we create below will be test.o - DEPENDS $(target:G=e) : $(target) ; - } - else - { - SEARCH on $(target) = [ path.native $(self.path) ] ; - } - } - - # Returns the directory for this target - rule path ( ) - { - if ! $(self.path) - { - if $(self.action) - { - local p = [ $(self.action).properties ] ; - local path = [ $(p).target-path ] ; - - if $(path[2]) = true - { - # Indicates that the path is relative to - # build dir. - path = [ path.join [ $(self.project).build-dir ] - $(path[1]) ] ; - } - - # Store the computed path, so that it's not recomputed - # any more - self.path = [ path.native $(path) ] ; - } - } - return $(self.path) ; - } - -} - -class notfile-target : abstract-file-target -{ - rule __init__ ( name : project : action ? ) - { - abstract-file-target.__init__ $(name) : : $(project) : $(action) ; - } - - # Returns nothing, to indicate that target path is not known. - rule path ( ) - { - return ; - } - - rule actualize-location ( target ) - { - NOTFILE $(target) ; - ALWAYS $(target) ; - } -} - -# Class which represents an action. -# Both 'targets' and 'sources' should list instances of 'virtual-target'. -# Action name should name a rule with this prototype -# rule action-name ( targets + : sources * : properties * ) -# Targets and sources are passed as actual jam targets. The rule may -# not establish dependency relationship, but should do everything else. -class action -{ - import type toolset property-set indirect class path assert errors ; - - rule __init__ ( sources * : action-name + : property-set ? ) - { - self.sources = $(sources) ; - - self.action-name = [ indirect.make-qualified $(action-name) ] ; - - if ! $(property-set) - { - property-set = [ property-set.empty ] ; - } - - if ! [ class.is-instance $(property-set) ] - { - errors.error "Property set instance required" ; - } - - self.properties = $(property-set) ; - } - - rule add-targets ( targets * ) - { - self.targets += $(targets) ; - } - - rule targets ( ) - { - return $(self.targets) ; - } - - rule sources ( ) - { - return $(self.sources) ; - } - - rule action-name ( ) - { - return $(self.action-name) ; - } - - rule properties ( ) - { - return $(self.properties) ; - } - - # Generates actual build instructions. - rule actualize ( ) - { - if ! $(self.actualized) - { - self.actualized = true ; - - local ps = [ properties ] ; - local properties = [ adjust-properties $(ps) ] ; - - local actual-targets ; - for local i in [ targets ] - { - actual-targets += [ $(i).actualize ] ; - } - - actualize-sources [ sources ] : $(properties) ; - - DEPENDS $(actual-targets) : $(self.actual-sources) $(self.dependency-only-sources) ; - - # Action name can include additional argument to rule, which should not - # be passed to 'set-target-variables' - toolset.set-target-variables - [ indirect.get-rule $(self.action-name[1]) ] $(actual-targets) - : $(properties) ; - - # Reflect ourselves in a variable for the target. This allows - # looking up additional info for the action given the raw target. - # For example to debug or output action information from action rules. - .action on $(actual-targets) = $(__name__) ; - - indirect.call $(self.action-name) - $(actual-targets) : $(self.actual-sources) : [ $(properties).raw ] - ; - - # Since we set up creating action here, we also set up - # action for cleaning up - common.Clean clean-all : $(actual-targets) ; - } - } - - # Helper for 'actualize-sources'. - # For each passed source, actualizes it with the appropriate scanner. - # Returns the actualized virtual targets. - rule actualize-source-type ( sources * : property-set ) - { - local result = ; - for local i in $(sources) - { - local scanner ; - if [ $(i).type ] - { - scanner = - [ type.get-scanner [ $(i).type ] : $(property-set) ] ; - } - result += [ $(i).actualize $(scanner) ] ; - } - - return $(result) ; - } - - # Creates actual jam targets for sources. Initialized two member - # variables:. - # 'self.actual-sources' -- sources which are passed to updating action - # 'self.dependency-only-sources' -- sources which are made dependencies, but - # are not used otherwise. - # - # New values will be *appended* to the variables. They may be non-empty, - # if caller wants it. - rule actualize-sources ( sources * : property-set ) - { - local dependencies = [ $(self.properties).get ] ; - - self.dependency-only-sources += [ - actualize-source-type $(dependencies) : $(property-set) ] ; - self.actual-sources += [ - actualize-source-type $(sources) : $(property-set) ] ; - - # This is used to help bjam find dependencies in generated headers - # in other main targets. - # Say: - # - # make a.h : ....... ; - # exe hello : hello.cpp : a.h ; - # - # However, for bjam to find the dependency the generated target must - # be actualized (i.e. have the jam target). In the above case, - # if we're building just hello ("bjam hello"), 'a.h' won't be - # actualized unless we do it here. - local implicit = [ $(self.properties).get ] ; - for local i in $(implicit) - { - $(i:G=).actualize ; - } - } - - # Determined real properties when trying building with 'properties'. - # This is last chance to fix properties, for example to adjust includes - # to get generated headers correctly. Default implementation returns - # its argument. - rule adjust-properties ( property-set ) - { - return $(property-set) ; - } -} - -# Action class which does nothing --- it produces the targets with -# specific properties out of nowhere. It's needed to distinguish virtual -# targets with different properties that are known to exist, and have no -# actions which create them. -class null-action : action -{ - rule __init__ ( property-set ? ) - { - action.__init__ : .no-action : $(property-set) ; - } - - rule actualize ( ) - { - if ! $(self.actualized) - { - self.actualized = true ; - - for local i in [ targets ] - { - $(i).actualize ; - } - } - } -} - -# Class which acts exactly like 'action', except that the sources -# are not scanned for dependencies. -class non-scanning-action : action -{ - rule __init__ ( sources * : action-name + : property-set ? ) - { - action.__init__ $(sources) : $(action-name) : $(property-set) ; - } - rule actualize-source-type ( sources * : property-set ) - { - local result ; - for local i in $(sources) - { - result += [ $(i).actualize ] ; - } - return $(result) ; - } -} - - -# Creates a virtual target with approariate name and type from 'file'. -# If a target with that name in that project was already created, returns that already -# created target. -# FIXME: more correct way would be to compute path to the file, based on name and source location -# for the project, and use that path to determine if the target was already created. -# TODO: passing project with all virtual targets starts to be annoying. -rule from-file ( file : file-loc : project ) -{ - import type ; # had to do this here to break a circular dependency - - # Check if we've created a target corresponding to this file. - local path = [ path.root [ path.root $(file) $(file-loc) ] - [ path.pwd ] ] ; - - if $(.files.$(path)) - { - return $(.files.$(path)) ; - } - else - { - local name = [ path.make $(file) ] ; - local type = [ type.type $(file) ] ; - local result ; - - result = [ new file-target $(file) - : $(type) - : $(project) - : #action - : $(file-loc) ] ; - - .files.$(path) = $(result) ; - return $(result) ; - } -} - -# Registers a new virtual target. Checks if there's already registered target, with the same -# name, type, project and subvariant properties, and also with the same sources -# and equal action. If such target is found it is retured and 'target' is not registers. -# Otherwise, 'target' is registered and returned. -rule register ( target ) -{ - local signature = [ sequence.join - [ $(target).path ] [ $(target).name ] : - ] ; - - - local result ; - for local t in $(.cache.$(signature)) - { - local a1 = [ $(t).action ] ; - local a2 = [ $(target).action ] ; - - if ! $(result) - { - if ! $(a1) && ! $(a2) - { - result = $(t) ; - } - else - { - if $(a1) && $(a2) && [ $(a1).action-name ] = [ $(a2).action-name ] && - [ $(a1).sources ] = [ $(a2).sources ] - { - local ps1 = [ $(a1).properties ] ; - local ps2 = [ $(a2).properties ] ; - local p1 = [ $(ps1).base ] [ $(ps1).free ] [ $(ps1).dependency ] ; - local p2 = [ $(ps2).base ] [ $(ps2).free ] [ $(ps2).dependency ] ; - if $(p1) = $(p2) - { - result = $(t) ; - } - } - } - } - } - - if ! $(result) - { - .cache.$(signature) += $(target) ; - result = $(target) ; - } - - .recent-targets += $(result) ; - .all-targets += $(result) ; - - return $(result) ; -} - - -# Each target returned by 'register' is added to a list of -# 'recent-target', returned by this function. So, this allows -# us to find all targets created when building a given main -# target, even if the target -rule recent-targets ( ) -{ - return $(.recent-targets) ; -} - -rule clear-recent-targets ( ) -{ - .recent-targets = ; -} - -# Returns all virtual targets ever created -rule all-targets ( ) -{ - return $(.all-targets) ; -} - -# Returns all targets from 'targets' with types -# equal to 'type' or derived from it. -rule select-by-type ( type : targets * ) -{ - local result ; - for local t in $(targets) - { - if [ type.is-subtype [ $(t).type ] $(type) ] - { - result += $(t) ; - } - } - - return $(result) ; -} - - - -rule register-actual-name ( actual-name : virtual-target ) -{ - if $(.actual.$(actual-name)) - { - local cs1 = [ $(.actual.$(actual-name)).creating-subvariant ] ; - local cs2 = [ $(virtual-target).creating-subvariant ] ; - local cmt1 = [ $(cs1).main-target ] ; - local cmt2 = [ $(cs2).main-target ] ; - - - local action1 = [ $(.actual.$(actual-name)).action ] ; - local action2 = [ $(virtual-target).action ] ; - local properties-added ; - local properties-removed ; - if $(action1) && $(action2) - { - local p1 = [ $(action1).properties ] ; - p1 = [ $(p1).raw ] ; - local p2 = [ $(action2).properties ] ; - p2 = [ $(p2).raw ] ; - properties-removed = [ set.difference $(p1) : $(p2) ] ; - properties-removed ?= "none" ; - properties-added = [ set.difference $(p2) : $(p1) ] ; - properties-added ?= "none" ; - } - errors.error "Duplicate name of actual target:" $(actual-name) - : "previous virtual target" [ $(.actual.$(actual-name)).str ] - : "created from" [ $(cmt1).full-name ] - : "another virtual target" [ $(virtual-target).str ] - : "created from" [ $(cmt2).full-name ] - : "added properties: " $(properties-added) - : "removed properties: " $(properties-removed) ; - } - else - { - .actual.$(actual-name) = $(virtual-target) ; - } -} - - -# Traverses the dependency graph of 'target' and return all targets that will -# be created before this one is created. If root of some dependency graph is -# found during traversal, it's either included or not, dependencing of the -# value of 'include-roots'. In either case, sources of root are not traversed. -rule traverse ( target : include-roots ? : include-sources ? ) -{ - local result ; - if [ $(target).action ] - { - local action = [ $(target).action ] ; - # This includes 'target' as well - result += [ $(action).targets ] ; - - for local t in [ $(action).sources ] - { - if ! [ $(t).root ] - { - result += [ traverse $(t) : $(include-roots) : $(include-sources) ] ; - } - else if $(include-roots) - { - result += $(t) ; - } - } - } - else if $(include-sources) - { - result = $(target) ; - } - return $(result) ; -} - -# Takes an 'action' instances and creates new instance of it -# and all produced target. The rule-name and properties are set -# to 'new-rule-name' and 'new-properties', if those are specified. -# Returns the cloned action. -rule clone-action ( action : new-project : new-action-name ? : new-properties ? ) -{ - if ! $(new-action-name) - { - new-action-name = [ $(action).action-name ] ; - } - if ! $(new-properties) - { - new-properties = [ $(action).properties ] ; - } - - local action-class = [ modules.peek $(action) : __class__ ] ; - local cloned-action = [ class.new $(action-class) - [ $(action).sources ] : $(new-action-name) : $(new-properties) ] ; - - local cloned-targets ; - for local target in [ $(action).targets ] - { - local n = [ $(target).name ] ; - # Don't modify the name of the produced targets.Strip the directory f - local cloned-target = [ class.new file-target $(n) exact : [ $(target).type ] - : $(new-project) : $(cloned-action) ] ; - local d = [ $(target).dependencies ] ; - if $(d) - { - $(cloned-target).depends $(d) ; - } - $(cloned-target).root [ $(target).root ] ; - $(cloned-target).creating-subvariant [ $(target).creating-subvariant ] ; - - cloned-targets += $(cloned-target) ; - } - - return $(cloned-action) ; -} - -class subvariant -{ - import sequence ; - import type ; - - rule __init__ ( main-target # The instance of main-target class - : property-set # Properties requested for this target - : sources * - : build-properties # Actually used properties - : sources-usage-requirements # Properties propagated from sources - : created-targets * ) # Top-level created targets - { - self.main-target = $(main-target) ; - self.properties = $(property-set) ; - self.sources = $(sources) ; - self.build-properties = $(build-properties) ; - self.sources-usage-requirements = $(sources-usage-requirements) ; - self.created-targets = $(created-targets) ; - - # Pre-compose the list of other dependency graphs, on which this one - # depends - local deps = [ $(build-properties).get ] ; - for local d in $(deps) - { - self.other-dg += [ $(d:G=).creating-subvariant ] ; - } - - self.other-dg = [ sequence.unique $(self.other-dg) ] ; - } - - - rule main-target ( ) - { - return $(self.main-target) ; - } - - rule created-targets ( ) - { - return $(self.created-targets) ; - } - - rule requested-properties ( ) - { - return $(self.properties) ; - } - - rule build-properties ( ) - { - return $(self.build-properties) ; - } - - rule sources-usage-requirements ( ) - { - return $(self.sources-usage-requirements) ; - } - - rule set-usage-requirements ( usage-requirements ) - { - self.usage-requirements = $(usage-requirements) ; - } - - rule usage-requirements ( ) - { - return $(self.usage-requirements) ; - } - - # Returns all targets referenced by this subvariant, - # either directly or indirectly, and - # either as sources, or as dependency properties. - # Targets referred with dependency property are returned a properties, - # not targets. - rule all-referenced-targets ( ) - { - # Find directly referenced targets. - local deps = [ $(self.build-properties).dependency ] ; - local all-targets = $(self.sources) $(deps) ; - - # Find other subvariants. - local r ; - for local t in $(all-targets) - { - r += [ $(t:G=).creating-subvariant ] ; - } - r = [ sequence.unique $(r) ] ; - for local s in $(r) - { - if $(s) != $(__name__) - { - all-targets += [ $(s).all-referenced-targets ] ; - } - } - return $(all-targets) ; - } - - # Returns the properties which specify implicit include paths to - # generated headers. This traverses all targets in this subvariant, - # and subvariants referred by properties. - # For all targets which are of type 'target-type' (or for all targets, - # if 'target-type' is not specified), the result will contain - # <$(feature)>path-to-that-target. - rule implicit-includes ( feature : target-type ? ) - { - local key = ii$(feature)-$(target-type:E="") ; - if ! $($(key))-is-nonempty - { - local target-paths = [ all-target-directories $(target-type) ] ; - target-paths = [ sequence.unique $(target-paths) ] ; - local result = $(target-paths:G=$(feature)) ; - if ! $(result) - { - result = "" ; - } - $(key) = $(result) ; - } - if $($(key)) = "" - { - return ; - } - else - { - return $($(key)) ; - } - } - - rule all-target-directories ( target-type ? ) - { - if ! $(self.target-directories) - { - compute-target-directories $(target-type) ; - } - return $(self.target-directories) ; - } - - rule compute-target-directories ( target-type ? ) - { - local result ; - for local t in $(self.created-targets) - { - if $(target-type) && ! [ type.is-derived [ $(t).type ] $(target-type) ] - { - # Skip target which is of wrong type. - } - else - { - result = [ sequence.merge $(result) : [ $(t).path ] ] ; - } - } - for local d in $(self.other-dg) - { - result += [ $(d).all-target-directories $(target-type) ] ; - } - self.target-directories = $(result) ; - } -} - diff --git a/v2/changes.txt b/v2/changes.txt deleted file mode 100644 index 7ac8ffa2f..000000000 --- a/v2/changes.txt +++ /dev/null @@ -1,317 +0,0 @@ -Copyright 2004-2007 Vladimir Prus -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) - -Milestone 13 (in development) - -Changes in this release: - -The following bugs were fixed: - - - gcc suport did not work on HP-UX systems - -Milestone 12 (Oct 1, 2007) - -Changes in this release: - - - The Pathscale, PGI and mipspro compilers are now supported. - - Support for autoconfiguration of toolset based on command-line - toolset=xxxx request, and for default toolset - configuration as a fallback. - - Support for precompiled headers for gcc toolset, - and improvements for msvc. - - Mechanism for removing inherited requirements. - - The 'make' rule support specifying usage-requirements. - - New 'project.extension' rule for declaring standalone - projects. - - New 'conditional' convenience rule. - - New 'glob-tree' rule. - - The 'glob' rule accepts patterns to exclude. - - Inline targets are now marked explicit automatically. - - Toolsets can now implicitly add requirements to - all targets. - - New 'generate' rule. - - The executables produced by the 'run' rule are automatically - removed after run. - - The gcc toolset uses the version obtained by running - the compiler, if no explicit one is provided. - - The sun toolset now supports the 'address-model' feature, - and uses -KPIC for shared libraries. - - Free features on command line affect all targets, not - just 'directly requested' ones. - - -Documentation changes: - - - Installation instructions for Linux distributors. - - Configuration options for all supported C++ compilers - are now documented. - -The following bugs were fixed: - - - The 'cflags' and 'linkflags' now work on Darwin.o - - The intel toolset now works on Windows. - - Fix library search options for CodeWarriour toolset. - - The could cause duplicate - mkdir commands. - - Numerious fixes in Boost autolink support - - Numerious fixes in Boost.Python support. - - Indirect properties not evaluated in usage requirements. - - Generator that returns a property set but not target is - considered successful. - - On Darwin, when several compiler versions - are configured, -fcoalesce-templates is applied only to - versions that need it. - - -Milestone 11 (Jule 20, 2006) - -Changes in this release: - - - New C++ compilers: IBM xlf, HP aCC, HP CXX, Intel fortran compiler. - - New tools: Qt4 support, MS message compiler and IDL compiler. - - New main targets: 'notfile' and 'cast'. - - - Core changes: - - - Only one file required at top level of a project, named Jamroot. - - Jamfiles can now contain project-specific help messages. - - "Indirect conditional requirements" introduced - (http://tinyurl.com/mn3jp) - - Strip suffix in main target names when computing names of generated - files (URL) - - The 'source-location' project attribute can contain - several directories. - - Usage requirements are propagated not only direct dependents, - but to indirect dependents. - - - Command line option changes (see http://tinyurl.com/zbycz) - - New option --build-dir - - The --clean option cleans only target below the current directory, - not globally. - - New --clean-all option was added. - - New option --debug-building - - Running "bjam some_directory" works even if there's no Jamfile - in the current directory. - - - Toolset improvements: - - Assembling support with gcc, borland and msvc. - - Support amd64/ia64 cross-compiling with msvc. - - Improved, registry-based autodetection for msvc. - - Serialize execution of gcc.link actions - - Precompiled headers supported on MSVC - (Need documentation) - - - New features and - - The 'glob' rule accepts wildcards in directory names. - - The 'stage' rule was renamed to 'install' - (the old name still available for compatibility) - - The feature can accept user-defined function as value - (URL) - - The 'install' rule can install a directory hierarchy preserving relative - paths. - - The 'install' rule no longer allows to change library - name during install. - - The Jamfile referred via 'use-project' may declare project id different - from the one in 'use-project'. - - The 'using' rule now searches the directory of containing Jamfile. - - -The following bugs were fixed: - - - The feature was ignored for static linking - - Fix #include scanning for C files. - - Child projects were sometimes loaded before parent projects. - - Fix project references with absolute paths on Windows. - - The feature was ignored for 'install' targets. - - A generator having the same type in sources and targets was causing hang. - - Use 'icpc' command for Intel, fixing errors with 8.1 and higher. - - Generation of PS files with the FOP tool really produces .PS files. - - No dependency scanning was done for C files. - - The 'constant' and 'path-constant' rules did not accept multi-element - value. - - Don't pass -fcoalesce-templates to gcc on OSX 10.4 - - Fix static lib suffix on OSX. - - Fix rpath setting on Intel/Linux. - - The 'install' rule don't unnecessary scans #includes in installed - headers. - - -Developer visible changes: - - - Ability to customize type's prefix depending on build properties. - - Generator's 'run' method can return usage-requirements. - - Main target rule is automatically declared for each new target type. - - 'Link incompatible' feature attribute was removed - - Generators no longer bypass unhandled sources, they just ignore them. - - If there are several applicable generators, immediately report ambiguity. - Provide a way to explicitly resolve conflicts between generators. - - The 'flags' rule can match absense of feature. - - Great improvement in response files handling - - The 'toolset.flags' rules allows value-less feature to signify - absense of this feature (fix hack-hack). - - Automatically declare main target rule for each declared target type. - - When inheriting types, inherit generators for the base type, as opposed - to using various hacks to invoke base generators when needed. - - Improve diagnostic for "duplicate actual target" and generator ambiguity. - - -Milestone 10 (October 29, 2004) - -Changes in this release: - - Many toolsets were added: Intel, Metrowerks, Comeau, aCC, vacpp. - Documentation was converted to BoostBook and improved. - Performance was improved. - - - Toolsets initialization syntax is much more uniform. Compiler and linker - flags can now be specified. - - The algorithm for computing build properties was improved. Conditional - requirements can be chained, and a number of bugs were fixed. - - Specific order of properties can be specified. - - The main target rules can be called from everywhere, not necessary from - Jamfile. - - Check for "unused sources" removed. - - The feature affects only linking now. - - The feature now works only for libraries. - - Simpler syntax for "searched" libraries was added. - - New feature. - - - Unix: - The right order of static libraries on Unix is automatically - computed. - The feature is the default. - gcc: - The -fPIC option is passed when creating shared libraries. - Problems with distcc were solved. - Sun: - It's now possible to use the sun linker (as opposed to gnu), and - to compile C files. - Darwin: - Shared libraries are now supported. - MSVC: Before resource files compilation, the setup script is invoked. - Options deprecated in 8.0 are not longer used. - - -The following bugs were fixed: - - - The rule did not handle the property (!!!!!!) - - Don't add "bin" to the build directory explicitly specified by the user. - - Allow to select staged targets, - even with off. - - Includes for the form '# include " did not work. - - (Qt) Add paths to all dependent libs to uic command - line, which helps if the UI files uses plugins. - - Using xxx in requirements was broken. - - Error message printed when target can be found is much more clear. - - Inline targets in sources of 'stage' did not work. - - Don't produce 'independent target' warnings on Windows - - (gcc) The static did not work. - - (gcc) Suppress warnings from the 'ar' tool on some systems. - - (gcc) Don't try to set soname on NT. - -Developer visible changes: - - - Generator priorities are gone, explicit overrides are used. - - 'Active' features were removed - - Support for VMS paths was added. - -Thanks to Christopher Currie, Pedro Ferreira, Philipp Frauenfelder, -Andre Hentz, Jurgen Hunold, Toon Knapen, Johan Nilsson, Alexey Pakhunov, -Brock Peabody, Michael Stevens and Zbynek Winkler who contributed -code to this release. - - -Milestone 9.1 (Nov 6, 2003) - -The following bugs were fixed: - - - The 'unit-test' rule used to ignore properties. - - The gcc toolset used to ignore property. - -Milestone 9 (Nov 6, 2003) - -Changes in this release - - - Putting library in sources of other library now works even for static - linking, which makes expressing library->library dependency much - simpler. - - Performance was considerably improved. - - Regression testing framework now works on windows. - - The "alias" rule can have usage requirements and passes on usage - requirements of sources. - - The "stage" rule can traverse dependencies. - - Support for "def files" was implemented. - - Targets paths are now shorter. - - Darwin toolset was improved. - -The following bugs were fixed: - - - It was not possible to specify empty suffix for a target type derived - from other type. - - The stage rules used to generate incorrect suffix in some cases. - - It was possible to load Jamfile twice. - - The 'use-project' rule was broken when referring to a child project. - - Use of composite properties in requirements did not work. - -Developer visible changes: - - - New CALC builtin, which considerable improves performance. - - Source layout was reorganized. - - Handling of response file was simplified. - -Thanks to Pedro Ferreira, Kirill Lapshin, Andre Hentz, Paul Lin, -Jurgen Hunold, Christopher Currie, and Brock Peabody, who contributed to -this release. - -Milestone 8 (Oct 15, 2003) - -Changes in this release: - - - A regression testing framework was implemented. - - New feature was added for better handling - of dependencies to generated headers. - - The link-compatibility checks not longer cause projects to be skipped, - and issue warning, not error, for main targets. - - Algorithm for selecting main target alternative was improved. - - The feature was renamed to . - - Project root constants were made available in project root itself. - -The following bugs were fixed: - - - failure to recognize shared libraries with version as such - - the 'path-constant' rule was mishandling absolute paths on Windows. - - -Milestone 7 (Sep 11, 2003) - -Changes in this release: - - - Performance was improved. - - Support for Sun and Darwin toolsets was added. - - feature, which changes the name of target depending of build - variant, was implemented. - - Old-style targets-ids are no longer supported. - - New 'glob' rule allows to easily perform wildcard matching in Jamfile. - - Improve bison/flex support to understand C++. - -The following bugs were fixed: - - - bogus error on use of project default-build attribute with several - main target alternatives. - - broken toolset inheritance - - hard error after skipping a target due to incompatible requirements - - incorrect behaviour of a generator when producing several targets of - the same type - - errors on use of the 'project-root' rule in Jamfile context - - inability to require specific compiler version for a main target. - - incorrect behaviour of "bjam msvc" when msvc is configured with explicit - version. - -Thanks to Christopher Currie, Pedro Ferreira and Michael Stevens, who -contributed to this release. - - - - diff --git a/v2/debian/boost-build.docs b/v2/debian/boost-build.docs deleted file mode 100644 index 70af14954..000000000 --- a/v2/debian/boost-build.docs +++ /dev/null @@ -1,4 +0,0 @@ -boost_build_v2.html -index_v2.html -boost.png -doc \ No newline at end of file diff --git a/v2/debian/boost-build.examples b/v2/debian/boost-build.examples deleted file mode 100644 index e5a7b8d3b..000000000 --- a/v2/debian/boost-build.examples +++ /dev/null @@ -1 +0,0 @@ -example/* \ No newline at end of file diff --git a/v2/debian/changelog b/v2/debian/changelog deleted file mode 100644 index bfc1f139c..000000000 --- a/v2/debian/changelog +++ /dev/null @@ -1,6 +0,0 @@ -boost-build (2.0.m10-1) unstable; urgency=low - - * Initial Release. - - -- Vladimir Prus Wed, 14 Aug 2002 14:08:00 +0400 - diff --git a/v2/debian/conffiles b/v2/debian/conffiles deleted file mode 100644 index 291d688ed..000000000 --- a/v2/debian/conffiles +++ /dev/null @@ -1 +0,0 @@ -/etc/site-config.jam diff --git a/v2/debian/control b/v2/debian/control deleted file mode 100644 index 7d1733e78..000000000 --- a/v2/debian/control +++ /dev/null @@ -1,13 +0,0 @@ -Source: boost-build -Section: devel -Priority: optional -Maintainer: Vladimir Prus -Build-Depends: debhelper (>> 3.0.0), docbook-to-man, bison -Standards-Version: 3.5.2 - -Package: boost-build -Architecture: all -Depends: ${shlibs:Depends}, bjam (>> 3.1.9-1) -Description: Build system - Boost.Build is a build system with a simple and high-level language. - It supports build variants, and several different compilers and tools. diff --git a/v2/debian/copyright b/v2/debian/copyright deleted file mode 100644 index e69de29bb..000000000 diff --git a/v2/debian/excludes b/v2/debian/excludes deleted file mode 100644 index 59882930d..000000000 --- a/v2/debian/excludes +++ /dev/null @@ -1,14 +0,0 @@ -boost.css -boost_build_v2.html -index_v2.html -boost.png -generators_prototype.py -hacking.txt -release_procedure.txt -site-config.jam -roll.sh -debian -doc -example -test -CVS \ No newline at end of file diff --git a/v2/debian/rules b/v2/debian/rules deleted file mode 100755 index 96ccc418b..000000000 --- a/v2/debian/rules +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# This file is public domain software, originally written by Joey Hess. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -build: -clean: -binary-arch: - -binary-indep: - dh_testdir - dh_testroot - - dh_clean -k - dh_installdirs usr/share/boost-build etc - - # Add here commands to install the package into debian/ - (tar --exclude-from debian/excludes -cpf - * ) | (cd `pwd`/debian/tmp/usr/share/boost-build && tar xpf - ) - chmod a-x -R `pwd`/debian/tmp/usr/share/boost-build - - dh_installchangelogs - dh_installdocs -XCVS - mv `pwd`/debian/tmp/usr/share/doc/boost-build/index_v2.html `pwd`/debian/tmp/usr/share/doc/boost-build/index.html - - (tar --exclude make --exclude CVS -cpf - example/* ) | ( cd `pwd`/debian/tmp/usr/share/doc/boost-build && tar xpf - ) - - sed 's/# using gcc ;/using gcc ;/' user-config.jam > `pwd`/debian/tmp/etc/site-config.jam - -# dh_install -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installcatalogs -# dh_installpam -# dh_installmime -# dh_installinit -# dh_installcron -# dh_installinfo -# dh_undocumented - dh_installman - dh_link - dh_compress - dh_fixperms -# dh_perl -# dh_python -# dh_makeshlibs - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install diff --git a/v2/doc/Jamfile.v2 b/v2/doc/Jamfile.v2 deleted file mode 100644 index a00f6ff7d..000000000 --- a/v2/doc/Jamfile.v2 +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2004,2006 Vladimir Prus -# 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 quickbook - ; - -project tools/build/v2/doc - ; - -boostbook userman : src/standalone.xml - : toc.section.depth=1 - doc.standalone=true - nav.layout=none - jam_docs - jam_docs - ; - -xml jam_docs : ../../../jam/doc/bjam.qbk ; - -if ! $(BOOST_ROOT) -{ - BOOST_ROOT = [ modules.peek : BOOST_ROOT ] ; -} - -# Copy stylesheet and images from 'official' docs location -stage html : $(BOOST_ROOT)/doc/html/boostbook.css ; -stage html/images - : [ path.glob $(BOOST_ROOT)/doc/html/images : *.png ] ; diff --git a/v2/doc/development_plan.html b/v2/doc/development_plan.html deleted file mode 100644 index 598c23dae..000000000 --- a/v2/doc/development_plan.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - Boost Build System V2 - - - - boost.png (6897 bytes) - - -

Boost Build Development Plan

- -
-
- -

© Copyright Vladimir Prus 2002-2003. Permission to copy, use, - modify, sell and distribute this document is granted provided this - copyright notice appears in all copies. This document is provided "as is" - without express or implied warranty, and with no claim as to its - suitability for any purpose.

- -

Revised - 23 Aug, 2004 - -

- - - diff --git a/v2/doc/src/advanced.xml b/v2/doc/src/advanced.xml deleted file mode 100644 index 3b535403b..000000000 --- a/v2/doc/src/advanced.xml +++ /dev/null @@ -1,1235 +0,0 @@ - - - - - Overview - - This section will provide the information necessary to create your own - projects using Boost.Build. The information provided here is relatively - high-level, and as - well as the on-line help system must be used to obtain - low-level documentation (see ). - - Boost.Build actually consists of two parts - Boost.Jam, a - build engine with its own interpreted language, and Boost.Build itself, - implemented in Boost.Jam's language. The chain of events when - you type bjam on the command line is: - - - Boost.Jam tries to find Boost.Build and loads the top-level - module. The exact process is described in - - - The top-level module loads user-defined configuration - files, user-config.jam and site-config.jam, which define - available toolsets. - - - The Jamfile in the current directory is read. That in turn - might cause reading of further Jamfiles. As a result, a tree of - projects is created, with targets inside projects. - - - Finally, using the build request specified on the command line, - Boost.Build decides which targets should be built, and how. That - information is passed back to Boost.Jam, which takes care of - actually running commands. - - - - - So, to be able to successfully use Boost.Build, you need to know only - four things: - - - - How to configure Boost.Build - - - - How to write declares targets in Jamfiles - - - - How the build process works - - - Some Basics about the Boost.Jam language. See - . - - - - - -
- Boost.Jam Language - - This section will describe the basics of the Boost.Jam - language—just enough for writing Jamfiles. For more information, - please see the Boost.Jam - documentation. - - Boost.Jam has an interpreted, procedural language. - On the lowest level, a Boost.Jam program consists of variables and - rule - rules (the Jam term for function). They are grouped - in modules—there's one global module and a number of named - modules. Besides that, a Boost.Jam program contains classes and class - instances. - - - Syntantically, a Boost.Jam program consists of two kind of - elements—keywords (which have a special meaning to Boost.Jam) and - literals. - - Consider this code: - -a = b ; - which assigns the value b to the variable - a. Here, = and - ; are keywords, while a and - b are literals. - - All syntax elements, even keywords, must be separated by - spaces. For example, omitting the space character before - ; will lead to a syntax error. - - - If you want to use a literal value that is the same as some keyword, the - value can be quoted: - -a = "=" ; - - - All variables in Boost.Jam have the same type—list of - strings. To define a variable one assigns a value to it, like in the - previous example. An undefined variable is the same as a variable with - an empty value. Variables can be accessed with the - $(variable) syntax. For example: - -a = $(b) $(c) ; - - - - Rules are defined by specifying the rule name, the parameter names, - and the allowed size of the list value for each parameter. - -rule example - ( - parameter1 : - parameter2 ? : - parameter3 + : - parameter4 * - ) - { - // body - } - When this rule is called, the list passed as the first argument must - have exactly one value. The list passed as the second argument can - either have one value of be empty. The two remaining arguments can - be arbitrary long, but the third argument may not be empty. - - - The overview of Boost.Jam language statements is given below: - -helper 1 : 2 : 3 ; -x = [ helper 1 : 2 : 3 ] ; - This code calls the named rule with the specified arguments. When the - result of the call must be used inside some expression, you need to add - brackets around the call, like shown on the second line. - -if cond { statements } [ else { statements } ] - This is a regular if-statement. The condition is composed of: - - Literals (true if at least one string is not empty) - Comparisons: a - operator b where - operator is one of =, - !=, <, >, - <=, >=. The comparison is done - pairwise between each string in the left and the right arguments. - - - Logical operations: ! a, a && - b, a || b - Grouping: ( cond ) - - -for var in list { statements } - Executes statements for each element in list, setting the variable - var to the element value. - -while cond { statements } - Repeatedly execute statements while cond remains true upon entry. - -return values ; - This statement should be used only inside a - rule and assigns values to the return value of the - rule. - - The return statement does not exit the rule. For example: - -rule test ( ) -{ - if 1 = 1 { - return "reasonable" ; - } - return "strange" ; -} will return strange, not -reasonable. - - - -import module ; -import module : rule ; - The first form imports the specified bjam module. All rules from - that module are made available using the qualified name: - module.rule. - The second form imports the specified rules only, and they can be called - using unqualified names. - - - - Sometimes, you'd need to specify the actual command lines to be used - when creating targets. In jam language, you use named actions to do this. - For example: - -actions create-file-from-another -{ - create-file-from-another $(<) $(>) -} - - This specifies a named action called - create-file-from-another. The text inside braces is the - command to invoke. The $(<) variable will be expanded to list of - generated files, and the $(>) variable will be expanded - to the list of source files. - - - To flexibly adjust command line, you can define a rule with the - same name as the action, and taking three parameters -- targets, sources - and properties. For example: - -rule create-file-from-another ( targets * : sources * : properties * ) -{ - if <variant>debug in $(properties) - { - OPTIONS on $(targets) = --debug ; - } -} -actions create-file-from-another -{ - create-file-from-another $(OPTIONS) $(<) $(>) -} - - In this example, the rule checks if certain build property is specified. - If so, it sets variable OPIONS that's used inside - action. Note that the variable is set "on targets" -- the value will - be only visible inside action, not globally. Were it set globally, - using variable named OPTIONS in two unrelated - actions would be impossible. - - - More details can be found in Jam reference, - - -
- -
- Configuration - - The Boost.Build configuration is specified in the file - user-config.jam. You can edit the one in the top-level - directory of Boost.Build installation or create a copy in your home directory - and edit that. (See for the - exact search paths.) The primary function of that file is to declare which - compilers and other tools are available. The simplest syntax to configure - a tool is: - - -using tool-name ; - - The using rule is given a name of tool, and will make that tool - available to Boost.Build. For example, using gcc ; will make the gcc compiler - available. - - - - Since nothing but a tool name is specified, Boost.Build will - pick some default settings. For example, it will use the - gcc executable found in the - PATH, or look in some known installation - locations. In most cases, this strategy works automatically. In - case you have several versions of a compiler, it's installed in - some unusual location, or you need to tweak its configuration, - you'll need to pass additional parameters to the - using rule. The parameters to - using can be different for each - tool. You can obtain specific documentation for any tool's - configuration parameters by invoking - -bjam --help tool-name.init - - - - That said, for all the compiler toolsets Boost.Build supports - out-of-the-box, the list of parameters to - using is the same: toolset-name, version, invocation-command, and options. - - - - The version - parameter identifies the toolset version, in case you have - several installed. It can have any form you like, but - it's recommended that you use a numeric identifier like - 7.1. - - - - The invocation-command - parameter is the command that must be executed to run the - compiler. This parameter can usually be omitted if the compiler - executable - - has its “usual - name” and is in the PATH, - or - was installed in a standard - “installation directory”, - or - - can be found through a global mechanism like the - Windows registry. - - - For example: - -using msvc : 7.1 ; -using gcc ; - -If the compiler can be found in the PATH but only by a -nonstandard name, you can just supply that name: - -using gcc : : g++-3.2 ; - -Otherwise, it might be necessary to supply the complete path to the -compiler executable: - -using msvc : : "Z:/Programs/Microsoft Visual Studio/vc98/bin/cl" ; - -Some Boost.Build toolsets will use that path to take additional -actions required before invoking the compiler, such as calling -vendor-supplied scripts to set up its required environment variables. -When compiler executables for C and C++ are different, path to the C++ -compiler executable must be specified. The “invocation command” -can be any command allowed by the operating system. For example: - -using msvc : : echo Compiling && foo/bar/baz/cl ; - -will work. - - - To configure several versions of a toolset, simply invoke - the using rule multiple times: - -using gcc : 3.3 ; -using gcc : 3.4 : g++-3.4 ; -using gcc : 3.2 : g++-3.2 ; - - Note that in the first call to - using, the compiler found in the - PATH will be used, and there's no need to - explicitly specify the command. - - - As shown above, both the version and invocation-command parameters are - optional, but there's an important restriction: if you configure - the same toolset more than once, you must pass the version - parameter every time. For example, the following is not allowed: - -using gcc ; -using gcc : 3.4 : g++-3.4 ; - - because the first using call does - not specify a version. - - - The options - parameter is used to fine-tune the configuration. All of - Boost.Build's standard compiler toolsets accept properties of the - four builtin features cflags, - cxxflags, compileflags and - linkflags as options specifying flags that will be - always passed to the corresponding tools. Values of the - cflags feature are passed directly to the C - compiler, values of the cxxflags feature are - passed directly to the C++ compiler, and values of the - compileflags feature are passed to both. For - example, to configure a gcc toolset so that it - always generates 64-bit code you could write: - -using gcc : 3.4 : : <compileflags>-m64 <linkflags>-m64 ; - - - -
- -
- Invocation - - This section describes how invoke Boost.Build from the command line - - To build all targets defined in Jamfile in the current directory with default properties, run: - -bjam - - - To build specific targets, specify them on the command line: - -bjam lib1 subproject//lib2 - - - - To request a certain value for some property, add - property=value to the command line: - -bjam toolset=gcc variant=debug optimization=space - - For often used features, like toolset and variant you can - omit the feature name, so the above can be written as: - -bjam optimization=space - - - - - Boost.Build recognizes the following command line options. - - - - - - - Cleans all targets in the current directory and - in any subprojects. Note that unlike the clean - target in make, you can use --clean - together with target names to clean specific targets. - - - - - - - Cleans all targets, - no matter where they are defined. In particular, it will clean targets - in parent Jamfiles, and targets defined under other project roots. - - - - - - - - Changes build directories for all project roots being built. When - this option is specified, all Jamroot files should declare project name. - The build directory for the project root will be computed by concatanating - the value of the option, the project name - specified in Jamroot, and the build dir specified in Jamroot - (or bin, if none is specified). - - - The option is primarily useful when building from read-only - media, when you can't modify Jamroot. - - - - - - - - Prints information on Boost.Build and Boost.Jam - versions. - - - - - - - - Invokes the online help system. This prints general - information on how to use the help system with additional - --help* options. - - - - - - - - Produces debug information about loading of Boost.Build - and toolset files. - - - - - - - Prints what targets are being built and with what properties. - - - - - - - - Produces debug output from generator search process. - Useful for debugging custom generators. - - - - - - - - Do not load site-config.jam and - user-config.jam configuration files. - - - - - - - - Enables internal checks. - - - - - - - - For complete specification of command line syntax, see - - - - -
- -
- Declaring Targets - - - A Main target is a user-defined named - entity that can be built, for example an executable file. - Declaring a main target is usually done using one of the main - target rules described in . The user can also declare - custom main target rules as shown in . - - - main targetdeclaration - syntax - Most main target rules in Boost.Build have the same common - signature: - - - -common signature - - -rule rule-name ( - main-target-name : - sources + : - requirements * : - default-build * : - usage-requirements * ) - - - - - - main-target-name is the name used - to request the target on command line and to use it from - other main targets. A main target name may contain - alphanumeric characters, dashes - (‘-’), and underscores - (‘_’). - - - - - - sources is the list of source files and other main - targets that must be combined. - - - - - - requirements is the list of properties that must always - be present when this main target is built. - - - - - - default-build is the list of properties that will be used - unless some other value of the same feature is already - specified, e.g. on the command line or by propagation from a dependent target. - - - - - - usage-requirements is the list of properties that will be - propagated to all main targets that use this one, i.e. to all its - dependents. - - - - - - Some main target rules have a different list of parameters as explicitly - stated in their documentation. - - - The actual requirements for a target are obtained by refining - requirements of the project where a target is declared with the - explicitly specified requirements. The same is true for - usage-requirements. More details can be found in - - - -
- Name - - - The name of main target has two purposes. First, it's used to refer to this target from - other targets and from command line. Second, it's used to compute the names of the generated files. - Typically, filenames are obtained from main target name by appending system-dependent suffixes and - prefixes. - - - The name of a main target can contain alphanumeric characters, - dashes, undescores and dots. The entire - name is significant when resolving references from other targets. For determining filenames, only the - part before the first dot is taken. For example: - -obj test.release : test.cpp : <variant>release ; -obj test.debug : test.cpp : <variant>debug ; - - will generate two files named test.obj (in two different directories), not - two files named test.release.obj and test.debug.obj. - - -
- -
- Sources - - The list of sources specifies what should be processed to - get the resulting targets. Most of the time, it's just a list of - files. Sometimes, you'll want to automatically construct the - list of source files rather than having to spell it out - manually, in which case you can use the - glob rule. Here are two examples: - -exe a : a.cpp ; # a.cpp is the only source file -exe b : [ glob *.cpp ] ; # all .cpp files in this directory are sources - - - Unless you specify a file with an absolute path, the name is - considered relative to the source directory — which is typically - the directory where the Jamfile is located, but can be changed as - described in . - - - - - The list of sources can also refer to other main targets. - Targets in the same project can be referred to by name, while - targets in other projects must be qualified with a directory or a - symbolic project name. The directory/project name is separated from - the target name by a double forward slash. There's no special syntax to - distinguish the directory name from the project name—the part before - the double slash is first looked up as project name, and then as directory - name. For example: - - - -lib helper : helper.cpp ; -exe a : a.cpp helper ; -# Since all project ids start with slash, ".." is directory name. -exe b : b.cpp ..//utils ; -exe c : c.cpp /boost/program_options//program_options ; - - - The first exe uses the library defined in the same - project. The second one uses some target (most likely library) - defined by Jamfile one level higher. Finally, the third target - uses some C++ Boost - library, referring to it by absolute symbolic name. More - information about target references can be found in and . - - -
- -
- Requirements - Requirements are the properties that should always be present when - building a target. Typically, they are includes and defines: - -exe hello : hello.cpp : <include>/opt/boost <define>MY_DEBUG ; - - There is a number of other features, listed in - . For example if - a library can only be built statically, or a file can't be compiled - with optimization due to a compiler bug, one can use - -lib util : util.cpp : <link>static ; -obj main : main.cpp : <optimization>off ; - - - - Sometimes, particular relationships need to be maintained - among a target's build properties. This can be achieved with - conditional - requirements. For example, you might want to set - specific #defines when a library is built as shared, - or when a target's release variant is built in - release mode. - -lib network : network.cpp - : <link>shared:<define>NEWORK_LIB_SHARED - <variant>release:<define>EXTRA_FAST - ; - - - In the example above, whenever network is - built with <link>shared, - <define>NEWORK_LIB_SHARED will be in its - properties, too. - - - You can use several properties in the condition, for example: - -lib network : network.cpp - : <toolset>gcc,<optimization>speed:<define>USE_INLINE_ASSEMBLER - ; - - - - - A more powerful variant of conditional requirements - is indirect conditional requirements. - You can provide a rule that will be called with the current build properties and can compute additional properties - to be added. For example: - -lib network : network.cpp - : <conditional>@my-rule - ; -rule my-rule ( properties * ) -{ - local result ; - if <toolset>gcc <optimization>speed in $(properties) - { - result += <define>USE_INLINE_ASSEMBLER ; - } - return $(result) ; -} - - This example is equivalent to the previous one, but for complex cases, indirect conditional - requirements can be easier to write and understand. - - - Requirements explicitly specified for a target are usually - combined with the requirements specified for the containing project. You - can cause a target to completely ignore specific project's requirement - using the syntax by adding a minus sign before a property, for example: - -exe main : main.cpp : -<define>UNNECESSARY_DEFINE ; - - This syntax is the only way to ignore free properties from a parent, - such as defines. It can be also useful for ordinary properties. Consider - this example: - -project test : requirements <threading;>multi ; -exe test1 : test1.cpp ; -exe test2 : test2.cpp : <threading;>single ; -exe test3 : test3.cpp : -<threading;>multi ; - - Here, test1 inherits project requirements and will always - be built in multi-threaded mode. The test2 target - overrides project's requirements and will - always be built in single-threaded mode. In contrast, the - test3 target removes a property - from project requirements and will be built either in single-threaded or - multi-threaded mode depending on which variant is requested by the - user. - - Note that the removal of requirements is completely textual: - you need to specify exactly the same property to remove it. - -
- -
- Default Build - - The default-build parameter - is a set of properties to be used if the build request does - not otherwise specify a value for features in the set. For example: - -exe hello : hello.cpp : : <threading>multi ; - - would build a multi-threaded target unless the user - explicitly requests a single-threaded version. The difference between - requirements and default-build is that requirements cannot be - overridden in any way. - -
- -
- Additional Information - - - The ways a target is built can be so different that - describing them using conditional requirements would be - hard. For example, imagine that a library actually uses - different source files depending on the toolset used to build - it. We can express this situation using target - alternatives: - -lib demangler : dummy_demangler.cpp ; # alternative 1 -lib demangler : demangler_gcc.cpp : <toolset>gcc ; # alternative 2 -lib demangler : demangler_msvc.cpp : <toolset>msvc ; # alternative 3 - - In the example above, when built with gcc - or msvc, demangler - will use a source file specific to the toolset. Otherwise, it - will use a generic source file, - dummy_demangler.cpp. - - - It is possible to declare a target inline, i.e. the "sources" - parameter may include calls to other main rules. For example: - - -exe hello : hello.cpp - [ obj helpers : helpers.cpp : <optimization>off ] ; - - - Will cause "helpers.cpp" to be always compiled without - optimization. When referring to an inline main target, its declared - name must be prefixed by its parent target's name and two dots. In - the example above, to build only helpers, one should run - bjam hello..helpers. - - - When no target is requested on the command line, all targets in the - current project will be built. If a target should be built only by - explicit request, this can be expressed by the - explicit rule: - -explicit install_programs ; - - -
-
- -
- Projects - - As mentioned before, targets are grouped into projects, - and each Jamfile is a separate project. Projects are useful - because they allow us to group related targets together, define - properties common to all those targets, and assign a symbolic - name to the project that can be used in referring to its - targets. - - - Projects are named using the - project rule, which has the - following syntax: - -project id : attributes ; - - Here, attributes is a sequence of - rule arguments, each of which begins with an attribute-name - and is followed by any number of build properties. The list - of attribute names along with its handling is also shown in - the table below. For example, it is possible to write: - -project tennis - : requirements <threading>multi - : default-build release - ; - - - - The possible attributes are listed below. - - Project id is a short way to denote a project, as - opposed to the Jamfile's pathname. It is a hierarchical path, - unrelated to filesystem, such as "boost/thread". Target references make use of project ids to - specify a target. - - - Source location specifies the directory where sources - for the project are located. - - Project requirements are requirements that apply to - all the targets in the projects as well as all subprojects. - - Default build is the build request that should be - used when no build request is specified explicitly. - - - - The default values for those attributes are - given in the table below. - - - - <tgroup cols="4"> - <thead> - <row> - <entry>Attribute</entry> - - <entry>Name</entry> - - <entry>Default value</entry> - - <entry>Handling by the <functionname>project</functionname> - rule</entry> - - </row> - </thead> - - <tbody> - - <row> - <entry>Project id</entry> - - <entry>none</entry> - - <entry>none</entry> - - <entry>Assigned from the first parameter of the 'project' rule. - It is assumed to denote absolute project id.</entry> - </row> - - <row> - <entry>Source location</entry> - - <entry><literal>source-location</literal></entry> - - <entry>The location of jamfile for the project</entry> - - <entry>Sets to the passed value</entry> - </row> - - <row> - <entry>Requirements</entry> - - <entry><literal>requirements</literal></entry> - - <entry>The parent's requirements</entry> - - <entry>The parent's requirements are refined with the passed - requirement and the result is used as the project - requirements.</entry> - </row> - - <row> - <entry>Default build</entry> - - <entry><literal>default-build</literal></entry> - - <entry>none</entry> - - <entry>Sets to the passed value</entry> - </row> - - <row> - <entry>Build directory</entry> - - <entry><literal>build-dir</literal></entry> - - <entry>Empty if the parent has no build directory set. - Otherwise, the parent's build directory with the - relative path from parent to the current project - appended to it. - </entry> - - <entry>Sets to the passed value, interpreted as relative to the - project's location.</entry> - </row> - </tbody> - </tgroup> - </table> - </para> - - <para>Besides defining projects and main targets, Jamfiles - often invoke various utility rules. For the full list of rules - that can be directly used in Jamfile see - <xref linkend="bbv2.reference.rules"/>. - </para> - - <para>Each subproject inherits attributes, constants and rules - from its parent project, which is defined by the nearest - Jamfile in an ancestor directory above - the subproject. The top-level project is declared in a file - called <filename>Jamroot</filename> rather than - <filename>Jamfile</filename>. When loading a project, - Boost.Build looks for either <filename>Jamroot</filename> or - <code>Jamfile</code>. They are handled identically, except - that if the file is called <filename>Jamroot</filename>, the - search for a parent project is not performed. - </para> - - <para>Even when building in a subproject directory, parent - project files are always loaded before those of their - subprojects, so that every definition made in a parent project - is always available to its children. The loading order of any - other projects is unspecified. Even if one project refers to - another via the <code>use-project</code> or a target reference, - no specific order should be assumed. - </para> - - <note> - <para>Giving the root project the special name - “<filename>Jamroot</filename>” ensures that - Boost.Build won't misinterpret a directory above it as the - project root just because the directory contains a Jamfile. - <!-- The logic of the previous reasoning didn't hang together --> - </para> - </note> - - <!-- All this redundancy with the tutorial is bad. The tutorial - should just be made into the introductory sections of this - document, which should be called the "User Guide." It's - perfectly appropriate to start a user guide with that kind - of material. --> - </section> - - <section id="bbv2.advanced.build_process"> - <title>The Build Process - - When you've described your targets, you want Boost.Build to run the - right tools and create the needed targets. - - This section will describe - two things: how you specify what to build, and how the main targets are - actually constructed. - - - The most important thing to note is that in Boost.Build, unlike - other build tools, the targets you declare do not correspond to specific - files. What you declare in a Jamfile is more like a “metatarget.†- - Depending on the properties you specify on the command line, - each metatarget will produce a set of real targets corresponding - to the requested properties. It is quite possible that the same - metatarget is built several times with different properties, - producing different files. - - - - This means that for Boost.Build, you cannot directly obtain a build - variant from a Jamfile. There could be several variants requested by the - user, and each target can be built with different properties. - - - -
- Build Request - - - The command line specifies which targets to build and with which - properties. For example: - -bjam app1 lib1//lib1 toolset=gcc variant=debug optimization=full - - would build two targets, "app1" and "lib1//lib1" with the specified - properties. You can refer to any targets, using - target id and specify arbitrary - properties. Some of the properties are very common, and for them the name - of the property can be omitted. For example, the above can be written as: - -bjam app1 lib1//lib1 gcc debug optimization=full - - The complete syntax, which has some additional shortcuts, is - described in . - -
- -
Building a main target - - When you request, directly or indirectly, a build of a main target - with specific requirements, the following steps are done. Some brief - explanation is provided, and more details are given in . - - - Applying default build. If the default-build - property of a target specifies a value of a feature that is not - present in the build request, that value is added. - - - - Selecting the main target alternative to use. For - each alternative we look how many properties are present both in - alternative's requirements, and in build request. The - alternative with large number of matching properties is selected. - - - Determining "common" properties. - - The build request - is refined - with target's requirements. - - The conditional properties in - requirements are handled as well. Finally, default values of - features are added. - - - Building targets referred by the sources list and - dependency properties. The list of sources and the properties - can refer to other target using target references. For each - reference, we take all propagated - properties, refine them by explicit properties specified in the - target reference, and pass the resulting properties as build - request to the other target. - - - Adding the usage requirements produced when building - dependencies to the "common" properties. When dependencies are - built in the previous step, they return - - both the set of created - "real" targets, and usage requirements. The usage requirements - are added to the common properties and the resulting property - set will be used for building the current target. - - - Building the target using generators. To convert the - sources to the desired type, Boost.Build uses "generators" --- - objects that correspond to tools like compilers and - linkers. Each generator declares what type of targets it - - can - produce and what type of sources it requires. Using this - information, Boost.Build determines which generators must be run - to produce a specific target from specific sources. When - generators are run, they return the "real" targets. - - - Computing the usage requirements to be returned. The - conditional properties in usage requirements are expanded - - and the - result is returned. - - -
- -
Building a Project - - Often, a user builds a complete project, not just one main - target. In fact, invoking bjam without - arguments - - builds the project defined in the current - directory. - - When a project is built, the build request is passed without - modification to all main targets in that project. - - It's is possible to - prevent implicit building of a target in a project with the - explicit rule: - -explicit hello_test ; - - would cause the hello_test target to be built only if - explicitly requested by the user or by some other target. - - - The Jamfile for a project can include a number of - build-project rule calls - - that specify additional projects - to be built. - - -
- - - - - - diff --git a/v2/doc/src/architecture.xml b/v2/doc/src/architecture.xml deleted file mode 100644 index 01c50fa94..000000000 --- a/v2/doc/src/architecture.xml +++ /dev/null @@ -1,636 +0,0 @@ - - - - - Boost.Build v2 architecture - - - This document is work-in progress. Don't expect much from it - yet. - - -
- Overview - - The Boost.Build code is structured in four different components: - "kernel", "util", "build" and "tools". The first two are relatively - uninteresting, so we'll focus on the remaining pair. The "build" component - provides classes necessary to declare targets, determine which properties - should be used for their building, and for creating the dependency - graph. The "tools" component provides user-visible functionality. It - mostly allows to declare specific kind of main targets, and declare - avaiable tools, which are then used when creating the dependency graph. - - -
- -
- The build layer - - The build layer has just four main parts -- metatargets (abstract targets), - virtual targets, generators and properties. - - Metatargets (see the "targets.jam" module) represent - all the user-defined entities which can be built. The "meta" prefix - signify that they don't really corrspond to files -- depending of - build request, they can produce different set of - files. Metatargets are created when Jamfiles are loaded. Each - metagarget has a generate method which is given a - property set and produces virtual targets for the passed properties. - - Virtual targets (see the "virtual-targets.jam" - module) correspond to the atomic things which can be updated -- - most typically files. - - Properties are just (name, value) pairs, specified - by the user and describing how the targets should be - built. Properties are stored using the property-set class. - - Generators are the objects which encapsulate tools - -- they can take a list of source virtual targets and produce new - virtual targets from them. - - - - - The build process includes those steps: - - Top-level code calls the generate - method of a metatarget with some properties. - - - The metatarget combines the requested properties - with requirements and passes the result, together with the list - of sources, to the generators.construct - function - - - A generator appropriate for the build properties is - selected and its run method is - called. The method returns a list of virtual targets - - - The targets are returned to the top level code. They - are converted into bjam targets (via - virtual-target.actualize) and passed to bjam for building. - - - - -
- Metatargets - - There are several classes derived from "abstract-target". The - "main-target" class represents top-level main target, the "project-target" - acts like container for all main targets, and "basic-target" class is a - base class for all further target types. - - - Since each main target can have several alternatives, all top-level - target objects are just containers, referring to "real" main target - classes. The type is that container is "main-target". For example, given: - -alias a ; -lib a : a.cpp : <toolset>gcc ; - - we would have one-top level instance of "main-target-class", which will - contain one instance of "alias-target-class" and one instance of - "lib-target-class". The "generate" method of "main-target" decides - which of the alternative should be used, and call "generate" on the - corresponding instance. - - - Each alternative is a instance of a class derived from - "basic-target". The "basic-target.generate" does several things that are - always should be done: - - - Determines what properties should be used for building the - target. This includes looking at requested properties, requirements, - and usage requirements of all sources. - - - Builds all sources - - - Computes the usage requirements which should be passes back. - - - For the real work of constructing virtual target, a new method - "construct" is called. - - - The "construct" method can be implemented in any way by classes - derived from "basic-target", but one specific derived class plays the - central role -- "typed-target". That class holds the desired type of file - to be produces, and calls the generators modules to do the job. - - - This means that a specific metatarget subclass may avoid using - generators at all. However, this is deprecated and we're trying to - eliminate all such subsclasses at the moment. - - - Note that the build/targets.jam file contains - an UML diagram which might help. - -
- -
- Virtual targets - - Virtual targets correspond to the atomic things which can be - updated. Each virtual target can be assigned an updating action -- - instance of the action class. The action class, in - turn, contains a list of source targets, properties, and a name of - bjam action block which should be executed. - - - We try hard to never create equal instances of the - virtual-target class. Each code which creates virtual - targets passes them though the virtual-target.register - function, which detects if a target with the same name, sources, and - properties was created. In that case, existing target is returned. - - - When all virtual targets are produced, they are - "actualized". This means that the real file names are computed, and - the commands that should be run are generated. This is done by the - virtual-target.actualize method and the - action.actualize methods. The first is conceptually - simple, while the second need additional explanation. The commands - in bjam are generated in two-stage process. First, a rule with the - appropriate name (for example - "gcc.compile") is called and is given the names of targets. The rule - sets some variables, like "OPTIONS". After that, the command string - is taken, and variable are substitutes, so use of OPTIONS inside the - command string become the real compile options. - - - Boost.Build added a third stage to simplify things. It's now - possible to automatically convert properties to appropriate assignments to - variables. For example, <debug-symbols>on would add "-g" to the - OPTIONS variable, without requiring to manually add this logic to - gcc.compile. This functionality is part of the "toolset" module. - - - Note that the build/virtual-targets.jam file - contains an UML diagram which might help. -
- -
- Above, we noted that metatargets are built with a set of - properties. That set is represented with the - property-set class. An important point is that handling - of property sets can get very expensive. For that reason, we make - sure that for each set of (name, value) pairs only one - property-set instance is created. The - property-set uses extensive caching for all operation, - so most work is avoided. The property-set.create is the - factory function which should be used to create instances of the - property-set class. - -
- - -
- -
- The tools layer - - Write me! - -
- -
- Targets - - NOTE: THIS SECTION IS NOT EXPECTED TO BE READ! - There are two user-visible kinds of targets in Boost.Build. - First are "abstract" — they correspond to things declared - by user, for example, projects and executable files. The primary - thing about abstract target is that it's possible to request them - to be build with a particular values of some properties. Each - combination of properties may possible yield different set of - real file, so abstract target do not have a direct correspondence - with files. - - File targets, on the contary, are associated with concrete - files. Dependency graphs for abstract targets with specific - properties are constructed from file targets. User has no was to - create file targets, however it can specify rules that detect - file type for sources, and also rules for transforming between - file targets of different types. That information is used in - constructing dependency graph, as desribed in the "next section". - [ link? ] Note:File targets are not - the same as targets in Jam sense; the latter are created from - file targets at the latest possible moment. Note:"File - target" is a proposed name for what we call virtual targets. It - it more understandable by users, but has one problem: virtual - targets can potentially be "phony", and not correspond to any - file. - -
- Dependency scanning - - Dependency scanning is the process of finding implicit - dependencies, like "#include" statements in C++. The requirements - for right dependency scanning mechanism are: - - - - - Support for different scanning algorithms. C++ and XML have - quite different syntax for includes and rules for looking up - included files. - - - - - - Ability to scan the same file several times. For example, - single C++ file can be compiled with different include - paths. - - - - - - Proper detection of dependencies on generated files. - - - - - - Proper detection of dependencies from generated file. - - - - -
- Support for different scanning algorithms - - Different scanning algorithm are encapsulated by objects - called "scanners". Please see the documentation for "scanner" - module for more details. - -
- -
- Ability to scan the same file several times - - As said above, it's possible to compile a C++ file twice, with - different include paths. Therefore, include dependencies for - those compilations can be different. The problem is that bjam - does not allow several scans of the same target. - - The solution in Boost.Build is straigtforward. When a virtual - target is converted to bjam target (via - virtual-target.actualize method), we specify the scanner - object to be used. The actualize method will create different - bjam targets for different scanners. - - All targets with specific scanner are made dependent on target - without scanner, which target is always created. This is done in - case the target is updated. The updating action will be - associated with target without scanner, but if sources for that - action are touched, all targets — with scanner and without - should be considered outdated. - - For example, assume that "a.cpp" is compiled by two compilers - with different include path. It's also copied into some install - location. In turn, it's produced from "a.verbatim". The - dependency graph will look like: - - -a.o (<toolset>gcc) <--(compile)-- a.cpp (scanner1) ----+ -a.o (<toolset>msvc) <--(compile)-- a.cpp (scanner2) ----| -a.cpp (installed copy) <--(copy) ----------------------- a.cpp (no scanner) - ^ - | - a.verbose --------------------------------+ - - -
-
- Proper detection of dependencies on generated files. - - This requirement breaks down to the following ones. - - - - - If when compiling "a.cpp" there's include of "a.h", the - "dir" directory is in include path, and a target called "a.h" - will be generated to "dir", then bjam should discover the - include, and create "a.h" before compiling "a.cpp". - - - - - - Since almost always Boost.Build generates targets to a - "bin" directory, it should be supported as well. I.e. in the - scanario above, Jamfile in "dir" might create a main target, - which generates "a.h". The file will be generated to "dir/bin" - directory, but we still have to recornize the dependency. - - - - - The first requirement means that when determining what "a.h" - means, when found in "a.cpp", we have to iterate over all - directories in include paths, checking for each one: - - - - - If there's file "a.h" in that directory, or - - - - - - If there's a target called "a.h", which will be generated - to that directory. - - - - - Classic Jam has built-in facilities for point (1) above, but - that's not enough. It's hard to implement the right semantic - without builtin support. For example, we could try to check if - there's targer called "a.h" somewhere in dependency graph, and - add a dependency to it. The problem is that without search in - include path, the semantic may be incorrect. For example, one can - have an action which generated some "dummy" header, for system - which don't have the native one. Naturally, we don't want to - depend on that generated header on platforms where native one is - included. - - There are two design choices for builtin support. Suppose we - have files a.cpp and b.cpp, and each one includes header.h, - generated by some action. Dependency graph created by classic jam - would look like: - - -a.cpp -----> <scanner1>header.h [search path: d1, d2, d3] - - - <d2>header.h --------> header.y - [generated in d2] - -b.cpp -----> <scanner2>header.h [ search path: d1, d2, d4] - - - -In this case, Jam thinks all header.h target are not -realated. The right dependency graph might be: - - -a.cpp ---- - \ - \ - >----> <d2>header.h --------> header.y - / [generated in d2] - / -b.cpp ---- - - -or - - -a.cpp -----> <scanner1>header.h [search path: d1, d2, d3] - | - (includes) - V - <d2>header.h --------> header.y - [generated in d2] - ^ - (includes) - | -b.cpp -----> <scanner2>header.h [ search path: d1, d2, d4] - - - - -The first alternative was used for some time. The problem -however is: what include paths should be used when scanning -header.h? The second alternative was suggested by Matt Armstrong. -It has similiar effect: add targets which depend on -<scanner1>header.h will also depend on <d2>header.h. -But now we have two different target with two different scanners, -and those targets can be scanned independently. The problem of -first alternative is avoided, so the second alternative is -implemented now. - - - The second sub-requirements is that targets generated to "bin" - directory are handled as well. Boost.Build implements - semi-automatic approach. When compiling C++ files the process - is: - - - - - The main target to which compiled file belongs is found. - - - - - - All other main targets that the found one depends on are - found. Those include main target which are used as sources, or - present as values of "dependency" features. - - - - - - All directories where files belonging to those main target - will be generated are added to the include path. - - - - - After this is done, dependencies are found by the approach - explained previously. - - Note that if a target uses generated headers from other main - target, that main target should be explicitly specified as - dependency property. It would be better to lift this requirement, - but it seems not very problematic in practice. - - For target types other than C++, adding of include paths must - be implemented anew. - -
-
- Proper detection of dependencies from generated files - - Suppose file "a.cpp" includes "a.h" and both are generated by - some action. Note that classic jam has two stages. In first stage - dependency graph graph is build and actions which should be run - are determined. In second stage the actions are executed. - Initially, neither file exists, so the include is not found. As - the result, jam might attempt to compile a.cpp before creating - a.h, and compilation will fail. - - The solution in Boost.Jam is to perform additional dependency - scans after targets are updated. This break separation between - build stages in jam — which some people consider a good - thing — but I'm not aware of any better solution. - - In order to understand the rest of this section, you better - read some details about jam dependency scanning, available - - at this link. - - Whenever a target is updated, Boost.Jam rescans it for - includes. Consider this graph, created before any actions are - run. - - -A -------> C ----> C.pro - / -B --/ C-includes ---> D - - - -Both A and B have dependency on C and C-includes (the latter -dependency is not shown). Say during building we've tried to create -A, then tried to create C and successfully created C. - - - In that case, the set of includes in C might well have - changed. We do not bother to detect precisely which includes were - added or removed. Instead we create another internal node - C-includes-2. Then we determine what actions should be run to - update the target. In fact this mean that we perform logic of - first stage while already executing stage. - - After actions for C-includes-2 are determined, we add - C-includes-2 to the list of A's dependents, and stage 2 proceeds - as usual. Unfortunately, we can't do the same with target B, - since when it's not visited, C target does not know B depends on - it. So, we add a flag to C which tells and it was rescanned. When - visiting B target, the flag is notices and C-includes-2 will be - added to the list of B's dependencies. - - Note also that internal nodes are sometimes updated too. - Consider this dependency graph: - - -a.o ---> a.cpp - a.cpp-includes --> a.h (scanned) - a.h-includes ------> a.h (generated) - | - | - a.pro <-------------------------------------------+ - - - Here, out handling of generated headers come into play. Say - that a.h exists but is out of date with respect to "a.pro", then - "a.h (generated)" and "a.h-includes" will be marking for - updating, but "a.h (scanned)" won't be marked. We have to rescan - "a.h" file after it's created, but since "a.h (generated)" has no - scanner associated with it, it's only possible to rescan "a.h" - after "a.h-includes" target was updated. - - Tbe above consideration lead to decision that we'll rescan a - target whenever it's updated, no matter if this target is - internal or not. - - - - The remainder of this document is not indended to be read at - all. This will be rearranged in future. - - - -
- File targets - - - As described above, file targets corresponds - to files that Boost.Build manages. User's may be concerned about - file targets in three ways: when declaring file target types, - when declaring transformations between types, and when - determining where file target will be placed. File targets can - also be connected with actions, that determine how the target is - created. Both file targets and actions are implemented in the - virtual-target module. - - -
- Types - - A file target can be given a file, which determines - what transformations can be applied to the file. The - type.register rule declares new types. File type can - also be assigned a scanner, which is used to find implicit - dependencies. See "dependency scanning" [ link? ] below. -
-
- -
- Target paths - - To distinguish targets build with different properties, they - are put in different directories. Rules for determining target - paths are given below: - - - - - All targets are placed under directory corresponding to the - project where they are defined. - - - - - - Each non free, non incidental property cause an additional - element to be added to the target path. That element has the - form <feature-name>-<feature-value> for - ordinary features and <feature-value> for - implicit ones. [Note about composite features]. - - - - - - If the set of free, non incidental properties is different - from the set of free, non incidental properties for the project - in which the main target that uses the target is defined, a - part of the form main_target-<name> is added to - the target path. Note:It would be nice to completely - track free features also, but this appears to be complex and - not extremely needed. - - - - - For example, we might have these paths: - - -debug/optimization-off -debug/main-target-a - - -
-
-
-
-
- - diff --git a/v2/doc/src/catalog.xml b/v2/doc/src/catalog.xml deleted file mode 100644 index 26e16145d..000000000 --- a/v2/doc/src/catalog.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/v2/doc/src/extending.xml b/v2/doc/src/extending.xml deleted file mode 100644 index ff69e13a9..000000000 --- a/v2/doc/src/extending.xml +++ /dev/null @@ -1,873 +0,0 @@ - - - - - Extender Manual - -
- Introduction - - This document explains how to extend Boost.Build to accomodate - your local requirements. Let's start with a simple but - realistic example. - - Say you're writing an application that generates C++ code. If - you ever did this, you know that it's not nice. Embedding large - portions of C++ code in string literals is very awkward. A much - better solution is: - - - - - Write the template of the code to be generated, leaving - placeholders at the points that will change - - - - - - Access the template in your application and replace - placeholders with appropriate text. - - - - - Write the result. - - - - It's quite easy to achieve. You write special verbatim files - that are just C++, except that the very first line of the file - contains the name of a variable that should be generated. A simple tool - is created that takes a verbatim file and creates a cpp file with - a single char* variable whose name is taken from the first line - of the verbatim file and whose value is the file's properly quoted content. - - Let's see what Boost.Build can do. - - First off, Boost.Build has no idea about "verbatim files". So, - you must register a new target type. The following code does - it: - - -import type ; -type.register VERBATIM : vrb ; - - - The first parameter to - type.register gives the name of the - declared type. By convention, it's uppercase. The second parameter - is the suffix for files of this type. So, if Boost.Build sees - code.vrb in a list of sources, it knows that it's of type - VERBATIM. - - Next, you tell Boost.Build that the verbatim files can be - transformed into C++ files in one build step. A - generator is a template for a build step that - transforms targets of one type (or set of types) into another. Our - generator will be called verbatim.inline-file; it - transforms VERBATIM files into CPP files: - - -import generators ; -generators.register-standard verbatim.inline-file : VERBATIM : CPP ; - - - - Lastly, you have to inform Boost.Build about the shell - commands used to make that transformation. That's done with an - actions declaration. - - -actions inline-file -{ - "./inline-file.py" $(<) $(>) -} - - - - - - - - Now, we're ready to tie it all together. Put all the code - above in file verbatim.jam, add import verbatim ; - to project-root.jam, and it's possible to write - the following in Jamfile: - - -exe codegen : codegen.cpp class_template.verbatim usage.verbatim ; - - - -The verbatim files will be automatically converted into C++ -and linked it. - - - In the subsequent sections, we will extend this example, and review - all the mechanisms in detail. The complete code is available in example/customization - directory. - - -
-
- Target types - The first thing we did in the intruduction was declaring a - new target type: - -import type ; -type.register VERBATIM : verbatim ; - - The type is the most important property of a target. Boost.Build can - automatically generate necessary build actions only because you - specify the desired type (using the different main target rules), and - because Boost.Build can guess the type of sources from their - extensions. - - - The first two parameters for the type.register rule - are the name of new type and the list of extensions associated with - it. A file with an extension from the list will have the given target - type. In the case where a target of the declared type is generated - from other sources, the first specified extension will be used. - - - Sometimes you want to change the suffix used for generated targets - depending on build properties, such as toolset. For example, some compiler - uses extension elf for executable files. You can use the - type.set-generated-target-suffix rule: - -type.set-generated-target-suffix EXE : <toolset>elf : elf ; - - - - A new target type can be inherited from an existing one. - -type.register PLUGIN : : SHARED_LIB ; - - The above code defines a new type derived from - SHARED_LIB. Initially, the new type inherits all the - properties of the base type - in particular generators and suffix. - Typically, you'll change the new type in some way. For example, using - type.set-generated-target-suffix you can set the suffix for - the new type. Or you can write special a generator for the new type. For - example, it can generate additional metainformation for the plugin. - In either way, the PLUGIN type can be used whenever - SHARED_LIB can. For example, you can directly link plugins - to an application. - - - A type can be defined as "main", in which case Boost.Build will - automatically declare a main target rule for building targets of that - type. More details can be found later. - - -
- Scanners - - Sometimes, a file can refer to other files via some include - mechanism. To make Boost.Build track dependencies to the included - files, you need to provide a scanner. The primary limitation is that - only one scanner can be assigned to a target type. - - - First, we need to declare a new class for the scanner: - -class verbatim-scanner : common-scanner -{ - rule pattern ( ) - { - return "//###include[ ]*\"([^\"]*)\"" ; - } -} - - All the complex logic is in the common-scanner - class, and you only need to override the method that returns - the regular expression to be used for scanning. The - parentheses in the regular expression indicate which part - of the string is the name of the included file. Only the - first parenthesized group in the regular expression will be - recognized; if you can't express everything you want that - way, you can return multiple regular expressions, each of - which contains a parenthesized group to be matched. - - - After that, we need to register our scanner class: - -scanner.register verbatim-scanner : include ; - - The value of the second parameter, in this case - include, specifies the properties that contain the list - of paths that should be searched for the included files. - - - Finally, we assign the new scanner to the VERBATIM - target type: - -type.set-scanner VERBATIM : verbatim-scanner ; - - That's enough for scanning include dependencies. - - -
- -
- -
- Tools and generators - - This section will describe how Boost.Build can be extended to support - new tools. - - - For each additional tool, a Boost.Build object called generator - must be created. That object has specific types of targets that it - accepts and produces. Using that information, Boost.Build is able - to automatically invoke the generator. For example, if you declare a - generator that takes a target of the type D and - produces a target of the type OBJ, when placing a - file with extention .d in a list of sources will - cause Boost.Build to invoke your generator, and then to link the - resulting object file into an application. (Of course, this requires - that you specify that the .d extension corresponds - to the D type.) - - - Each generator should be an instance of a class derived from the - generator class. In the simplest case, you don't need to - create a derived class, but simply create an instance of the - generator class. Let's review the example we've seen in the - introduction. - - -import generators ; -generators.register-standard verbatim.inline-file : VERBATIM : CPP ; -actions inline-file -{ - "./inline-file.py" $(<) $(>) -} - - - - We declare a standard generator, specifying its id, the source type - and the target type. When invoked, the generator will create a target - of type CPP with a source target of - type VERBATIM as the only source. But what command - will be used to actually generate the file? In bjam, actions are - specified using named "actions" blocks and the name of the action - block should be specified when creating targets. By convention, - generators use the same name of the action block as their own id. So, - in above example, the "inline-file" actions block will be used to - convert the source into the target. - - - - There are two primary kinds of generators: standard and composing, - which are registered with the - generators.register-standard and the - generators.register-composing rules, respectively. For - example: - -generators.register-standard verbatim.inline-file : VERBATIM : CPP ; -generators.register-composing mex.mex : CPP LIB : MEX ; - - Standard generators take a single source of type - VERBATIM and produces a result. The second generator - takes any number of sources, which can have either the - CPP or the LIB type. Composing generators - are typically used for generating top-level target type. For example, - the first generator invoked when building an exe target - is a composing generator corresponding to the proper linker. - - - You should also know about two specific functions for registering - generators: generators.register-c-compiler and - generators.register-linker. The first sets up header - dependecy scanning for C files, and the seconds handles various - complexities like searched libraries. For that reason, you should always - use those functions when adding support for compilers and linkers. - - - (Need a note about UNIX) - - Custom generator classes - - The standard generators allows you to specify source and target - types, an action, and a set of flags. If you need anything more complex, - - you need to create a new generator class with your own logic. Then, - you have to create an instance of that class and register it. Here's - an example how you can create your own generator class: - -class custom-generator : generator -{ - rule __init__ ( * : * ) - { - generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - } - -} - -generators.register - [ new custom-generator verbatim.inline-file : VERBATIM : CPP ] ; - - This generator will work exactly like the - verbatim.inline-file generator we've defined above, but - it's possible to customize the behaviour by overriding methods of the - generator class. - - - There are two methods of interest. The run method is - responsible for the overall process - it takes a number of source targets, - converts them to the right types, and creates the result. The - generated-targets method is called when all sources are - converted to the right types to actually create the result. - - - The generated-target - method can be overridden - when you want to add additional properties to the generated - targets or use additional sources. For a real-life example, - suppose you have a program analysis tool that should be given a - name of executable and the list of all sources. Naturally, you - don't want to list all source files manually. Here's how the - generated-targets method can find the list of - sources automatically: - -class itrace-generator : generator { -.... - rule generated-targets ( sources + : property-set : project name ? ) - { - local leaves ; - local temp = [ virtual-target.traverse $(sources[1]) : : include-sources ] ; - for local t in $(temp) - { - if ! [ $(t).action ] - { - leaves += $(t) ; - } - } - return [ generator.generated-targets $(sources) $(leafs) - : $(property-set) : $(project) $(name) ] ; - } -} -generators.register [ new itrace-generator nm.itrace : EXE : ITRACE ] ; - - The generated-targets method will be called with a single - source target of type EXE. The call to - virtual-target.traverse will return all targets the - executable depends on, and we further find files that are not - produced from anything. - The found targets are added to the sources. - - - The run method can be overriden to completely - customize the way the generator works. In particular, the conversion of - sources to the desired types can be completely customized. Here's - another real example. Tests for the Boost Python library usually - consist of two parts: a Python program and a C++ file. The C++ file is - compiled to Python extension that is loaded by the Python - program. But in the likely case that both files have the same name, - the created Python extension must be renamed. Otherwise, the Python - program will import itself, not the extension. Here's how it can be - done: - -rule run ( project name ? : property-set : sources * ) -{ - local python ; - for local s in $(sources) - { - if [ $(s).type ] = PY - { - python = $(s) ; - } - } - - local libs ; - for local s in $(sources) - { - if [ type.is-derived [ $(s).type ] LIB ] - { - libs += $(s) ; - } - } - - local new-sources ; - for local s in $(sources) - { - if [ type.is-derived [ $(s).type ] CPP ] - { - local name = [ $(s).name ] ; # get the target's basename - if $(name) = [ $(python).name ] - { - name = $(name)_ext ; # rename the target - } - new-sources += [ generators.construct $(project) $(name) : - PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ; - } - } - - result = [ construct-result $(python) $(new-sources) : $(project) $(name) - : $(property-set) ] ; -} - - - - First, we separate all source into python files, libraries and C++ - sources. For each C++ source we create a separate Python extension by - calling generators.construct and passing the C++ source - and the libraries. At this point, we also change the extension's name, - if necessary. - - - -
- -
- Features - - Often, we need to control the options passed the invoked tools. This - is done with features. Consider an example: - -# Declare a new free feature -import feature : feature ; -feature verbatim-options : : free ; - -# Cause the value of the 'verbatim-options' feature to be -# available as 'OPTIONS' variable inside verbatim.inline-file -import toolset : flags ; -flags verbatim.inline-file OPTIONS <verbatim-options> ; - -# Use the "OPTIONS" variable -actions inline-file -{ - "./inline-file.py" $(OPTIONS) $(<) $(>) -} - - We first define a new feature. Then, the flags invocation - says that whenever verbatin.inline-file action is run, the value of - the verbatim-options feature will be added to the - OPTIONS variable, and can be used inside the action body. - You'd need to consult online help (--help) to find all the features of - the toolset.flags rule. - - - - - Although you can define any set of features and interpret their values - in any way, Boost.Build suggests the following coding standard for - designing features. - - - Most features should have a fixed set of values that is portable - (tool neutral) across the class of tools they are designed to work - with. The user does not have to adjust the values for a exact tool. For - example, <optimization>speed has the same meaning for - all C++ compilers and the user does not have to worry about the exact - options passed to the compiler's command line. - - - - Besides such portable features there are special 'raw' features that - allow the user to pass any value to the command line parameters for a - particular tool, if so desired. For example, the - <cxxflags> feature allows you to pass any command line - options to a C++ compiler. The <include> feature - allows you to pass any string preceded by -I and the interpretation - is tool-specific. (See for an example of very smart usage of that - feature). Of course one should always strive to use portable - features, but these are still be provided as a backdoor just to make - sure Boost.Build does not take away any control from the user. - - - - Using portable features is a good idea because: - - - When a portable feature is given a fixed set of - values, you can build your project with two different - settings of the feature and Boost.Build will automatically - use two different directories for generated files. - Boost.Build does not try to separate targets built with - different raw options. - - - - - - Unlike with “raw†features, you don't need to use - specific command-line flags in your Jamfile, and it will be - more likely to work with other tools. - - - - - - Steps for adding a feauture - - Adding a feature requires three steps: - - - Declaring a feature. For that, the "feature.feature" - rule is used. You have to decide on the set of feature - attributes: - - - if a feature has several values and - significantly affects the build, make it “propagated,†so that the - whole project is built with the same value by - default - - if a feature does not have a fixed - list of values, it must be “free.†For example, the - include feature is a free - feature. - - if a feature is used to refer to a - path relative to the Jamfile, it must be a “path†- feature. include is also a path - feature. - - if feature is used to refer to some target, it - must be a “dependency†feature. - - - - - - Representing the feature value in a - target-specific variable. Build actions are command - templates modified by Boost.Jam variable expansions. The - toolset.flags rule sets a target-specific - variable to the value of a feature. - - Using the variable. The variable set in step 2 can - be used in a build action to form command parameters or - files. - - - - - Another example - - Here's another example. - Let's see how we can make a feature that refers to a target. For example, - when linking dynamic libraries on windows, one sometimes needs to specify - "DEF file", telling what functions should be exported. It would be nice to - use this file like this: - - lib a : a.cpp : <def-file>a.def ; - - - Actually, this feature is already supported, but anyway... - - - - - - Since the feature refers to a target, it must be "dependency". - -feature def-file : : free dependency ; - - - - One of the toolsets that cares about - - DEF files is msvc. The following line should be added to it. - - - -flags msvc.link DEF_FILE <def-file> ; - - - - - Since the DEF_FILE variable is not used by the -msvc.link action, - -we need to modify it to be: - - -actions link bind DEF_FILE -{ - $(.LD) .... /DEF:$(DEF_FILE) .... -} - - - - - Note the bind DEF_FILE part. It tells - bjam to translate the internal target name in - DEF_FILE to a corresponding filename in - the link action. Without it the expansion of - $(DEF_FILE) would be a strange symbol that is - not likely to make sense for the linker. - - - - - We are almost done, but we should stop for a small workaround. Add the following - code to msvc.jam - - -rule link -{ - DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ; -} - - - - This is needed to accomodate some bug in bjam, which hopefully - will be fixed one day. - - - - - - Variants and composite features. - - Sometimes you want to create a shortcut for some set of - features. For example, release is a value of - <variant> and is a shortcut for a set of features. - - - It is possible to define your own build variants. For example: - -variant crazy : <optimization>speed <inlining>off - <debug-symbols>on <profiling>on ; - - will define a new variant with the specified set of properties. You - can also extend an existing variant: - -variant super_release : release : <define>USE_ASM ; - - In this case, super_release will expand to all properties - specified by release, and the additional one you've specified. - - - You are not restricted to using the variant feature - only. - - Here's example that defines a brand new feature: - -feature parallelism : mpi fake none : composite link-incompatible ; -feature.compose <parallelism>mpi : <library>/mpi//mpi/<parallelism>none ; -feature.compose <parallelism>fake : <library>/mpi//fake/<parallelism>none ; - - - This will allow you to specify the value of feature - parallelism, which will expand to link to the necessary - library. - - -
- -
- Main target rules - - A main target rule (e.g “exe†- Or “libâ€) creates a top-level target. It's quite likely that you'll want to declare your own and - there are two ways to do that. - - - - The first way applies when - - your target rule should just produce a target of specific type. In that case, a - rule is already defined for you! When you define a new type, Boost.Build - automatically defines a corresponding rule. The name of the rule is - obtained from the name of the type, by downcasing all letters and - replacing underscores with dashes. - - For example, if you create a module - obfuscate.jam containing: - - -import type ; -type.register OBFUSCATED_CPP : ocpp ; - -import generators ; -generators.register-standard obfuscate.file : CPP : OBFUSCATED_CPP ; - - and import that module, you'll be able to use the rule "obfuscated-cpp" - in Jamfiles, which will convert source to the OBFUSCATED_CPP type. - - - The second way is to write a wrapper rule that calls - any of the existing rules. For example, suppose you have only one library per - directory and want all cpp files in the directory to be compiled into that library. You - can achieve this effect with: - -lib codegen : [ glob *.cpp ] ; - - but if you want to make it even simpler, you could add the following - definition to the project-root.jam file: - -rule glib ( name : extra-sources * : requirements * ) -{ - lib $(name) : [ glob *.cpp ] $(extra-sources) : $(requirements) ; -} - -which would allow you to reduce the Jamfile to - -glib codegen ; - - - - - Note that because you can associate a custom generator with a target - type, the logic of building can be rather compiler. - - For example, the - boostbook module declares a target type - BOOSTBOOK_MAIN and a custom generator for that - type. You can use that as example if your main target rule is - non-trivial. - - -
- -
- - Toolset modules - - If your extensions will be used only on one project, they can be - placed in a separate .jam file that will be - imported by your project-root.jam. If the - extensions will be used on many projects, users will thank you for - a finishing touch. - - - The using rule provides a standard mechanism - for loading and configuring extensions. To make it work, your module - - should provide an init rule. The rule will be called - with the same parameters that were passed to the - using rule. The set of allowed parameters is - determined by you. For example, you can allow the user to specify - paths, tool versions, and other options. - - - - Here are some guidelines that help to make Boost.Build more - consistent: - - The init rule should never fail. Even if - the user provided an incorrect path, you should emit a warning and go - on. Configuration may be shared between different machines, and - wrong values on one machine can be OK on another. - - - - Prefer specifying the command to be executed - to specifying the tool's installation path. First of all, this - gives more control: it's possible to specify - -/usr/bin/g++-snapshot -time g++ - - - as the command. Second, while some tools have a logical - "installation root", it's better if the user doesn't have to remember whether - a specific tool requires a full command or a path. - - - - Check for multiple initialization. A user can try to - initialize the module several times. You need to check for this - and decide what to do. Typically, unless you support several - versions of a tool, duplicate initialization is a user error. - - If the - tool's version can be specified during initialization, make sure the - version is either always specified, or never specified (in which - case the tool is initialied only once). For example, if you allow: - -using yfc ; -using yfc : 3.3 ; -using yfc : 3.4 ; - - Then it's not clear if the first initialization corresponds to - version 3.3 of the tool, version 3.4 of the tool, or some other - version. This can lead to building twice with the same version. - - - - If possible, init must be callable - with no parameters. In which case, it should try to autodetect all - the necessary information, for example, by looking for a tool in - PATH or in common installation locations. Often this - is possible and allows the user to simply write: - -using yfc ; - - - - Consider using facilities in the - tools/common module. You can take a look at how - tools/gcc.jam uses that module in the init rule. - - - - - - - - -
- -
- - diff --git a/v2/doc/src/faq.xml b/v2/doc/src/faq.xml deleted file mode 100644 index f0c75113c..000000000 --- a/v2/doc/src/faq.xml +++ /dev/null @@ -1,400 +0,0 @@ - - - - - Frequently Asked Questions - -
- - How do I get the current value of feature in Jamfile? - - - - This is not possible, since Jamfile does not have "current" value of any - feature, be it toolset, build variant or anything else. For a single invocation of - bjam, any given main target can be built with several property sets. - For example, user can request two build variants on the command line. Or one library - is built as shared when used from one application, and as static when used from another. - Obviously, Jamfile is read only once, so generally, there's no single value of a feature - you can access in Jamfile. - - - A feature has a specific value only when building a target, and there are two ways how you - can use that value: - - Use conditional requirements or indirect conditional requirements. See - . - - Define a custom generator and a custom main target type. The custom generator can do arbitrary processing - or properties. See the extender manual. - - - -
- -
- - I'm getting "Duplicate name of actual target" error. What - does it mean? - - - - The most likely case is that you're trying to - compile the same file twice, with almost the same, - but differing properties. For example: - - -exe a : a.cpp : <include>/usr/local/include ; -exe b : a.cpp ; - - - - - - The above snippet requires two different compilations - of 'a.cpp', which differ only in 'include' property. - Since the 'include' property is free, Boost.Build - can't generate two objects files into different directories. - On the other hand, it's dangerous to compile the file only - once -- maybe you really want to compile with different - includes. - - - - To solve this issue, you need to decide if file should - be compiled once or twice. - - - - Two compile file only once, make sure that properties - are the same: - - -exe a : a.cpp : <include>/usr/local/include ; -exe b : a.cpp : <include>/usr/local/include ; - - - - If changing the properties is not desirable, for example - if 'a' and 'b' target have other sources which need - specific properties, separate 'a.cpp' into it's own target: - - -obj a_obj : a.cpp : <include>/usr/local/include ; -exe a : a_obj ; - - - - To compile file twice, you can make the object file local - to the main target: - - - exe a : [ obj a_obj : a.cpp ] : <include>/usr/local/include ; - exe b : [ obj a_obj : a.cpp ] ; - - - - - - A good question is why Boost.Build can't use some of the above - approaches automatically. The problem is that such magic would - require additional implementation complexities and would only - help in half of the cases, while in other half we'd be silently - doing the wrong thing. It's simpler and safe to ask user to - clarify his intention in such cases. - - -
- -
- - Accessing environment variables - - - - Many users would like to use environment variables in Jamfiles, for - example, to control location of external libraries. In many cases you - better declare those external libraries in the site-config.jam file, as - documented in the recipes - section. However, if the users already have the environment variables set - up, it's not convenient to ask them to set up site-config.jam files as - well, and using environment variables might be reasonable. - - - In Boost.Build V2, each Jamfile is a separate namespace, and the - variables defined in environment is imported into the global - namespace. Therefore, to access environment variable from Jamfile, you'd - need the following code: - -import os ; -local SOME_LIBRARY_PATH = [ os.environ SOME_LIBRARY_PATH ] ; -exe a : a.cpp : <include>$(SOME_LIBRARY_PATH) ; - - -
- -
- - How to control properties order? - - - For internal reasons, Boost.Build sorts all the properties - alphabetically. This means that if you write: - -exe a : a.cpp : <include>b <include>a ; - - then the command line with first mention the "a" include directory, and - then "b", even though they are specified in the opposite order. In most - cases, the user doesn't care. But sometimes the order of includes, or - other properties, is important. For example, if one uses both the C++ - Boost library and the "boost-sandbox" (libraries in development), then - include path for boost-sandbox must come first, because some headers may - override ones in C++ Boost. For such cases, a special syntax is - provided: - -exe a : a.cpp : <include>a&&b ; - - - - The && symbols separate values of an - property, and specify that the order of the values should be preserved. You - are advised to use this feature only when the order of properties really - matters, and not as a convenient shortcut. Using it everywhere might - negatively affect performance. - - -
- -
- - How to control the library order on Unix? - - - On the Unix-like operating systems, the order in which static - libraries are specified when invoking the linker is important, because by - default, the linker uses one pass though the libraries list. Passing the - libraries in the incorrect order will lead to a link error. Further, this - behaviour is often used to make one library override symbols from - another. So, sometimes it's necessary to force specific order of - libraries. - - - Boost.Build tries to automatically compute the right order. The - primary rule is that if library a "uses" library b, then library a will - appear on the command line before library b. Library a is considered to - use b is b is present either in the sources of a or in its - requirements. To explicitly specify the use relationship one can use the - <use> feature. For example, both of the following lines will cause - a to appear before b on the command line: - -lib a : a.cpp b ; -lib a : a.cpp : <use>b ; - - - - - The same approach works for searched libraries, too: - -lib z ; -lib png : : <use>z ; -exe viewer : viewer png z ; - - - -
- -
- Can I get output of external program as a variable in a Jamfile? - - - The SHELL builtin can be used for the purpose: - -local gtk_includes = [ SHELL "gtk-config --cflags" ] ; - - -
- -
- How to get the project-root location? - - - You might want to use the location of the project-root in your - Jamfiles. To do it, you'd need to declare path constant in your - project-root.jam: - -path-constant TOP : . ; - - After that, the TOP variable can be used in every Jamfile. - -
- -
- How to change compilation flags for one file? - - - If one file must be compiled with special options, you need to - explicitly declare an obj target for that file and then use - that target in your exe or lib target: - -exe a : a.cpp b ; -obj b : b.cpp : <optimization>off ; - - Of course you can use other properties, for example to specify specific - compiler options: - -exe a : a.cpp b ; -obj b : b.cpp : <cflags>-g ; - - You can also use conditional - properties for finer control: - -exe a : a.cpp b ; -obj b : b.cpp : <variant>release:<optimization>off ; - - - -
- -
- Why are the <code>dll-path</code> and - <code>hardcode-dll-paths</code> properties useful? - - - (This entry is specific to Unix system.)Before answering the - questions, let's recall a few points about shared libraries. Shared - libraries can be used by several applications, or other libraries, - without phisycally including the library in the application. This can - greatly decrease the total size of applications. It's also possible to - upgrade a shared library when the application is already - installed. Finally, shared linking can be faster. - - - However, the shared library must be found when the application is - started. The dynamic linker will search in a system-defined list of - paths, load the library and resolve the symbols. Which means that you - should either change the system-defined list, given by the - LD_LIBRARY_PATH environment variable, or install the - libraries to a system location. This can be inconvenient when - developing, since the libraries are not yet ready to be installed, and - cluttering system paths is undesirable. Luckily, on Unix there's another - way. - - - An executable can include a list of additional library paths, which - will be searched before system paths. This is excellent for development, - because the build system knows the paths to all libraries and can include - them in executables. That's done when the hardcode-dll-paths - feature has the true value, which is the - default. When the executables should be installed, the story is - different. - - - - Obviously, installed executable should not hardcode paths to your - development tree. (The stage rule explicitly disables the - hardcode-dll-paths feature for that reason.) However, you - can use the dll-path feature to add explicit paths - manually. For example: - -stage installed : application : <dll-path>/usr/lib/snake - <location>/usr/bin ; - - will allow the application to find libraries placed to - /usr/lib/snake. - - - If you install libraries to a nonstandard location and add an - explicit path, you get more control over libraries which will be used. A - library of the same name in a system location will not be inadvertently - used. If you install libraries to a system location and do not add any - paths, the system administrator will have more control. Each library can - be individually upgraded, and all applications will use the new library. - - - Which approach is best depends on your situation. If the libraries - are relatively standalone and can be used by third party applications, - they should be installed in the system location. If you have lots of - libraries which can be used only by your application, it makes sense to - install it to a nonstandard directory and add an explicit path, like the - example above shows. Please also note that guidelines for different - systems differ in this respect. The Debian guidelines prohibit any - additional search paths, and Solaris guidelines suggest that they should - always be used. - - -
- -
- Targets in site-config.jam - - It is desirable to declare standard libraries available on a - given system. Putting target declaration in Jamfile is not really - good, since locations of the libraries can vary. The solution is - to declare the targets in site-config.jam: - -project site-config ; -lib zlib : : <name>z ; - - - Recall that both site-config.jam and - user-config.jam are projects, and everything - you can do in a Jamfile you can do in those files. So, you declare - a project id and a target. Now, one can write: - -exe hello : hello.cpp /site-config//zlib ; - - in any Jamfile. - -
- -
- Header-only libraries - - In modern C++, libraries often consist of just header files, without - any source files to compile. To use such libraries, you need to add proper - includes and, maybe, defines, to your project. But with large number of - external libraries it becomes problematic to remember which libraries are - header only, and which are "real" ones. However, with Boost.Build a - header-only library can be declared as Boost.Build target and all - dependents can use such library without remebering if it's header-only or not. - - - Header-only libraries are declared using the alias rule, - that specifies only usage requirements, for example: - -alias mylib - : # no sources - : # no build requirements - : # no default build - : <include>whatever - ; - - The includes specified in usage requirements of mylib are - automatically added to build properties of all dependents. The dependents - need not care if mylib is header-only or not, and it's possible - to later make mylib into a regular compiled library. - - - - If you already have proper usage requirements declared for project where - header-only library is defined, you don't need to duplicate them for - the alias target: - -project my : usage-requirements <include>whatever ; -alias mylib ; - - - -
- - -
- \ No newline at end of file diff --git a/v2/doc/src/fragments.xml b/v2/doc/src/fragments.xml deleted file mode 100644 index 3106ca62e..000000000 --- a/v2/doc/src/fragments.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - -
- - root - - - - Specifies root directory of the compiler - installation. This option is necessary only if it's not possible - to detect this information from the compiler command—for - example if the specified compiler command is a user script. - - -
- -
- - - cflags - - Specifies additional compiler flags that - will be used when compiling C sources. - - - - - cxxflags - - Specifies additional compiler flags that - will be used when compiling C++ sources. - - - - - compileflags - - Specifies additional compiler flags that - will be used when compiling both C and C++ sources. - - - - - linkflags - - Specifies additional command line options - that will be passed to the linker. - - - -
- -
diff --git a/v2/doc/src/howto.xml b/v2/doc/src/howto.xml deleted file mode 100644 index bd0cf5b5e..000000000 --- a/v2/doc/src/howto.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - How to use this document - - - If you've just found out about Boost.Build V2 and want to know - if it will work for you, start with . You can continue with . When you're ready to try Boost.Build - in practice, go to . - - - - If you are about to use Boost.Build on your project, or already - using it and have a problem, look at . - - - - If you're trying to build a project which uses Boost.Build, - see and then read about - . - - - - If you have questions, please post them to our mailing list (). The mailing list is - also mirrowed to newsgroup . - - - diff --git a/v2/doc/src/install.xml b/v2/doc/src/install.xml deleted file mode 100644 index 3dd30bf1e..000000000 --- a/v2/doc/src/install.xml +++ /dev/null @@ -1,228 +0,0 @@ - - - - - Installation - - - This section describes how to install Boost.Build from a - released Boost - source distribution - or CVS - image. - - Note that packages prepared for - Unix/Linux systems usually make their own choices about where to - put things and even which parts of Boost to include. When we - say “released source distribution” we mean a - distribution of Boost as released on its SourceForge - project - page. - - -All paths are given relative to - the Boost.Build v2 root directory, which is - - - - - - located in the tools/build/v2 subdirectory - of a full Boost distribution. - - The Boost.Build subset of boost is also distributed - separately, for those who are only interested in getting a - build tool. The top-level directory of a Boost.Build - distribution contains all the subdirectories of the - tools/build/v2 subdirectory from a full - Boost distribution, so it is itself a valid Boost.Build root - directory. It also contains the - tools/jam/src subdirectory of a - full Boost distribution, so you can rebuild Boost.Jam from - source. - - - - - - - - Boost.Build uses Boost.Jam, an - extension of the Perforce - Jam portable make replacement. The - recommended way to get Boost.Jam is to download - a prebuilt executable from SourceForge. - If a prebuilt executable is not provided for your platform - or you are using Boost's sources in an unreleased state, it - may be necessary to - build bjam - from sources included in the Boost source tree. - - - - - - - To install Boost.Jam, copy the executable, - called bjam - or bjam.exe to a location accessible in - your PATH. Go to the Boost.Build root - directory and - run bjam . You - should see: - - - Boost.Build V2 (Milestone N) - Boost.Jam xx.xx.xx - - - where N is the version of Boost.Build you're using. - - - - - - Configure Boost.Build to recognize the build resources (such - as compilers and libraries) you have installed on your - system. Open the - user-config.jam file in the Boost.Build - root directory and follow the instructions there to describe - your toolsets and libraries, and, if necessary, where they - are located. - - - - - - You should now be able to go to the - example/hello/ directory and run - bjam there. A simple application will be - built. You can also play with other projects in the - example/ directory. - - - - - - - If you are using Boost's CVS state, be sure to - rebuild bjam even if you have a previous - version. The CVS version of Boost.Build requires the CVS - version of Boost.Jam. - - - - When bjam is invoked, it always needs to be - able to find the Boost.Build root directory, where the - interpreted source code of Boost.Build is located. There are - two ways to tell bjam about the root directory: - - - - - - Set the environment variable BOOST_BUILD_PATH - to the absolute path of the Boost.Build root directory. - - - - - - At the root directory of your project or in any of its - parent directories, create a file called - boost-build.jam, with a single line: - - -boost-build /path/to/boost.build ; - - - - - - - Information for distributors - - - If you're planning to package Boost.Build for a Linux distribution, - please follow these guidelines: - - - Create a separate package for Boost.Jam. - - - Create another package for Boost.Build, and make - this package install all Boost.Build files to - /usr/share/boost-build directory. After - install, that directory should contain everything you see in - Boost.Build release package, except for - jam_src directory. If you're using Boost CVS - to obtain Boost.Build, as opposed to release package, take - everything from the tools/build/v2 directory. - For a check, make sure that - /usr/share/boost-build/boost-build.jam is installed. - - - Placing Boost.Build into /usr/share/boost-build - will make sure that bjam will find Boost.Build - without any additional setup. - - - Provide a - /etc/site-config.jam configuration file that will - contain: - -using gcc ; - - You might want to add dependency from Boost.Build package to gcc, - to make sure that users can always build Boost.Build examples. - - - - - If those guidelines are met, users will be able to invoke - bjam without any explicit configuration. - - - - - - - - - diff --git a/v2/doc/src/recipes.xml b/v2/doc/src/recipes.xml deleted file mode 100644 index 7230aabdf..000000000 --- a/v2/doc/src/recipes.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - Boost Build System V2 recipes - - diff --git a/v2/doc/src/reference.xml b/v2/doc/src/reference.xml deleted file mode 100644 index 2868b22ff..000000000 --- a/v2/doc/src/reference.xml +++ /dev/null @@ -1,2133 +0,0 @@ - -version : c++-compile-command : compiler options"> -The following options can be provided, using <option-name>option-value syntax:"> -This statement may be repeated several times, if you want to configure several versions of the compiler."> -]> - - - Detailed reference - -
- General information - -
- Initialization - - bjam's first job upon startup is to load the Jam code that - implements the build system. To do this, it searches for a file - called boost-build.jam, first in the invocation directory, then - in its parent and so forth up to the filesystem root, and finally - in the directories specified by the environment variable - BOOST_BUILD_PATH. When found, the file is interpreted, and should - specify the build system location by calling the boost-build - rule: - - -rule boost-build ( location ? ) - - - - If location is a relative path, it is treated as relative to - the directory of boost-build.jam. The directory specified by - that location and the directories in BOOST_BUILD_PATH are then searched for - a file called bootstrap.jam, which is expected to - bootstrap the build system. This arrangement allows the build - system to work without any command-line or environment variable - settings. For example, if the build system files were located in a - directory "build-system/" at your project root, you might place a - boost-build.jam at the project root containing: - - -boost-build build-system ; - - - In this case, running bjam anywhere in the project tree will - automatically find the build system. - - The default bootstrap.jam, after loading some standard - definitions, loads two files, which can be provided/customised by - user: site-config.jam and user-config.jam. - - Locations where those files are searched are summarized below: - -
- Search paths for configuration files - - - - - - - - site-config.jam - - user-config.jam - - - - - - - Linux - - - /etc - $HOME - $BOOST_BUILD_PATH - - - - $HOME - $BOOST_BUILD_PATH - - - - - Windows - - - %SystemRoot% - %HOMEDRIVE%%HOMEPATH% - %HOME% - %BOOST_BUILD_PATH% - - - - %HOMEDRIVE%%HOMEPATH% - %HOME% - %BOOST_BUILD_PATH% - - - - -
- - - Boost.Build comes with default versions of those files, - - which can serve as templates for customized versions. - - -
-
- Command line - - The command line may contain: - - - Jam options, - - Boost.Build options, - - Command line arguments - - -
- Command line arguments - - - Command line arguments specify targets and build - request using the following rules. - - - - - - An argument that does not contain slashes or the = - symbol is either a value of an implicit feature or of a target to - be built. It is taken to be value of a feature if an appropriate - feature exists. Otherwise, it is considered a target id. Building the - special target name “clean†has the same effect as - using the --clean option. - - - - - - An argument containing either slashes or - the = symbol specifies a number of build - request elements (see ). In its simplest - form, it's just a set of properties, separated by - slashes, which become a single build request element, - for example: - - -borland/<runtime-link>static - - - A more complex form can be used to save typing. For example, - instead of - - -borland/runtime-link=static borland/runtime-link=dynamic - - - one can use - - -borland/runtime-link=static,dynamic - - - Exactly, the conversion from argument to build request - elements is performed by (1) splitting the argument at each slash, - (2) converting each split part into a set of properties and (3) - taking all possible combinations - - of the property sets. Each split - part should have either the form - - -feature-name=feature-value1[","feature-valueN]* - - - or, in case of implicit features - - -feature-value1[","feature-valueN;]* - - - will be converted into the property set - - -<feature-name>feature-value1 .... <feature-name>feature-valueN - - - - - - - - - - For example, the command line - - -target1 debug gcc/runtime-link=dynamic,static - - - would cause target called target1 to be rebuilt in - debug mode, except that for gcc, both dynamically and statically - linked binaries would be created. - - -
-
- Command line options - - All of the Boost.Build options start with the "--" prefix. - They are described in the following table. - - FIXME: That table has moved into "User documentation" section - and there's nothing we can add here. Remove this part? - - -
-
- - - - -
- Builtin rules - - This section contains the list of all rules that - can be used in Jamfile—both rules that define new - targets and auxiliary rules. - - - - exe - - Creates an executable file. See - . - - - - lib - - Creates an library file. See - . - - - - install - - Installs built targets and other files. See - . - - - - alias - - Creates an alias for other targets. See - . - - - - unit-test - - Creates an executable that will be automatically run. See - . - - - - compile - compile-fail - link - link-fail - run - run-fail - - Specialized rules for testing. See - . - - - - - obj - - Creates an object file. Useful when a single source - file must be compiled with special properties. - - - - glob - - The glob rule takes a list shell pattern - and returns the list of files in the project's source directory that - match the pattern. For example: - -lib tools : [ glob *.cpp ] ; - - It is possible to also pass a second argument—the list of - exclude patterns. The result will then include the list of - files patching any of include patterns, and not matching any - of the exclude patterns. For example: - -lib tools : [ glob *.cpp : file_to_exclude.cpp bad*.cpp ] ; - - - - - - glob-tree - glob-tree - - The glob-tree is similar to the - glob except that it operates recursively from - the directory of the containing Jamfile. For example: - -ECHO [ glob-tree *.cpp : .svn ] ; - - will print the names of all C++ files in your project. The - .svn exclude pattern prevents the - glob-tree rule from entering administrative - directories of the Subverion version control system. - - - - - project - - Declares project id and attributes, including - project requirements. See . - - - - - use-project - - Assigns a symbolic project ID to a project at - a given path. This rule must be better documented! - - - - - explicit - - The explicit rule takes a single - parameter—a list of target names. The named targets will - be marked explicit, and will be built only if they are explicitly - requested on the command line, or if their dependents are built. - Compare this to ordinary targets, that are built implicitly when - their containing project is built. - - - - constant - - Sets project-wide constant. Takes two - parameters: variable name and a value and makes the specified - variable name accessible in this Jamfile and any child Jamfiles. - For example: - -constant VERSION : 1.34.0 ; - - - - - - path-constant - - Same as constant except that - the value is treated as path relative to Jamfile location. For example, - if bjam is invoked in the current directory, - and Jamfile in helper subdirectory has: - -path-constant DATA : data/a.txt ; - - then the variable DATA will be set to - helper/data/a.txt, and if bjam - is invoked from the helper directory, then - the variable DATA will be set to - data/a.txt. - - - - - build-project - - Cause some other project to be built. This rule - takes a single parameter—a directory name relative to - the containing Jamfile. When the containing Jamfile is built, - the project located at that directory will be built as well. - At the moment, the parameter to this rule should be a directory - name. Project ID or general target references are not allowed. - - - - - test-suite - - This rule is deprecated and equivalent to - alias. - - - - -
- -
- Builtin features - - - variant - - - - A feature that combines several low-level features, making - it easy to request common build configurations. - - - Allowed values: debug, release, - profile. - - The value debug expands to - - -<optimization>off <debug-symbols>on <inlining>off <runtime-debugging>on - - - The value release expands to - - -<optimization>speed <debug-symbols>off <inlining>full <runtime-debugging>off - - - The value profile expands to the same as - release, plus: - - -<profiling>on <debug-symbols>on - - - User can define his own build variants using the variant rule from the common - module. - - Notee: Runtime - debugging is on in debug builds to suit the expectations of - people used to various IDEs. - - - - - - link - - - - Allowed values: shared, - static - - - A feature that controls how libraries are built. - - - - - - runtime linking - runtime-link - - - Allowed values: shared, - static - - - Controls if a static or shared C/C++ runtime should be used. There - are some restrictions how this feature can be used, for example - on some compilers an application using static runtime should - not use shared libraries at all, and on some compilers, - mixing static and shared runtime requires extreme care. Check - your compiler documentation for more details. - - - - - - source - - - - The <source>X feature has the same effect on - building a target as putting X in the list of sources. - It's useful when you want to add - the same source to all targets in the project - (you can put <source> in requirements) or to conditionally - include a source (using conditional requirements, see ) - See also the <library> feature. - - - - - library - - - - This feature is almost equivalent to the <source> feature, - except that it takes effect only for linking. When you want to - link all targets in a Jamfile to certain library, the - <library> feature is preferred over - <source>X -- the latter will add the library to - all targets, even those that have nothing to do with libraries. - - - - - - dependency - - - - Introduces a dependency on the target named by the - value of this feature (so it will be brought - up-to-date whenever the target being declared is). - The dependency is not used in any other way. For example, in - application with plugins, the plugins are not used when linking - the application, - application might have dependency on its plugins, even though - - - , and - adds its usage requirements to the build properties - of the target being declared. - - The primary use case is when you want - the usage requirements (such as #include paths) of some - library to be applied, but don't want to link to it. - - - - - - - - use - - - - Introduces a dependency on the target named by the - value of this feature (so it will be brought - up-to-date whenever the target being declared is), and - adds its usage requirements to the build properties - - of the target being declared. The dependency is not used - in any other way. The primary use case is when you want - the usage requirements (such as #include paths) of some - library to be applied, but don't want to link to it. - - - - - - - dll-path - - - - Specify an additional directory where the system should - look for shared libraries when the executable or shared - library is run. This feature only affects Unix - compilers. Plase see - in for details. - - - - hardcode-dll-paths - - - - Controls automatic generation of dll-path properties. - - - Allowed values: - true, false. This property - is specific to Unix systems. If an executable is built with - <hardcode-dll-paths>true, the generated binary - will contain the list of all the paths to the used shared - libraries. As the result, the executable can be run without - changing system paths to shared libraries or installing the - libraries to system paths. This - - is very convenient during - development. Plase see the FAQ entry for details. - Note that on Mac OSX, the paths are unconditionally hardcoded by - the linker, and it's not possible to disable that behaviour. - - - - - cflags - cxxflags - linkflags - - - - The value of those features is passed without modification to the - corresponding tools. For cflags that's both the C and C++ - compilers, for cxxflags that's the C++ compiler and for - linkflags that's the linker. The features are handy when - you're trying to do something special that cannot be achieved by - higher-level feature in Boost.Build. - - - - - warnings - - - - The <warnings> feature controls the warning level of compilers. It has the following values: - - off - disables all warnings. - on - enables default warning level for the tool. - all - enables all warnings. - - Default value is all. - - - - - warnings-as-errors - - - - The <warnings-as-errors> makes it possible to treat warnings as errors and abort - compilation on a warning. The value on enables this behaviour. The default value is - off. - - - - - build - - - Allowed values: no - - - The build feature is used to conditionally disable build of a target. If <build>no - is in properties when building a target, build of that target is skipped. Combined with conditional requirements this - allows to skip building some target in configurations where the build is known to fail. - - - - - tag - - The tag feature is used to customize - the name of the generated files. The value should have the form: -@rulename where - rulename should be a name of a rule with - the following signature: -rule tag ( name : type ? : property-set ) - The rule will be called for each target with the default name computed - by Boost.Build, the type of the target, and property set. The rule - can either return a string that must be used as the name of the - target, or empty string, in which case the default name will be used. - - - Most typical use of the tag feature is - to encode build properties, or library version in library target names. - You should take care to return non-empty string from the tag rule - only for types you care about — otherwise, you might - end up modifying names of object files, generated header file and - other targets for which changing names does not make sense. - - - - - debug-symbols - - - Allowed values: on, off. - - The debug-symbols feature specifies if - produced object files, executables and libraries should include - debug information. - Typically, the value of this feature is implicitly set by the - variant feature, but it can be explicitly - specified by the user. The most common usage is to build - release variant with debugging information. - - - - architecture - - - The architecture features specifies - the general processor familty to generate code for. - - - - - instruction-set - instruction-set - - Allowed values for this feature depend on used toolset. - - The instruction-set specifies for which - specific instruction set the code should be generated. The - code in general might not run on processors with older/different - instruction sets. - - While Boost.Build allows a large set of possible values - for this features, whether a given value works depends on which - compiler you use. Please see - for details. - - - - - - address-model - 64-bit compilation - - Allowed values: 32, 64. - - The address-model specifies if 32-bit or - 64-bit code should be generated by the compiler. Whether this feature - works depends on the used compiler, it's version, how the compiler - is configured, and the values of the architecture - instruction-set - features. Please see - for details. - - - - -
- -
- Builtin tools - - Boost.Build comes with support for a large number of C++ compilers, - and other tools. This section documents how to use those tools. - - Before using any tool, you must declare your intention, and possibly - specify additional information about tool's configuration. This is done - with the using rule, for example: - -using gcc ; - - additional parameters can be passed just like for other rules, for example: - -using gcc : 4.0 : g++-4.0 ; - - The options that can be passed to each tool will be documented in the - subsequent sections. - -
- - C++ Compilers - - This section lists all Boost.Build modules that support C++ - compilers and documents how each one can be initialized. - -
- - GNU C++ - - The gcc module supports the - GNU C++ compiler - on Linux, a number of Unix-like system including MacOS X, SunOS and - BeOS, and on Windows (either Cygwin - or MinGW). - - - The gcc module is initialized using the following - syntax: - -using gcc : &toolset_ops; ; - - &using_repeation; - - - - - If the version is not explicitly specified, it will be - automatically detected by running the compiler with the -v - option. If the command is not specified, the g++ - binary will be searched in PATH. - - &option_list_intro; - - - - - - - - rc - - - Specifies the resource compiler command - that will be used with the version of gcc that is being - configured. This setting makes sense only for Windows and only - if you plan to use resource files. By - default windres will be used. - - - - - rc-type - - - Specifies the type of resource compiler. The value can - be either windres for msvc resource compiler, - or rc for borland's resource compiler. - - - - - - 64-bit compilation - gcc - - In order to compile 64-bit applications, you have to specify - address-model=64, and the instruction-set - feature should refer to a 64 bit processor. Currently, those - include nocona, opteron, - athlon64 and athlon-fx. - -
- - -
- - Microsoft Visual C++ - - The msvc module supports the - Microsoft Visual - C++ command-line tools on Microsoft Windows. The supported - products and versions of command line tools are listed below: - - Visual Studio 2005—8.0 - Visual Studio .NET 2003—7.1 - Visual Studio .NET—7.0 - Visual Studio 6.0, Service Pack 5—6.5 - - - The msvc module is initialized using the following - syntax: - -using msvc : &toolset_ops; ; - - &using_repeation; - If the version is not explicitly specified, the most recent - version found in the registry will be used instead. If the - special value all is passed as the version, all - versions found in the registry will be configured. If a version is - specified, but the command is not, the compiler binary will be - searched in standard installation paths for that version, followed - by PATH. - - - The compiler command should be specified using forward slashes, - and quoted. - - &option_list_intro; - - - - - - setup - - The filename of the environment setup scripts - to run before invoking the compiler. If not specified, - vcvars32.bat alongside the compiler binary - will be used. - - - - - compiler - - The command that compiles C and C++ sources. - If not specified, cl will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - linker - - The command that links executables and dynamic - libraries. - If not specified, link will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - assembler - - The command that compiles assember files. - If not specified, cl will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - resource-compiler - - The command that compiles resource files. - If not specified, rc will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - idl-compiler - - The command that compiles Microsoft COM - interface definition files. - If not specified, midl will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - mc-compiler - - The command that compiles Microsoft message - catalog files. - If not specified, mt will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - - -
- 64-bit support - - 64-bit compilation - Microsoft Visual Studio - - Starting with version 8.0, Microsoft Visual Studio - can generate binaries for 64-bit processor, both 64-bit - flavours of x86 (codenamed AMD64/EM64T), and - Itanium (codenamed IA64). In addition, compilers that are - itself run in 64-bit mode, for better performance, are provided. - The complete list of compiler configurations are as follows - (we abbreviate AMD64/EM64T to just AMD64): - - 32-bit x86 host, 32-bit x86 target - - 32-bit x86 host, 64-bit AMD64 target - - 32-bit x86 host, 64-bit IA64 target - - 64-bit AMD64 host, 64-bit AMD64 target - - 64-bit IA64 host, 64-bit IA64 target - - - - The 32-bit host compilers can be always used, even on 64-bit Windows. - On the contrary, 64-bit host compilers require both 64-bit - host processor and 64-bit Windows, but can be faster. By default, - only 32-bit host, 32-bit target compiler is installed, and additional - compilers should be installed explicitly. - - - To use 64-bit compilation you should: - - Configure you compiler as usual. If you provide - a path to the compiler explicitly, provide the path to the - 32-bit compiler. If you try to specify the path to any of 64-bit - compilers, configuration won't work. - - - When compiling, use address-model=64, - to generate AMD64 code. - - To generate IA64 code, use - architecture=ia64 - - - The (AMD64 host, AMD64 target) compiler will be used - automatically when you're generating AMD64 code and are - running 64-bit Windows on AMD64. The (IA64 host, IA64 target) - compiler won't be ever used, since nobody has an IA64 machine - to test. - - It is believed that AMD64 and EM64T targets are essentially - compatible. The compiler options /favor:AMD64 - and /favor:EM64T, which are accepted only by - AMD64 targeting compilers, cause the generated code to be - tuned to a specific flavor of 64-bit x86. Boost.Build will - make use of those options depending on the value - of theinstruction-set feature. - -
- -
- -
- - Intel C++ - - The intel-linux and intel-win modules - support the Intel C++ command-line compiler—the Linux - and - Windows versions respectively. - - The module is initialized using the following syntax: - -using intel-linux : &toolset_ops; ; - or - -using intel-win : &toolset_ops; ; - respectively. - - &using_repeation; - - - If compiler command is not specified, then Boost.Build will - look in PATH for an executable icpc - (on Linux), or icc.exe (on Windows). - - - &option_list_intro; - - - - - - - The Linux version supports the following additional options: - - - - - - - - -
- -
- - HP aC++ compiler - - The acc module supports the -HP aC++ compiler - for the HP-UX operating system. - - The module is initialized using the following - syntax: - -using acc : &toolset_ops; ; - - &using_repeation; - - - - If the command is not specified, the aCC - binary will be searched in PATH. - - &option_list_intro; - - - - -
- -
- - Borland C++ Compiler - - The borland module supports the command line - C++ compiler included in - C++ Builder 2006 - product and earlier version of it, running on Microsoft Windows. - - The supported products are listed below. The version reported - by the command lines tools is also listed for reference.: - - C++ Builder 2006—5.8.2 - CBuilderX—5.6.5, 5.6.4 (depending on release) - CBuilder6—5.6.4 - Free command line tools—5.5.1 - - - The module is initialized using the following syntax: - -using borland : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named bcc32 in PATH. - - &option_list_intro; - - - - -
- -
- - Comeau C/C++ Compiler - - The como-linux and the como-win - modules supports the - Comeau C/C++ Compiler - on Linux and Windows respectively. - - The module is initialized using the following syntax: - -using como-linux : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named como in - PATH. - - &option_list_intro; - - - - - Before using the windows version of the compiler, - you need to setup necessary environment variables per compiler's - documentation. In particular, the COMO_XXX_INCLUDE - variable should be set, where XXX corresponds to the - used backend C compiler. - -
- -
- - Code Warrior - - The cw module support CodeWarrior compiler, - originally produced by Metrowerks and presently developed - by Freescale. Boost.Build supports only the versions of the compiler - that target x86 processors. All such versions were released by - Metrowerks before aquisition and are not sold any longer. - The last version known to work is 9.4 - - The module is initialized using the following syntax: - -using cw : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named mwcc in default installation - paths and in PATH. - - &option_list_intro; - - - - - - - - setup - - The command that sets up environment variables - prior to invoking the compiler. If not specified, - cwenv.bat alongside the compiler binary - will be used. - - - - - - compiler - - The command that compiles C and C++ sources. - If not specified, mwcc will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - linker - - The command that links executables and dynamic - libraries. - If not specified, mwld will be used. The - command will be invoked after the setup script was - executed and adjusted the PATH variable. - - - - - -
- -
- - Digital Mars C/C++ Compiler - - The dmc module supports the - Digital Mars C++ compiler. - - - The module is initialized using the following syntax: - -using dmc : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named como in - PATH. - - &option_list_intro; - - - - -
- -
- - HP C++ Compiler for Tru64 Unix - - The hp_cxx modules supports the - - HP C++ Compiler for Tru64 Unix. - - The module is initialized using the following syntax: - -using hp_cxx : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named hp_cxx in PATH. - - &option_list_intro; - - - - -
- -
- - Sun Studio - - The sun module supports the - - Sun Studio C++ compilers for the Solaris OS. - - The module is initialized using the following syntax: - -using sun : &toolset_ops; ; - - &using_repeation; - - If the command is not specified, Boost.Build will search for - a binary named CC - in /opt/SUNWspro/bin and in - PATH. - - When using this compiler on complex C++ code, such as the - Boost C++ library, it is - recommended to specify the following options when intializing the - sun module: - --library=stlport4 -features=tmplife -features=tmplrefstatic - See the - Sun C++ Frontend Tales for details. - - &option_list_intro; - - - - - 64-bit compilation - Sun Studio - Starting with Sun Studio 12, you can create 64-bit applications - by using the address-model=64 property. - -
- -
- - IBM Visual Age - The vacpp module supports the - IBM Visual - Age C++ Compiler, for the AIX operating system. Versions - 7.1 and 8.0 are known to work. - - The module is initialized using the following - syntax: - -using vacpp ; - - The module does not accept any initialization options. The - compiler should be installed in the /usr/vacpp/bin - directory. - - Later versions of Visual Age are known as XL C/C++. They - were not tested with the the vacpp module. - -
- -
- -
- Third-party libraries - - Boost.Build provides special support for some - third-party C++ libraries, documented below. - -
- STLport library - STLport - - The STLport library - is an alternative implementation of C++ runtime library. Boost.Build - supports using that library on Windows platfrom. Linux is - hampered by different naming of libraries in each STLport - version and is not officially supported. - - Before using STLport, you need to configure it in - user-config.jam using the following syntax: - - -using stlport : version : header-path : library-path ; - - - Where version is the version of - STLport, for example 5.1.4, - headers is the location where - STLport headers can be found, and libraries - is the location where STLport libraries can be found. - The version should always be provided, and the library path should - be provided if you're using STLport's implementation of - iostreams. Note that STLport 5.* always uses its own iostream - implementation, so the library path is required. - - - When STLport is configured, you can build with STLport by - requesting stdlib=stlport on the command line. - - -
- -
- -
- -
- Build process - - The general overview of the build process was given in the - user documentation. - This section provides additional details, and some specific rules. - - - To recap, building a target with specific properties includes the - following steps: - - - applying default build, - - selecting the main target alternative to use, - - - determining "common" properties, - - building targets referred by the sources list and - dependency properties, - - adding the usage requirements produces when building - dependencies to the "common" properties, - - building the target using generators, - - computing the usage requirements to be returned. - - - - -
- Alternative selection - - When there are several alternatives, one of them must be - selected. The process is as follows: - - - - - For each alternative condition is defined - as the set of base properies in requirements. [Note: it might be - better to specify the condition explicitly, as in - conditional requirements]. - - - - - - An alternative is viable only if all properties in condition - are present in build request. - - - - - - If there's one viable alternative, it's choosen. Otherwise, - an attempt is made to find one best alternative. An alternative - a is better than another alternative b, iff the set of properties - in b's condition is a strict subset of the set of properities of - 'a's condition. If there's one viable alternative, which is - better than all others, it's selected. Otherwise, an error is - reported. - - - - -
- -
- Determining common properties - - The "common" properties is a somewhat artificial term. Those are - the intermediate property set from which both the build request for - dependencies and properties for building the target are derived. - - - Since default build and alternatives are already handled, we have - only two inputs: build requests and requirements. Here are the rules - about common properties. - - - - Non-free feature can have only one - value - - A non-conditional property in requirement in always - present in common properties. - - A property in build request is present in - common properties, unless (2) tells otherwise. - - If either build request, or requirements (non-conditional - or conditional) include an expandable property (either composite, - or property with specified subfeature value), the behaviour is - equivalent to explicitly adding all expanded properties to build - request or requirements. - - If requirements include a conditional property, and - condiiton of this property is true in context of common - properties, then the conditional property should be in common - properties as well. - - If no value for a feature is given by other rules - here, it has default value in common properties. - - - Those rules are declarative, they don't specify how to compute the - common properties. However, they provide enough information for the - user. The important point is the handling of conditional - requirements. The condition can be satisfied either by property in - build request, by non-conditional requirements, or even by another - conditional property. For example, the following example works as - expected: - -exe a : a.cpp - : <toolset>gcc:<variant>release - <variant>release:<define>FOO ; - - - -
- -
- - - -
- - Definitions - -
- Features and properties - - A feature is a normalized (toolset-independent) - aspect of a build configuration, such as whether inlining is - enabled. Feature names may not contain the '>' - character. - - - - Each feature in a build configuration has one or more - associated values. Feature values for non-free features - may not contain the '<', ':', or - '=' characters. Feature values for free features may not - contain the '<' character. - - A property is a (feature,value) pair, expressed as - <feature>value. - - A subfeature is a feature that only exists in the - presence of its parent feature, and whose identity can be derived - (in the context of its parent) from its value. A subfeature's - parent can never be another subfeature. Thus, features and their - subfeatures form a two-level hierarchy. - - A value-string for a feature F is a string of - the form - value-subvalue1-subvalue2...-subvalueN, where - value is a legal value for F and - subvalue1...subvalueN are legal values of some - of F's subfeatures. For example, the properties - <toolset>gcc <toolset-version>3.0.1 can be - expressed more conscisely using a value-string, as - <toolset>gcc-3.0.1. - - A property set is a set of properties (i.e. a - collection without duplicates), for instance: - <toolset>gcc <runtime-link>static. - - A property path is a property set whose elements have - been joined into a single string separated by slashes. A property - path representation of the previous example would be - <toolset>gcc/<runtime-link>static. - - A build specification is a property set that fully - describes the set of features used to build a target. - -
- Property Validity - - - For free - features, all values are valid. For all other features, - the valid values are explicitly specified, and the build - system will report an error for the use of an invalid - feature-value. Subproperty validity may be restricted so - that certain values are valid only in the presence of - certain other subproperties. For example, it is possible - to specify that the <gcc-target>mingw - property is only valid in the presence of - <gcc-version>2.95.2. - - -
-
- Feature Attributes - - Each feature has a collection of zero or more of the following - attributes. Feature attributes are low-level descriptions of how the - build system should interpret a feature's values when they appear in - a build request. We also refer to the attributes of properties, so - that an incidental property, for example, is - one whose feature has the incidental - attribute. - - - - incidental - - Incidental features are assumed not to affect build - products at all. As a consequence, the build system may use - the same file for targets whose build specification differs - only in incidental features. A feature that controls a - compiler's warning level is one example of a likely - incidental feature. - - Non-incidental features are assumed to affect build - products, so the files for targets whose build specification - differs in non-incidental features are placed in different - directories as described in "target paths" below. [ where? ] - - - - - - - propagated - - - Features of this kind are - propagated to dependencies. That is, if a main target is built using a - propagated - property, the build systems attempts to use the same property - when building any of its dependencies as part of that main - target. For instance, when an optimized exectuable is - requested, one usually wants it to be linked with optimized - libraries. Thus, the <optimization> feature is - propagated. - - - - - - free - - - Most features have a finite set of allowed values, and can - only take on a single value from that set in a given build - specification. Free features, on the other hand, can have - several values at a time and each value can be an arbitrary - string. For example, it is possible to have several - preprocessor symbols defined simultaneously: - - -<define>NDEBUG=1 <define>HAS_CONFIG_H=1 - - - - - - optional - - An optional feature is a feature that is not required to - appear in a build specification. Every non-optional non-free - feature has a default value that is used when a value for - the feature is not otherwise specified, either in a target's - requirements or in the user's build request. [A feature's - default value is given by the first value listed in the - feature's declaration. -- move this elsewhere - dwa] - - - - symmetric - - A symmetric feature's default value is not automatically - included in build variants. Normally - a feature only generates a subvariant directory when its - value differs from the value specified by the build variant, - leading to an assymmetric subvariant directory structure for - certain values of the feature. A symmetric feature, when - relevant to the toolset, always generates a corresponding - subvariant directory. - - - - path - - The value of a path feature specifies a path. The path is - treated as relative to the directory of Jamfile where path - feature is used and is translated appropriately by the build - system when the build is invoked from a different - directory - - - - implicit - - Values of implicit features alone identify the feature. - For example, a user is not required to write - "<toolset>gcc", but can simply write "gcc". Implicit - feature names also don't appear in variant paths, although - the values do. Thus: bin/gcc/... as opposed to - bin/toolset-gcc/.... There should typically be only a few - such features, to avoid possible name clashes. - - - - composite - - Composite features actually correspond to groups of - properties. For example, a build variant is a composite - feature. When generating targets from a set of build - properties, composite features are recursively expanded and - added to the build property set, so rules can find - them if necessary. Non-composite non-free features override - components of composite features in a build property set. - - - - dependency - - The value of dependency feature if a target reference. - When used for building of a main target, the value of - dependency feature is treated as additional dependency. - - For example, dependency features allow to state that - library A depends on library B. As the result, whenever an - application will link to A, it will also link to B. - Specifying B as dependency of A is different from adding B to - the sources of A. - - - - Features that are neither free nor incidental are called - base features. - - -
-
- Feature Declaration - - The low-level feature declaration interface is the - feature rule from the - feature module: - - -rule feature ( name : allowed-values * : attributes * ) - - - A feature's allowed-values may be extended with the - feature.extend rule. - - -
-
- -
- Build Variants - - - A build variant, or (simply variant) is a special kind of composite - feature that automatically incorporates the default values of - features that . Typically you'll want at least two separate - variants: one for debugging, and one for your release code. [ - Volodya says: "Yea, we'd need to mention that it's a composite - feature and describe how they are declared, in pacticular that - default values of non-optional features are incorporated into - build variant automagically. Also, do we wan't some variant - inheritance/extension/templates. I don't remember how it works in - V1, so can't document this for V2.". Will clean up soon -DWA ] - - -
- -
- Property refinement - - When a target with certain properties is requested, and that - target requires some set of properties, it is needed to find the - set of properties to use for building. This process is called - property refinement and is performed by these rules - - - - - - Each property in the required set is added to the original - property set - - - - - - If the original property set includes property with a different - value of non free feature, that property is removed. - - - -
- -
- Conditional properties - - Sometime it's desirable to apply certain requirements only for - a specific combination of other properties. For example, one of - compilers that you use issues a pointless warning that you want to - suppress by passing a command line option to it. You would not - want to pass that option to other compilers. Conditional - properties allow you to do just that. Their syntax is: - - - property ( "," property ) * ":" property - - - - For example, the problem above would be solved by: - - -exe hello : hello.cpp : <toolset>yfc:<cxxflags>-disable-pointless-warning ; - - - - The syntax also allows several properties in the condition, for - example: - -exe hello : hello.cpp : <os>NT,<toolset>gcc:<link>static ; - - - -
- -
- Target identifiers and references - - Target identifier is used to denote a - target. The syntax is: - - -target-id -> (project-id | target-name | file-name ) - | (project-id | directory-name) "//" target-name -project-id -> path -target-name -> path -file-name -> path -directory-name -> path - - - - This grammar allows some elements to be recognized as either - - - - - project id (at this point, all project ids start with slash). - - - - - - name of target declared in current Jamfile (note that target - names may include slash). - - - - - - a regular file, denoted by absolute name or name relative to - project's sources location. - - - - - To determine the real meaning a check is made if project-id - by the specified name exists, and then if main target of that - name exists. For example, valid target ids might be: - - -a -- target in current project -lib/b.cpp -- regular file -/boost/thread -- project "/boost/thread" -/home/ghost/build/lr_library//parser -- target in specific project - - - - - Rationale:Target is separated from project by special - separator (not just slash), because: - - - - - It emphasises that projects and targets are different things. - - - - - - It allows to have main target names with slashes. - - - - - - - - Target reference is used to - specify a source target, and may additionally specify desired - properties for that target. It has this syntax: - - -target-reference -> target-id [ "/" requested-properties ] -requested-properties -> property-path - - - - For example, - - - exe compiler : compiler.cpp libs/cmdline/<optimization>space ; - - - would cause the version of cmdline library, - optimized for space, to be linked in even if the - compiler executable is build with optimization for - speed. - -
- -
- -
- Generators - - The information is this section is likely to be outdated - and misleading. - - - To construct a main target with given properties from sources, - it is required to create a dependency graph for that main target, - which will also include actions to be run. The algorithm for - creating the dependency graph is described here. - - The fundamental concept is generator. If encapsulates - the notion of build tool and is capable to converting a set of - input targets into a set of output targets, with some properties. - Generator matches a build tool as closely as possible: it works - only when the tool can work with requested properties (for - example, msvc compiler can't work when requested toolset is gcc), - and should produce exactly the same targets as the tool (for - example, if Borland's linker produces additional files with debug - information, generator should also). - - Given a set of generators, the fundamental operation is to - construct a target of a given type, with given properties, from a - set of targets. That operation is performed by rule - generators.construct and the used algorithm is described - below. - -
- Selecting and ranking viable generators - - Each generator, in addition to target types that it can - produce, have attribute that affects its applicability in - particular sitiation. Those attributes are: - - - - - Required properties, which are properties absolutely - necessary for the generator to work. For example, generator - encapsulating the gcc compiler would have <toolset>gcc as - required property. - - - - - - Optional properties, which increase the generators - suitability for a particual build. - - - - - - Generator's required and optional properties may not include - either free or incidental properties. (Allowing this would - greatly complicate caching targets). - - - When trying to construct a target, the first step is to select - all possible generators for the requested target type, which - required properties are a subset of requested properties. - Generators that were already selected up the call stack are - excluded. In addition, if any composing generators were selected - up the call stack, all other composing generators are ignored - (TODO: define composing generators). The found generators - are assigned a rank, which is the number of optional properties - present in requested properties. Finally, generators with highest - rank are selected for futher processing. - -
-
- Running generators - - When generators are selected, each is run to produce a list of - created targets. This list might include targets that are not of - requested types, because generators create the same targets as - some tool, and tool's behaviour is fixed. (Note: should specify - that in some cases we actually want extra targets). If generator - fails, it returns an empty list. Generator is free to call - 'construct' again, to convert sources to the types it can handle. - It also can pass modified properties to 'construct'. However, a - generator is not allowed to modify any propagated properties, - otherwise when actually consuming properties we might discover - that the set of propagated properties is different from what was - used for building sources. - - For all targets that are not of requested types, we try to - convert them to requested type, using a second call to - construct. This is done in order to support - transformation sequences where single source file expands to - several later. See this - message for details. - -
- -
- Selecting dependency graph - - - After all generators are run, - it is necessary to decide which of successfull invocation will be - taken as final result. At the moment, this is not done. Instead, - it is checked whether all successfull generator invocation - returned the same target list. Error is issued otherwise. - - -
- -
- Property adjustment - - Because target location is determined by the build system, it - is sometimes necessary to adjust properties, in order to not - break actions. For example, if there's an action that generates - a header, say "a_parser.h", and a source file "a.cpp" which - includes that file, we must make everything work as if a_parser.h - is generated in the same directory where it would be generated - without any subvariants. - - Correct property adjustment can be done only after all targets - are created, so the approach taken is: - - - - - When dependency graph is constructed, each action can be - assigned a rule for property adjustment. - - - - - - When virtual target is actualized, that rule is run and - return the final set of properties. At this stage it can use - information of all created virtual targets. - - - - - In case of quoted includes, no adjustment can give 100% correct - results. If target dirs are not changed by build system, quoted - includes are searched in "." and then in include path, while angle - includes are searched only in include path. When target dirs are - changed, we'd want to make quoted includes to be search in "." then in - additional dirs and then in the include path and make angle includes - be searched in include path, probably with additional paths added at - some position. Unless, include path already has "." as the first - element, this is not possible. So, either generated headers should not - be included with quotes, or first element of include path should be - ".", which essentially erases the difference between quoted and angle - includes. Note: the only way to get - "." as include path into compiler command line is via verbatim - compiler option. In all other case, Boost.Build will convert "." into - directory where it occurs. - -
- -
- Transformations cache - - - Under certain conditions, an - attempt is made to cache results of transformation search. First, - the sources are replaced with targets with special name and the - found target list is stored. Later, when properties, requested - type, and source type are the same, the store target list is - retrieved and cloned, with appropriate change in names. - - -
-
- -
- - diff --git a/v2/doc/src/standalone.xml b/v2/doc/src/standalone.xml deleted file mode 100644 index decde144a..000000000 --- a/v2/doc/src/standalone.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Boost.Build V2 User Manual - - - - - - - - - - - - - - - Boost.Jam Documentation - - - - - - - - diff --git a/v2/doc/src/tasks.xml b/v2/doc/src/tasks.xml deleted file mode 100644 index 58c7bf6ab..000000000 --- a/v2/doc/src/tasks.xml +++ /dev/null @@ -1,657 +0,0 @@ - - - - - - - - - Common tasks - - This section describes main targets types that Boost.Build supports - of-of-the-box. Unless otherwise noted, all mentioned main target rules - have the common signature, described in . - - -
- Programs - - exe - Programs are created using the exe rule, which - follows the common - syntax. For example: - -exe hello : hello.cpp some_library.lib /some_project//library - : <threading>multi - ; - - This will create an executable file from the sources -- in this case, - one C++ file, one library file present in the same directory, and - another library that is created by Boost.Build. Generally, sources - can include C and C++ files, object files and libraries. Boost.Build - will automatically try to convert targets of other types. - - - - - On Windows, if an application uses dynamic libraries, and both - the application and the libraries are built by Boost.Build, its not - possible to immediately run the application, because the - PATH environment variable should include the path - to the libraries. It means you have to either add the paths - manually, or place the application and the libraries to the same - directory. See . - - - -
- -
- Libraries - - Libraries are created using the lib rule, which - follows the common - syntax. For example: - -lib helpers : helpers.cpp : <include>boost : : <include>. ; - - - - In the most common case, the lib creates a library - from the specified sources. Depending on the value of - <link> feature the library will be either static or - shared. There are two other cases. First is when the library is - installed somewhere in compiler's search paths, and should be - searched by the compiler (typically, using the - option). The second case is where the library is available as a - prebuilt file and the full path is known. - - - - - The syntax for these case is given below: - -lib z : : <name>z <search>/home/ghost ; -lib compress : : <file>/opt/libs/compress.a ; - - The name property specifies the name that should be - passed to the option, and the file - property specifies the file location. The search feature - specifies paths in which to search for the library. That feature can - be specified several times, or it can be omitted, in which case only - default compiler paths will be searched. - - - The difference between using the file feature as - opposed to the name feature together with the - search feature is that file is more - precise. A specific file will be used. On the other hand, the - search feature only adds a library path, and the - name feature gives the basic name of the library. The - search rules are specific to the linker. For example, given these - definition: - -lib a : : <variant>release <file>/pool/release/a.so ; -lib a : : <variant>debug <file>/pool/debug/a.so ; -lib b : : <variant>release <file>/pool/release/b.so ; -lib b : : <variant>debug <file>/pool/debug/b.so ; - - It's possible to use release version of a and debug - version of b. Had we used the name and - search features, the linker would always pick either - release or debug versions. - - - - - For convenience, the following syntax is allowed: - -lib z ; -lib gui db aux ; - - and is does exactly the same as: - -lib z : : <name>z ; -lib gui : : <name>gui ; -lib db : : <name>db ; -lib aux : : <name>aux ; - - - - When a library uses another library you should put that other - library in the list of sources. This will do the right thing in all - cases. For portability, you should specify library dependencies even - for searched and prebuilt libraries, othewise, static linking on - Unix won't work. For example: - -lib z ; -lib png : z : <name>png ; - - - - - When a library (say, a), that has another - library, (say, b) - - is linked dynamically, the b - library will be incorporated - - in a. (If b - is dynamic library as well, then a will only refer to - it, and not include any extra code.) - - When the a - library is linked statically, Boost.Build will assure that all - executables that link to a will also link to - b. - - - - One feature of Boost.Build that is very important for libraries - is usage requirements. - - For example, if you write: - -lib helpers : helpers.cpp : : : <include>. ; - - then the compiler include path for all targets that use - helpers will contain the directory - - where the target is defined.path to "helpers.cpp". The user - only needs to add helpers to the list of sources, - and needn't consider the requirements its use imposes on a - dependent target. This feature greatly simplifies Jamfiles. - - - - - If you don't want shared libraries to include all libraries - that are specified in sources (especially statically linked ones), - you'd need to use the following: - -lib b : a.cpp ; -lib a : a.cpp : <use>b : : <library>b ; - - This specifies that a uses b, and causes - all executables that link to a also link to - b. In this case, even for shared linking, the - a library won't even refer to b. - - - -
- -
- Alias - - - The alias rule gives alternative name to - a group of targets. For example, to give the name - core to a group of three other targets with the - following code: - -alias core : im reader writer ; - Using core on the command line, or in the source list - of any other target is the same as explicitly using - im, reader, and - writer, but it is just more convenient. - - - - - - Another use of the alias rule is to change build - properties. For example, if you always want static linking for a - specific C++ Boost library, you can write the following: - -alias threads : /boost/thread//boost_thread : <link>static ; - - and use only the threads alias in your Jamfiles. - - - - - You can also specify usage requirements for the - alias target. If you write the following: - -alias header_only_library : : : : <include>/usr/include/header_only_library ; - - then using header_only_library in sources will only add an - include path. Also note that when there are some sources, their usage - requirements are propagated, too. For example: - -lib lib : lib.cpp : : : <include>. ; -alias lib_alias ; -exe main : main.cpp lib_alias ; - - will compile main.cpp with the additional include. - - -
- -
- Installing - - This section describes various ways to install built target - and arbitrary files. - - Basic install - - For installing a built target you should use the - install rule, which follows the common syntax. For - example: - -install dist : hello helpers ; - - will cause the targets hello and helpers to - be moved to the dist directory, relative to - Jamfile's directory. The directory can - be changed with the location property: - -install dist : hello helpers : <location>/usr/bin ; - - While you can achieve the same effect by changing the target name to - /usr/bin, using the location - property is better, because it allows you to use a mnemonic target - name. - - - The location property is especially handy when the location - is not fixed, but depends on build variant or environment variables: - -install dist : hello helpers : <variant>release:<location>dist/release - <variant>debug:<location>dist/debug ; -install dist2 : hello helpers : <location>$(DIST) ; - - See also conditional - properties and environment variables - - - Installing with all dependencies - - - Specifying the names of all libraries to install can be boring. The - install allows you to specify only the top-level executable - targets to install, and automatically install all dependencies: - -install dist : hello - : <install-dependencies>on <install-type>EXE - <install-type>LIB - ; - - will find all targets that hello depends on, and install - all of those which are either executables or libraries. More - specifically, for each target, other targets that were specified as - sources or as dependency properties, will be recursively found. One - exception is that targets referred with the use feature - are not considered, because that feature is typically used to refer to - header-only libraries. - If the set of target types is specified, only targets of that type - will be installed, otherwise, all found target will be installed. - - - Preserving Directory Hierarchy - - install-source-root - By default, the install rules will stip paths from - it's sources. So, if sources include a/b/c.hpp, - the a/b part will be ignored. To make the - install rule preserve the directory hierarchy you need - to use the install-source-root feature to specify the - root of the hierarchy you are installing. Relative paths from that - root will be preserved. For example, if you write: - - -install headers - : a/b/c.h - : <location>/tmp <install-source-root>a - ; - - - the a file named /tmp/b/c.h will be created. - - - The glob-tree rule - can be used to find all files below a given directory, making - it easy to install entire directory tree. - - Installing into Several Directories - - The alias - rule can be used when targets must be installed into several - directories: - -alias install : install-bin install-lib ; -install install-bin : applications : /usr/bin ; -install install-lib : helper : /usr/lib ; - - - - Because the install rule just copies targets, most - free features see the definition of "free" in . - have no effect when used in requirements of the install rule. - The only two which matter are - - dependency and, on Unix, - dll-path. - - - - - (Unix specific). On Unix, executables built with Boost.Build typically - contain the list of paths to all used dynamic libraries. For - installing, this is not desired, so Boost.Build relinks the executable - with an empty list of paths. You can also specify additional paths for - installed executables with the dll-path feature. - - - - -
- -
- - Testing - - Boost.Build has convenient support for running unit tests. The - simplest way is the unit-test rule, which follows the - common syntax. For - example: - -unit-test helpers_test : helpers_test.cpp helpers ; - - - - The unit-test rule behaves like the - exe rule, but after the executable is created it is - run. If the executable returns an error code, the build system will also - return an error and will try running the executable on the next - invocation until it runs successfully. This behaviour ensures that you - can't miss a unit test failure. - - - By default, the executable is run directly. Sometimes, it's - desirable to run the executable using some helper command. You should use the - testing.launcher property to specify the name of the - helper command. For example, if you write: - - -unit-test helpers_test - : helpers_test.cpp helpers - : <testing.launcher>valgrind - ; - - The command used to run the executable will be: - -valgrind bin/$toolset/debug/helpers_test - - - There are few specialized testing rules, listed below: - -rule compile ( sources : requirements * : target-name ? ) -rule compile-fail ( sources : requirements * : target-name ? ) -rule link ( sources + : requirements * : target-name ? ) -rule link-fail ( sources + : requirements * : target-name ? ) - - They are are given a list of sources and requirements. - If the target name is not provided, the name of the first - source file is used instead. The compile* - tests try to compile the passed source. The link* - rules try to compile and link an application from all the passed sources. - The compile and link rules expect - that compilation/linking succeeds. The compile-fail - and link-fail rules, on the opposite, expect that - the compilation/linking fails. - - - There are two specialized rules for running applications, which - are more powerful than the unit-test rule. The - run rule has the following signature: - -rule run ( sources + : args * : input-files * : requirements * : target-name ? - : default-build * ) - - The rule builds application from the provided sources and runs it, - passing args and input-files - as command-line arguments. The args parameter - is passed verbatim and the values of the input-files - parameter are treated as paths relative to containing Jamfile, and are - adjusted if bjam is invoked from a different - directory. The run-fail rule is identical to the - run rule, except that it expects that the run fails. - - - All rules described in this section, if executed successfully, - create a special manifest file to indicate that the test passed. - For the unit-test rule the files is named - target-name.passed and - for the other rules it is called - target-name.test. - The run* rules also capture all output from the program, - and store it in a file named - target-name.output. - - The run and the run-fail rules, if - the test passes, automatically delete the linked executable, to - save space. This behaviour can be suppressed by passing the - --preserve-test-targets command line option. - - It is possible to print the list of all test targets (except for - unit-test) declared in your project, by passing - the --dump-tests command-line option. The output - will consist of lines of the form: - -boost-test(test-type) path : sources - - - - It is possible to process the list of tests, the output of - bjam during command run, and the presense/absense of the - *.test files created when test passes into - human-readable status table of tests. Such processing utilities - are not included in Boost.Build. - -
- -
- - Custom commands - - When you use most of main target rules, Boost.Build automatically - figures what commands to run and it what order. As soon as you want - to use new file types, or support new tools, one approach is to - extend Boost.Build to smoothly support them, as documented in - . However, if there's a single - place where the new tool is used, it might be easier to just - explicitly specify the commands to run. - - Three main target rules can be used for that. The - make rule allows you to construct - a single file from any number of source file, by running a - command you specify. The notfile rule - allows you to run an arbitrary command, without creating any files. - Finaly, the generate rule allows you - to describe transformation using Boost.Build's virtual targets. - This is higher-level than file names that the make rule operates with, - and allows you to create more than one target, or create differently - named targets depending on properties, or use more than one - tool. - - The make rule is used when you want to - create one file from a number of sources using some specific command. - The notfile is used to unconditionally run - a command. - - - - Suppose you want to create file file.out from - file file.in by running command - in2out. Here's how you'd do this in Boost.Build: - -actions in2out -{ - in2out $(<) $(>) -} -make file.out : file.in : @in2out ; - - If you run bjam and file.out - does not exist, Boost.Build will run the in2out - command to create that file. For more details on specifying actions, - see . - - - - - It could be that you just want to run some command unconditionally, - and that command does not create any specific files. The, you can use - the notfile rule. For example: - -notfile echo_something : @echo ; -actions echo -{ - echo "something" -} - - The only difference from the make rule is - that the name of the target is not considered a name of a file, so - Boost.Build will unconditionally run the action. - - - The generate rule is used when - you want to express transformations using Boost.Build's virtual targets, - as opposed to just filenames. The generate - rule has the standard main target rule signature, but you are required - to specify the generating-rule property. The value - of the property should be in the form - @rule-name and the named - rule should have the following signature: - -rule generating-rule ( project name : property-set : sources * ) - - and will be called with an instance of the project-target - class, the name of the main target, an instance of the - property-set class containing build properties, - and the list of instances of the virtual-target class - corresponding to sources. - The rule must return a list of virtual-target instances. - The interface of the virtual-target class can be learned - by looking at the build/virtual-target.jam file. - The generate example in Boost.Build distribution - illustrates how the generate rule can be used. - - -
- -
- Precompiled Headers - - Precompiled headers is a mechanism to speed up compilation - by creating a partially processed version of some header files, - and then using that version during compilations rather then - repeatedly parsing the original headers. Boost.Build supports - precompiled headers with gcc and msvc toolsets. - - To use precompiled headers, follow these steps: - - Create a header that includes big headers used by your project. - It's better to include only headers that are sufficiently stable — - like headers from the compiler, and external libraries. Please wrap - the header in #ifdef BOOST_BUILD_PCH_ENABLED, so that - the potentially expensive inclusion of headers is not done - when PCH is not enabled. Include the new header at the top of your - source files. - - Declare a new Boost.Build target for the precompiled header - and add that precompiled header to the sources of the target whose compilation - you want to speed up: - -cpp-pch pch : header.hpp ; -exe main : main.cpp pch ; - You can use the c-pch if you want to use the precompiled - header in C programs. - - - - The pch example in Boost.Build distribution - can be used as reference. - - Please note the following: - - The inclusion of the precompiled header must be the - first thing in a source file, before any code or preprocessor directives. - - - The build properties used to compile the source files - and the precompiled header must be the same. Consider using - project requirements to assure this. - - - Precompiled headers must be used purely as a way to - improve compilation time, not to save the number of #include - statements. If a source file needs to include some header, explicitly include - it in the source file, even if the same header is included from - the precompiled header. This makes sure that your project will build - even if precompiled headers are not supported. - - - - -
- - -
- Generated headers - - Usually, Boost.Build handles implicit dependendies completely - automatically. For example, for C++ files, all #include - statements are found and handled. The only aspect where user help - might be needed is implicit dependency on generated files. - - By default, Boost.Build handles such dependencies within one - main target. For example, assume that main target "app" has two - sources, "app.cpp" and "parser.y". The latter source is converted - into "parser.c" and "parser.h". Then, if "app.cpp" includes - "parser.h", Boost.Build will detect this dependency. Moreover, - since "parser.h" will be generated into a build directory, the - path to that directory will automatically added to include - path. - - Making this mechanism work across main target boundaries is - possible, but imposes certain overhead. For that reason, if - there's implicit dependency on files from other main targets, the - <implicit-dependency> [ link ] feature must - be used, for example: - - -lib parser : parser.y ; -exe app : app.cpp : <implicit-dependency>parser ; - - - - The above example tells the build system that when scanning - all sources of "app" for implicit-dependencies, it should consider - targets from "parser" as potential dependencies. - -
- -
- - - diff --git a/v2/doc/src/tutorial.xml b/v2/doc/src/tutorial.xml deleted file mode 100644 index 590bd75cc..000000000 --- a/v2/doc/src/tutorial.xml +++ /dev/null @@ -1,716 +0,0 @@ - - - - - - - Tutorial - - - - - - - - This section will guide you though the most basic features of - Boost.Build V2. We will start with the “Hello, world” example, - learn how to use libraries, and finish with testing and installing features. - - -
- Hello, world - - The simplest project that Boost.Build can construct is - stored in example/hello/ directory. The - project is described by a file - called Jamroot that contains: - - -exe hello : hello.cpp ; - - - Even with this simple setup, you can do some interesting - things. First of all, just invoking bjam will - build the hello - executable by compiling and - linking hello.cpp. By default, debug variant - is built. Now, to build the - release variant of hello, invoke - - -bjam release - - - Note that debug and release variants are created in different - directories, so you can switch between variants or even build - multiple variants at once, without any unnecessary - recompilation. Let's extend the example by adding another line - to our project's Jamroot: - - -exe hello2 : hello.cpp ; - - - Now let us build both the debug and release variants of our project - again: - - -bjam debug release - - - Note that two variants of hello2 are linked. - Since we have already built both variants - of hello, hello.cpp won't be recompiled; - instead the existing object files will just be linked into the - corresponding variants of hello2. Now - let's remove all the built products: - - -bjam --clean debug release - - - It's also possible to build or clean specific targets. The - following two commands, respectively, build or clean only the - debug version of hello2. - - -bjam hello2 -bjam --clean hello2 - - - -
-
- Properties - - - To portably represent aspects of target configuration such as - debug and release variants, or single- and multi-threaded - builds, Boost.Build uses features with - associated values. For - example, the debug-symbols feature can have a value of on or - off. A property is just a (feature, - value) pair. When a user initiates a build, Boost.Build - automatically translates the requested properties into appropriate - command-line flags for invoking toolset components like compilers - and linkers. - - There are many built-in features that can be combined to - produce arbitrary build configurations. The following command - builds the project's release variant with inlining - disabled and debug symbols enabled: - - -bjam release inlining=off debug-symbols=on - - - - Properties on the command-line are specified with the syntax: - - -feature-name=feature-value - - - - The and that we've seen - in bjam invocations are just a shorthand way to - specify values of the variant feature. For example, the command - above could also have been written this way: - - -bjam variant=release inlining=off debug-symbols=on - - - - variant is so commonly-used that it has - been given special status as an implicit - feature—Boost.Build will deduce the its identity just - from the name of one of its values. - - - - A complete description of features can be found in . - - - -
- Build Requests and Target Requirements - - - The set of properties specified on the command line constitute - a build request—a description of - the desired properties for building the requested targets (or, - if no targets were explicitly requested, the project in the - current directory). The actual - properties used for building targets are typically a - combination of the build request and properties derived from - the project's Jamroot (and its other - Jamfiles, as described in ). For example, the - locations of #included header files are normally - not specified on the command-line, but described in - Jamfiles as target - requirements and automatically combined with the - build request for those targets. Multithread-enabled - compilation is another example of a typical target - requirement. The Jamfile fragment below - illustrates how these requirements might be specified. - - - -exe hello - : hello.cpp - : <include>boost <threading>multi - ; - - - - When hello is built, the two - requirements specified above will always be present. - If the build request given on the bjam - command-line explictly contradicts a target's requirements, - the target requirements usually override (or, in the case of - “free”” features like - <include>, - - -See - - augments) the build request. - - - - - The value of the <include> feature is - relative to the location of Jamroot where it's - used. - - - -
-
- Project Attributes - - - If we want the same requirements for our other - target, hello2, we could simply duplicate - them. However, as projects grow, that approach leads to a great - deal of repeated boilerplate in Jamfiles. - - Fortunately, there's a better way. Each project can specify a - set of attributes, including - requirements: - - -project - : requirements <include>/home/ghost/Work/boost <threading>multi - ; - -exe hello : hello.cpp ; -exe hello2 : hello.cpp ; - - - The effect would be as if we specified the same requirement for - both hello and hello2. - -
-
- -
- Project Hierarchies - - So far we've only considered examples with one project - —a. with one user-written Boost.Jam file, - Jamroot). A typical large codebase would be - composed of many projects organized into a tree. The top of the - tree is called the project root. Every - subproject is defined by a file called - Jamfile in a descendant directory of the - project root. The parent project of a subproject is defined by - the nearest Jamfile or - Jamroot file in an ancestor directory. For - example, in the following directory layout: - - -top/ - | - +-- Jamroot - | - +-- app/ - | | - | +-- Jamfile - | `-- app.cpp - | - `-- util/ - | - +-- foo/ - . | - . +-- Jamfile - . `-- bar.cpp - - - the project root is top/. The projects in - top/app/ and - top/util/foo/ are immediate children of the - root project. - - - - When we refer to a “Jamfile,” set in normal - type, we mean a file called either - Jamfile or - Jamroot. When we need to be more - specific, the filename will be set as - “Jamfile” or - “Jamroot.” - - - - - - Projects inherit all attributes (such as requirements) - from their parents. Inherited requirements are combined with - any requirements specified by the subproject. - For example, if top/Jamroot has - - -<include>/home/ghost/local - - - in its requirements, then all of its subprojects will have it - in their requirements, too. Of course, any project can add - include paths to those specified by its parents. - Many - features will be overridden, - rather than added-to, in subprojects. See for more - information - - More details can be found in - . - - - - Invoking bjam without explicitly specifying - any targets on the command line builds the project rooted in the - current directory. Building a project does not automatically - cause its subprojects to be built unless the parent project's - Jamfile explicitly requests it. In our example, - top/Jamroot might contain: - - -build-project app ; - - - which would cause the project in top/app/ - to be built whenever the project in top/ is - built. However, targets in top/util/foo/ - will be built only if they are needed by targets in - top/ or top/app/. - -
- -
- Dependent Targets - - - When a building a target X depends on first - building another target Y (such as a - library that must be linked with X), - Y is called a - dependency of X and - X is termed a - dependent of Y. - - - To get a feeling of target dependencies, let's continue the - above example and see how top/app/Jamfile can - use libraries from top/util/foo. If - top/util/foo/Jamfile contains - - -lib bar : bar.cpp ; - - - then to use this library in top/app/Jamfile, we can - write: - - -exe app : app.cpp ../util/foo//bar ; - - - While app.cpp refers to a regular source file, - ../util/foo//bar is a reference to another target: - a library bar declared in the Jamfile at - ../util/foo. - - - - Some other build system have special syntax for listing dependent - libraries, for example LIBS variable. In Boost.Build, - you just add the library to the list of sources. - - - - Suppose we build app with: - -bjam app optimization=full define=USE_ASM - - Which properties will be used to build foo? The answer is - that some features are - propagated—Boost.Build attempts to use - dependencies with the same value of propagated features. The - <optimization> feature is propagated, so both - app and foo will be compiled - with full optimization. But <define> is not - propagated: its value will be added as-is to the compiler flags for - a.cpp, but won't affect foo. - - - - Let's improve this project further. - The library - probably has some headers that must be used when compiling - app.cpp. We could manually add the necessary - #include paths to app's - requirements as values of the - <include> feature, but then this work will - be repeated for all programs - that use foo. A better solution is to modify - util/foo/Jamfile in this way: - - -project - : usage-requirements <include>. - ; - -lib foo : foo.cpp ; - - - Usage requirements are applied not to the target being declared - but to its - dependents. In this case, <include>. will be applied to all - targets that directly depend on foo. - - - Another improvement is using symbolic identifiers to refer to - the library, as opposed to Jamfile location. - In a large project, a library can be used by many targets, and if - they all use Jamfile location, - a change in directory organization entails much work. - The solution is to use project ids—symbolic names - not tied to directory layout. First, we need to assign a project id by - adding this code to - Jamroot: - -use-project /library-example/foo : util/foo ; - - Second, we modify app/Jamfile to use the - project id: - - -exe app : app.cpp /library-example/foo//bar ; - -The /library-example/foo//bar syntax is used - to refer to the target bar in - the project with id /library-example/foo. - We've achieved our goal—if the library is moved to a different - directory, only Jamroot must be modified. - Note that project ids are global—two Jamfiles are not - allowed to assign the same project id to different directories. - - - - - If you want all applications in some project to link - to a certain library, you can avoid having to specify it directly the sources of every - target by using the - <library> property. For example, if /boost/filesystem//fs - should be linked to all applications in your project, you can add - <library>/boost/filesystem//fs to the project's requirements, like this: - - -project - : requirements <source>/boost/filesystem//fs - ; - - - -
- -
- Testing - - -
- -
- Static and shared libaries - - Libraries can be either - static, which means they are included in executable - files that use them, or shared (a.k.a. - dynamic), which are only referred to from executables, - and must be available at run time. Boost.Build can create and use both kinds. - - - The kind of library produced from a lib target is - determined by the value of the link feature. Default - value is shared, and to build static library, the value - should be static. You can either requiest static build - on the command line: - -bjam link=static - - or in the library's requirements: - -lib l : l.cpp : <link>static ; - - - - - We can also use the <link> property - to express linking requirements on a per-target basis. - For example, if a particular executable can be correctly built - only with the static version of a library, we can qualify the - executable's target - reference to the library as follows: - - - - -exe important : main.cpp helpers/<link>static ; - - No matter what arguments are specified on the bjam - command line, important will only be linked with - the static version of helpers. - - - - Specifying properties in target references is especially useful if you - use a library defined in some other project (one you can't - change) but you still want static (or dynamic) linking to that library - in all cases. If that library is used by many targets, - you could use target references - everywhere: - - -exe e1 : e1.cpp /other_project//bar/<link>static ; -exe e10 : e10.cpp /other_project//bar/<link>static ; - - but that's far from being convenient. A better approach is - to introduce a level of indirection. Create a local - alias target that refers to the static (or - dynamic) version of foo: - - -alias foo : /other_project//bar/<link>static ; -exe e1 : e1.cpp foo ; -exe e10 : e10.cpp foo ; - - The alias - rule is specifically used to rename a reference to a target and possibly - change the properties. - - - - - - - When one library uses another, you put the second library in - the source list of the first. For example: - -lib utils : utils.cpp /boost/filesystem//fs ; -lib core : core.cpp utils ; -exe app : app.cpp core ; - This works no matter what kind of linking is used. When - core is built as a shared library, it is linked - directly into utils. Static libraries can't - link to other libraries, so when core is built - as a static library, its dependency on utils is passed along to - core's dependents, causing - app to be linked with both - core and utils. - - - - - (Note for non-UNIX system). Typically, shared libraries must be - installed to a directory in the dynamic linker's search - path. Otherwise, applications that use shared libraries can't be - started. On Windows, the dynamic linker's search path is given by the - PATH environment variable. This restriction is lifted - when you use Boost.Build testing facilities—the - PATH variable will be automatically adjusted before - running executable. - - - - -
- -
- Conditions and alternatives - - Sometimes, particular relationships need to be maintained - among a target's build properties. For example, you might want to set - specific #define when a library is built as shared, - or when a target's release variant is built. - This can be achieved with conditional requirements. - - -lib network : network.cpp - : <link>shared:<define>NEWORK_LIB_SHARED - <variant>release:<define>EXTRA_FAST - ; - - - In the example above, whenever network is - built with <link>shared, - <define>NEWORK_LIB_SHARED will be in its - properties, too. Also, whenever its release variant is built, - <define>EXTRA_FAST will appear in its properties. - - - - Sometimes the ways a target is built are so different that - describing them using conditional requirements would be - hard. For example, imagine that a library actually uses - different source files depending on the toolset used to build - it. We can express this situation using target - alternatives: - -lib demangler : dummy_demangler.cpp ; # alternative 1 -lib demangler : demangler_gcc.cpp : <toolset>gcc ; # alternative 2 -lib demangler : demangler_msvc.cpp : <toolset>msvc ; # alternative 3 - - When building demangler, Boost.Build will compare - requirements for each alternative with build properties to find the best match. - For example, when building with with <toolset>gcc - alternative 2, will be selected, and when building with - <toolset>msvc alternative 3 will be selected. In all other - cases, the most generic alternative 1 will be built. - - -
- -
- Prebuilt targets - - - To link to libraries whose build instructions aren't given in a Jamfile, - you need to create lib targets with an appropriate - file property. Target alternatives can be used to - associate multiple library files with a single conceptual target. For - example: - -# util/lib2/Jamfile -lib lib2 - : - : <file>lib2_release.a <variant>release - ; - -lib lib2 - : - : <file>lib2_debug.a <variant>debug - ; - - - This example defines two alternatives for lib2, and - for each one names a prebuilt file. Naturally, there are no sources. - Instead, the <file> feature is used to specify - the file name. - - - Once a prebuilt target has been declared, it can be used just like any other target: - - -exe app : app.cpp ../util/lib2//lib2 ; - - - As with any target, the alternative selected depends on the - properties propagated from lib2's dependents. - If we build the the release and debug versions of app will be linked - with lib2_release.a and lib2_debug.a, respectively. - - - - - System libraries—those that are automatically found by - the toolset by searching through some set of predetermined - paths—should be declared almost like regular ones: - - -lib pythonlib : : <name>python22 ; - - - We again don't specify any sources, but give a - name that should be passed to the - compiler. If the gcc toolset were used to link an executable - target to pythonlib, - would appear in the command line (other compilers may use - different options). - - - - We can also specify where the toolset should look for the library: - - -lib pythonlib : : <name>python22 <search>/opt/lib ; - - - And, of course, target alternatives can be used in the usual way: - - -lib pythonlib : : <name>python22 <variant>release ; -lib pythonlib : : <name>python22_d <variant>debug ; - - - - - A more advanced use of prebuilt targets is described in . - - -
- -
- - diff --git a/v2/doc/src/userman.xml b/v2/doc/src/userman.xml deleted file mode 100644 index d57e05653..000000000 --- a/v2/doc/src/userman.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Boost.Build V2 User Manual - - - - - - - - - - - - - - - - diff --git a/v2/doc/src/v1_vs_v2.xml b/v2/doc/src/v1_vs_v2.xml deleted file mode 100644 index 8b77b8f01..000000000 --- a/v2/doc/src/v1_vs_v2.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - Differences to Boost.Build V1 - - - While Boost.Build V2 is based on the same ideas as Boost.Build V1, - some of the syntax was changed, and some new important features were - added. This chapter describes most of the changes. - -
- Configuration - - In V1, toolsets were configured by environment variables. If you - wanted to use two versions of the same toolset, you had to create a new - toolset module that would set the variables and then invoke the base - toolset. In V2, toolsets are configured by the - using, and you can easily configure several - versions of a toolset. See for details. - - -
- -
- Writing Jamfiles - - Probably one of the most important differences in V2 Jamfiles is - the use of project requirements. In V1, if several targets had the same - requirements (for example, a common #include path), it was necessary to - manually write the requirements or use a helper rule or template target. In V2, the - common properties can be specified with the requirements project - attribute, as documented in . - - - Usage requirements - also help to simplify Jamfiles. - - If a library requires - all clients to use specific #include paths or macros when compiling - code that depends on the library, that information can be cleanly - represented. - - The difference between lib and dll targets in V1 is completely - eliminated in V2. There's only one library target type, lib, which can create - either static or shared libraries depending on the value of the - <link> - feature. If your target should be only built in one way, you - can add <link>shared or <link>static to its requirements. - - - The syntax for referring to other targets was changed a bit. While - in V1 one would use: - -exe a : a.cpp <lib>../foo/bar ; - - the V2 syntax is: - -exe a : a.cpp ../foo//bar ; - - Note that you don't need to specify the type of other target, but the - last element should be separated from the others by a double slash to indicate that - you're referring to target bar in project ../foo, and not to - project ../foo/bar. - - - -
- -
- Build process - - The command line syntax in V2 is completely different. For example - -bjam -sTOOLS=msvc -sBUILD=release some_target - - now becomes: - -bjam toolset=msvc variant=release some_target - - or, using implicit features, just: - -bjam msvc release some_target - - See the reference for a - complete description of the syntax. - - - -
-
- - - diff --git a/v2/doc/tools.html b/v2/doc/tools.html deleted file mode 100644 index 8b4929d29..000000000 --- a/v2/doc/tools.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - Boost Build System V2 — supported tools - - - - boost.png (6897 bytes) SourceForge.net Logo - -

Boost Build System V2 — supported tools

- -

Compilers

- -

The following compilers are supported:

- -
    -
  • GNU gcc (various versions), on Linux, NT, Cygwin and Darwin.
  • - -
  • Microsoft VC++ compiler (various version), on NT and Cygwin.
  • - -
  • Borland's compiler, on NT and Cygwin.
  • - -
  • Metrowerks Code Warrior, on NT.
  • - -
  • Intel C++ Compiler, on Linux and NT.
  • - -
  • Sun's C++ Compiler.
  • - -
- -

Libraries

- -

Some important libraries have special support in Boost.Build:

- -
    -
  • STLport — on gcc and - msvc.
  • - -
  • QT, - including the moc and uic tools — on gcc and msvc.
  • -
- -

Other tools

- -
    -
  • Parser/lexer generators bison and lex.
  • - -
  • XSLT processor xsltproc.
  • - -
  • The Apache FOP - tool.
  • - -
  • BoostBook documentation format.
  • - -
  • GNU gettext - internationalization tools.
  • -
-
- -

© Copyright Vladimir Prus 2003. Permission to copy, use, modify, - sell and distribute this document is granted provided this copyright - notice appears in all copies. This document is provided "as is" without - express or implied warranty, and with no claim as to its suitability for - any purpose.

- -

Revised - Jule 3, 2003 - -

- - - diff --git a/v2/doc/userman.pdf b/v2/doc/userman.pdf deleted file mode 100644 index 975c22bfd..000000000 --- a/v2/doc/userman.pdf +++ /dev/null @@ -1,4763 +0,0 @@ -%PDF-1.3 -%ª«¬­ -4 0 obj -<< /Type /Info -/Producer (FOP 0.20.5) >> -endobj -5 0 obj -<< /Length 237 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Garo;9aefl%#46L'fg.:A,_=_3Kt@^`=k*&pMh;F>1)1R!@$_EQ]79c(]8B^I\";M^VUf!_a9%W-]p:1<0+_KsfL9rP/b>G"tO*5J]/gp-a77gmY?'upGVC4&c?CC2KCQJ(5X`1mh;jVN=b1!'#,He.7h2_P)s&oKE#lO(t9$K]V"hY%(;n48i~> -endstream -endobj -6 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 5 0 R ->> -endobj -7 0 obj -<< /Length 2150 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gb"/l?#uJp'Sc)T/"#104gUgf#r#FB9g?)BREi7Ime1+&0,,sR\equ`8DAX/J?_*o`09GP*VW9G*YBX@"MO"=]c8Z&UIWY@_]m^)37E!13V*i(]]thDOmdTk(rgGE!b])drcpJg=1K52(Od(/EPR8!:oD"h'4"^?f_*nmf9uV8FWEHcX*Uakme81X/rSAZf,+9nh+:Fmn=eAQQYT%hYfPC$CSm;9=WOKq_Lo)Li`]#K%>N?[aP]99%^5Xj\bk6M-?^,Pj,-"5Z'P_*LLN9@LJVi;`k/5X.rHp1l?u"=p2nm4:ts;+748O,6oo]$u%Ch7ZAJD`4b62B\t/!hD#^F^RG;dk(ETO>s#-IBrO`)J&Ctnt9>N!-(;@.2b@rCcUKWl3\?8McS.u;43Z6XDgYd)sO,1RLpEod/GKQ3dWA_q:SHV62[Xg]:DkK1cO1GT>&Erq(HB8'W(W!hH!9$'/]#d]D)$1roL[5p4O2;_)cqYS91nj8I2%lPgT.NIjEge#'7Y%50^sig>45e;$p:2ZGnr`Lr:Ds3W^F2l0^HAp84'Jj>uWV&@RsHc.0/nsAI*4H*eIC&&!0b>k,[dZQ)RKj9e,:-4bu/a6a(`cq9PgRsMQ`pMLK(6Y'"AssL;af$dbal9e,M:*+d5R4JF5:/STa%;g[m9NVi\B^$cQG"*V?;$L(X*4H^a$1FE3k9f)+jSm[qI;I1Bmm6Sf@;k%9jhQ)8f=*qD:`Bs9J,Hj`l&Sp3f-]up`R$fM(]b>QI_>IZR[70$"]Ur:RX_mDiOUmiFOBCeSn1-T@JnpEki0n*ReV9JF=LB1.MF)CJjpG7,$g8OE\PF-g_:Ie5aG=M8R?mWr=dEd?1'CR4-".qog3h1D-.,>fe9J&8&90_K(A2hY4dT%9]kj-HmMkkW`YPZ$?-q'"l]cb[i;QCbQrd0qL^PhOm^WU,rPDR+7P[+)qEe@"#Q'@PQ~> -endstream -endobj -8 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 7 0 R -/Annots 9 0 R ->> -endobj -9 0 obj -[ -10 0 R -12 0 R -14 0 R -16 0 R -18 0 R -20 0 R -22 0 R -24 0 R -26 0 R -28 0 R -30 0 R -32 0 R -34 0 R -36 0 R -38 0 R -40 0 R -42 0 R -44 0 R -46 0 R -48 0 R -50 0 R -52 0 R -54 0 R -56 0 R -58 0 R -60 0 R -62 0 R -64 0 R -66 0 R -68 0 R -70 0 R -72 0 R -74 0 R -76 0 R -78 0 R -80 0 R -82 0 R -84 0 R -86 0 R -88 0 R -90 0 R -92 0 R -94 0 R -96 0 R -98 0 R -] -endobj -10 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 655.001 176.44 645.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 11 0 R -/H /I ->> -endobj -12 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 644.001 117.0 634.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 13 0 R -/H /I ->> -endobj -14 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 633.001 104.22 623.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 15 0 R -/H /I ->> -endobj -16 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 622.001 146.55 612.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 17 0 R -/H /I ->> -endobj -18 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 611.001 136.55 601.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 19 0 R -/H /I ->> -endobj -20 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 600.001 172.92 590.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 21 0 R -/H /I ->> -endobj -22 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 589.001 171.81 579.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 23 0 R -/H /I ->> -endobj -24 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 578.001 196.26 568.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 25 0 R -/H /I ->> -endobj -26 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 567.001 205.44 557.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 27 0 R -/H /I ->> -endobj -28 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 556.001 156.83 546.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 29 0 R -/H /I ->> -endobj -30 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 545.001 152.82 535.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 31 0 R -/H /I ->> -endobj -32 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 534.001 152.11 524.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 33 0 R -/H /I ->> -endobj -34 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 523.001 162.94 513.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 35 0 R -/H /I ->> -endobj -36 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 512.001 169.33 502.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 37 0 R -/H /I ->> -endobj -38 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 501.001 172.67 491.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 39 0 R -/H /I ->> -endobj -40 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 490.001 157.94 480.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 41 0 R -/H /I ->> -endobj -42 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 479.001 218.21 469.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 43 0 R -/H /I ->> -endobj -44 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 468.001 141.15 458.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 45 0 R -/H /I ->> -endobj -46 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 457.001 145.44 447.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 47 0 R -/H /I ->> -endobj -48 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 446.001 145.71 436.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 49 0 R -/H /I ->> -endobj -50 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 435.001 179.87 425.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 51 0 R -/H /I ->> -endobj -52 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 424.001 129.88 414.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 53 0 R -/H /I ->> -endobj -54 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 413.001 164.32 403.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 55 0 R -/H /I ->> -endobj -56 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 402.001 162.39 392.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 57 0 R -/H /I ->> -endobj -58 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 391.001 145.57 381.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 59 0 R -/H /I ->> -endobj -60 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 380.001 177.37 370.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 61 0 R -/H /I ->> -endobj -62 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 369.001 162.94 359.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 63 0 R -/H /I ->> -endobj -64 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 358.001 150.72 348.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 65 0 R -/H /I ->> -endobj -66 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 347.001 141.0 337.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 67 0 R -/H /I ->> -endobj -68 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 336.001 139.87 326.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 69 0 R -/H /I ->> -endobj -70 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 325.001 185.88 315.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 71 0 R -/H /I ->> -endobj -72 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 314.001 381.45 304.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 73 0 R -/H /I ->> -endobj -74 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 303.001 228.75 293.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 75 0 R -/H /I ->> -endobj -76 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 292.001 227.08 282.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 77 0 R -/H /I ->> -endobj -78 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 281.001 263.47 271.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 79 0 R -/H /I ->> -endobj -80 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 270.001 348.72 260.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 81 0 R -/H /I ->> -endobj -82 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 259.001 244.03 249.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 83 0 R -/H /I ->> -endobj -84 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 248.001 280.13 238.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 85 0 R -/H /I ->> -endobj -86 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 237.001 396.68 227.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 87 0 R -/H /I ->> -endobj -88 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 226.001 199.04 216.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 89 0 R -/H /I ->> -endobj -90 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 215.001 194.49 205.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 91 0 R -/H /I ->> -endobj -92 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 204.001 135.43 194.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 93 0 R -/H /I ->> -endobj -94 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 193.001 157.1 183.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 95 0 R -/H /I ->> -endobj -96 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 182.001 155.99 172.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 97 0 R -/H /I ->> -endobj -98 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 96.0 171.001 125.99 161.001 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 99 0 R -/H /I ->> -endobj -100 0 obj -<< /Length 1008 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gasao968i1&AJ$CE,.5h:q`!omUM^B3odZtBm[WNNeh9*81:)-qdP6&Y3\+g?1]`8le>]QZ(/N-*0VeEGoi12AepJ`=\&VcKnMlO+B`$t/7E)",JS02W5C3tM\r3X*Y]L&d0epJ'9`ljm'($&b'k]VI7sR&j]CJ+-"11$)<]XlQI(^.KB)ig2%n>hgq9Tbh6ZVGZ1#%i)q?l_%oj.kp^4ik;Os\C?IhC#7g/NQ9*a;R?'i)"h_pK1M^/R.!f_i6COfBrKgE0r^UZk*jt3m5WtTR-)08B8)q$Eab?h5Mo(i^PBb4*>)l,s:dpK-LT]D*=KZfY#?FNmnQ;):UPTG7`\4<>FE@$GqM.r)[Mr-VDHMt+(\oZQd/^7s@)=`5=D?_didJt:Hp>6kk".4+=KrREk>*&BZH5*3IK=tZXf=iNUQ#%L(PTV//\c\o+1Q3@M>Ld0fr7+DV_,bud1b>m/6M=/kC=Q*sH?YMF..iC8e1tYnc*54L;OTnCPVNb`*!AP1)r/V1-T_fh9OYRPbND;66WZ2t4B/VfYfQH+LF&TZk'1I="E8[h)KD::6-1G^r84T)dsMF>@QR1`^oL9J8`nek,0(=^c3_EHKmqCN3o($ftJ67"+0aa?+q)B>^$/ss6msT!';fKf6)_=Q:EG`HJiSOIP"Y&Vd82;bALjsQ6k,a8l0cZaD1(p0o-$;XgghO]n8Lo\%OcMC!&Q_j5FP?ngESqV;W>VS_o*'6rSiB*Zlf6G&kY:C,R8iYoc.]B2A5LB-UtZ85oCl0Uh.-'kB,t2Hq_P67fAP$>\j8b;Xa1FW0E);=N9lm*`O!ii=-\+?"7]?]FO!f\?3,`85]@~> -endstream -endobj -101 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 100 0 R -/Annots 102 0 R ->> -endobj -102 0 obj -[ -103 0 R -104 0 R -105 0 R -106 0 R -107 0 R -108 0 R -109 0 R -111 0 R -112 0 R -] -endobj -103 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 472.55 671.009 505.34 661.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 15 0 R -/H /I ->> -endobj -104 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 143.94 660.009 225.32 650.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 31 0 R -/H /I ->> -endobj -105 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 452.65 660.009 498.77 650.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 13 0 R -/H /I ->> -endobj -106 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 472.09 639.009 541.24 629.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 31 0 R -/H /I ->> -endobj -107 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 628.009 87.56 618.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 31 0 R -/H /I ->> -endobj -108 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 342.412 607.009 388.532 597.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 13 0 R -/H /I ->> -endobj -109 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 475.252 607.009 544.682 597.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 110 0 R -/H /I ->> -endobj -111 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 596.009 140.05 586.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 110 0 R -/H /I ->> -endobj -112 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 261.834 575.009 307.124 565.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://boost.org/more/mailing_lists.htm#jamboost) -/S /URI >> -/H /I ->> -endobj -113 0 obj -<< /Length 3318 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatB587SI.Afr[W%NRR#oIZ'!!#RSs68?&Jq!]\GiR3KY:!`,0cUZ'J5Sg_:LXG4af>H6*QKaC/s?XmUSk&f9F8g!X6MIp1j,Z&T^_([50AOpREUj6/=ma"_iZfnA]@[:kTX/(VLIg_r]ufr_UYVb?XubE5:,^[DCC=o#:$QF)106hIDi\X,F0Y8?6SV:g6$;1.\<([h\'bUCarR$KXLpb2M2_eS5f\_nk'L5&?o^2[pGEN14Qtbf\Z4ID8rTMS6c\Ih5$k(<2"_91K;l^/J[/!.gWAGFU_YD(Sh9UM5+*$(BikEXOZPY#Hu;'YtNHF.UP\$S2s:OZ*%/&bCf,*_@7l]):0Ud*Up$Xl6Il0MM%!Y_7F-'!("^iS!df/S[LPH[]apl?VUadC<,ZXXgkCO:5Fto/%4\gZ&!4Wd1W<_.20#/EX8'.rk.;35;ftR4E;Qu3P[BRO"T?0&PMN?;iQL&W?4r&5:&f5PI9ASoOEKZ$ZZqYjA+]U&B,j_6tL=3q^5Y;WQ)"+b!*6ZielI3"I0%P6K*2]#5po^$+9'Sd1f0GJlODb]_B=`ga&7bmC4d-1SS`qm!_I16Q*J=n1ED%j%.+-<\H/(H0ojtY\fS1V[`DZji.!BeC8KmB:uRU7)DqoEc4-Mpqs@aWF\q@5=?1iA/sp@!.eKf$"[420Gk6VE)L8[UtN;$r<7UaSta!V@=@2N%79TF^r-]+1H5-dVT8BID>YD\]C`@tc_b&u?(=J**L3uWKArOQ64rfT0n%+`N.E$h,mtZWE?%KU.NumL$h$)>u:7O<>G02l,or+\4iU1p-!p#=g-S;=%&%&]"4MSO*^aCee#lA=7D@9AB;HK1nmA"3o3%R3FVL%_A1_+kM"2_\r=4h>2%k9/1'O,P\]3N\?XD,9WhCNkJu*VJ=P'1qHTM'09jNFY-G:fhHJ27"B:7kM.a!Z0`u7j9R-o1_1+0=]X.$!GJGZFQ<^PRChZSBRdT9+FMB?Hn'pcZ5#bF.!q.d-nVeP\po5)<@Z^0?^#%CF_!8\.]6"?k2T0mTB6\K3M#0p^]56B_13"un-F4L4d>i5%<\jOrq_t4r-UD.X8P;XL3hi4>0ZF/8iIlT2.d7)i.g\gP4T]o;.?jH8W7>OAe6*T=6ZOO/kb'NL&q_cW"a[<`P"tg*PY"W"KeX"sSnAY()m=`iUqj_u!l"[-N4r^iV"66,g6h^75#dFaK7%ptFYZ#h-:&<*1X_>nTC\+T0M7S`+\`PM1"(Qg:^eDA9F.ii&oS/gR_8.>`f`V@f`0H(OLO:2S/$MWU0)_U#bBYanNaOiL8%f<5TPF_J,6:WYKpHW^CnqpZ2/NT_2P;#XeNEiB+Zc2Br#jpFb*V16b2qYLJta?j`ct\j/gof4K1m*BB\,&)B6fS1*PUTo,0"\sR0lGskY+X:D;Pq6BC4phH`'f6V=\Y`>:d^?'>u]\D,^&m>*,Q`Qa53^rP5(u9QKuAFNNeM$2^"o5_]Gne$l?dV.^V(c=nJHi6JN@3&Je025&0gV89`q8n6$Pa4WZ&IM%OXHsrnZjES-Y"`.-1<`/>$bk#9Kf-T-nX=Ce4\V7agi]6YL,YR;0h=FVu;17_dj)Lkh9)*Ff#q`q:RonU0.As(jsJ9;P4pl$lp85lENX/oG>>_2$S&jt[]L?uqK8mA1I%.r[HW?3NRr@.gY>=acQ@EhM'R_b#;K?:U66PhQcWA$:GJ,h*mAk/j!ehtf[6WE.D?5uGhac@!((F^8F0r(+<0+1`obC`(:`YD4!^=m4q\SJ/+=PKr.?EW!7cYk:r->hVIZkH%WOHf[eg'C$]`+ZE='5h:W;cSg4Jq!li0o@'o3J,]H=NP;nQrC5k+9l@89<8Q-s?N^\YH+O6ss.qfK%5goE/^!]+rZ*+$?3GSIhZ+i!.c-lk*t,Z"?_S`4rZ.]1P)oGo^DeQ>_Ku&#(j\3HqI52G^;r`Z>0?pWn\O/skGY;1*SBr-kFXaLRt1^nh2M2$WWsdFJR`Xh(jul6QH`%:8GT;r5cQLG_dDIQXKTCeaQ,T -endstream -endobj -114 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 113 0 R -/Annots 115 0 R ->> -endobj -115 0 obj -[ -116 0 R -117 0 R -118 0 R -119 0 R -120 0 R -121 0 R -122 0 R -123 0 R -124 0 R -125 0 R -] -endobj -116 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 359.42 671.009 459.98 661.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041) -/S /URI >> -/H /I ->> -endobj -117 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 483.286 671.009 529.676 661.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/cvs/?group_id=7586) -/S /URI >> -/H /I ->> -endobj -118 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 445.488 62.4 484.808 54.4 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041) -/S /URI >> -/H /I ->> -endobj -119 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 147.83 649.009 193.95 639.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041) -/S /URI >> -/H /I ->> -endobj -120 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 78.742 62.4 156.094 54.4 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=80982) -/S /URI >> -/H /I ->> -endobj -121 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 164.686 618.009 206.636 608.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (../../tools/build/jam_src/index.html) -/S /URI >> -/H /I ->> -endobj -122 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 296.545 618.009 349.025 608.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://www.perforce.com/jam/jam.html) -/S /URI >> -/H /I ->> -endobj -123 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 206.312 607.009 339.932 597.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=72941) -/S /URI >> -/H /I ->> -endobj -124 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 523.484 596.009 544.044 586.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (../../tools/build/jam_src/index.html#building_bjam) -/S /URI >> -/H /I ->> -endobj -125 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 92.0 585.009 168.65 575.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (../../tools/build/jam_src/index.html#building_bjam) -/S /URI >> -/H /I ->> -endobj -126 0 obj -<< /Length 566 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GasIe95gRZ&AI`dHq^?\;"Iq4#^J9U5pE^LD^*6m+,b"Ps1gOSLSdM2B3-5TGEh"tuI\0S1M3ac11ZRZu?&smLIN.VGu;Q[uae[4/J!5\e\a(27b9&7MJbcX&Fa>]7dh"&K@GI,##WgY%r\n0.TPthhsKf<\Ci..pmF_%fT<]F6oUU:J,o"OC^NTA79C(ORl6J0@1h#lEI/9E&K="\Iq*E@$K"!:cGV^,R_(Y-a39."uC#^#eY%:680eaP(kNaLq/YWp8OGr[c&V^O[Lpt` -endstream -endobj -127 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 126 0 R -/Annots 128 0 R ->> -endobj -128 0 obj -[ -129 0 R -] -endobj -129 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 119.496 698.0 180.066 688.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (../../tools/build) -/S /URI >> -/H /I ->> -endobj -130 0 obj -<< /Length 2560 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm==c_T$&q9:VTssXoDN54l8s"gF,_Kp;#SNqa4=#3F-+_?X/39$F*rl,%G_i.@bHnO5"raM)lSX>]/Afi7,Knf_qf:YDP%:MII/iFY1A^qJ3(Ds,`mQSX8!9daFNjriNf,En/pIt2XP\07VGGp=+5a$((:m,B]j,!9NZL@OYP+C:`rg+UV(0nM[,)'WPX-WA^8W3r8T+?gpFMOYjA&hJle*4VS^3Vpc+RX^ZP#^HcM)7!9J$[Y0dJjHO-]'lEbdM.1>/@85Fcq`^@K)Q.Ub23F%;+[*$)-JWIX8AmAjm.II3,-Hsf8VO='e>5/X6Y/pnYomo]J,s,rgn4S!%fV`DUcm"]-OOdrkc^.;(d@UJ97R`8Oflft#V7.9Pl>$,?^]5N!,Kc$)boS"DrWhCeeQ1H;L@1#@b=8[/PN=*%)Og_\$]^gZ^F>S_QR?r0;=-\:prCrqS(4sVrIWjMJl%'7;^N2F4_/]=25\"_ZbE+`!((>c_*R-h=Mkd97rg1pqjVA_#X>cgekLTTdP0W;EN`V)m-L'nuPGBTYI>)l(4^6(qX?E!l!aT2i3QlA;:=K-",8/\S(\L!k.f="`hqQ2Pfm4Ldq!gns-_1)-!b=Tjd58:%00X2FUH9jA_$M<8YDGC8(t#i(tt9V[-NO8]n#UoG!UGo>NEQr&+.-#3CH+)[%/d>=-WRo3@u#VT,AtuX]q%U2@!f&26&[F;2#MB<2;!e?&XE?KZ5+o)K$@))PK"^e_eCK;4/u2mS81h0ac*n;a:8rNI;eaga]5E^"A,te7i/Tk5[#rVjcZZ*LHgKSS1gLY#/QFo3'8+Pe=Uk-Ni?S+Xj=,593nO9Lt3(?=LY:Ol*I,ukF43)iK0[0*4qc1D^4H_8$3qd=A&]2!RdJ=g*"9dUL0J(+,#"d0;bb/(_iHpcuMB5PS.2N4*sg2@jE[eBrH[uFE<;61i#c?88\&iS*TK8SE+O.?-@s>%`#>47,K%=DcCfY9Kj80VZ9j5?i/Z4NllSiK^L-c$jW:X=\URT`mU!Io!)f$F%S`PK!M-"nL7PjlO-`q?/*IlA6(r4P9k9-'5#WKW/Zhq"k>f/XYh)03jQXGE#)UMd.m@gu`;N(J&^Om<7NA;iOh7%!@cd^@8M_Ct2_@QK^NtKj!#\Q%m>p:HmXL1(=O+kWD322!\rKicS\o>K:SJ+\!I/A982G)9QC!\e08-Fc&#tmC6D#Hl+Dp#=i!@4\_UgBgjJfb_p:T)L$^Ujqo$pQ?oCDC\ZIN)eKab!(658Z79(aT"A')?L#'klMc+Mlt@F-!X.%Nqc/K6CX+VSH#LVoDi^^CM^ACpIWNGOGDfUT&4A^@A^?+5tS!B7pEQW*WDb,E-TMh(h92K1V0KKnXPgR_3rUds5pZk2Z'P&mH$$+Eb1_#tqPA&C+*tZX37?G3oE;jI]ZhKZE<=$fr!>ZN[VN6i_c(&O&VBuk25oq>2!aLe"iJgQ;H)X=INuj$=f)B+:\qH#\VGpP3dM:9A;sK.%m.>AU$uUU[n6\1;Me:Q.;OT63^]p>sd_E?COf;1XUmeDg1&:VQ(2("1/S=lE6/NAp7tNNAVceS3GK#&U4/h#e"kehGB.Defg"q"UuXf&!CF9Y,/?@Ia<>_r(#$<+Q6U.h-GUNjB:g":YhO^H=Wng]iWr/l8>aqbE6jr-Y&%ONX,#q<#$RhK7#RrV7Q:I[VCc?('77&%fP*a8~> -endstream -endobj -131 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 130 0 R ->> -endobj -132 0 obj -<< /Length 2931 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatK9KMH*[8?8"6eP3KCH5Rn8MP8b#aQa48*%X+rn]I.,r'^]!TrhU]k:k'MBlMTe/.5o^iBncF&"HbV]@pYk/tiV?F3V1;\8J9q5,!3ttr8=nooa9lj.oR;-+]^pUH<^.&ZF'NY7B)UGN,uKP8IhC\2pCnr50BPUJHKB:(jSqP`k.>;keut0bG]#-^++"Vg/PWUEi(Ijs6`P7;KH]m2b.Dc1/m@m8I$9"O!bim7D-:>tH>+Qg/N_gIn[DQhNu-^qV%4)R(bXM0Gor;pCB?&/J>hGbUGl_pUHZ+OJn-YIs/=?'@_YM_sDXYU!s3(i`'e'@+5P*oe3$F[303iM>qR,#G5!iGb0fks35'JRjQkNm=N0*`jI>;eQ0\9Qlo*hdLOGic6l[9>VH+D$BsUOA9XaSF=V$]$J6GcJ^BEnHP2>rSt4qlZZ3X1#:[J^^H24Rk/3AZ:o5Z:.@U#akAb4j,*r_29QZ4Har9hH=mnR3]:HnNcMc7!NpEQW5;],g\spYBbG)al$u$>6<2a,lYQ12hZ-U+?S%?0nFY0IS7-j'a:e@5hS8]CKMU9(bV;U9i]HRUbc9SL@>!H#i43h,.C?CqJY:l'h+q2'%\;nlDah.t%QRf1?W'di2[r0d)nSPfNq/K_\V=a,mdj0L(XLrL`iu/;c>D8A23X='Y0I\tU^O3.`ZfpW@KGJn,%ea%mj(R]*]RZ2gHs5+e?782$jbN$bOkZ_ECMP"!=A,`T"n(0n@J"NQj<22YOC7'7m&d?mHXd?4mWLnLJTH0TG7K9f^o'CWTBN2%`$L-sTgmIi@Q+Etp5[5]$T^Q51=eJqS"rUFQk*<`;(5^)u-_n9]H8a@?W(48W8A$Zp#)a\Lh'-H#+(Zhrbln\>-s+kXluoo56+:.eBIQ!5s(7Q'c-nnpA'`,RPPj.$%r\!>;j3>?k9]"W,7<4IP!EU$F^JIk*`SU59t2bJ.M:XeKAN0Xp(MN.msli)N@f2#jEUoJ>oeS2U!TgTe"_cfsHE5B0Ko^s66P/KDP[$NTqY&B:_N9f/f;9J0dXVd>*1VX@u6n08U1Xq6Ks(_78K$*Tb/8)39IrkSr4_uhmgaujSL0&7"S^&W]\VGY#kXL&G:Wh$:mEjlB4tjbhmb5qT)!i8C-3]@HjOe4^(sCZ3JU6"fCIB=Js&,Pdqc"cqLb?Z9%Rbh4Lc2_'Gj%6">B!h2oi+)(V1O15N/9!*IP4$(m^=Cj7FTDQS'EOpqmAV@85hHHVc]GfS>.`k"#s'[/BFEEg5e(jkmeSJ;%i7uZiZm6SH9s&cq1c4^DQKX7oihkaKn'j#Lm[\Mt"=t%'A2U13^2rQm(^51+mVt`&c)?1/YQ$F98L5:5*M!D'NWQea)EA=rl#Gr)r.LoG/+la!_PL02o1t2ak;=8ul::7W$\Iso[Nm*)>1hQiGP-?n4]5./r\&.@>(.Xaf+!^Kb3Bp\dr()JP561fB*%[t=Y(KR2QPR9%1)6%u$X;g@Tjf(Ss2%jP(HlgVO\IF$YRH51Ft@QEXGjk-F4IU=Xj;)R!Ym4$ff90"@L`_@WM;?((K>7,3l]>rqOJ#nu,Thu2!PBA*9**d+Hm%Q"G!84r\X=$$`FBs7D]BTD(t%g/5Grj@l<4TCE'\%`H3ZJ9;G*@7?h9p>KuB0V">/c:DC=mKE-p(-pS!T\gMMpq[g!?[o/n94LAKNXdVEGiMOs%DogY:ikOXQXk2_)*_5bE9X*75MPCG8\YCDKB"bp`s=RhCu9`rXY^E$#9~> -endstream -endobj -133 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 132 0 R -/Annots 134 0 R ->> -endobj -134 0 obj -[ -135 0 R -137 0 R -138 0 R -] -endobj -135 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 277.23 524.56 451.35 514.56 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 136 0 R -/H /I ->> -endobj -137 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 380.804 441.121 538.534 431.121 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 21 0 R -/H /I ->> -endobj -138 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 90.552 71.2 213.192 63.2 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 139 0 R -/H /I ->> -endobj -140 0 obj -<< /Length 2908 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatTK?'"$SnU5n@hQi'B\Iq>Z3%YJJd9L_nd^6LfnrO;Wg7m1mA^QY$gN1^`T:nf46WoQ]A02SUd0r%*):"THr,VQ!bM@)\@IVUTT770aTEm;F_B=o]3XZE``7P'T5m5O&_5FpFgc`F-4afkQ'G)oZi-r:rJ2n#^_k,s8b1=DP+o(l)4p8V'0Ah!G\Y1*Y'2?Y@&uUKX#@EL:rQQ4DUSpT-Q:\s>c.W^hiGH+Om#KA/Pm*5mE>=LAJj8G'JRD-"\\r@56m6QGrd&9pJD1dEK)>%,Ut;A9UiV)80ZcK()EZu%BRVcGYDR\@VL,ksZ6(0SJs"#l]Ph6)AY*%A?Q6qBlb)nd<7J`kO'[t9n`Wf!75g[k-d=)sm631*.:Tag[3,jW;cue`O<[-9*FciG5)QJt8ZYqL#5j"E>5WQ,[5`uBSPe`C[JL+J`b\B#\TbV[3t(>0JX6*_]IK6@=K`%+Q[@)59j!pEH,r5l#;d]o^/AGc-.H5DIiI"jWlQs*hI2iVpYSP>o6S$8qU/ZS3!HITRDh@@7TM7e8.PLX[0,:)=.b0K7R:?pBrIKVcCH@"DL\G!UliNA%eJ+->^D=Ctq);+15+&f^NL+m4TYMD(ZY98(ED-Q.l''_8L/Cl(dBsYC>Msr-c5JXBO^q\.?$U0ICoj'4ESS3\Cfn??"D'KTRL)LZgm-`nE8?\JJ]69]R1XVBLd=+t\.1'WjqF7fFUMZ%!-amd*20;&;<9a06q$D5)>Z@0/q^]9RE7s]P#m-*+T=YjSM?JE*n'ajQ`1^LG"H04PB2i>EhUR5\)'SA)/1!fP-#,hZ\d'S^sLe/ZbEo18]3%%;;Ho@N1(\;#A=`(h!'mG[h4C1sYX`l\(R0kCjHeuWe9rbXJlg7IfmK4dI?WN@[e^\HMH'_cJ$9kYTfI9A-n$77\.*ho'WoRf8C;7J`KdB;ad^0P>lM*3!1Y5'=!r!oM/^aSG.:P7CZP7mlX^$;:S&/g4n3:8b2IZe]c\Z6/ECSFhm$bLC=-OSWan6NR57&^9a%&C4lRr8<;`:nrIn.AEU30oGE0+m5#:p#hm<.>=HYR+P<^ILC4:/AJl--/nKI);+;l\Y&27"csFtpn.In$o5S3eNh:QXJ,>e<=eOH`MAi2L/&CS]e>W\@a,cBi@qKk<%3C,LVt%bj@V=h$k^0#Jnl>2A#0a]+_JQTW3'pailOe0"d7X!i@HqWCI&`S_F=7RnER&;6g77$5eAQhn7[;NbYVV%U"f:@=@CQ].!^_(X#c%_jEVG&V,V/n@;2A$USeB-^,?+t^8q$+T4fUp?p&8g%k-P>&'Y>KEhs2/HFB?,VZ5PX2E\]=!-fG0--\4j-E1l$qEVXp3U<`-0N$\JDep,[s&4DI=X43+nqM:.Z(FMR\*I)2fX+-6CcJ0uP3(ZY7"pPuV0IMR#)Xd-EI?p@d&kT\lbD3,jlUXE+7Ms8D\&!,DNIrO+2l_@_3`0NbHelX*K-_hsG0$n1ii(ZM%.mp$&?F#lE!TDJnP-DBl\c5';[`3c&X$KK\5TQKU:->H18W@$cJ@5@>d&dUW(,Gl)!L!a9QGOkhL[E!P2VU,REe2tha?5=tXb@QN@f]#[V)m=lXdM:&7\$_JY,UP=C'H\JP0Roi_6slel'>FYReBiOGl-[eWp!J*/=Nh4JBr+Vl*7eB+N)La6d2dfJN3b,oL'Z]@$L551h+!T/[B!R^10Xu5s([#/llH4*#b)e03%>AAHpo.9i6^`+sZU=JXT*=VQ1;Gk=)6CBQk';S][8,+uVlCF?B%nP62c0,VneImSF>5enUCrh[3_1=r42"qTk/>pUS2daA>C]/A`bB%0^$h]8bO7=@Mp8Er*WX;'cF`j&eAR,UTm](GpQ1G8?$@95\gSLJoUisTK^$MaLRYQ3b3..hbi8?Nu[+7)7c5C%TfppZ(QkRW0\+^>[1JQFG"TA46DU/b)BQ-[m'ZencZhYO=Vo@7$U-)(%`*[80TScNnaj!d)8P:'$SU/o94sFuP34qODA(`j9`4K^rOAJKAQuftN)H:N+;h].`oVV`RNAk"eXk[a;MDDu/6l1XNN*[KMEAEbD=l=9NIg3tmOsLo+>TN*D+sB)!,1r=@ReXX3@/AJ$Ata_(I&AP-Xj_*g2=pq^^R![q@_c-@M&i;DM&/+0_\hmSiO9cgDOiul?:ckG~> -endstream -endobj -141 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 140 0 R -/Annots 142 0 R ->> -endobj -142 0 obj -[ -143 0 R -145 0 R -] -endobj -143 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 381.82 250.2 494.85 240.2 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 144 0 R -/H /I ->> -endobj -145 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 318.944 71.2 441.584 63.2 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 139 0 R -/H /I ->> -endobj -146 0 obj -<< /Length 3038 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%&h/D=3&qA57@Gi1b"VO;!^=2cc)mfdWkWKpFU(?YM5YI?D4]un"Z/48CIm]>2LU'UO#S:rES/H?,*<(]bbP(AgVdMkTOp(;e>MaXprLL^ni6U:+P^&\9$]#U0S*b4equ%''`1)?;rAU39RNs.O]K"U"Dcs^8IJ;"Khja#ZTJ5*p*f,D/93%LX,Rm,;C6j,RBL:_'I=GY0,q^*&SgA]I`/^Ggii3f^oo`-M&UG2]FILR$+.gBG8M4gEK#l">/jX-u*i*_IRQF5a*Qm/;A`R-DVT4WcQ[MCmgTs*aZ;@$oOp_T[C)#dJqbYfP"0tD2q*?GRi#g.i.\b<+>3eq;.1bU$b2,8d$a5/f@*GZ,SD"1)G3Z5rH[utKj7`:p85R98]0+65MQZ`:HW6itleU003Wc>.O&e[eQB&=VY1qo3'0UC$cY!GuH[oLbHDtuJH&5GBjQ@J#9N=>^Vg#Ccc-H$&-PI4#l=!@oA3*H:KJ/toS7]A5OA`gg6[H!#SM&0&A06oW##dINTh.EP;o)2CGo?iLl$uO9!/Q_AV[?k9a@:J!*o[`\`,^m$2YIZ5OKc*2Uj]#@C[bK;%hR\$_Du`H"$.aZe8/OcT>Z$?@,b8A<9"WgDFtAF.`8pP&pX+!bomc?7*"T3`R\3*0/jm1a,hBIhbI6WQUs\7@W9V6]h-8M&US/4b$^0mP4KhkH]0in&C?SP(-P9l.KAu'jji=a0_7jKKpKdr(^AaFS/C"QR^LU&9]B4=7>S)o0@GV(;ne+)&>+`\7j1kH=/,.-e)M*Nd1^B/@&jTB1gOEhU.jp'2p!p>D+6tH)Hs[A+D*A]IX;_*:YHL1ikMtkmDs`r8$N[ud7mqffR0k,`g>&<(ET1i=:mL16X3m0/G20I`4>.,>d\H5Q_m^<[9c-@N:i7NlnENp2+3'tV:DCX6m]:H8U+8'iWDl_oVc&8H9$[:,`H*+/O/mt(8:;+]p6_W\fq.l86'H_7"&M:J4R'ompZ[*HFV!jT,MY4HIXXZ0@g@mW4U5E.A!tZF&IR=HH'?C.gD/>SRL^O"CD,G4NID$.N?b6>ps.1N([P31d-RK8c3[Kob3Vm"@?C'oDnRAT5JH5gCpg^%\)?GKsmk@=GKK6="NRL&o0E$kpP)p4oYTLs?q?HU5r&-("Z99dA;!crCbsXg.:+f0`UM7D/if[\U"X*Z)YeFXCE*$>_gOFp%0]GU\1T^huCboN=!m0E`dsSi`8S`o;c>C3S#/@Cd.TK`FF&boM8\2^VsrP!H55&Jf\GH\eZE;8e#\T>q7GAi[42V9:ra-R--++4s4>es)Y,BIY8mIE>`MP.14J_@?%sD@s.b"jBM!n=2OWE$IoHjjRi8KnjOf5:\c3_UM)?XoA<*07JgF[9dc-&_G.WG5Vms$`DKX#-5`&$rO6^uZ,8I;)NVFO>V3]Q!#C#u:XGN4,Wo=(&7b,QSl+Bd2!dueK01Rl#Q$u_%:f8`MJ=0LG_m<8CI8*_8cu-k?auKq!D,k3D+T9q4t$V`B>.?2oBaTC6[g%8U1sXOG^a^o+dqJ1=&`$gB"Y`!;Rk+E1Zg"146"3sPgMnV+.UNJ(&?*`d\f@;+ke#?4*j8f(?$+^;L'Cck2O?!HM=CqO\C>pifE+$R")@YtFt*oo2^Ds-WYYD8nK@.4+.sd\Y#Z/R4Ykr+p`r\dbfKFmE0t@6q_c@>D]"Aa+Z1/I:1'(gJ1a7SE6%)Z,Zp>1l[^9H]kM(o/pn?6HjCs4f'i)gSB3Ua[]d'af=d@i=G'm^+lB5H/$SJ1]6_!0EdP+$B8s'0V&8Q)>n:uO4BH_bo/Pe9Rj3IoYut:Z!TTRU#6P2>[p&"HQTd2g?2SrG][[/pel$V\jp>m3oW_gp^9F>iAn4s*bj,A9r+akAHP8c]R/9ZZg[u)X5*)X6i[A[0?Q6*.m&mD_#`UOe7'=mt,tQ&dASrnSVDnAe7$EO\gU8,*4cljZGSUkJXUqY-,Qor-$Je*H5,IhL=s:G:5FSQd*:fm]`1qd%Ge/W;bS/=7+Ul0&kpH:mkFsE.]W4ZWl9qIt"I_*In""C/e0CY5kBMO>c@D9ErT!V>cg`ASlDI1H:SRBb&I_",jdYi/?["0X`@mP<tN1U%ORGPC)~> -endstream -endobj -147 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 146 0 R ->> -endobj -148 0 obj -<< /Length 2763 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatTJfl#h0ni^@=[n_I,epYd8d$SNT#E&Tu@plOn//GTe`LN5^[uMa5qk_AsWi26FhAl_)==',1XLlUsGB_e;q8W/r\(ML?hWEqFhg#"DhkYhC-$d;3GdFG/s10$8iaMGCGf/BbIQf"GSV(P[qJBHZID_PtPBc9@\J3dbWU4lT)r1#__rfjGh6392GiH['6N<*sMqprug[hVW&+#%-F's]QX&O^"@t"tKpU$9uj6rH&3654-\X+nNqc4[Kl4gB?;2Ai[;`D@"!dO;\\s8UN)NdN"8*b)L_MAAH.goKe+b+CZTAn3@i_=SDo%)h.B5nco4IZWtp:G'5r+X'#;HDZ6B?BL&e'*Mp3ge58ikqf^O<74q]Gc1u7eI2l08c+B6'04jEE3bR!,%*AMM?8MS=>L!8%Q2mb!KlLe/^t8>/%#I4;,Bno!0TDJ,\Y=H1eNmf[u\e1eMm@P0>]tkD=8SlJ$m;+O13lmffjEV-bFcOWj!KeWC('39RK.j(T>67N!F,j@E>b/Df/h<0+g6#C[)W,t3@U\Wd?U8QE6UPr5^K"l_6J'otYrj3>0"p#kEi*1$oXFIWsD%stt+r.1'Fr)Li`Jg^OIl^)1Gm9(E>E?UAe>[*b`jD-\#&kBaB:*GgO>9,a7ef7WG\86_3*Fqj2!-!nT,J5D]qA-SqXfFH5n9+:n>Xj1HSG]a[Z]^8YWI%;hn#W@8@7^9ZC<.')oR0-O&/MHi((Lq*7Uiu2WpR77D(f`RWpR6.=4iHpTD@/6bU:r-7j>NUc"'!Z)(a)pIi>Y@1^(DpHO!qjmhT]`dB5,\56(i[roe`"!/qTZ5-F"d+P/@!ja'nds!kB(8XU[`mUc%4&Ds!*Hm%lp`+%_^;\/?odVBr(F=@X\+*]>-iHd%0_i;[6"5+RHOd8Eof"/V?g0tO]IOWH=01iR[l_BAO:HCS^E&tGt+n4BHj&)&F,e(_kDW7@sE@-`<%((OZa`]7X>pcfB9>3$D&m[BicM]=WAu3.4=ctdX*g,O<8KLV4Jp29noj[/%"jnT>0L?]gpW>2V9mfA2qHcGoZs8iIG*Fe=gkf&AuP$hDiRQ+Qd(Om-]D2Y%VPk3A@(,g?=CW(.uZ0]b/_D#)&ATG"fKD(D7k6j#D7q[M>P:s3@Tp"q&+qJrb6+&!(Pj(^mH67fMiLc6I=`0B6$lB'aYl0Eq^U>U24AFJg+VSSn`8O>RFtHe"nbGq3+l^ndK.,j%Vhm9*/C!qt:Y,i*-\amIG5=0sP>tD/7)bX1IUDf0aPIdZ?1R8T,Z1dL_r[ArN/B0C14n-qF4_)8l+)n>25^YZ=O;kR]I`VgHUUY`U_9ddHXlAr]jQ^j(nP?N-0b(\'63Nn15(!@t?fATGhXniNr7$%RDLL!.t"l5[`:]Qu!(:h57YZ&\>E-[qh!s3gKaif/WfYo+FM%$Okt2Xa@l"3oP3M(hAg99gL,k")YWjZt[X;&]';_(M]=uh0*odjJ"-")PIHVaL?mLWY..hs?7G(3lG=AMgZp'9.os)b5r&7a&827j2R),4(gj_WYr*K2YJuN=b?k[)Ft0,\>_"n*@A[VQ4rI%F?=\V[P$7Buh!LCDetW/WB-<-2P/Yalps6`IW*u9u8lO]H$'C'4sHB),=Cl!l+nN&p#78\q1-`-JW;F/:)`R\4a,(@f1Ko#6+W]9Z`7n7L0LfNi:#8#t4+i6l;-lT-S+&Im'n&)(>IZAGX.2O0K"E-3,8hr_$`MWXSiBK&&Yl#oEof.gO:h;iNG`aWkD.H\JI<0;.>pmtrQl/G`9S60r.(/_:Hgj1gWl6MJ1qt85#0Y$JY-fX"OQ[J>'!:@F#5#4`jY1Hn*&?%EO,pRj-io<%_OY`(6#Jcm!n&d/["&VaAF.J70s4X,[h^?8G]P+9;d8/N7UQoK=>C:Ka6?I>^+-9@u59DBrITf`LHa_`L4".Rl7V-V0*jEJ@gosKYNo'KKo@ug0!rr^js[J`](2m6TroSA%5(c]0bBOX7Unph0h"BiYr)"h8dO)-lJIB?'9(DYpo,?EVFHs4U\1*&)Y`mr7pdNd"S)>WMs9KrU?Qt0.@Ah/Po4e(+p6?Y0]++i8H$e6ZA.1GgV!A-oJ[$~> -endstream -endobj -149 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 148 0 R -/Annots 150 0 R ->> -endobj -150 0 obj -[ -151 0 R -153 0 R -] -endobj -151 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 524.63 246.36 547.4 236.36 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 152 0 R -/H /I ->> -endobj -153 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 235.36 109.19 225.36 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 152 0 R -/H /I ->> -endobj -154 0 obj -<< /Length 3263 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatTKCQI4.o)&Cnj8*0t@)E`P<\=Z>ZjE2X+mC::Uql)rTOiGo7[@;9g9(DRNC6Yab*'EV@Bg#L`8M,[_g+glf2oHMUD\R((Da)qQuFQjSkDqG8>[JEcK*2QjH*>Gj;gbcB$e9XFlNTMSn4[_N7PZE5$\*M(eJ?l18p1dA\*"P"!:.KC/YZ010B_a"CbPo8Z_'Y(cQ&p.B^9,X7?\WaI05S50JKQ5)EO-\h0!U$=p-\Olp1$i,05VMesEIS[R[LK8H>1f]Wt;1?[,NBI;Lmk;':TEB@2q,;rYmI*]r^]ILWm?rKR%9>MQ&kTjQ9]%S>m?ATTq<;CH+<1m/eAWO=k+pf"!#6K:"&O3^L1fFe`3SK&:)$`;aA'A&0h0LFlLgDqK0]Z!_^P)rGDcE!C0Epb!YN(6c@1CCrRU3OO^0YGn.#Oes<-+`:o,!R@&E*Vk^ab02>f_&@sh[rskG'm[E0^G]!C+8AY:tDHcAJJt8\RqB5-j8\a36-o0ncD>K/TT45Y@n7$UphW`:W2k4qGU;2W%`X,W,jsg(&a?>tpFjR4'TbieIr(BWh+\<#1,^hR+cQl2?TDg^c#a9s8EtJlhrUfEM^YXs`P4Wdps$dXGl-kgERF+$;<XOD.?&Xc6/R*Iie=pUc;Qa>cn&7YdnRa!?@fpr;\R$8o^.FuN>5nMe[[,2Ki%rO!^Hka]G9qEbBh97Lk(:`!]TG1?+gJoh91i?U(CT^oZd,o$OR<8if.7?$i6Vq6K/T6d1gcW75=2b=Y$O?(UW"-PAPdS[t)0kL@8)bCb!W:/-V'!OE0Nde0h'R%3XXr_&K#Y7<#kQ7[:VN6:E3Ep%-!QB8IEP6OAV]"_>n)8Gg2h>^Od?85`YoI]3f^MM"[&6>G;u&[%kLgS4/J+ahNBjU_(EfXQu7Y"ZoGPTR9:]'L1r0ZZrHIn[lm.bDJ7dE6l3IQ`j%@git:!uKbfJ[lp>".j40>aFg^J)K'1b7cg!f8Jn%O8Ir/\I>IX$56jl\Rphu0p('R_DLGbA!!m(Un?IBAbkXS_Fpp#e8Xn)&Lq:[Q&Tho)&.`>4<&J1Ah1&%su9OPN!tT1.sZlQY#ZH;HQRi]=+C+&suE6kj*E(:b%dk;R=-&5TtjFii/3ZL!?.L*RCiAP`BT6s8M%MbeJp<_J'dg7'C#?%71=lCuPI*FKl?8Xk<<+F,?;@"DrFJf4(L1+=lDg=ZIPA;`ot.JL)dlUeBms@E8NfJ'Re.lX%K'brbb-AE`Q266h8$?M]^]Y:6Hsrk54@Oj3IL&ABu_u)D^%le.tedhg&KP5UY!*+m:h#c>t5fO%>_NZCJUYH!7N>B3?$'SY[sQ&"jg<:.D`F5Hs^mkduu?0lG_e%]?pINnZ^P@.8aP^&ibfGdJ'@Uf1nn;kNiKmg:\'AY.c7kIE)WRe9:BcYJn)Oue#[d/Kifn/FdqO3i[Ei<`D+ZWscqVb%n6o'nQ2,`?W'p*'7+p-hr>r.mcMJQ]lXWYh35.+,ropuqT(A35Vu8q0V-L*(#8_l6:,/Z&Z4&nc4H;CJruF+N7r7^EeVr=m0Wh"f#&k+d;@6'S9"i=Ks>8GPPY.)MdL6`fY)-+.*m@IA!')uDE^9=TB"S57Qu-6jIa2,o$*YtWo4^MXTArTNSM+iLK9=^Ifo6;>$BSNrrsZ(eII(;#CRp'UYh^p5ds<3UsAZ-5kEh0mNW#t!Mke5Xj1"oE+Pc^`rq%;#K>nn(4%'I:Yge'`lR&>YQ!`Mhbmf"L#%MT@GKCC*fOjJg0O[ClKroi5uO'[?g@PgZX'J%R`.kL)=G)$("?@i`p$&.*+MNi(E!DuKkF7J6HtTi]?pQXB&jpr~> -endstream -endobj -155 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 154 0 R -/Annots 156 0 R ->> -endobj -156 0 obj -[ -157 0 R -] -endobj -157 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 90.05 637.56 120.05 627.56 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 158 0 R -/H /I ->> -endobj -159 0 obj -<< /Length 1945 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau0D?]Wr"%"H#f&RZ.:!I%067s981%VW*^BHK,@$a>EB:aicB\@!X/QLC8\5MDDSg9HhW=HOD^+XrSKI\cmZGI)`o=3cP:\7L-E\nhQc@]Q).WdGU8a"Sp>1`0b]l*F1Z=)SleTVA>lYBgrEr-7?adRbRl5Kp(aW'QI3^*p3k'4&Xg#L3YMa7.$c(>V.s+m]OB@(cHeK;)e[4t`82em[`Nmp?<3BM?WdET5$U(2c8UbL[;t]DfkYFAuc+?pgZef*,07]-VQt%a.CfRL,!"e;L]PjB?88g=G"fFh.L;"O>'nPfc"Y?#Y+aEJJoQa^j]\(`"2F,m=WKYQB0qm'<]8`EB@*9fNquakrJ#.[K6FjF]Ma$<_#/&9=qT.,79*9J)_`ju'`T+%34j9C=>9G.EXMoL/1pBGifb5Z8''D9oX_e@k.dtH$O1a[cZhV8YlbqJ9Ij7N8@Iu4K_hHgYFptQ_l:YVH5Zf#Wk6'\ar-?j*JZT%4E?8LQUdMP^CbbK5bFC/5L4S@`3S[?+t$bj^Tt3ILhBan5M+%nm!k&Jp8M;p(Zmll2aJcj6g40-O$IP;&dW-egm>@18+=>Bcm:le4=2:><:5Hn"%!`mK:lk[N+5,T+_!KOL]$QIQ*4N9h^JYsi^I1ukDO#L=pN$bRV_4]ZgWZVL2Z(*bE]N?rl['1(D%[dPScX_B+)A8+'u/j-KB3cY@gj+S)8T'>':g1Lf^[?:*0DX2Oe)pa;fnAa4qR$6(b-qiE&787DC4o0hX!`$)KDhB48kjPEX5dU$f)!t2PVQ)3Y1gh(-%=Cm0+XTi\-j"rR7@'t@_b[bJq!NFQpr^mAV(Af'c.t&L))=.*,IH%U'7e<'r.:ehr68V[8:TF)%Y'"/&cE=2pSMj]O))i#H=Z1g0Quhc47uY4Va0-ZFNspPC5uY.P?5crF4,9G+>U3`fr!=BHLtpWlUbt_?13Ooq<[.`1s'5tr!i2qa(G&pR;p2>[blJdRqVTFneU%bM/N\nSf,1"PM>nkN9as;q2&hd^R,[@a&TSJVR*J\iD0ec9R2XU@A`R/;OhS3@h01)5-?["I/G+WRImtEq6].gF+@GT5-'jmdrJ)%]k9g1*(gYoKu0,7.7i128%UXnuG-:g+b*:pPab`:'E]o*hU)[H?E3;3$"Nb]+&#:E#BF8~> -endstream -endobj -160 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 159 0 R -/Annots 161 0 R ->> -endobj -161 0 obj -[ -162 0 R -] -endobj -162 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 294.73 216.8 478.58 206.8 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 89 0 R -/H /I ->> -endobj -163 0 obj -<< /Length 2935 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%&99\*g'#)\qd*:T#%@8>2Ok`+0ip=89S?c_n+VjGHU*'a[MGORtAF6R-&.`r:Uu\?6K)Pmp2nIBIJFddXoX@V,Q"ElrP1B9q'X*NmaXYkkaf7n,GdT!$BTj13m)B*:m/Cla<0gaD6u.8PrVsgConUY:>Ph+3A9@_#mcq1dG>-n](;3!-LU2D\&R(duZl=C*k7oDJ5/_ESW@L&=baeO/'aP.*q(57/Q6oWdT(4p#hQ=%-Vqcn[T^bIGgbLXfrU's$L2lPNILDKag?7PfI&bmhq[a4!]!1q3aO[enH8S!eWON'oZt6TtFj']feTULOP28R&M+SgJ.aO_b]:U.FArZ^u;cTjO+>*d`3D;pEG5ond-!`^apJO&`4lX6YV9R6!P5Tl(YP_."13=]XhDQJnuj^XMe,Yg!Lf`E+Q/'eo+hCkI8]^FubBPcu>L/=3jMUPUit&n9AS30T.40L"tl,>X#"Fs+a[)F=+bQ.b*:pG)raK?dr`2o`*4f]!)$RuU2cFUfM9%fdT/pIs-Yh_Cpb3>>,Dke];R;O&t??D&PYUn1b&#^^5j.ScdPJJKOc,9Uuq_kb9`W6uO[!DVHnH)A1X5tZr&1*m`09HKu&M_'+^8tpA!XM\oE!!"ocfs/CMlb:j(J-'-)45D:kf5oWa'#qNEEXe0T[jS3D8Ei3(STR/L-Iu/.3b7Nf0a$'uC<)+Ddi*G:bt4_N%nK'Fq9$EKleo7_^U.'>(j,7k^Ets/!\tlZobR$Z**hJ2J9egp8gOH9SVC&M75i.0utYd*YDUCI<1;hQ]V:;'d#^^qkIf$#=G/sYaQXnS'3b;reUSV?SFGRPDQH+,S*-+[G8GI'EIuS_NIF<@]`G#T/,3,7JC^sf/=I7+XbtQ38u3d&Q&JjHZo\gQh^Zm:apBRhpM98#8F,R/mmMn?@>)=nA]r^`6B=(5cK%5Tcg'#Ti%)KW<0!b9aCl)Hk',H*eq^T+gPsmDrq:ESj40FYNT*Q8/j5/c=rtFDUErtDJf)^.#7/+8D%TgW+\1cj#m6W,&,sEuV=*N01]q`?UiTAqc%mBf7I1Xai2EE73*EX$+C4%Oj`n#[A;Vg>oc0T-iXZ!ch0!,S3%/Zd>O"+k;X&DdkUP`n/M^Y3A^]p>&>RkrEW>Pq4g\m)..P/J\$?uBETla%/r:>=T.;+P`OSl-cCqhKX'P)Qnm\hX>L4>m()s5A+&SqWB+4bNIK0#3\6S^E'A@mpET:6B]-W@tF(*_>p5eAs)KUck'+9]/]=I(P9!-f^h1709nTs$(4Jlr`e]a8-B0X\]4iHSi682AoP$4YXAWfrCU^0btO<_^nhWp=[`A069oDgqsNoI[^0)T;<*AupA1C?PHef2/W&[IXN[Fc4YWg1c,Cc<=*fW/G9;U#dnX3;I&sl<*B'*DOMCa%ei#/D.*^Y8%];6/H_Sq%d_Z?pIVA!>c(T`O/+,="h)+087+$*LBVu`i(hEK3OJVZR(I"4]sR3Hthj@;1_@tZXs13?H,Z2>s8QY20[a>oTeK;\0B_N>Xjlg;6_Rf7@h+4':h99(YgdAO8R88pE59HUbr:@'TBXLCJV2gqu0>cFP0hn8XjNj?-k0DP+b`OIj+EUL-4<$itlR#fA*?FS!i=.]TN0^-b4W(Br#DejHRr`9-hY3[9Kq-Kj>ks"VB^I:oa[VSNUjk1CpZ'M^':(Y$\g+S#oL.5fWl9O3Z^@G4HVG.-qG"GNN[;n'sl)+V527Y2i!#&NiaC;KF-N1hlZhE2bkJ_BMFJa+aAqO&cioZ@b2f'/1pLQ<@RH\23eT8YZ+mdm>6AsQ5?J(NZU/XP>DV.L6mO#[gX'8`iBBE;K\gOS?Oc2\Esq"o$_[DTd1@]%L45`H#P7(PDe;*oBE1Kq\f'&"BS0r>3d3%)50Z)MN\[ofH")RH]VY'3DPHT-=Ve1)gloL:lCYm7Wd+OY=_Fq&r&(>A<#:7!Z4h<8=`@c3_OR/-mNFCXK5&aK5_h(&%#LA*Y1liA$&O1S(G/:iMj>[-c@$^U[&YW5&j5tL\g3fS[nuc[M<%C7Wtl1=n$!gA_qR-?](g8(d1\tgJa*3BIJUkZo7NH1A-81BoTla'F_l2FqY/IZD9/b3hq?f*nr=d@6suUN;0@(`-utM?jIsM#B>YOSaT"%c6@dJ`!U/&QDZ~> -endstream -endobj -164 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 163 0 R -/Annots 165 0 R ->> -endobj -165 0 obj -[ -166 0 R -167 0 R -169 0 R -171 0 R -172 0 R -173 0 R -174 0 R -175 0 R -176 0 R -177 0 R -] -endobj -166 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 245.374 660.009 320.074 650.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 59 0 R -/H /I ->> -endobj -167 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 210.31 649.009 223.63 639.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 168 0 R -/H /I ->> -endobj -169 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 518.712 575.009 549.532 565.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 170 0 R -/H /I ->> -endobj -171 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 92.0 564.009 196.43 554.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 170 0 R -/H /I ->> -endobj -172 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 406.009 208.11 396.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 33 0 R -/H /I ->> -endobj -173 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 385.009 175.6 375.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 35 0 R -/H /I ->> -endobj -174 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 364.009 203.65 354.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 37 0 R -/H /I ->> -endobj -175 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 297.54 343.009 339.49 333.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://www.boost.org/tools/build/jam_src/index.html#jam_fundamentals) -/S /URI >> -/H /I ->> -endobj -176 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 358.93 343.009 406.43 333.009 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://www.boost.org/tools/build/jam_src/jam.html) -/S /URI >> -/H /I ->> -endobj -177 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 401.274 267.683 438.464 257.683 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 178 0 R -/H /I ->> -endobj -179 0 obj -<< /Length 2720 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat$;gQJVInU8-gDgSp9X?ds_9V0P/A1O.L,b%tM;jGOY%'luuJ@o,L1Ol#$$#%EtNbbYl:ntb'eT^q&s7GklZCr?02Z)Nu[lHV!NO1pmekU/]s102V:dUd_G0&41HLlNl@8Gfu/9F7p0//4k'gR`9dUf$,\4tg+,Nk,%jTLPp'"XZEm*b+.+eD2e$X%IX>I(!Eq"Y[1cIXs_-W3%08Y)..2Qj4c\]:FYW/fituM.71.87_ElR>:]:/7'dlN+36*?.1V9M=3qMenFE@$K?TSg?`>sb!mGKW,9%f-Oe@fA-7f>cOS4J?DkGZLjc5Q#+YM>fhr2#c?#=mh*;5Y)6r-b2(lpiNBT![C]MDb@ReM.gB5&+[$o1A!ZBO^D5N#'^8n/3,s$r!AL=\hf]XGo<^nTcd;#3iA"=[a[Le]t&Y%_`WsR@6[1L6%c\S]Ulj-lPCpnBsjpg('+#%LaA/<0PhX*[b%E$gB@+dMQK#'UuN=N@0D/=P#N83c*j4tPCdFJfgi"-Oi,&J:X;H!5"CIiK5-?8%(=]<(O[F<7CK'#feh>PjUiF_g5/_@J`u^s6U%!__C->aq607BJ4HS.4S'IQ%U-ZfTU-J*!#ullbR*DV3[RifZJY<]htIH0,F7l_chfp[=WiW-$ks&ur0=MUSdO=*'b#Y2r[909^qMSaeMX-l%4YTMj8!d6cIa;2r:DdBPf@S]rdgnZZ"6)OarBUMb%DTZq"]]KH`^cBZ!/3P+S,$8A74RSk=8;9"8MQ6FjcG9FaFuS9Gs^DY6rk$C5c#Jaka(H&hle[t=6]o;[!qhO9Ij,D@l(gtoka?oh=?Oc;QQJ12b>ZmM%"LtJhEodYOrX[)b(r_m[=-T*+2pOLL\lLk5]rQfkJCX=Gb^.81/&jTBa+c\Kech3gYO&!cB36QaU>6m/Gg1'mb>pUH3514YfH;a.oeq'Nps6bP+@H\ZhYs;P49fE,XSNRUHGrL^f$/?c>^;-Va;RV'[\p)>Ak_,cYHZc*njt\RmHLe"jilo1L\tg"rdS9#dmO02FeaF2K.X[6Q0*`HI];!>tgF;6P1"fr(=Qn,EVW(YT+4_&>Rns_[uGQ502)X@/*8jn:R+HLAB_++.33a,[li]nJ!`*8>"tF*=g4h+2#03$L3M/^`-CXIC-=36s+2q%hQ(T[8J222DnRjfpOO#_&=4('/2+NE)`0`rsaF8Y3QZdM9-c/RpB"R\P,K*i`t`F&tnr&1L$1_2opJ\qHqRp/T#r">qEVrctHSqh:R@HdH.irM&`CeDmTDk,8<7Z8#&ghlg"IR[Wu:m5VZ@=GuhRN\2`n:@Ie7V7TIO66*?;t/V%8:?KNt!f3#W8CotJflC8a"P5j[ALY&^>71$!N#"c;l9dFsi1E_qmMG`#TmfJ5g36'h1j^&gUC+r\2)TIo_UI17$bcIO+QB+[Cs]o"X40R;c1%^0L[!AT57aB&q?7Qpe[.Af`/XRDUL+Dc5SU@;CtrZ27UQj2Sn$&A9=O*Q&f9_VM+..je`QB#^;_B'Hj=AB71efVipb<=Zc8m^ip:-5M"CDcLLKCQ4o=Tm[=2Cm'DH2_Z`+c4;$$tp/;//Ll4",=I_[W<`?^0d,2MuH/a0DY`a3t&C0%[h6R2QRo/HZ"n@I\\]4XK$@@@HV<>?A/7?s8e7dh^8>5ub:3bm4n9&hM0:GSK"#6->,pPYHi1%n\i/D?~> -endstream -endobj -180 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 179 0 R ->> -endobj -181 0 obj -<< /Length 2373 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm==c_;q&:WMDiPu((Zau2C.$/;7LB'V;FGi>)Mh77.>E'+_Ph,1"qNBio*6PR1*>Al41aC;^:NMZ4]>+1#;n-igiiMRW2pQ/^j/sBlkH88in7'uoDS3QaVFgUq,[U\_1ErFb).WZ<.Oot5fC;.B?j4[!XT]&QsF4;WoC&k&]F[Uli3gW;YCP]<@dZeX^)7Jg@-]m92nP\?Wfhls(um'm6UAbnFBg`Rr#k?=Sa2a?hKg^lj5L3NeeLu'uET%L,?9kuQ;'+E1SU73B(8#Hg:L"P/p==Ci[K)&SVSr'h9;63jP-`Flb9u.hHTG;,9P@TNl&"0-*NN=94#VO0lWZiXUO@rMok%%aL!jH37a;EbC3ofX069K%gS/1rT8T0e9M#jH>F0],6rNOFr4VD$)P(gSdY*C$k8FGNaY<^YQ8jHsp2T,gA%1j\0Fj:Ijr2ZOY^u!eB_Q)9?MEtWH'GZtBV>u-nSBM=drbNj4X:.I8#&6fed@s)=>*`j8lAt6+XqAP3:2CPCUMX@N?.%/(AjgF-Ehl"b`lh2p4#ZKX>=7r`bDL-[SN4BSgLcOnAt'tO66Y[+?r(KD]9*beh84[O5\nV;_fHkd&pTD48Kp'%lXMeVAZ;Zn]g7:3DP08PjU%siA?[TYNL1ed9/g8If1dGiTuid2s?"'^OQ=J^S;7p-DTl>u$@>LNqC,3b!QKKOdX<"u.4,#eoeZV9=^6UN!uSSG5l:=]+cbPI6:n9^RN`/l'r^`6S5FBd90Z.\^5a/K)Q^iUDAUTqJ2kFVE'FUTL5C5-)J'8j0Rknu@qdr8jqK3.P28%S(\L)e8Pce;j'LN)KbI6fT#6No1QRJ'`\Ul-nL::K:LG<.G2&&dB\,RQ90me>;hANJ'9)^P^@Z,B#[i[@+=W_:q7%P%=oC1Cq:'Bhp3UAH!oUnn7H8q`P1faQDAM:\*W]s,>A5t%4f9KoNQja6]WQd5:9$geD@P)mjh]X)+qm1FTQO&ZpLKV(Y>HSSO*lWgB.?:KRr"D>3ujW>TCB)8Et7@P'Wd>dCecje+LBLn*tVJ0C\CKXa1QP`A)iWiO%_s;YEGAM]pp-`*n`X$h`>Yk!>!T^ao[IMEm$K!0C(W0sa,:8Q:i1Va+:)&//#(&d(e,ffkoXM+[cOq4p:*MJtFD0>?+pt+ck2=W$N&a/'!b9b+Kr2pmN<[T]`2*?eQ^0&89M.q7fe%2_b>@_F#?CVq>NjTkOXZ>Ki>l#LPN496=36XIX]rgro<;7YLVsB$Cn)6.p!q)csd>J)tbHn(Zb-+(SFE)-Oq0Tr]5^]-eHKEapC[mqag,-YZ:ad.C8QUS-,udu:'_M(A!k1'Fs$.A^U/@-6H544gr/7JRElMt6OhJg[=*Vn:gN?tYQ\;56!S2dg.#7gpa^I*B9N>R1+iXE=Ag;;]E7448=@Q:&+c=UMp=psKB+t4k-GuIGu`q2NtiJ)a5o-$5"[EGD42##FDVI@WeC53CEt$/JJu6^4Blg*74DCLnHm^"fs4Rb$%n;%D9OfTJl!-#A`cm4cK7+%^am&NEH&X_%5cBs5S/ZZW4R-l496r@/T(SeOT`#iLN:QE@SS^Y[c%:OYD6')dI+a-LV>7rIYsWAO*+B+$?VAKWql6kg2^d0JP@q613S&qCL1BGCCM6]Mjq~> -endstream -endobj -182 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 181 0 R -/Annots 183 0 R ->> -endobj -183 0 obj -[ -184 0 R -186 0 R -187 0 R -189 0 R -190 0 R -] -endobj -184 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 499.515 167.53 489.515 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 185 0 R -/H /I ->> -endobj -186 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 478.515 184.75 468.515 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 144 0 R -/H /I ->> -endobj -187 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 87.0 457.515 178.94 447.515 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 188 0 R -/H /I ->> -endobj -189 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 344.646 386.076 502.126 376.076 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 39 0 R -/H /I ->> -endobj -190 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 289.18 375.076 438.31 365.076 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 55 0 R -/H /I ->> -endobj -191 0 obj -<< /Length 2930 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm>D3*G]&cTMZ_E^=re+7>IlBem1U.HtSY0E[-3@KbX&5Y.LAPO!]M:t,ef9b!GaIt/1P=)SsQ89.60-&8"6i#j+lLmq1Mo$U,D0B">Ck!2E6N%_FQEfR(_`3IVT)q+uVZrE?PiOcY">4Rid%0/Cor+9eInmmIcu/1S.!Y+MiOjQD+qj4?6_hjFu6C:+!8WeJWtgUJU],4k]=_Zbc,cn]+g^k(P!Pht*:!B4P?;-):]ABZl<3HYj^\qI1=G?Yi"&C)*PNlV]R^;0(j>NGRn^/4Kg^79GT^A,Qf0ZL%\sl(#iB7d@r2:*(qM`b6)NTF08_d4pHHLX/%81kF]"P>bM,CFO8]F%6T1N7d^3V/*;./fO7u[^Q1kM3<)*-0nR8S6c.?&)9^1UBS;oCnHuhUEE$X#?eD@8K5N]7TK1fBl7E")X/kY>DRekE8GdoBQ4W-e4<>;;kONXolfT^l;ElEt_F]lmd`CJ:7^kcX-;&-Y(4"f'+4H]pW;douTOkFbS.gG`o;;L=D_,R^oCVpiAE\XekRcWFj*r#'W]o"[ipX+-3[TcPN)5jWI>g[O3SIc.JE)6>TT`IBbg/OGpPE;5$(KAq,tj<)SWa1n*kX%Op%L6t:ohPA`F&1'1\ge*%lm:H:6kB<99b.&DZ/A^\>/6kaN=+k@SkaLkJ"'O87YlMHW^@hs.4B-s74q@2D'S1`(b>o0Kfg"r[9qIALM!Gt1*I,qP!l!':DGg69in51pl@=FF$jF7MedD2/K)pS\Vugh1&iFGu(t"ro@ZAoa!cl4DkLr0is5@6G$26b:#Tcit3C;?%='c-=&l5!)FgX%p]4P`RI5G&(?Gc*AHqYLb:o,uBo]n^=LZY6HOlLc1"ehEQ8aN;BZ&Fion4WNG(Gb*:o1H;Y4NltPCESJC%OA*h1A(-[m2&8mU5u"s*queUSoM4;`bRgbp!T`oHTZ=`rTH'BS(1C'?c/@Yd0BTVrkUo65#S&]HXV:'%VVj_9*J43:7!\54`UUd+S\"X5aanH,7(^O4]17HJ6"AIM:GrMRh']7rl6`A4^5h9fZG(9>:(m#F!9Q'rM%9Oa\n@VQuli3`f1dla>YMc']#QVA:<.K5`J3B5CijUjsqS3adTjpWh$4c+5.HXA?rj`m-HfEN.hIlS1M%2D7-5+\oHW.K74SEfG,!(+Dm4ZCOY?pQ<-I.Q;>:7<`(>e-t_7SEG-BEld>Hn]cKEX4Z:3))5EBE3]/?fW!![fY4G9'&(#D:jJHo_ID!QWQ"?fu2.pG^reE)5[Wp)]!l?TtdE?tOj7JN'eLKW/s224/!Y'Ccih#T.7*Gr5#YS'qrlqY\RgdhD-\1$sUeBt(+nG8dW:&KD/j<+(a?reimbN@V^&J#mqnIMG@7h0gLSCM]]57k\@"mtph?\=a6I\GNBG<673d:KCP9K22'M`4M@0dG^l]eq+9D(6[*J&IV0uV@sR2_;]3$Jeb-q7a:QrCq0e_d<&gZhXu;th2%]Wf-">!+%MT>Jo@*fctb7\9lj*5m>pT4GA^]db5IQCY-O:hAMOan6NP_l6kFb97n0(I=RN!)J6f7Ut"3Qk&=X<574>gX"p1Qb6K)$(aVSIs,a?"*M>fGq^h<3quJ0#+2BT9VLO%l%\+qPFu8i$h08UBBc@uF["$!16>gV39VcZm#)fa0k;Pl$P-So6\iV_Z`J_no3#MkH3jgQl^ND9[Yd1uN7hdP-E05Co4?Y=.LO+;:et!K_q[_@PRq1nqs)YfhuGH\b!Tg0Hth!dUZnrPcP9VCFh+W5"X^.LL&4Z>8T#2(3l-4IWE:T'^oAA3B;WCL"T:/E+ZMn3N,EF\-c%=YSN#l)CFirLckCf?7%KOtg>dT[oPXO@,\+n>s[OQOdXL5=_Z.]ee41BUf&771*shcH=Jk<#@8g,nDIPn]C,?h8K3WOCq&f9kF(IbXla[I5/0?j[(/f:6KZu?EO%k308\,~> -endstream -endobj -192 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 191 0 R -/Annots 193 0 R ->> -endobj -193 0 obj -[ -194 0 R -196 0 R -197 0 R -198 0 R -199 0 R -201 0 R -202 0 R -] -endobj -194 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 439.59 583.42 552.62 573.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 195 0 R -/H /I ->> -endobj -196 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 515.332 583.42 575.592 573.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 195 0 R -/H /I ->> -endobj -197 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 360.85 449.12 404.64 439.12 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://boost.org) -/S /URI >> -/H /I ->> -endobj -198 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 334.604 438.12 491.224 428.12 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 23 0 R -/H /I ->> -endobj -199 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 515.128 438.12 545.948 428.12 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -201 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 427.12 254.99 417.12 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -202 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 429.47 262.82 519.19 252.82 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 203 0 R -/H /I ->> -endobj -204 0 obj -<< /Length 2868 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatM%e`"RVnLV\F99LEI+l:#!Wm&",S!.jJXW6rPTm2F]JX0QOYS:rk7'AbLToIre:/gn@piGBk"bp]/>4&H/nJ9XYu\7r/iUWD#!<]<3@ip7A)Kk.+WUH_cQQIgWFn<@!/\/INM_S#_"r$X3C[141/;.h2d-3Oj&'W348C_kg2Y;OV*W;*/N4#2\"c*kTt#s:)VSb%NPVdVt\,^5=W2-%'MU5*n^m*M0G>m^Bl(q!<.DcH=&Y3UPJ#J"3si@SJcS$mqc_-")l]aZqdH2<[S_E')IU@%K-lN]%ebPR(\>]KLT\]Y'9CmSKEp`:-*"&JFNQZ=!`B]Lq-W&`!*9Ad*-'V^Ha<`,P31:$dAfKhSr`$;_.\]TPJRY!0@;PGC@tF:;VB48%':OS#j!$8F0l4SZnV`RJ]GiL,IW>DGd:/*`_r1e_:$/6qSrXKO8't3XZ+tT8]Iup(n&7a6FIehX$Au()84aub+0=0^_OE`Lb&6Q^GY].bJ?!UA5%.j!*PU/XG:2g1"Z^mh6ScU'WaTsU:\$OT.AcQ[?12-MapLBJDWpIT='Q7_H"9mHkoWNg0BELBKr_2HPmkj&Y1^CbI)-$/X?Z.FRGaA:Pd9%N@E1E&1@t'qMi0+<(jE^rN7%3LrWUJb.-*LDC7WfD@JE@T1"96ZS_`0NLL`k+-S%Z?%7+"l6u4fPlGrc)+[T+7XeK4L#QBT^R]p8@g]Sut8o:H6YS$RjH#HX9G$AFHPqB3V9)G._5BhqOKK.W6JQULM>;$RG@d7\p"5:t2U!^'O>88q``)5]UFA9'cXlFuo<7@>f0>7,^mGOa&bT^`D2J$X\)t]Du1'f[9[/oTECBrHF7cMfQK@8!!L.@u&k)hR(H,Qs(_g0OgGNLqLk%pldm9pII,OF.d_Yd*^")he`o!qjG.+su5'T:+!6EJf)_fJ/+3t0A=D/hp:f)>kYGXREPZ"o/HX=#VDC65bj,)!A\6PS#ee34\eDD>N'3(Tsj&8b_S66%B_/6d*P@km\(k/HMtN7?nqHua5%$mXY'')U%,&5^aoBA:h$nh\@g:AOJ7etV+b<-\WX'k)H>-EO3%WuS%Oo&dX4ot*.G"AUk;h)VVYX\PV`?a_Tcq696Ub0KO]HRrF3]mJ=e#/3f#MG:UOe&qV;Qfepb_Gt)_L4\sfZtR8hQ$;ZS+@`O?7$cG"dFU>C[&bZIRGST;9lA:G-1b,as%#*EAkrBb+oh+f5?4`HcsAF%@%SuUc.BX3XC]`hV\A_f=HD=e,*IM`<*9thMMQGf='AY#8rIYbM96R/3#e"):l_.`oJ_:,UL,53f_1,f<_.,1[bQ:M5&pKoW"_HN5/.(aId*>r""E%W'C$RbSARh9aa8l,ga7*2Zqa"cik9bU"RCh>a<]n"%bab#A]teoc@Hhs3HZKq)/.5#P')B&BBOIVas^/9?tR[iFS'`8!fke":S'S;NhIh],qM'JqL@DhF!oUL,!2U?QAKintQ)R@CqfECbufc)?ia(R1dUAA,ce3tem8:\1Rl3*6jAMl@eM2>;poKjHoMm7*02X:t;5CH`]Eu_I^0s&`nPl4O3ND[1H5aDp8+s\b:4GV23g.a(THcrtEsf*\_$l:'&E0GFjNMRI0bM4i!cC7/%\$Fn,4ndi\Gd%^\"Bd%$AZ@PsGQ$&j2=3'@02l)/BsZZWMrWI8@S>>Gd)8.\:KC?5D5a\X\GMk/.Ae$i:HB%KJ)J>P)O-psT%AGi/e$7eKTp5JtU9XG+K~> -endstream -endobj -205 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 204 0 R -/Annots 206 0 R ->> -endobj -206 0 obj -[ -207 0 R -208 0 R -] -endobj -207 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 218.36 532.7 247.25 522.7 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 27 0 R -/H /I ->> -endobj -208 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 222.65 87.661 292.33 77.661 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -209 0 obj -<< /Length 3441 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau/[a`c^SnandM%meM)DmU#@V?)W5"/rp`"&*"eTGL,I.^[HYdL3>5!fKI7=3;gL*p:Q_drPS'<]B:i):--cW1nl6+daXu=?,U%jVn*Y@OlmHPfRK7pYD,^dP?V'LQj$A9?&T=;rKBrMQ!@iaBqrTU4SuGYCb2eosV0I:ena^"_C""EHl]FMkP2tY?M.'mf/k=A$!*^Rf(h_18MbJ*g,8otf7PgcA!*Tut#pr9@C_c<.c9]gc\b*Sg"iuK(eQ#CcXX+o-qQ\oNb<6`$4L0STOOthV@aGL$8j\goYm*F"%^Zcl;Vkdl:,]U)!=eVKB89_2g*UiuQp[h-K7LGb5=\tuL*YYGS:uk8:;`8[.D6+Mg%,DU?.Z,?EGA3?JEJS/3+Gs7"RZUI3N>#U'>(=7BZ#Ng,."=M\rFE@bf38lb2[^96jY^a!B.P97KYR'K\:[3g>J!6&N!4c.(bS!tL5mOE7e.6b[R2oV&<#S<(R0U+XU@b<_I(Y@6>>>GbEFnJnsNo'(+`4/(4Y<9Tp#)Lik^dGqp'uq#.5VYVDb5r9l7luULLNOif(l(?erbYpaHXlUc.U'd!RW'r*L"p7!O9ks^[P8aF"^!!c9i=fGPBA0IKN^UY1R-ao/#,=1hBi+0as4Z4G8<<8b]5BSqEWcNp4n*k2FYcHHO&sOV0E0BWQ&^X#V4g#qZ4)$c/!X\ui3MbsB&KOTJ7jOHOQ=ATKsg@j[tk.SYpn"[5F:u9$=&8l#M&P.RS;p&\&\\YF%)sO,XDs81-s1&U6-&8QGI7p`:%XBI$>?`Xtu2M0#3"&Kk7LD6nGmM?-ZH:Fgg'Sa_<'iZ<"t@lb^W*A#rZ*28d5+RZ.b,`IZXCPc<^X)&N-1DffTWH%QB9R9MGJ>G`Xl6K^3^b8URNZeQ=0bq'ldT&$MaQ!g6*/oSq&3'pk+V?O\Z>^1W.ZbY0;VT`Kn"r2VcVEm=>4\A6rLj59ba[0C9#T-cO@ZX$:gSQqL-J"HK#%Dnd1DFq1nVc5Kh8fniq16-[57-LT('!42EQ"[i4Zdc1)+=6f4#j4dB:SFg+Fh2/gC3`aGoAgrSOL);_44rJrZ+#skhU>!6B4YF/3NVW`jm`(nl,P,!;//te5T];OL*$CB:)bik"poS`Ee;b@tNqo9G&iie+1S#A>9Vtis4B5'AP0ojh-P(//31`t1UIA>'f`YdJGqi\LM^*3'E'O[?*^`.obSR5%an1"&4uY>=E%f*?'Z>kAtRj`G*MBo'JnPG,WD5>IUFKZE$b`\lQYrFKa+#kHaj"s8VT86M=TmKo`%6okRV0s%%SEZ$d6aK;Jul]0"29ZC"f?\GW`#(-D32%k487-kXmLh-Sd-]SkP9LSk@R6;b.Nb5JL15g_tWK/LXMc+s5PX$Adui`q:L;CKT$;QhU6Ua$bb!E-U8`KqJW>!3[-uEZ(q*mN*t.qi;Aq.tOGD$`c+Y)+`W;b<*U(0D`:VFg]#BU>1M2Jnjq'sRIILhXhr81K.O#0*!AO4>l+nQ<:o!'d?NHO'3e1=?(`meQ<,EHh,U0mufN45W`=e4A9lGpqIFaG9R-t'SL#UPn5&)a:@s:8NEYGEOd`7?#HtZqPKD164gsB3*F!49_^GKjMI3\B;YaZ?:Im!TQqr[HOM)S;BBY)0+)4`.JfIJ%59s-/#"m=SoO`3HnO%jnf\QW$R,uP_f(-(l?eiPd*/=)5?>iB1qOo[eh'l:lhKT`sbbr9CGc;H\QHI)DKf@0j;`3@?Z:/dMV"S`3D?+cL2W$S4L%iJ#+XBq7Oq,LsSY\+_>hP?PXB1deK4^#P)lolV)ul;2=W5P_H-1Sj=AJMrfA79_)K4bkVn[MJ%i,kAe#n<1:i\D[%hb8KmsB%WI=EB#oH+^KVqPeWK]&m!`2X?/;cg?l]+jGiCt?L]E1I?!=D#ic)K>RfA+nV>$s?Zfd#k&&7*kSCNhc9G,_prCiLrTT<968+dm-HJf\f>WOlTke5FiLD\1&7Z=Iec(&b[U*.Krp^'a-epc9KCBUROV6LscXUa-R?I=T-4UpaIs$7lN>*s+?t,,/c^qNfT\8&Db7=B&j$)Qs?SV2c-oK+&Sg^5%#LYl]hPb;J=@p04.lHDE-e'h?Xal?Gm(6euJ!P#?btD'&5X$pqgOt+H9JNms>G%f&McVO:L'K^A1\R8A3J59O;t;tihiKZ%2P5`;.UaspDJ6<#-S+04g:ZFarpejpT=hFAfuY/Ye_GYa$b@Xl*7&ZcJNa9c&UQ^gQ[%+'`+!@Nhs&fiXGO%W-7[jWUL/9>=N!L+P[5O+)!?0@V@fT$%Mne]Y^O64Dj@[!U#"-i\5e=* -endstream -endobj -210 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 209 0 R -/Annots 211 0 R ->> -endobj -211 0 obj -[ -212 0 R -213 0 R -] -endobj -212 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 141.642 293.958 305.792 283.958 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 188 0 R -/H /I ->> -endobj -213 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 355.78 174.958 421.78 164.958 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 214 0 R -/H /I ->> -endobj -215 0 obj -<< /Length 2840 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gasash/D%-&qA57@I20LJOJ%dD&)8-03b(W/?j?C@<&fh#?dp6[Z]j;;SBWUr[;g.)9S*_":-tOOi."SbY[lNkIYr1MH(9Zn`oph(U%05P#\U`P1:o0fHs@gA@$T"=9$!a5-eNrO'.obr;Ih-7\"buJl#hA)DYgK<%[p+.>3GI2nXW/5Rn6OhB/d>WOhAVfFcD]@XFn1RIse7*k5f"+nW_L8jgFHK90s#F4!j5,SF*IA/#7u+B.Vnr;WpkIgaN0/e`.]X%$:2?4@a0SX-?5P.@Ko30lq`C%K%Dp?t21hFlg.lT!T6G,sHNWmr*?Z/P3IG\#&*l&ufg=kuT>@hN.Q9Zeg1;9,hSR:!@)-0^p>aZ:p'>6krL"jeQt?>nRt$3o7%1oi>"2<3.?L*U`oUp[OZq9Ji?]l_qn6Akl6i;6c^^>3+^]DjtMFE)WqIOD-.&`Mt?H-nU!e&S9'.=#Vq[Z>jsbSr4m7N2VmFFDDY0QGZgTu#;KPe5D?oA/GLUNsR4NCNaC?@=WO9W*[=R.Q&,D\<)cV$"GSinP]V"HHdM[M1*!aPrNcFL1VN:]*W!1!h2L^3@&A_KP%\qER>-!fGQIJ=t@]TG:,VdEO5.dO%M]V"a;]ZnIet67r;r3I+7%uO3jrfLo_W#23B>5e(*0gG;K!oC.pb$FoQIJYX7Oa.;G`Ek<*h_0RWQ@b0&6)r=dnVD&MGT*2fk7=#'Vhr'W75nm[)'Gkk!h-$LuESI@P!+6[TQ.5@@s^lar8Zap0A!YFXLKPo89l-GeR:=5q`,[+?W9J$c*C4Tpqs!g^;3?RJ;BSJ'p/hRD-3Kdm]_Ln_k-CZ#9%,d*ge6Lr)[!;\t'"PInGe_)KE0\^\,Y9@Yq2hY9JOtLSbaP88VWPDE=-`!<(m6aj39_$[ekQr]:cO#Z33t1m;k_]^n3!t.j,hrP.Om*TT^>JC-6^7HWUj1((/io?.cNbhCRE_*Qo)?W.h/DQGp&\/ar(aN\qhR1Hpgmi1i"s%r_@X+P]N[RkPh#ldiNmjrf_&$=./mY:mn)Q]G*^o_Oh=(TJ4nTP+)(?HZ+;Bhn9"3Jp`\G~> -endstream -endobj -216 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 215 0 R -/Annots 217 0 R ->> -endobj -217 0 obj -[ -218 0 R -219 0 R -220 0 R -222 0 R -224 0 R -225 0 R -] -endobj -218 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 74.0 587.548 101.77 577.548 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 195 0 R -/H /I ->> -endobj -219 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 74.0 572.298 118.43 562.298 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 214 0 R -/H /I ->> -endobj -220 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 74.0 546.048 125.66 536.048 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 221 0 R -/H /I ->> -endobj -222 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 74.0 530.798 104.0 520.798 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 223 0 R -/H /I ->> -endobj -224 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 527.01 127.929 540.89 117.929 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -225 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 116.929 94.5 106.929 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -226 0 obj -<< /Length 3005 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU6>Argc&q8010_3Y5J4)nOgUlZ:e+Nd>08i8)oO2sKTHuY]M'T[D`:a-+V)Uie:mRRb7=]p[M&["\F!KqIh;,!TgJnpliG*SH$WkYud4-u&d:s[@C`UO33a1q9e\=<7^P_mJl7igic6(!h'G4?EIIudQpn+eRU*-1pqr*r6IHjh7r[3#gRr8g)%E83a7.),.V6m(*A$p(Wd/[\Tj8e5Cr.^,qmcMc5$FXN/:"`)-+0=>L8>rc4[?gIFHuOmL6-7`LX.q[4R9E=e'Hfp8J^RUin[qc-UJI$<_ZMLK4bQWUI@']\$5SdR,3A$[t&DQP\G)cGhCh;%lH`I6A2#!md.\0AFl[?>%0&mF+E-/kF(H.3KcV7<*]&p[a?H[!qP-UH[#Udp.8'Xj:,^c.^8I<>VN)VZP/!8(Qmq#/!oc@r$U+_O73f&#AFOG>jH:]m?94s7RQL.-joh;m_ra;af[T3inO@ItI=ade=ogu9THU:9%J3Zp=&l+9SU(Rd::,[M_R-K4p7eIo.?L^bQF)sEh97T>f*1LkJJ>HZf-8"k(QZA4Jt/J<.T904_uWWTU#h$%ca:AHHKA2BU1k(YN"?UQS8hX1_N9=eXn>O918tc!j.`Z:43>BE5Nlo#/ZugjAc>E1WQN:RZ`%rWNE=l'CKlSTWU]Dj]YX^0L\a9o.#$-1dWLg?N?_D+K"Sjrh#m"NBF]nh=c(YbH9QiPOJlQNI/]J8.3?]W$W&5Y4sB4^*M;L<>AUVPJb9"(f@4)!cCbQ4#)0?%>iCr;-]5Od]Dbpp:%7S8a5.**fo!C7=GdOmC#q(*KC=IBY4(Vjp]hr3n_KFuq$:Kj7AHTHF6@6*e'')%pD7E\DG=r#fUT_Def\_IcNSIfij-I%iu-]Q^h'V;21Y1VZ)]gt>s5,h/_XFoGi.b21&<&>^^i].IHBmBiHZ7q%@aZ,kTGt00d`?!TtWNJTRnR[_lc@XWQfW1:XkWTL1A3l4\3`lmn:)lTj8;,p'_*g)S+]-G9?jHdM&c@PC?T-k?c$;1d%;U=^o\b4e=W)W9nN8WECV#NPLobPmLFF`$lN,/[0V6S$d\kinnGu187+4%J;"u]NE0k/E=Xtr1bb]pi6I'^;.G:P0ge07glBMaHXB%@QV!$fH-a)\CL0#gFlRUc+pGBR9tRQ`cinEYDks>.;.5n*mg97Tc7gOg`T1_+NjWDd:L#&D9NX9\_q;@!s(hQ)UV"G:RNoA^J>'I+)4UBc;,I.t.9ltj)M)9gH9d";K@X(UaV -endstream -endobj -227 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 226 0 R -/Annots 228 0 R ->> -endobj -228 0 obj -[ -229 0 R -230 0 R -231 0 R -233 0 R -234 0 R -] -endobj -229 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 370.58 689.14 510.56 679.14 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 110 0 R -/H /I ->> -endobj -230 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 362.51 627.701 498.04 617.701 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 65 0 R -/H /I ->> -endobj -231 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 341.062 521.701 369.382 511.701 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 232 0 R -/H /I ->> -endobj -233 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 224.268 478.701 290.618 468.701 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -234 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 437.481 478.701 481.911 468.701 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 235 0 R -/H /I ->> -endobj -236 0 obj -<< /Length 3076 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gb!#^?]X6U&V&\6iO@m0?!7je91f[%jH?CNU-MYm73@tmTP]#"Sh-n)]R-,DhiUHDL,*=WP85P^f[Yp?jD[).IRELXmG7UD^'[dSAZP4g/m(9mKrY3&_GqMZ@$Lp&b;RIWHX?[SBDq=lfWn.37qf]Z]A#rk/M0Z9t*3gco\rcUA[jO/N"!$"Sq,4TB0+>TS\J>*Udt$"1sB,J_ppF-()8E!UHML&ZjgM8`'.kj[-Y\!'aKKKhoepKU*us(mV-e7NX+Al=RM*j5pG@$R@W7BUrK>B=[VYh&Fc)h$]"8%lHUa5,b7s8WlbG)c?nWN,8YkbY-D(gJWgY;Ol8Y)5G%:l'qu(G-H=h9Q8cjcOk>TO%YVO20lrh'5e+:c(W-N0h4#3cfj1=%p>(YGm5TNB8I%Q5aP@4VGT7X+kJ[[RHJs`#6b-Ag^7E9+$F-5XYT"qlZ^`Z70kh>r8SRsE;OW6:9\C=4[lt7Wll&OQL6(BMX`u%##Q-7n&es^!,gJEnP0!"NO1:D.3AF8j&'h>Rr[/OB@:3e^`?+0t!5X0s-5-?f-od4h`cJ^EJorSH2t(?tE;.XH_A'I_h!hi>'!ZY:D_si<,*%Y8SE5C_+8bhaTSUSn1W7rtDlM-I")T2-Q+Z&])2j*f?$OI)EbI1:=2_UYK?FUL7/1C4(.S20el6[nNiI[08Gf0]=hT>"MP.l@`B:J3l4co8V#HJ;_-YnblSBN],\T+(B3-Xc[:tu+C?!!3/Y(Wsh3rSY3Lh1s;VsnIbWP!DF$#7lb$X;b)E!KsjtsWHiU]<9fg5H**5TBU,\%*,Iq464hLq)Jn8X:[2)G._1a>;A[LuNtSlmIHBpa`Ms(NPC+XnhA\\/>b<.iek[ZknpTOU8XQ_5oW?uh5qO%*oqb9&kP)IjhsBctRe7fD`.(TU,Chan85EjKBFl"P^g2d0YW\iY2eVg"aj-_D`'o,BkG-DRjsm[__`>^LXY`D\'(3!XAW<2NC1_iT#qkJF`edFb"2-r0AOQR-%"BVGe7'XKRNQ">sBSK[k[BqGX_DFr;@g51PnBk`dKL4L_`IsY6j\)0:9+?A!">f^&Wk>C)?r?FQ6`*1LC`?34%l>1D&lqJ8;\;HLUHPnf=<$H9^/MpI<$:REZqAVA-l]PSn*TU(&BLSX,!36R2PKjUZ=>>KPL2N9kF3u4S6KDmuQf3F-NLrV'#%b[*bS\_IE$[_oTX%M.EAX1\^=dh&_c`.>()1TXP8pbpHd7PT@,VQ@`>aWa?t+f.=AJuh@p-=7R;0BP&VhcEb/g^M(PJbcgLoa?$2aqts;KPY-NcHb.^4*%!Mmo:U#bPg!`j.mZ;:J1\=_hfhFq@)VZDYX1r?q[*<%#(qUr%SY0NLHc5(&0]t!J,M+u7`uT4\m]M4(kC@91k\*j'iJ>B[@XR-trm,]+=3C#t,jO^2Wod2g[3TJsCCA6VnamKVL,WSN1/_/Tu=gX#mO4jL^j>dSQSNaJhR#_Jl%rLfGPNCG8')f04(1[`YOC\EfCPFJI4emqpGt8"Q'=k-!"Z-9lb8kN99Z/8iN0/RS1->UdOgqaT\k(p[IPm_U>!E@gfSah[8DYm_O'oj`'+6C&jd:+TDELCW?R,r]bdq'J!-cAL.qE^NF77kTl[<'L_2.;1/&BY$PAK];MAPeTTQ[1*T9't0@#$BtUITXALqu;,C&Ogs6Lum%;+9Y(7fPWc<#mkEg"a9/l9Ck"?Z`.]9$V!N2d.7<'7IH#WAi0'EZOtjgYVn0s5u!Z$*YZU,b)Vk!)L"-*UiuTpL-.U+jq4QaF;G3^)"bl*=C7DcF[*UdSQ\\o`!9eU`I/fNl.rg7j5[tgoJa -endstream -endobj -237 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 236 0 R -/Annots 238 0 R ->> -endobj -238 0 obj -[ -239 0 R -241 0 R -243 0 R -] -endobj -239 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 313.01 689.561 376.62 679.561 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 240 0 R -/H /I ->> -endobj -241 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 285.85 527.987 306.4 517.987 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 242 0 R -/H /I ->> -endobj -243 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 310.78 477.548 374.39 467.548 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 240 0 R -/H /I ->> -endobj -244 0 obj -<< /Length 2651 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatTKbDtU@o%m_^jH=5q_\K.p2AdR#h#NX+Jd$J*LRgT4-/'\8(*,Q8g\L\B@S&,n[-Z(IJ,u^p@MS37<.B:AptO-jL'ApU4RF2Ac2N93!r\0t;PnGJ^dq'V:WL_0hc97CEUu@#L;!'L]sL%]Ic11*"oeM2q;:?!(X41rGrXt7)'^;pcg+J-Z?W10X^.8c+@s09U8uQTd2dlD>(/jNDnhnjaKJ,G;j-=8)ua94hg:\Se=,!E5;$m?Sf][R_cn$aj5=bGo*?4BWJ:^:bSgl%cd..s')DI@1%uTE\+rI_li2OnIh&4(U`n9Ge-t_B$e"P,C_;(W3m+h9G+-X^+(^^l8oAq#N!/UA6EDGJTnQd+LOT7^e$C(J!QAdcb:(jR-gr=E,R['IQbEU+R^YEl@BfPo/8-kU;r$nBM4;%+%WdfgaBdYAN`f+4?W&qEGI`Z@IkijCmEjM,:,b$#aW)QObS.nk=4N.3W?B>-_Bo?*"Y?L'R9T_blUZR$X@pBT]:qS0-R@"npO'\!%8GJ$_<8k@jU#&kTEB+pW,p+#"l?sZ@[9rUL+`Mh'nKMZ?L7^iBGnr.Mc5*CK*^E+XDKHqSINli"iZ@HO[_b/rUNB6-X*K%_1a$UmfE&3OSj6p)P)S,LF"%*fm;:=Bm?8hdqlRAN7]E&;4$J!@'WS?'lJ:jdNER+=AoJ7,2E]*QbZ_Fnc[.G8>J,$j9s*H;,pg:eW'*@h;`TeOlt^%)Ij@*M7\2AT4P%fC*@:9Fs],/ABKU;[h'S67>oM)[NMQ-W\;>SCr'>gFq&XmKdm6\O^aGOl>`&t((K!o;+0m)?*(.M7%$^+2=066QUs?gq$GGCnVdk-*6nca;5puK+*E!"4"#AL*H^$pW2#q^*;k]'MH<[I\g+.m\*iZ+UdDhq(%m9;:3Ojpe=-(t?+AQss5GM.X8\81;&Br^\jrsd2&uhCrPWKV@H4`T[i25k-[=hi+g9f4%4E56.K,UU=236B^K6fX!'28"@"*%2WOdEq9J#Nlu4i0=BsWSJo0T:bTCM&m)N2.jA8EZXB0_'l6_TR6c>$W4A3Z[#]V.Qu8R+a+%'8*_=$&7M.NQ?sN.611:L_m$[?_O@IG?HPqlJC'$eAVmg&Mk@'L,dW*]m!thFF7KX[-:;ZcETY*d'Xu8"845J^3!W&A0K`^cVu&qnn1.D;R9+Fl,edX\EMqj'-+AVt0TJ[DZ29R'k0iJ:Krc3\`aB_!VDhRPA,XmcFfVIQ#J_&YIs;O^r,id'gJ2_/bpO`T('Z>)fLbZnQdMAD$o;OmE&^(r8Td,Maqbt+>[9\eL,'eeV_^Ha$YgDCb,6)4/o[&e4dJ]Mo!d[F'>`PHAV6ZDY2nW'A$j9@\#W&m!emG<`]"%3UDh(S`>ADgE=?uW&XH_"%E:pY_tT!0/'6E>RurU1Sg3;mKid(S2p,+\%1d"%3,;N*^4GohkAM+A9Uj5MLqTQFn$o&:SDOlZqX\UG2<'?*[:d'.0jtUoP)f?qaU6+Hk)mV\cuTT]8l7=;/EGW=`>X_)9]ZNU']7-mf"@B4=sj^^LB\nT6,8M3l(M1$YTKQ5N/kpkWDRL#_3eXbkaePO"&1ak+$kK;mMcelB$Ok!))q:&(iDE/e5PNUOA?6!B`53&!*97:NcpKTBlu:Smj$Ikb^%\(k>[@r/B^(L(=C2hn]<$hn];t_ecm0)HgUS&"OsAYkHOihcX?7n?O29FQ.R6.^7fhg$ddXs.<'t^Q3jH@K,sD)OrZWL5u=c?8Z2uHhc41a/?nK8Eb.eTt(&riO_BPRLUWap]T7/>$S)%+,8`/8)\;Mk7Jnp8@U-:W#M\o9-B'V#0-!qIfce\e%l~> -endstream -endobj -245 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 244 0 R -/Annots 246 0 R ->> -endobj -246 0 obj -[ -247 0 R -] -endobj -247 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 187.82 206.253 251.43 196.253 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 240 0 R -/H /I ->> -endobj -248 0 obj -<< /Length 2516 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau/ZCQIManb`:mIjiZ*@$`D/X_Y1,&%MZV,RB8e8;efScka;A.Z4c_mB6J;7jKAj[?A1XUc;c.1FD;`Ud&a8m_:>31a'VHHajA?O#M.o^d#EP6GTEd8Fg;t4`12iN`CZgml,H)d%>d=*Yi<66@<_omrqYfmCbN#DkJ`fRQ^]F9%6q!?/:\S'7I3&\-$8I>o_?8q+.r=7@$CHaYJqHW99m+1lk5l?Q*`lR>T^H^;s&0kW:(q-G$nfG7(U_bmtK3)>tH,'Xq:\NuC=%)j$g#R;>qQe$C8`grrE;_OXc'*YrS/-h^J)ThfMUXcW6D>4#Ak4]C(,@Y%J7q`"Wa&e*;@K,oEt,7[Wc7c9YXtAId/Rs!H,1p@NDW%:ES$&I7>g;L^JNmYU[5"WmX:oL,rpeh?VE!'MJ>ugKl(j'FVRD\q0Wm'j9X4JRK_#&I%2JIaN^Q!fus8P#6&:Za&,TpBWBeueYQs5fpk$BOOsZ]>^]=-`&*708c=%X6PB(PLNS^[XXu)s4l*4$$C%S8%XeO^guVLd5r;4Js,ruLQ=H[[5UoJ'(cs9m]d20+iE^5qdr:)L4io'X,3@q).Z;/4;+0CdoskoP/r+9^O:Vc9k0N[Z'C>qZb$KKI)Sp9,G@oY2bisrQ-X8*VZ./5C$!c3?#r!=B$a_QH^SIi^M#OnmKG8EZSpSKD=F+hPZDrKCpgrd%K81@-Zd+?UsB@/+^KZL3@[uRF.QT]=)KntqG"@_YjHUGRp!R0=bmb\s-DD%KS3,o0lK2\[b\[ob9Z0^0SN;=umZmW&l[V.hr.%l$;ihou2HM_#^ft@c+\'t[qT2C=0W`b71,XpeOG_9"1$m?4Zr]OmoE+r"?+:,iD0d2.ZhM8p0PB.;LjTK/h#DZ`1&'rPeS;e)"*;\QUQ%4G&7^^D9JCkQ>occ5Q\u]W?02`:-j\b6FX^jH__h=Lb-QB6J.^l^q2cRerFVYI'7"I>_XS!opM1Xb!H!KCIXsDZ;Y^'`*iJrc&Od@fg%pd"/GM&Vp6L@ZlhLZe_%t_J'I)Cm%-NRO3]J&,-:dbfFTCiuN5B%V"Je)h]'";`420]Urr[PS%?t2hPT'.Xha`][Zkq0bH#Jk8FgCG'm!7cjkm6.qbau=Dt7nM&OBPB`ITIKQmpR$Y]7q.Y3I]Dg>`Mj;,MQfr'bO;0r.^,b!HoB,)aQTg?!reE'WrATTSHIan\j.^2VF2QBMCFT!`5GnuqgN^s!Rh6iuV.iqarW/_mQ%HqTL+mY$rWcLnJ$A~> -endstream -endobj -249 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 248 0 R -/Annots 250 0 R ->> -endobj -250 0 obj -[ -251 0 R -252 0 R -253 0 R -254 0 R -] -endobj -251 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 397.6 475.681 461.21 465.681 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 240 0 R -/H /I ->> -endobj -252 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 107.55 249.801 195.04 239.801 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 203 0 R -/H /I ->> -endobj -253 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 214.48 249.801 303.63 239.801 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 75 0 R -/H /I ->> -endobj -254 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 296.514 115.501 314.514 105.501 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 255 0 R -/H /I ->> -endobj -256 0 obj -<< /Length 2497 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU58WVph'Y`2&Lq#,`F_A!5_[))7%"\Qed2W]R6EZQRb=jg'Vn7jocZAH;T3\GG1u.*:IX[44B'8T2oA0B-mnM_g^\Qob(O/"pO8QdD@_^.#`XA!k1oe5#^7W&F2ns1smPf(@Vd9SCr>qmZ2B`V:?Dts:_@Q7d]5P>H?A5SrO5Bhre+uD55HRZAg;HeI9WdE@^@lH>1][H=32"*JmTI^9lWSp`Hh73TI\?<@1M6$.NB"',>q/b(FD&T8U*tIdM&6Icoo0LbgQ$l+Qqgt7'Bg[c_SB#c1.)V(*L(=5;@'tK4Bl./347>$RM!9N+H.L/[7Q+XVH>LIj;(IK*38sYT\*4SGbBX-TGb:BhM/FC32U2fkcgm*ks0!*L26kMG6=Wrhq`oa3Wa;i_7@Esa]r]NRN2RF3ZNDq,#gbVrZ!U'n$1e\l-hkYsQS=[@$5,*/kK_!76JQ2r>R>;E+DLr%*o%u-;?b/3/k]6?h'^gCsT*lYC-NPgmW/`pcP@uZl0,$el+8;E'(@/R,J^B9$a9E%Kb(nK-`S]MIXtCFZp_Bl<6IjiiHn,*n6,n%[0u[DeWZ+b>bA2[n*=,6b^p'j8JXlFM?%99G=#U"R]%lVq0=i;1BQO?K5\m:F;p@t1E&7,%!BLRr%-?c;-]gO1LMdmhY%%h`0K+uT+)'c/@iRkYofSPN!Wea7I/SKJq!#2#NQg'Qb//nea):Mab]0RmAE$o1X.k)6'hY4Ru2S?c>$/o%9['#`iZ3sbI0ng0`?(e8ZN$]X8t8Smf*#cghI[HnG@\Wr$$.oMtbG:VYS12+3-l&o_1VK8_M9t&kCKEDT^f@Q1p]F!\>C^UT8U1a.6^+$@/ZF.kN<.[-IBT^WC[,>,_P9oD!lSkkbC2PR(E3;&>o$&bq.Ae4mWV\I4Q=imoBp5@W3Lt(1*-fWrMPH\'!?\"S/NR=3+f2XB=jZGNaXF_iVfq.cqL11QC=+lSYG1;WEb[KR_:d46l2.tBNTC$q4"K-,P!OEAh5orqKmpN32=hs6(ER$&NT5?X&7VSeET2Z0L@tp@I_N.66LrRE>>N;0oaGQ_/cf_q#]<2sO@K0"bo6%P"Rm-f,,g\,-2VYCs?[(_-q]0Hf-G("J@Z]D36Z4?pLM;2hCF^oi7H(07s0/6*_0,d6+J7d+eUOi6QkmJcd>kl;;^bqUUh-lr.:oEaDG*QFc'TYbg@YC^'5qhQ&8#E]W^UDMs1]cf)NhG%&Ee#_bA9Z"cT6W/i)67`f[o.4_s(O+%ib2N0*rdP,anSP)8Oih]tO8BCB"uAMUNZZD[3e<_;8TA-)KDq2iaN;G?m)KkB`m"l-hC^[ibeVI(Uq]X9O6B`dXXnOM -endstream -endobj -257 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 256 0 R -/Annots 258 0 R ->> -endobj -258 0 obj -[ -259 0 R -260 0 R -261 0 R -263 0 R -] -endobj -259 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 90.05 709.0 120.05 699.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 158 0 R -/H /I ->> -endobj -260 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 169.952 71.2 292.592 63.2 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 139 0 R -/H /I ->> -endobj -261 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 244.53 617.56 304.53 607.56 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 262 0 R -/H /I ->> -endobj -263 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 86.72 497.987 150.33 487.987 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 240 0 R -/H /I ->> -endobj -264 0 obj -<< /Length 3202 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gb!k6foFiGnpS6HJUObTb]%^4%`@eQ:1D!Hm,?270sK=9[DZrsXVNuZAu>TWGna7I[79QM@uPkFPun9L`N!CPhqd2fq0f^A4m$VLpG^skE8tk!q=?O2*(XV1"t\SJmZ3ie^O1Ip`4g-Sp@(PYhe_^i:Q`>5o,+[$iJL#*8@/NEiDQj,V7cae7ou!G)3/F*,Cfk^7CB0\/Xb2,\2PCEBi"Vq,.g`r9;.X6*H!bguJ1J`Mqh#aI,1XIp1FUo263TgPeQD*QAV8=,X=R`/!f2kSXDV(Z])_pZ%CA&lRTs_7aMGPNeoW?OR3@q#`"Wg+rfD>\LgS$cJ.7,I23RQPt+t;MWE]cW7[*8_!.C-7?keS01].\BV=9?@(Vo'rNbf.D]5Q[cdH?FrV)]Pn+-8U)c;Zc%r@;,6CTQlf;r&ni`npPS91e4Eh:D8W():NHitM"[!jsB&rok'nZYDKP__VI3mDlf+([oc:Dj)"D$b%JD0-p[^0RUPVREJ(qYB,h\nh%?h$!B]Tf6ii)%'E;Vle)>AbE:5E$RCh"`YF=J1&T8&-*Z!;cUa+MQ`+2b2MF],Bq5@6tK4El'X$%\+).H)GX!*4ep*XP9.L$g24C`T0/R`e@@Q5:6)kYq_LR(4`qS_92iN0PCTZ9;"Fg'kdp=.-P2et-W5\Rb)H"MV)mfLTSQV2YeUBj&L3A7u7nqY^!;F+Y9lZ_/N7q0EGn2#!)m;AJlgTeHcK;>H%Wd*b]$B.='%=+np]n-/8b`+W5?\3J*!9NBKc#J_rF5!S0MR9k^08VZ>4h:sSc2Ti7=WeWAK[c;Wdl]nN*N=r-n>"Z8OD0[/iYE4XG:l%WF:fgBtgPeDs8\%T=b4go6GfZNW,b[dXLj0g@IIC`_0CWN2(@BN^!&N'NM(#ZA$<.GY.NRsIAh#uLmFW&2,u!7#U,@&<%I7CBf'!/mki?`i0IQA3]_5=&IVX513J$XG5"jXTN:(r2fanSFaOYL#kB1XR)_F##I7SXQ"6\$UB-(BJk9!cTpX"]'1W=o)$'^XY_Y9J:qJ,:f2^aDd3?QuY;>?qZ3,:(]q9[#;cD&d;`5PG7E'"ARL5.U_Q6@;6.D?=u2`$.:.G,6P-bL^-Eq/igVJIJBdRE(5*aEJ*0)51Z$64HWD_&slUlZ"kl$mBu41([.`7S;DH2S&7aOSM,Kob0[Wc;Q[7lO!T@2L5p0a+D&8J_aMHsE7?Sd=;1lJfm:7Rne1)3^-a(to5P=3dt5!+K.L[sgO*@ahWRX3VgYQLY.(?0#PGAk*Mu$lZRebaXA,7ke.3O"6T;/[..uj^,?\k_bL>ASOY_KZ2li4No&D_>F4UTsMdX>BB,:^(*E6&X:l.rq:"mH%(97WPF*Dj2Bq>nA,TY`i+#JJc]YP#QH57Vq7jZ9oJ]kF=C(:UCi3)V'9rRu+4n5>Ffnr4Fsa'9F^`B#&XLc.=U/,gZ,^>+(R+h0@Jf8E1$8jOe,*D1!JfL!,HfD/diZD6ZDH8@Q=hiLm9JG:IE25i)/cY%UA9;\RN^8DVQI$'VDn1=oiS)>"I(j%EBlohjmBlj.EiHXXapJ\`WHci3G,;!#f*h0!>KY@bsOtT%s"urC%ehgVdEVEJ0hMS5)E%.8sfrE`+d2YMjp`<#r@@uFnG$0n4CUh0D,7acrDiM,'jJ+(q3(i\/PC37F5?=O`4RL;aM5ZKT7C8t`&%HX!d8Jkf(,O(/L?.nuFIa:+46@V0j=I+2O6N1'k0Tk=Cpt9$E!\I5p64cXVhChm2Pu6tZUXc%ik9@8:J%38h:&i=4Rk7KS^.f?EQ#^o*C -endstream -endobj -265 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 264 0 R -/Annots 266 0 R ->> -endobj -266 0 obj -[ -267 0 R -268 0 R -269 0 R -270 0 R -] -endobj -267 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 206.748 326.42 534.088 316.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 87 0 R -/H /I ->> -endobj -268 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 190.0 315.42 249.98 305.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 87 0 R -/H /I ->> -endobj -269 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 262.76 315.42 375.52 305.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 71 0 R -/H /I ->> -endobj -270 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 501.432 229.42 544.482 219.42 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 87 0 R -/H /I ->> -endobj -271 0 obj -<< /Length 2685 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU5998*k'#++D0X->s!'M=8+-TELmEGk!+NS(*cfC0j/80lXF!?GN.CZ5HlaJ.&Al4lDaTfJ`8h@8MO0=H5rV#Bu\*54J8?ge8Dh?6o9t1Mf(N/dLG^0j_0]-^$bqHOH4+FM\*Mp[/>M^ETltP'5et1:g,ai\C1R$$[['!P+*5+LS1q,NmA'^r\e4`l*n*kY*:hW(uGN8\<]VW20VI6J)Cpr6;!TQnAPGfQ1X8';`A*4;[r4W;A"[;cU@h9[(VEHnC+NTg9.BM0?@O%p*\i#(1sNn42t;5'/7:Ma&>SV\/NdJmkb;4k(IrIL]HB5q\Oa['Qu(mWC&-FpF6Uh*[Ec3h^,CKi"f#^/CeG>I4"Fu@HUm&6@J5r%f;5;6tkMjP=Xia!phG-#.F;>E=_Mt>[@eJ@1)$"K-RM/TJZin`We/14"Y-6c@"$gi;*iX)>oC1!S9=AW8qo19K/DLI7:qFmLnC^PjZ*Uc"*q!T'*n^PqiG?CMQ:A&j8b>R\`8_Q-.O:%.E+kZgOTaa->j+[,G*!o#X^g"-J/aJ2L=j,C[XfSqM),jKZA)BNr>t5p=,kU9kB1\?+`_(jqIQO-fN@2.N-Z%nT>31A+k^c]0%j&A7_]l8"4gn^Jp'eofHiec6T.Y[B>0t[8(Na4!h;W^+)($IUUVWbD%VJeF52g'2@R\ke+T^jRGgt$KY#U+#2hQ0A#Mk2(AS=;9kOQ4$'I7Y8=B?a8(o%KIXr3l]c3HhTF$Q[edTETU!T>Q>L:tXKJK#S1a%l9Zq8&LaI.nT%+f%?34;gNF6G:f&$.cH1s\MBoa3hae*Fk_3MWd7A!h^[*.Ne4cqLOBool3q:-jT*1Sf=cd=`MQ<_$3\4ZD:SZHc9?-X_k#8V(f%VP>qe,2+8[]FLSI[9)36$JLph=]_BK`)8uA=55C0`&kd+Q;41j&Nb@^C`)OXeFlFV"IG/50cS#%&NOoKFg26NgNU18m.5G&5;T`K3C9YEcmAJQ_cbU,!4n@F8plc+d9bTS$;(q#^-pd6/"8qH!4VmM(I9A"SP_KQ=HTKG"d>&fa,YdA;TL0J?t.<0,'L9A*M+Ji)RRC/!7(E#^#GtnESq&*SH`tpHm][nB1u6pHq+)7HJ36^E'70-6Hr='jWR(9.-^aBtFH#h6^LWGbWFhOh,^>cMl=jF)EZ`oe7&E**>(f[X]/%"OiPU91:b^?b]jT`3bR[B0L7(jmg9X!D+ACm*r*O>J8->SE4o^aDT=Zc$&0V,6;B&,(JHnG*PMd/(=9Oe!D\qf!#`oH/D%[8!*6=*:N-qd,E`\TJ^GW@Hreb6T%XcsM1^_+G/s'FYJf3W[F4TX/hDfL%XcVQ8t4c3/NPia+#:UG9.p0)=j^&.f,Y?LTu@IF*kL[W"R8j`+7Vf_N=pm:0YPOMqb*^jLM2sgbEkASE!Yj>pX%grZFHrb+UQ98#kr)]TXs,u)E(.1rXD/Y'+s('Y_@[$UpgRI*?Iuj9;`^pF>,0:0/_i8jbfk,a*n!j4AjNlq`\GWo8NMQHf).=R4jfn`2jo$'5hQuR6s"_j?bp\\`aL7s5*/%jIT-G+dU -endstream -endobj -272 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 271 0 R -/Annots 273 0 R ->> -endobj -273 0 obj -[ -274 0 R -275 0 R -276 0 R -277 0 R -279 0 R -] -endobj -274 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 318.64 625.561 455.56 615.561 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 33 0 R -/H /I ->> -endobj -275 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 275.59 542.122 388.62 532.122 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 144 0 R -/H /I ->> -endobj -276 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 521.122 151.7 511.122 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 23 0 R -/H /I ->> -endobj -277 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 448.344 478.122 514.604 468.122 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 278 0 R -/H /I ->> -endobj -279 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 88.94 120.083 140.85 110.083 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 110 0 R -/H /I ->> -endobj -280 0 obj -<< /Length 2660 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gasarl]9dY'*#[qKb5$?VVPhUI\ap`]=e>\af%V]nol0#r4S\MLBgB=2P3!sGda`ZYqX=+3ViK:RCL=2]K/=m"k2j_MqA3?0[!K.VCUO.5WUiY!-A+?`cR'LO8qZ=RBhhQjsb8IYK/f"FH]b)WoD"UEoOOA.Qmn!f4!B\=!gEtb6A5:VSH:kAqZij.Tu@Bh1@kTNTVi]K#SrhRS#$8OlKo4?)RI;!oHlNb>#2&\DJ`=&\(G@G_Wg)91,eZ=Hq9#LMq]C-/*Llr?;^>E+s(kOoNHrO(e95K^5RknNGCR#W-Y&V-:MQ-jV<:^0\j[O2Kh=r4dHJheW]\Lp2@IXK@@;GuZhuMRJ"dAMX,D?=#A/)T,RE@#h2rSLk"ZCcH<+-f$N3DJ]n+:MfUPO.lp%0%ot-#g1+uTU1.#XAU>J5.c9LCLIjtJ#o^622TI_054#5T)7?\_?8?8:kXP3)_&$c8&UQq5(W9qb.3.5E)i5F/hH`t$*h_[;)^Xj,j#K3RN,Ihe*DP@p@?*_@0eooeU8l.?Cgg(K+6G!VDqlV'K&Q^5HZS.r.pY_=i_\qBn.aob-1OsKJu=A"IaOKA,tY,ua-E>`Bu,;4rT!lprVdVNH"2SimH2p:fkY(7Ua/LoCZ?8>0I"WGffBWQX._+qMr$D1*]f#HaHo.Vj(5YRB5QfD0M7-Ca0tI>IiS1dHf-rg5nJ$*e@Ho'Z2uX",=LI(;goV8rR%JC8KIn(TPM3F5Nlkqiq*\Q;F..[EX_q6559t;[U`c:h7I/0fUJR;qVj`"Vp8j!AA?sk-UVeUOts`'8F#n=/$W(==D1SQr5gdYEhGZjS28d"iNA,>N\:i52gR?BD58sbjo3J?765*mlRIMe46,k2u0hLN^^EP_9DIn]G2H3K"$_AbY#i#\6cCAC%e4!4H)^O+E[$HfEH\O)fohcPu?hbH1Ehlac8FORl*FPcgL:j!CS"(fBZn"ERfqHk([((cp:^BT/fQ)?oO5R@41)<.eNBGMpXSXO-Wq2,cNmtF@`#=s.W)ajn3E,RH_]K8i_pj3Okh:#S(HfY3GjY>Z=a+$7TL=6VAM\Hqi:Y\'19`&_pUB!6L\;1`oc"#Di$'3I8V"U5m7._^1f*:_+=X521_oThk7S9G9<3J:+4/$Ng*q]>n4&:!9[*i&X6[&iF$SS%I%D?#8K>Y^CR$k6!akPFFd8fi?(t#t[;OTWmR._/l01Y@hh*aL!9QZdp\b]29p&ME$>FZK*&c-keN\ZbY;Q?^dr4ec35'Rj?Y.5tr:(bAZNZ\tK(B3'VOXJ&*&H&!B`=)5T.4!1.KsC9pa6Og:`&70O#(",Ln3bd6eGh[uX#V_LRf'3GW#+T,]LF^UbD@EI7a%PMoingBF#6\Qh`.M0'j40p\^KS)ZTe"o-h!/>q#[MWD8[[-=.?IKg^AWK5oUVB9:k,$'A[#1B`6SK7$45*V2>q?E0ng#=Tj6]"t@H8(1YeJW4RlV).7T!9lF5*M&"i`.n'-U])=I,V/PjC78GCVF57*N\UG)OrGgk:iR&XY$S;69n.XUg]0$gu\*L(Jj3PIi.$5%]'+L!2Wr[iV[b>'dIW`DK@L&:YlQ:o^g!Xa#*2=?#I"$7)D%\JLiC/Zuk79d"5SKo8"fYAkIp=*hd/~> -endstream -endobj -281 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 280 0 R ->> -endobj -282 0 obj -<< /Length 2768 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU5D3*bd%K=)V@ZW7V6Zs3ZH^kcRDO]I(Md0V0di_(X"<(L9&T2D\r%`?J?XHs19hO`>]sLmL@6Po5,Xmh0FhbK_l7lN=*qNF%o#=o$DZ#ctrqob7-nNIA[Z4FYCA"bhifeW!\kB\Um$kX:`(nefI/W%`Q62.j4RfNNV&.\P^jEmmU>>BH<]FLNphgE4TiZ>AKlV)k,HqL1D[.MoUqQu\ma?M?O'I&";?&6S%?4#kY.ktWbP.Rl3.Fuggs!*j_C+biPb!=&!nfro%"ZO=oF0jB!tXK7FVgZ+tL3P5b$pA?UV=Tn?:nZ3Heg%D)YM*F3%E;shIoR8Mgr=>SKp1"k.ecpigcHcOoV4DT%Kat.%]oCJpXYm9gFDRGAMD3A41aRTl_H,E]+`Q;^f4;<'e,WOC>-tpi;V!$.?,p/)BP[5$-J0m;M\i(HRbEG@1c,e&kX8VVl<)PRe63faI?eQP\Y0+Cm#F#[Pa*a)4HK1ZhB^V*&=6Jr#9CuYV2N"1;7JEke4J=!Wk#c8SGO%BQ7XV4BbWV_3,58cX*AI,\IW_lKs9fm,W:&![Zr'2sf)#OrlMI8P#?OsC,cQm7sH6Jtu>118YN'D+knP(94(.ie-0qf:RrBLS#V'bKf!thu#e/`PMT_J$gO2,IM0JFRLmt]NUsQ"a.u2E$B'4bN+pra0"*\8f$!#TrA3Be[W?I'^p>_s0qIsn_MZ$(2ZK(5Q'd%%hIRso)7&9Dm3Q0W>h1:f08I42P'V[F)iCE"f4a58m.WeN6JY#fF.oFig$`^CIDB7D91OY"$i(:):9HLg_)T/n@2s!re%G!7K1DO[((hU4RPQ5GNmkf0BTB8aR^/]`bY"F>H$kS%Yha#SiZ)Ke6KF%\gJ^*f6gp_/5;i13l7WUrC=`b:;8j:e%$\D;k+b]o=k0HGMa+gOCl"@h]BnZ24qp\'t;k=XKJN`2rM9_O8JiL(3:%q"Tb%4_a`[fRJFDu#bJ]WUb`"\OE"rEOTZR2uQ"8Mk%1g<0mon!OQn%-ehS"*Yl`&_u=B9@"-"%Li(4*(&pfo]1lr`=Ng;s8=I`5W,kOA)PqrJ-[q;SV-YE]&@QP@ql&lK/#g&pmPGT,OB/4@8J]U/ge$@7_k"AHj2uX`AS&I;"?aatp@FI];6"\1'CM)EF&SVPDH1*JH_h_8]%V:tgso&P=kK,r_4;_[6VCM*`G"W80f!tnqd?3k7UNO"XTEt4[?Um$lOQtknX5tnd\4#DEF?7WHNNK,&Pb!>'6E>>kmmGql&!'QRMptFeK-V-^Zm1k]gSl`>.f`U[JKUH="@>5c/3I-2j`Ps)QfF")QCGfGr]bpT -endstream -endobj -283 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 282 0 R -/Annots 284 0 R ->> -endobj -284 0 obj -[ -285 0 R -286 0 R -287 0 R -] -endobj -285 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 130.05 637.28 222.82 627.28 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (../../tools/build/v2/example/customization) -/S /URI >> -/H /I ->> -endobj -286 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 186.16 582.954 235.05 572.954 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 47 0 R -/H /I ->> -endobj -287 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 273.91 215.934 291.68 205.934 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 288 0 R -/H /I ->> -endobj -289 0 obj -<< /Length 3105 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau/[CN&:Bn[j:i_H5[^@SQ1e8;\1&Es=6fE(T@R+3l<#CUmd6[*hDSmqn!^p[BmOLQY\%TI9m&33tE2iOhbXmc!1!5%"+,nQ$1T$ZG]ciNGB6T>*u#JP3\,V#KXf^\W3JTBk#\X,$-JJijVJ8KNsEec\]SZKp%8ilU#Z%^bP(;d%'!'j=tjDO(GOcf_/#JRhI&OSBuT@pP/i^V%7.oB$LcMR)-DNu%c=+!2RX+0Rm-9Dg$cfA`Dqqs2k?MBj>O;D%%G,6DGC,S!E,]*,V;nR+nS3"1WK`8?fUO<(,\$!(-`N`i$RpP4o[[YV5+WU^QS2jgr"Mo&1L->8W'aMJ[;sE["pA*(>[cMXCECrT#5;Be<>BLF+[Pcc.)3e4K`1e;rM"O"P=pb/=San(73>RLo^IV(*D0S?.`-0r+@cn$a/6$OX_Ib@\qh(a!XqBiZ/5[t8.*j]*6Ni%e(/`KX#c"4KYX$WS>jRcCN4>es3i85:g@D-.>a2GnPD4#O^W/+$S%:hCQ$Ge"Ef19l#[eHYdLjruf!"E$,)09]E;RB9pd);%LXI#hH735"FsNMRPmdpsO,O;=1:;S$jeu]j*TalX`2[`P],ZSBTM9)#W(W^gWt9gSSp&)5D9/dc8S1')[UTd#:=su3_'@[]PhN*A@6EC-gXJ@fL5oXQWn;g/csF)F@7h/GgTUiIP+^3[&::,lhqPkTIeh,=Tb'oPo@`7Eq^Dh:\?<8k(eKBf?YJ+;:qL#:4&"7`o[>rs_m2mmT#7#)`T_heQuse-:dNj4p)>838YaMWE]E+4K8!VmiBl8*#?L=GBC2*#*Lci?RVkNddhK1?iI$BpjD?ho3&/nL-C`;6Xd9HB\%B4)2tNa#1>9h%[i!psLCct_W'qP,d2q#p[#))5OFPS,>*c'BW?T3K5?DJc8\jDoCMH"J'0HTJB4P;A(@P/A[u)+_r^BaS$tAs2_4k.[:T;&GET2;(R5\#=naWpZL'B7+W0WC[(l`.f:7[:*(OD&D'bLF[@A8Aeu\'ZFu9W<]=MlAEn>B&6-q`ll,5c0dNE1;J(l%TFjllfmnOd32OVEA[thTI4q_]]L9\ekf)\5t)_R1F9,B6-X@K'=3'+2?TmliPehAgGb8uVI%q`1O<+JL'(BNX.(`cuEhM;^i&PGH[feG1>1@"s+c/l#.W"OEs%9Lgi-1s@/B?+RkK:h]Qf&H0Q$=]Sb:2-b(i*_;e0P(eK/`W6CZa?Aju97oXlal;d96_2[-9d'@@eW03fpi55ln_roJ"iXt9S?a7J*d=]SNIi:XoS8SFk":i$aIGsVjmZZO,O]dk;KYr?mITcrR@&7U=!$$GolEq(/ra*G4b?Cm1BX#!_!GglML"$f$T-K&6ph.F>BHrd5ugJ3'D-Ul2h4\C*RN.EnS=q3KssrdR+o.3eYcRMpouuqa_jo0*oJC#au^]pT`I;U?%`=[+UkQI^^M'YGSWI_9)2R54A4I:*j7bD>tcCmdB^0<1_2NIj551>Y]`]18*]@hK+PUcS6k5[Sh-Wr-;bPgT?To>(5tJpZk%qJ*c2>p9fn`so[$0*PV5/LP*9c7qS0DqJW0V4`]r,OGNsL'6#;3^PaZG1&K[KL!U?FUp+Z"aJn&SK\iM/QrFg"R>+rlreiJtKX[Mor'>"Pj\*MS+-"$pl[o"K'H2iT:0m7XVO'pDl`l&dUiNA';ao)A=&+(%r@pb;3]9VlQX:?)VP@J5'\3RP]f2*^h(Ba9MgEf2h$LD0N5onUSg5KWbWi'5Q>6U106@U/Kh7k6e>k;1UPl_9L*68m'/)F=pVCO?EP-'!YX-d9,&((8s.CIaj>gmOD9hY(;:b:M$iUQe%#@t`d9.L0)=EqFnuUNgE0c7DhJUII^sk!=H5b?d"b'YsY5QS.0.`,g'tk!=W!L,BU3cg0-t_lF5:[ZK&IAP@mMENgKh4tNfO`MjDNMFsl4'@*On-F7mWt]*d]N1^' -endstream -endobj -290 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 289 0 R -/Annots 291 0 R ->> -endobj -291 0 obj -[ -292 0 R -] -endobj -292 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 142.67 268.074 191.56 258.074 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 47 0 R -/H /I ->> -endobj -293 0 obj -<< /Length 3165 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau/[CQI73p&"`G5sjiPG"eEMM@cMY'h,L@^jn%PX"'>'m$Q$CF7\&OJGAT'`5hCf`gJD#\CHjbNpZH3H$K&Uk2ob6U)!Ei\(^1e][cri?[;.%Y7_prM\,LVq]H^1udV3*V+mZX4s-Gh,A0@;^7?KF#JgZ=m]ApepI":0.PB1?/;lk%'o9kC6pk@_Q4qH;'/SV/$&P/K6oZ#iijP1,OT-tJae?4PO-BamJu"VX>YP2CLiVdZmESJZRiG!JRYhQP\%0<[d/@7(Xqa&7P/-c?*Nl_O$sffV7@ZW)kW8A%m[q_3c3)V`0ebm7?5_f=_s::qGO\E7[?NN-W,!V;3Y^*d-p8>!9.434I+pV'qpo7@ZRA5ZH+:6@W/(?.%5#0aWm!L.4_[[b>O_X=6B,CDu]D)GFS=KS;V<7pqZsFFug9N!T/Bf0f>Mspr;7lk8F9`rG1Sn%rZs1Pfi)6-"-csK+e16fZDHK(4)Qbh(]l+jU]5Jj:elpJf.?-\t[j:2^i!iX7;]7O5"=4^+!ZAa,E804.iY[HCV5gnh%/ec\oXC5&BDj#'dfilVgaNqEhP*L7oa.IU@9B7W&\lX]eTOF7PMJ/mU2E=e2)aag4S6W]tC?5UhNISt[+m>FBcLY_^[U'#>cq$uj90Kn0@P7nWNDZkEZq%T?$+1!Z,\,)m_01@%@,h>@?BZR"J[l1$5T4$Eq<+8XQF+iKaVq1d[76s8+GEN60T1!_4MjCNTpW4j:1$pshW.>J9S\OLa;;2kH1A-pVb:[:nD?6uP_\JH9;;0i@"kpc[smN'u_,#\MhfsHEq'p&bKX2k'Fe,p:Y#>l@PgWOVM#s:W(EqKihk,7"_>(!rJ1dVHrm\eWm\H-56fUG[%Nh'`Ab*%T"9!=,:AH@K7l=MG_E-n^X>s0^W)M"W''')0>U^,:$V\hufM=HYN2g+?X%G&m/,Q9RaZ68n71?X.Cif?-=O.H9l5g,AG!r=pPC#?TE^Q7G$7\ra`nOOmc6^2Ro;;M/"CFB4ZmnckKX(mZm?Q#ZZqNUe3;oe1cd\NBR91^?t4G5U1h"'Cg%-KdU\6k&!2u`Ut939SVDg:NPf?CBE]lXAKTbG$.m+.,sn5J]A&C^mOdP\M:4X#srjBRSlRV9gq^m:pj:nL7?4C\6Cq`'/#N,lLNI!^;D,.SaP<"Ch/BB\H1QTfm3Or"NSrVR,$^JQLN_J>[&<1pCSMfgPa,X[4G)JQ[F7fc?KNYDi4)I7c?)1'<<(4Mj'SIS4Hk0;22RGQVbqJf+P<;lA!^s&';O"^o;@kRmQ/OZOD8U\csp^Nl:b9`l@cb-/'+@Bbade)(t_)0;:R)Sb2,o%#F#cO=4[.=m/qKo@&JZK9obfgPpa_F36!]kn\>("07B%LgNg"j[k^\@Ne\^2JQKXDU9>5OG)a0.HM)gW[b4u)fV("[Cq3dqXok9njiDhn>AoI=6!bVplqSKR7Z8^r\1\M,qGpB,#ZsD:%YK]XbWC,72kLWdjgp\'6BFR"%tojkR+)s`#?:e)Dia1U_nRW6'JnS!)uf[\N1)+tBL.VJ^MQj[BV\FHEC7NM)8bU^t<_)'t.Aj59ZF6rS^Ka5u;a#:L.+cd&8aO0@a8L'8K)4JYBchHR-XsFC@p0X.h]ncRtHJe85VIsOU*eTR04\Nu$aU@Y;Za<3H7o[GUnl`&L=9ef9"uICt/BOEG[A17C7VlQE7/YI^2!8032uHSgA.>^q6GFi%SMN>4k@_W]R@X3UoCPC;=VkQd7A?W/e4-g4O0_B.#L)@K$Cs/J%.kM18`n>hfaQs[/]tlb:qTu+-;;s'cqjS__W4ETAQ=un:96+=i#"CcRQrJ7FEHk`0[8.Bgak_rKeIhIW'dm,AkTiDLC$*Q=KK1^pP/+^S9>j]I=B:YrI,_R3\(rB?!E?[*";X?*!m_GS0BkA46i~> -endstream -endobj -294 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 293 0 R ->> -endobj -295 0 obj -<< /Length 2338 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau0E?Z4[W&:`$(0X(RPQC8O[;1CV@6dm>pL98]Y5I>*]6F#d.Rk/iL'K7!)h+*Tl8BR0e%OgnB45V(IIRbH)Qa=ZYZ\ro0!t`Zll_@j2HN[u4pk(@>L4U9J#fL\jfZZN!s)Tsm3*Z;k,bd[t6n&0D;%bn6mV-f!Rn#b[nbDa1q>U*a\@t-]o_1^gEkNke+AJ-/ItnZ875&Y.$Gug7OkV'N9f,;?"FldjRPmq*Kb4]+[7At"DEui&pFb!j2C=&P6>$GDLdnUL!XOEH6f"M;!D[Q9G=e8;[mhECYBGFAG".!#/kr$D&7n\f+70OMJrbhpD5&>R>>2fUI,/]OQ5)W#KKcQW]nY8$]ib<+\[+s+Co77=7G_I93YBGtN5cilE)-S'od&C;KU+.MPTqUkeGqXBmhr)et/.o:gP>guRZ,uD_YNSs&+sOCUUTG2_`>Luu;aiO6fftpod4o1=R\6;;ZDk1"gu>I"Q51uDUF`!?`f$**G*^jniPIF\(sEb$Z^a'_A@6!5>DA$`qF));5F)WBd9&8![3penCMR6o%$_P!GqLTiA/mp2fpK,-"e_h&C^.f46:(De!fD0"+F2!jbE^sYhDCm1NqG:d4WDH>fm#IJBPPEppSFlc'D(qnYZUm?'[p+k#aXJd$>eM]#(hp;Q$p&9+jKN5kMNh7hI7T0s7sBr`.H)92T=e&N?#M$`W92E3=_"^8@DaYq0MHfVmi.)4YQu?X6p[9=am?O:6tsjM9Tb?mWmH+eGGWJrdp5+\H'qu(:HI(-X7NN+8aa0Yq3GlHlKgBe:[Uije.cmDaRJ\Je*!=IL*YaK@Rr-9L"^,-YHu7Qc=0s/nm#("t[liqKQ)=#mSSd,/X/]i%klE7Vk2%a!qL%<%PR:hm!/01qR9M=jH'`]mos+>D%?=j2C("_?LD/S*hsR&J!p9(#N:4DgRjP>l2YXDaf?pQ/`=!7iIhsY_XcO*EFXr`D96i14DKe0PW`KQq!f.&/D>-U(@odQmZKZP3*qPbL-m%X4A^;>?,+98n_:C!JcE:I6q?3bR_:*s<^&HQ/s!!PTF9G(`reH&D=5u7Cm`!Ptik\sr.g)K5UP4!,\S/cUVPinBmE57/'SnQ4':X/i9gq+'hiFfYSbr$.GVBEW>#UFYViLZU!ahqo:EXaQJ5CUPHuS,1(Gc&Hr\.Jl='@00oD&%-%f2]@2rGePSR$O-o.`j.6&Zf4OZ!hK9e#^cS8M0FX]=.&?j`MmXoK:(7nR%s_B'O!(#VZ?&THV`:n+#[mcfsWmuDsV,UUM$RPLJF!*KY^3$VE1\Xmh`1b^A2mMDK5[-.NEL6_d>l!VM)(:IC\[55BS*MQ'#d5q18&%*/o7koOtLhb<<+nMT[Q:>SYdDhN`r&J@!F>?>F9R5DE(uCr?_J8Vk=GA+JLf/MgZ_^31[14IQ]_r$kO5YJ?J\HaKp#)>+gOG4)6lq0jgoZQC=oSOqithI -endstream -endobj -296 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 295 0 R ->> -endobj -297 0 obj -<< /Length 3141 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GasasD3*G]&cTMZ_UoXV"LlS'MtNAg;DbolO9;Y"&I4(Y[i]:?[WR^$+"=>P(B*\J`K<-UAa^eX7aHlX%d/g-Pi&T\^Aj9G_LMcIe`J2\Ci@0ZT`0Y'/5ii+N(BhCbqFDAF$[g+CZ1DLs:\'OuQ]+Am+Z$<[Wd9QIWi[pV_=Ecib2P:L9dqpoSfO?qirLmY<-M8)ie/)[AM*QK=;Z(5_nGg;HL'hN!e3:>-BYd.l1^`;sJ:hiQ[X3J!lik:jrtkoOf`$9WVr0miSVgcPLnKBihVK-@&@qrVFfT%FitgaFYb[LRZmN03t+Em\p;a]F=U_(9p1]NEX%k=?GQ(_CtTFBI8de,C$dl-fo09c\`ad;YitJESnAgpE`.kIUo!8#0<%)c82.(B^YXbjeK]Zt7&00fanKI8E]>3[s84]glfkfEIJ!#5NR($r('TQ8bl,;Co))D]E&!CPAOr&26'aeJ7*6ll+Zl#iYta&#_l*r;*lHHoclt)b[=^9SOp:M`9WV*]Ot;StOhhDYDDFflOs[0OUed2;C(%Z>96uc87+>/N;2NPhc1tbHi6ACerE)YQq0KHXRclD?`3id;g"hV?0+LpD6hZ/qlO")rQt51(S*_c'?e0'.OZ\\0I[`hnL1B$r(9Pt'>#iJ&4poL5W8Or'"\J'`4(Xe;il67;dN\FNB/7=e'!&Fd,mIKF?=M<[ClQE+jsqNcD4%,"N6sRXQ*KK%$'cdNo)9,a5$'6eff'p$Z3G6SGfQ8*78L*.*].HL.l5YR84O'8k#*Y;R;0lYh2OAcU+)A"PK_L03MjeiTtSZ;'"P*eoH^F;`F4l\"IGK.2aF:a4ZBJpQGl-Jp_iODl*\DC&h-uGI*%X1J#V(qjD)a#a.jjS!lYrL0IV.O][L<,ZLVk['$BdA\!/a`N1$fqMN]o7W-t9WFH08JqJ-5C3WMTqSG/g@>rD3.%&R0pkD&dUTA\bM&DC;#FWX$Ktj.\-p).R'd?:s1p.^aM!sdH\2IU6-IfIkh18j&I>%I8p/NM<@^866^op>gNi7^XNV1.SWXkHISkX^AcGTI(Y`"+dHEYE1uQNZ7L'pfF>M^P[u=_N_sJ?UjIdgN/j$0#S9Q35W1RZrHI.%;"FQN&2C[DV"-Z!1a_ijbY_G+21lCB:Ld*\930*UM,"3cTuuRc6f$*=]b^^0jPA"@2=M`QKZM_76'37"m7*t;5+@RJ7>06VlXTB$$UtBn#juKOq16`F1&?="^ogL'h;.h:4YE[1BkQnKV!6FP>CJ6d9hi)FJrF'3$>Id?Og$`s6bhU,._c07%e1??![.5onM_`^3<^](V^/`k,,uS[Qe:m*]cdCkmdnD.nW*B(Sme(G6?\bp<)1ta7@-LQ3%pFR!>qLfkr!JFT01D^pHn__[iPS#l?9qedG3X;E@Sbq4^JekGW4IZHT7Xe-7Y*m*%U!T#VeE]^WHif`BDE4mYm0bHDX>V4XSNWJkEL0&G'\^4a0QZemOlK+\MW97^O`X`lZf%ocC!ZJ[QR.1pY]m^,^'*1>h$9CEn[rRCRLh96Xo8s_0j&2,-)$k)2/3lB7UnRTJ90oH,h1uY/EF"-(>6aefsk?VFFLphcu_#)j9Jl/:cGn2F_gVHmpJXZqW]ZPW27Y]sI5OK64r&Q5P`X6cAd>8Dq5e<4op1/;/p_5irn[jMl1i/LcQ,*+?=+u:&j*hD[&WJ@#*<'oVLm0D-GNX_LUsi&'"A@Qg`&eKSl&5_5@qV([?L6pSb]!C?!jU+bbjto[7c68>!l[P^Bf?B5kW47R"n$S!jNI'2@\#5eiec3K%lD(rkGkEoJO0J[C"9VZNaV"=30M+)"0h#/T.12jmX"2a4gtWNTWhlI3`e+M0.+Db&':J5Q81(q0i#YNqrXu;I:_$dp,$@l:J5!k2r9pmoJ;kFI)ap1S#Tjh<:]Q/<;%3=8f(IE9$l?j(I*>6estd!N$_@<;dkF'u9/[M9-A5La,"/rrG8 -endstream -endobj -298 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 297 0 R -/Annots 299 0 R ->> -endobj -299 0 obj -[ -300 0 R -301 0 R -] -endobj -300 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 246.162 323.774 538.872 313.774 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 81 0 R -/H /I ->> -endobj -301 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 312.774 112.82 302.774 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 81 0 R -/H /I ->> -endobj -302 0 obj -<< /Length 2352 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat]6(9s>DhL2A".@3(*/Fc+_j3_ssW@gr8'];J3QZI03`!g7bT*6BFNo'PH'omJS%VIV_j'PGn:_c\[]WkVps%i$[cL*XheMp:=DMcMTQ3RKoADD!;d:)<CEiel2VnfFr%6"b\7,[1$oFFcLX3%s;$>.p>r"['8g5=e7d?:V=li_8Ds/EL/LA3t4OLUr>P^T2bHDTu,LmdWVt,MLh3qF3^i@1Ie"4a[S`c6'ccTe;(-:=ZJ@34,BiiG7?ri[_"Pk3EGRfS`".Z]L[T_l[5i_Zb5_E%R'L3@/9?=XQR)Nem!Eml!2CtYOAiZMa.1d:cMJYO^!MMn#2_AWG,#p[i7Dfu4;7,D2h>kEal"4-S,hmRqpuqDL]XolS?a4WO)YZ?peuPgqJLNTkR`?m20[Gm]9$q_-;!p_-?rs7Xa?!a?0XO,()VS$T$>`Z]#c9V6btAGR_F2UVOosLDJi1G=8GJM)7.r_XQ/rYuAoh[(OnWrrPVu:n/.&Q(!J`8[TPehYQ%#&/rSs'GR&>_2Ho^901aV`Ik]7n;dRs-p1_apUUT5.E=+IQ3-aR>Gi]Rmkji#5^(K?0U28BpJ0Sd=W>IMt^$*uQ:>uoZU:V,)i#YA1@P1KaIYkf*lCg?^UR[>R+<&2CriOMk/cmE&l#8/8<3ksHj/gO;\b.)P2S$"U`.-u4PCS@jT5[986a"WsGBcQhg8^8j&,Uk5>+@`M-'U[=+=dp2]UP&og."KA+5C"TBY]FL3h,`Dn%EaSp9e&B1#CRQ/piJPO6^X>eS=%&!Q]]CK`*Gi9UmFB5ZkusOMK0@Q2IYEnA6Zi9!*9m%=s?hH%LgFQLqtIG>;6GD:;[)bGdB\N+h9159,fb58Ce'>l"3*:mf3P@h%p4DmqAFfDE,P%A\9+cs0FPe4E&`&ZF5HKP@R\TO(XIB0"0Nh\uY"#_4%i5%ep[)W[]Qf:%T*dWTK"('o*qlIsUm_Ph`X/h0pf!sK#1BLUBNs@ab7LFSUC-jc'8/sTf0Q]\l#;fBRCQ#-*qn`o2'a2T3)22p\]m3LDf%2=u7Cf*`:^#.4#+bP?)iY3pOE8ggk%?`ke+&DP7UR)gX/fL5YkMUImUXo7n0PnmM'I4rp#D[48(FgND_#P_,]ja#TYQ$,)*i`X-oS3!m]q9(^3*r+oZC=Rm=5A;5fLekJ3&-^=8)7/P\4'jdT/P\C70$Wc_T]'(3;N:>c)1s?iU*O9OA8KSo@RiTlpbj_3feIpfV%)8WDA1s8(,EFNg(X`m[q"rO//k(_2WOb27]d`Xs_#3.PUu74>gY:(^)*ZB724D?BkZ[0Kn.EUuhd\kjl'*CAC;Yi'tDboS`.q4<>qe2%S=4l_n#G"Wm0eIKAg/O++bL8N'6Ek4qVoUpX/EuF(KaoW.@r'oX$s3&im16,/F,:$B!?re'6FG-A?VSDCTKE6cT8U_,Fk4Z%U6#rI!`^c1h_`*RP7TOi6c>3PP_fdmJQ'&5WC4a`rUr^cA+<1Rof@iDR:(%Q%fJ7ok"[3Qs$s83I[T`5#GF?R>~> -endstream -endobj -303 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 302 0 R -/Annots 304 0 R ->> -endobj -304 0 obj -[ -305 0 R -] -endobj -305 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 92.0 709.0 108.11 699.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 139 0 R -/H /I ->> -endobj -306 0 obj -<< /Length 2565 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat$:CN&:Bn[j:i2CNN.^t.bP(.Bi8E$`ZM40>H;P3kuks5&l/M*jFL*>hmt7\&GM3CD\?cJIBt/'#*beL!Aa=-%">b(`,n't\u(f<2LkL$Trlb7q^Ye!e^ZjhjZ[)bGj[N.js/?IrmXr>Tk%5.JUc*.79E8uik]l-16"rqi%G+jg8WrR+:J"8<:@LDu[`p%+>G)L6ao4VZcT@HZ1q;Qlc'gaZTH,T0&NMls@kUqL?D)3c3EUnS]Tj.5mM[#gC(1cnJJEhf@/`SE7Z+d`5SR@@i:rsYOW#pP?#mcWh?,[2"M@9ZFibe>qF2'U@aYt3\$\ICl?RXtcir1d.&h.l886(__Elfu$2HAPq1e!%B4Wq<0bSVi[8W4Yr=O6E,lm6j8dWI9QcZ$IIiN&No+`o%mFWMVB"YVh-1-R\s,e%8=0U]SRV1=K63u31Z*;Ubq@H1H<4Y_BfPc$fY&U;Q.P%*q]OQZB5F`&r5DnD4;uFo"2mt`(K7Z9_/<"@XNJ_Pc_e$HU$-O/eO/uCq8-ncJaT]_&XXOa.]T^&`;1k\l.\$nKhiFnT>7(GZJ@o6D&i(+/a1bhNHXHgDE;/Jm_oG"%6T9asU!Ko;d5[AfQPh-D"AV-]&09B/]ZB.l;JAuF`0X?'^8*2ne!hI;<.?"k-s(>YkZhusSMd]rYNBX=p#8M\2=c8s.)cORnd.p/?*U23C98C_j?]]oU/bJa"L0DrO9Eb#&HnC_U/KSHm\]OWb4<\:3QU1pcgFsO4>EUW`]gC.S)j94/PVY"'Fgul*45P*E#+_a5]JP'?;=LKZ0ho&,::osPngr?fcOI"\Qd$LIbSq-(i$`s_3!XG(aZN$k`R"T;G#$*+/r2)D18Qg:DG`LA%47=_du^Q0Y1HVNjEs&``OP7BRSY0C;4+Z\*$1DNgPVZhNh+U!c6/?,IjB'3CIb&=%O3rg<0+>'d("6'(T2ZJ_QVQ%@IJaJo]+L@P#NKrTRje.eTe9jcf`f(7%ijla0&E%d>cD'l-$>YaGK9j"WZOf,Cck&ICorS>&.Jt)n=j/`V-qn8Lm(#7\Gd,;kVJCK$;9YbFCcDHu)YQ,]IAIR\VP9FbMq6W,.583M=M].brKibZ2ro&@(=[BC.,W&4kDBRl=Y0&*9&l])`!;DXMgFGNT"%rhol8D&#_P_-Y.pf(qSdO%97aYMbVf(E9ZJ!6P]LQYgZr.)`QI4c\n]ZqL1$I6Sk4e\\klq)4'h6\\)ER<%lZ@thDU`+kC!_iA*'D$-V@WTj8CD033:j"'&dG!^!7,;f7C?qahD@s(Lk'LbJ&u&^<`^br^B.(?D0!XJ+W`h^eWAUehU,KX:2V*R?Ftdl$\p#1@LXrmE!4eEIK*$A>8Z97DH]i5?PW':'X8%-pbpuTU/ZQVR6*F3XG_e#P^;A!S6ifoI*BVaTS@G82#ip+fV-XCq=S2c>!5j%$YM0jM&25t]W\Mj+=^O%fg*BBhoc;\8,3']j@*m%a%\9k:h"POcVS/?dVitR8Sug\6bD7`rZl:#=//'B]VEm7B9l.57<5U(MaqBRC47Y5^dQUYZ(YrrRIdd7hf_Hrd*@k7fh6X3mX,='cZ[\S&CeRo"m;8Nq+*LkNX>Q:WXZ[IkcL8>W98Z@@7oD2"]@*oR&^Uppp_J,A<7hN8q3o_2!W?0_qu~> -endstream -endobj -307 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 306 0 R ->> -endobj -308 0 obj -<< /Length 3003 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm>D/\Gm')nJ0@2&r_p?F>t/6UEp;q('lg7mCbe6e*137&:LZR^m8?K03MqVO@ILZ2-mS/+(8Yi%>"E/)8U,F+&_c2INYj_`X^[EibLX5f2Kg;#pk(&:+Q2Ep`,e\5;eI&eaeG'3!:,.?,89hcJqpe&h^h3-W>o>-)B_19?:Zf)OD^"(Ukd^Vt=\gM[pK0<0_*XQ;+2Mq:ZL#B?eA"l;+FL#iHB@H$YY58PGJ;Yi/qiqet;Cg*PU#:a44oLHT"sTBkl5[\n>jFT4NB:YT/_[pa9T(BBGGHaam&;jE37W%?nu*WBl1a$LB8^GC:=#_0+s01JCI"\""P$W)sQ8%'R^4+>c3_u6:lBVZ/,O%]ILO9N]V0Pk;t,Kk-OlLfaZ<-:WA+jUEZs3`#k7A2?>3a,E.E`pLbWbPkZJUd3'!\\)(jOiNuX'ah1mqS\&p+%f"fJE.$[WT.XLj@emJEgu/6erK/ShbGJa'1X.GU[6Q7!r`bIb1O$:5;q/*\ogf(;Fu'T;AL?q72Q)B>#C9o[3R92joco?p^62$+q/ErnHJ+H,&_Ga1l%KB?(B1__er+3pV^7*JX*=Km8?e^D9-Z`3P/^0.30Z8?>Ki\bF\ZYGY]1Ml]RjK%GLqbMK@+cKcMeq?`)-_iE?tc)V-q8.l]r>!Jsof)q0^o9(AUa*^Q/#EeS[R7u'k-Np!#$%Y$p8gU+4cR3O7e#Lim_0/5kU#``E4tU,IX6'"O9U'IfcXK&niC'M/*G+N!<'IQQ-]:[]WG?iE9NHmRSA\qW:`/Z`4>r#UnQ>Y1=UtZimXMfr5M-$gpr*'r]=*si3RQUKfZmY!TN'CWIikl(MXPIdi&bbOb&hYkZ'e,j?L*>4;`N1H*/;:K&6G+O"p'WE8)2";%mTL@^[M0nrKlF>E(/;bl`kEpn7&m!6EAMi&5uXt;Vm%oj,'LMFjm[)oYSn@Kg.S_OHVGsK4rI7F:I)g;QJ,fZ&mSE?;"HK8!@EqlC:k1Le:ZkD(VA*0A'sjmE4=jBY/VZ0S5,V8YYsn=/or@'X1+@D0F;64em9[o70V^Rm8Y!c*/^kA#Ep^AgpOm7+FOMd(&_+e;^W-kiU?'Y]T#*<)l%V.8r?3"<3-(98-K;/;.ZKXNe<6ku8`biScD*`0o4Em_%!5pagt7m25M]"t/%MCpsdW*`J!\*joqc'pD!TW9UhKk"P,lWh[)A@(t!shRoAh2IYL(3UD6hSb"es$[--9CBk8b"uX3h4&%L8d-*`,)dh&"gK%ZOB1;NOMDo=+[9f'uLJWD@9P$Mm'38eq)q(F&DGEQiRQ1O*a(U6/Fm4b-:"r"t1eue4XXnFHg-W:9E-.'S5BeNI+#;^a>UIZogN^o9_,=&a)sRc.\/dIZjE=jBQ;WSS9I61VP-fWK'T/C.NN6'44&o95O'V.sYTCS2ENb0lI8Na02T;>%u;KuCl7/+4+_I9TgKA@Ps:9\66u)T39bN3aK]0IQR"$2p.SC8=+Qi41E;R4p.3Ij4H!8)5m[,W7RQ3/)faA9?t\_BE[YP)[0dR2nZg.n,BT@A[O8dS#GNRGTi#ORC)EQpkeEreoh#Rb7m^)ogC#f:4tn=kEr`jV[@k`+ZNU#$=\Z:q7SWpC5>""2QjRVF`PgqVOnJ;'*rk1&<+l!rGS!BO6`lSX&bAoI*t-Jju".*BOPH!c1Ok.^ts1M;h3X>C9k)kSnO8csJEH'LbGXIVNBql)9"h[f\i$m1(1c56Oa-e#_/bpJ>+=TtA/lH,A<&.?.UKP7(i5_J/;`\.VU60Jq"a/=;,uj/\>4]$Jo:oI(0-7qmY0O9jfeOXa@RNUM/6!+*+B&A>_^4e&X?%=C\r^1fB++2a3K0F@pgZdCCG/!cc:m@\pi"^2`R7]RUh`W?b,<(PDmV+22f_S$>dX)GsfMTfX3mI=nlekPqPNY&E"PN[82(_2>C0Gj3f[Y2CUp!e43nHls*A-]rSS=IAoaS3Cl)Be5PbF>$';*kJ6Bm`@#-0C,LC:qoE^1%;?F-qVuRasSoll..0k4PFLCE_BW;iglpep'jT.B@Sj00R]o=PG61]M^_-=#AOsJr;3Xrmgl_85CWV->uU8L`*YU,ok))ShrK8Yhb&Im8r=Os^&I]NE9k,YjKZM/*!8Gb@$^AY!0^r/9=UM9j_01A%cCgpdIr39BXD+qaoa5oQ]lA=/>)dWn0p-k?Uq]k;5J>$Mh>*%%ik8_[BqcM+Pkbl6Og:Ej^PlXl&70:1X`C=0rS^@OuZs35H!uhr4'lqr="q1rj&Sk+gHtB^r^'-)^um'0XQ`3ih[nM6O@aYJ/`^#U`#=1JuqT>oO*8^e]04MPYg>KJQum[!up;&t`9jr5!TnIkkI&`B6ZfU[+A:MHR0555-4$4Kg?=Ws[62(7Q];!ArWCJ$0uJd8WXjD5O/fUTe[RHW3TP6u:GF$db^rRrEe1d$r\l[G/o-%D(*;C8.krINjfF;`:fsH>KmW#,VYL`dM!AH+t95JT,'Pj1T1MA`f_Gf\P67ra>S->cFdCJpK*"O[N7o9r?=*(Dm)+b\/uL6YLglTsY]]*b/.6,V;<&c/UC(=IjgQ9"Fh\ldSFnmHBb7YnWI4*[M7f`T(1nP5Lp:m+fnKSqTaVln<#'5$AHIM*pE$*c4T)IEp8f^]taA[pk&hMLCQW-pBJ5H`_^GP[92NLs1Wd20>IKUOH7X6pOC[Tmt8rE@^o>.2hCtI-)7C/4g2F?*lg:^1o&;J@,"gq`m5#3%t4nq/3jBITj?jmE^0rM~> -endstream -endobj -309 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 308 0 R ->> -endobj -310 0 obj -<< /Length 1005 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%"9lHOU&A@P9i7-iGk0)LES:?5_7B*q]"]R#p&/64`j$K!Ze_FS-j-]2J0RCTV#3.p5;[CYUJJ/4uY%K!sHRUC@qP=7dRMPSolEf!^5rZ6hLC$Duq"Uudo_d'uq]VpYsmWq4ahrp-=5UN"LnZM8/8S=7T20]`qW"pgkRBh>kd1>HP3[Q2snd#gWNFgT9r3ZLri1a?2[;c+HgV/aFn9pPc^F[TPC#BH_'IX55)4K&mVD2@Cj)S2lnAH5i"ZI^-siQqZ>sGXUI#,?h=[Xb@ttW/rB35?>]^hAH>D`Z>=j0)8s.p1%[r?/Z6EEX@%-lEB[)O"7S'-ilnQH'g:!UZIHb2/CDl/pdAQ.r$Oa;jNO_b4_YC`4."G3Bi2VMiDr@$.*[$oI/_=R!+=;m>](mNGuq_SRO2U:?CLUN'5Nc6*=7WX)J6)A.HTj,]8?TZrB'>P12Q2"0)RuAL:,[[JoMp?>dF<#.D? -endstream -endobj -311 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 310 0 R ->> -endobj -312 0 obj -<< /Length 2235 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat=-=`56<&:XAW=9K)u!&D7^d687%Ou*YHUeTA$Te-=LU+EmVV97oR;1I"K!JJ^[SDC/42ko(TDW#abFb4XiLn=05pYe,PigH;MF>/,mj/&>bh6c.`-2YJRs;!H'bnl0YYGVZ3nAN)%,siR^>0@cu(?`-naac=#]XN?]'kCr;af&XB"^1nF#%7g(=K#OpB];?40CiYWGK7HNi8'[D6$(Hcr&^7PMG,).%qK>@NGuG\;jJ>8&E?JK8jA0?K5RU7OZ^CM4#tW=QBZ4(K4%@*k?.&6^a&5%)^*@(t>-kT%SoJW69Bh^4%qICkX977B11;(dobbP(e"i"VsE"G$nol=/O'fqqfe/[,d$E:Ha<\@aB%FIFhBTnA0i'W/0(L$)NM7'1;k6WquHWRC2Jfr!W*]M>>)C`X4rNVfW%'86TliaXh9;Y`-jf[(RsI6bOit\tNZ=bMD+[+K6D2B@Y<&c$joUSDq/$+F`q]rQ"$_S)8,@^&7fOO39K'rVXdU#oo-deTrrY`.SNII!hP"Fn9^dGO%j4^?7lqNN9V0^RD+1X=5=K3p0lg`XSC#d^^#L1%+6a\D/]-qAa6h5@,m7dMc2JpnPuC/f!h."n/,`Nmfrr5oNW'%T#ND)8L]oGM9F^bZ!@cW`,T%u#oq_8>bo/!V3sg[9)?hG-kKY$d:q,='2,j#a=o&>*L7$4b)$3-PYIF]@*B*b?bHp$?Bc='M#fk7^LP0/>ZdjoV]W>V+^#1_A-R#E\6U&Bb,BLh/3J6T[!b\@O&bgqsY6ae%et]C5Ms'6c-gXTtI8s'$q+!Kq[$M$dCjKk93-@#5WQmGpFCP'*'mXr`Yrg21;R#o]2ie3jRFX(u6KY8ru`=H.b;bFole2VueKmg4X%HU6-JX8pO937*pnFuANW1pRTHAM0/;F)(9gXKc'J;IEVQ>0F(U6.aG5R]u)[CUg57S39C[bNQq^.rC+`^#&n=I>M%DZ#.3UWqcJ%Hd)Ld.oTRq_g(Ak]=3XCOY]]m>upG9DT++$n>bOi3SC%b0LYJ"UJl\$%0BtKhk02JZ*_"(J8`9R+gu=s>2bp#nV9&'jbt@,XZ,WhFElO)9A!$;1F%hN>kaKsnG.p,-,=@#;if""2p,mDS8Hk6n<:a*RYje'qpl@j$V#Dp,2)BNH1f8`2l/M-`/tW]o$kW=\*/T&=sN-_CBEA66.BJFkGJdl@+K-Q0O?qUX#9&*d?1AR>dLG:N+$Lg-(^LIBM6W9YA[+#[DJ3P\/X'Ij8V[%A:6TYPI.R^=>dLF5-5-I-QJ,8Rdag4'I49RRHIu/<0/VuL)YGg.RJ-4idl87Xj$2Lb/t=XY(j7P]`"R8X?CuMj4m8>1D:MEgd*.,c;t[H3kBBS#mO;(*K@i^Lf-1;7rnIVM$9"nh$,!c))5!,U*)pF&XkQB?@3Y75^**GYe?L^JY@B`l\\X,d"W(f:$-8o4g1.fs0TOmBdW1:[Pa]k4_d5!Agg&AYM)*,b03Kn'1ft[j;j[Mtdkf+VCjl6jE47s5n<'TGdN(:a#\!s\JnQ*5ONL.KdVC/(O\ai7`MSTen7`\Yk+LBU(R>A$L]~> -endstream -endobj -313 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 312 0 R ->> -endobj -314 0 obj -<< /Length 1952 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%$bEA>S']&Lb:t^eSb#T'l13lh[O/c`QWN#G@SV<"k>8'73_VOUo++XDtaVZeh)sR2_O//O$m^>&-5PkqNOdA&^r5Nk#DQr0DJ*b)pEh1hl;%eT.[WK6e54Gj'ec+.QG]A\j&-pL\?kp@tIQ6)cdSo@;K1j2XSsfYPS/N?Tb;0:*m"\0u>FW.R:fR]O;eQ3:S?I.#G2%3smTG?WjonoMFaY\mEI%&;_XV=:WodO\-=&)#e\*]J]Y1U8$%eP@2oCE!CMacAR9=)8Fe$JdO?B.\VW?=k9UcY[h3MH_S/%Q9$8+Q?duo%FSO%p=4`<*g31#lA4:De@SO97;Il;dZ'<*A>X@bY!dKR>@+H0rL).3)Q`Dgp4-q@-+Y$)7.-$.;;PbmAaK3D8Fe?2bV/m*Ke;-NfXg3;!bcl;)%@Y#3krM7ZS9HC>=oCZiX/9>QAsm4DLne=(@t[T_:P^e,s.#nQ>Bmbt(37XQ_MSN;uEFh(I_$'6F[M>U`?a>/Bp>VYeJ728m2m^8F?qi,p^YBrYV0f_##sm`:"p2L4M377s4*O0P;lPZ2Z7B^pY0C]4caRccL0cCro*mpI[m,h2(RL!]$+b]ADg$k\#e*P1.bk>S1G4RA8ni?oGl?sUh'=(X#Zgu-/d_%"Y,C-j@3a1ZV2Y5Ur_!99GE%^KY`=t*`f1Z#F"V;P^/rjp4^p2?I85^;NgpBTN"_E]mFsQMtHp?27]c_=D,sE]=&iMHHU/R80uB'?*2C*e.?P&tCi/5*B)I_Hr.DBCN62?=<8E@+bQ/;q[MbksXUP.DS_(_J0Dh1QQL=Hf%j:9QsC_dJ],X.-397Di[jh03[S!b3HGa:p"HkefBe:SXS+=5SV'uGP$QX8/5+EW9dcUi@!DXX*KB&:D,ddA3Buj`?ti:fK0fV1c%9__iG%OK(#dn8OBXO!Y,1ZPH/90rg[D@qOi*G7d7^iI:p,gS_M[.O2KJUHnuQE8)^jH?,)B^)OB;*f(U!H(N\QJfUiWID6>r/00o@'k7UpCJUF@)lF]#m!(a'j/5H4#;HiR@jank3=C+2e7!-?H$S%1AD7]p#:;bb(F.di!C>8a\)lUpV/K48R=92_H46+cXp^#a74i^6eM90hMFLgA_7K1X>]nV='XUY)F.jOkfB/;I'Amjho'%iE:Pp,oh_pSD%\%A];G1#CJ-5q'5HI%/:p2kM)d*mb$S*W2eM`mX-FIDFNn>U%_*sX4\5K8efm=:r$JSD%t7D&7LHTaY\&/aBGb-&L+4C:Q3NOTjOB4Y/nmTY>nlj*U8#7,mZjEnHr7J&U88'=j2712Xc9+D)F5qGMfhAiU"e/Cp.cK5YTPr]9%.W0Qo5&G4eFe>;Vg9lkehc5LQ]5gkL-boK?k&+rdEKD:_/,2,[84?*.55l\^3i4T7`bL8,iSjVjMH~> -endstream -endobj -315 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 314 0 R -/Annots 316 0 R ->> -endobj -316 0 obj -[ -317 0 R -319 0 R -] -endobj -317 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 137.57 637.561 167.02 627.561 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 318 0 R -/H /I ->> -endobj -319 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 507.23 517.362 540.28 507.362 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 200 0 R -/H /I ->> -endobj -320 0 obj -<< /Length 2696 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat$:fl#k/o%dXrbW`tu\@K23,R=sBP5kW8h$lEd6]_P]`3pLU@]q3!j1jL2+gKNK[AV(:crDXJ`O\T'mdL/JA)[YUn\+nkcM*q!!mcY:^ro'[AO/k=bhKV`+8<-VhS/W*@A8SH)rA94b/">>d@N/Y0X"r%0EH70bF[+457,Rac"s.a73g1cRM7Z';;ZkdJ/&>t);:&,8t>nGBHEI;mQ4B1MrX35iOCaP4'l4"DZ$Sfb32H++sY.%3W3.sguF=M?>YS@CWBg:tQrhkCmL^4>#KS:5?3C#c"]UjDh]Dp_NmLa"1pc&V:T,*kBaE*N?CSXP'7"-2ZbRlVkFNh#WE/CedY<1R"UUPB".Z,olAMN-fNLn[@B/K/gU@mkM;dD1X6(8W=1eE^88jK$&O-bo@kH`A1o?[VQE4:'g$3JR4`dGFA[cbZK67cg;jJ!P[/@B-+qXmW@En6gM>B12LI]p^WGZ+rV'mFV"/f,9?R2Ucu33T/0HuX,qNl>RNVDQ#M'NCf[h*_4\[;>iFg`HSi.(p]8\U<;Pu%*L<'nAgjAt2(9\3%G*q0^A8%Z+^gr+LN"HQ.S\RS!Wji\Ee6^T\:%RB\$C8@IoAaDrkGa>r2ka3."]F4.!"dJ6.W^Y[:s@]cT?)+Xd2N6cOkP$#nC1]')`b;j9qHHihc%!%tS&_9D,OZ="Jqe2fF9Ci0g8F!I*st^9@jLKZVT"E=u1?775W,3mC\pV`@j?4LIc.ib_kcbs7/E*4NTJ5ahss$m\&\'?4okZ,?@L*_;=k9n@uns3R_W7Uj+CXOm8,40E2WbI04"TMOD6\hbnrD9`,MEHeM(p9ZpSi\+=B(W2GZat2]kV_$nVUo'T_%?=IKSo";/*6*FPm-o6Q`o/`aS"<*6O.\J^uV`Vp#7fM.[n5`IOm/]U[c\1/76F8mKNO!'0Y*8U-%r/GK\uTo90NX,Yn`ri_BmlBSEIM=VS4p-ID&bg*3mr)7+tlpo,e^^;752piIVs?-hSZ^.mVqHgS,$d\h8:@]jLV3o^[&`OJ.t:[DfR`',SDlfN'M#W92'D9,sUr5QVKY*9fLQ(A3IO!3fOSXdWTWnLYI6+WG`c>FL(fl4kpK_^@oH@TggV;_>W=ubG"IG=_p(r-:d`\U&&P0^o:[7r!$m:6gVCMf]Z@V7`CN4G9KQ:%k,SPt5;5^Q#fI*\B,/oReq;YO`TbZZU6qNm18uNXU5S249p]p91AusW"cNR`JZK3]!^^7Bl9\j-3?R.E(atVP))7,%uj3WZCbe?PNVtn:!<7*T`ppF^9N_2.HfaQXOCADq1Fro#=Nj4HbPrQ&O*O!GLj#t_"mE;`TS6&foU<*c*_D;[*q[S6gJ&sK>*R@5]mpemjV8n^Yc1'XFbCHuk(U+Yua0N]i9X'g&e#;#WSieSUb\bQ(/]C@p80e[RK%C&PGV+YB3OXau:t+Aamo?QeM=\jpH91<"Z7K(Dm[?`Q%'RMK;N-$<'#\8/<`1QY:XNn-:UGnM,&\QZ6V[Z^JVFYeNB/?&_&Om+4TOms;meC(h&n>hQ1*s9TBXffXEl=PSX6j8\V.PUS=+4j2Y/4=RUnWAjOl>e6,%C26u&A%WglXY!tVi<9WL)0FMY<)?XPL:Md2;G8Pk5F.C1>oJ>dUFXf#hP3L;:aul3^3SLD<:W067!C]]]k3>ub!F/7>X<=I8]l!d/m6`%Uc%G%8Uoe/as.>#ms)iNdU)=4+cBLmG`9G_=,tM:m9Q2=NnSKDB#-_-q?4rUg2.):=V5p#W/7?!4%V"7W%Zk*/Zjq0`QuX.&5eM:jVA>]Z6"aAlRMLMNY!]QBm5e1D-:N$aS.'C1WP,3q9d0Fh>lRna3RUb=7Z?=1!`FWg.U;X^"m8ie-kk+^[`BtMtK$;Q&f=BTp*Ikr*B)sVakm*6'__4dJX`2C>IeXf!?UN:=JYPRG#(C@8NN;RQg.K*>%mA%$eZm&/C5QrrMLU:2^~> -endstream -endobj -321 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 320 0 R ->> -endobj -322 0 obj -<< /Length 2257 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU5997gc&AIV:0RDC]i$`nRQCM021h_2+;:IiAfc2DS]I"bZ%S>@,IpYgD`$%jY2^j($N5X[6mihXLHhZrL^.@63?>Oh0n`&dc=iBTl/;dEsME$TY@^/'I^--<,n7M2K?*BtXNoP6On,sbNd^i+q!e-k_p:*2NQG0H#VetJ"Nh"WBKZcIkO7>V6d((^]h:SeF^g0^QlM^dS,a'pjH8*B,jF4Dj;f?FP[JnrKIA.0qT9?(F_md@f)L2-knU7\@dl%#KPK[X*KXP>M/B^OcUh_M)fDuP+KUV=BD)o7I5t&O@MV*6@TbUCf,MI$W%.0Vt!;e/NIfa?K1R7j(i$dV*JP3#fUNs5IgV1KDj"F-n=PL-f"$fC:MYBE5ZH]IM1AEMj0HZACZQl8s*U-em.Cop[:!-URMPUYnLCh71*UF$*6SWC.dRrGgMRX=',*=BTQj3*ARpsC$@6=uIM$M`pLjlDXiP<%^_HmL=0@mK%'pa:d$!JR)K4bFZ!t*E?q20"llZnK'hGSoaK;6)1,BOB:p%,5LaR`Pkg^/Y2\aHY-O=.itr9,SbTe6U`j/.$^TD-]XETDhBJa^N?p9]J3QQ;BoAmO"I*/=4Xj09EG\%9.D`l"8mft;$M2c\dsr%`f-^+a`)]U"n\]2d*:h)f!5;OX\^nQ$IdHRZp*O3XkJ7or!Oo+Fu=!ln>\(nl@TMKoqB1s`i\_OrSc-KAalUg9e.PqZ+l##EsE?L5G:rfT4UK+0[*?/gM(i;N[[7%\>,-L6?X;L>PgV)G!_-ItX\he%SP[@AY+JAUpj>m*d@2"sA9hP/f/=j#;&rbJc3-L]=^\c&4Z.(n,Unmg*BS,9*BT*ndDc8&,h:t@Tl;A-Ec;4-Ir?usIbo.qlDS<"[O:_Gc.);"cAR&JG-WESXlDt_:9BZq-TSm3;e`U%nnb">\.:H,8"fq?>EG9YTX[jGl37F/n9%S,UOSk/KO/QBbgC(B8KDpTl;jEAiPi"_'0(`MdrQ-`>Oi<%jl63.A-NjFA7VRSBl`T5n1m'7E9F3)6\VgDpNHHNQ[,f^K$#$^3;[E#`p/746OW_)t92fOAhJ6bBp.Y_&&d:=ID6%(RS[!GTm@fsquF@F4m?,:E<,.[F@;lt-+(ao_PAcr%^F]@JuO5!Gd'DbrD[gS2/nRM*N\B;JUW'ps+7TeQU+j-$*KI5Pa2?!7`umTY)-TXg,W=Lh[q50u?*[^jMe$o@KiZp0U$dH?@5jC/'_!%+g#gO55#egeQp$PQM)SmN71Cegn`V=>=e45J@hNk)4@=*KJV="&bSIn[r(2r<\ok#b(V.`Ek&4]"31/3Wbp8MgI(j>$,8q5iiOmA1l`kp%0S*#t]9A8SG0\-Qto6K`7O7Z-0%H*aepd.if3"FX=:;0`b_L2/$[0Sk.!UY.?!YZRVG\db?%<9dtDAhes*lMj15@0dBi.sVXBWO%G7T/+'u<-0`UuEliuJr`EF@ae5T1V$VitTe:aLX./TE=(BC.`b3VP*R;2] -endstream -endobj -323 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 322 0 R -/Annots 324 0 R ->> -endobj -324 0 obj -[ -325 0 R -] -endobj -325 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 313.816 709.0 392.416 699.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 37 0 R -/H /I ->> -endobj -326 0 obj -<< /Length 3428 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau/[?#Sc5nNFY(DqP:6Y!/ef1_$[E]qE&o?Af$T6amT59ulVBP#%h3jF2MI+sd^J>4E=U(0PUrjD_gmS/LUIkF4,#aXR]iY^50`"KRlYE#$1'E0WkBbCYP'g$8CCqU_X0HsYW_;:?A;^7^XVX'mjTMTftQ6C)[@3:S$RQrFWC#1(_`/#l`dYopNSck!L#:^oQ+-Y;Xj;dO)0_mcDe7,"n2`^q#Ju-=n3OeGcFcBp62NAlHU.b/K4j`CMUj$=!ulmPuY6:]sWPa06'2?AJC/lA,Lu^'7XN4;i*ks[db3Qb-F3H,?lZ,i`nFWTEp1F%=a!D.J`Cn]#VC:_F^;F\5/(jBpCFI/&`E5@%50_Wh;];@rK8E2-,th(]AWYh_PjF.j3u==Rm$a)#oTps6l)[V0b^">A7Y.5:Lc(gMcPQMM=UJZ&;1u=5,fJhSP'MQ$#/iR3t!sOBd0/DF\`B;MGu,+lSL\oc-B`U(s/42h.@Jt#fF0=aBGEL8tM26?]Af&ohhh*^C;Plj1^#kVRmMlNh8-,iFD71`7hZV$7:,?]QcQu3$`2MgCiiElCr%R,UW"n05??WrKC#K"(b!0]dl^)+mg5o]h3Ja)b6A59#3h(W2^2gD:+b?unIVCGRcK=0#n-ut=0-kPEYj)(*C#:b`RC5=HLuQ:nRM/PY8=2ZNVu'*hUqAg,8?Hb.<%(N-RLUoD$9(N?>"q`_$(4]k,.=h9c*U-\2MBbD8VjZ>j8dFl>5uLBd3lI&?I-F#USTj-:aCL$RHt9fdgKX0ak[7t$ULZ:-W:NK`(,Y`eE<;Fd/bs5/p?4`VAQ7,EWd<`MV5SigKFOd1/r&.!"gS>_/iV9=hka1l^e:K`duqPeuCEp7LI#trhj\:-]2Y[?S9nOD[i70VJF^9K5S#6Qhg*32Ep$EOoFC;f!1-H^H/[2I>qlJ,6>+tg'L;_QX(0Mn?h#:pBUPbpAcICJ@ODp122W#7\h)BrFQsL8,b"R;,G`:_)\aeq".1?.s4D;V8$O9C[e?uIR"G(\Y%)+[&AF;6a@kG\&ot4b`bFVr4"OF?]XMWQK&anuV;@LnJLHfSM4BCL85$;f?gC"]R06Z&$"&=FDnh&RF$pZsRNTCbJSo?>8eYAr:ZL[f;qWR3AY),H:\`B>>@X>H8RqT[]J$)-pJ;-hjY-u3<'I!LfLNHhR*6EfUr'bF&!]&Afc]]6,IE;Z#'W80%,>=dh4]9YERqXY/99Y\;1I7dD!XA,h69c\J%T[FS]ta5dI>pb7:E:Y\A9]s1Jnq\"'Uq3fm+[?(=Lb^J7LIB[MRJ;GkIFf..VNeJ9Gh6)Zq'hC;9[lOW=FABeYie(I"%i5%DNNHnHO91'gmp?bdom8 -endstream -endobj -327 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 326 0 R -/Annots 328 0 R ->> -endobj -328 0 obj -[ -329 0 R -] -endobj -329 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 89.914 208.596 105.454 198.596 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 330 0 R -/H /I ->> -endobj -331 0 obj -<< /Length 3233 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%&D/\2f')q<+Z1++B!*bSmg:*fCK@;)_$="'roA+i9'a7[^ob,j!QB^`PJ,N67+_RUIm5bFQc6I?hS08saaaJYcnb1F@QDI/6]A6hiZb)-3QJ0)i[`U219(O<4c#2k#f/N`Qo>P'K^Wp_HZ#,f#NN^*':$SdV<'/cTU'e"Lr.[Fp]jR9cu8pSBl363I/2(-kpRcIYB8Ec%$kD^Lj8qY#XGHj`j"q=2oUUYt!q:GJ%BCJ-7(l)nWkBlNVqQm`S[&aU9M=,>-^%HHb<2q@&]Q[OkiV4^ZhXU[!6KPudr!&b(K"6c2SiC)>9Bt?oQNZtHne=62ig9aWjs@IOq4iB;6d]L,>"!S7")-Rd-dkaQp,XGSQ!0fmKgaMW(D(2o5tncQaXFG4*$Iip4a,`+=PS\4(5335Xa%Y-7lU>8Qk>f85i._(20@D5hk$_2HDDPfTbSGXG63]Sac^f^-d]$U7+bKJ!MZpkZ""'NbE[E!T?unJ'T`MT#:g(bPHUBViPuE+2QSZgg6ED^KnkSoA`]]6?!ItX$PC]:-l9]Jk3`=@0d5J=@k&0l@lf2<2aTJpPQWMGa%k1M%p7B_a`!IOHEi1;!Hf;1lQJKsdFkc7E+]3F2ndHn:98fiFA.8NfMGa$DjcVX2>>n)8(AWiea^1N:`dW2jnH$^()iMQ@^h-L/Kkha`'Gm*S5DS\=XKW_W08=MI?*FH4[UIig876t[Zhh$G%t2idleFZ02GqFH`[3Q9DK4Z'cTb+rn\PPETbeV#EaX`O\\/N8&a@ldfj:s5?a3_YKGG5:H4KA!,;.OL3W?E?,&-=f1SH$)]Yu&sabn+[q85UEPrOcP/p.T<[-n@p-K\i`SEWf$Y9rIAp@>ob24%c1aK)i;JeoPVcg@B&!L_%Yb]@\KVertZlHr*FFGj"3gDrLJA^eWSu`u34%]!(I$+PYaPVsg7O2K2*i9\'Rs2Gj,8bD2/Is8CDR1TPVc3i2i!cStn#mDj^(q=OK\hgQW\5=m8`YR6l@'oP:P=M4XKZ#0+'.=?#S45]0)en1ApES:X<*+^KS![/j6=o=+7JL-o;Jk(+gL0`,Z4c9;%*9pd8%.!eCNbCm]bYCC_b4H7<&2H\S@P)NuD]V"1=>qVh_5X=iqreN>hCVLS4'dWq3=<%)9f$4.,u^AY[5d`$[1(MmHh'J9`>2GOc%]9/j[_Fq=$11*fL.)uIrgMZqN#>I8=-qob5Q)"uHI#b3%U&7!DDdH+1)0hGp^/t?QS"`bO!gX?P16;4n42t!_$>"Q!jQ]\)HSN(WK"C\%0a>`G;7(4=EL4*q"J&4_TB@T*"QXO&#(j?#_8uXm7D\G[@/R`U.8hrGfW=JZs*5.c-'d"F(]c*Yp%M>FH,p1E;0K;5T;u=?(WK/fHUGeC%*Qqt^odERoh<^;5.q3fr>di?-7ZM>l)r3qY('kJF%o2b-RkJ-8..[5PQ/bM2Qktu4hI="GK3:TWCUsq0ZCiC`i?cc)CNf$%o-DmH+`Z$1=Ku;9?/eQ(l6A9GN&RT@r%9(M=HdAhb*/ldREHJn^Tm1IAkEO`skX61TR_N`;YklM6:fXL+QPN'!VS(nQJa4*;1"VO]H9"$3Pjg&bb.g&9oAM\sm8%6AF4+#p1.M3c492./pmN:`QoJWh'-eiI@eN+g4/?jHgTg[TiLYrnQTlUf^:Po=bH"b/ZPDS4gYSJ2/XM0\$l$qDk7btO0,-&Eoa/a4.4U.Xo-sa"W8[R_6rCdA(eD9Iq2R>0j!Vp*=[p>iJ:$gsigRJHgYX"W_2ETr*[b+S3r45k/N/QlHh73_U4=UMe\&j=-3op5:B4ku*2A,60n$r7K70u5#tC(Q-'#d/QQg]#8N!-(:BT7?b`!.b(=`!Mr*ciP]F);0it[/iO\BX9HTd-,qoY-<`VCigduri\OO"9c%dT6(7,?E4q\%LiFNA's3:D?,djK1lN$!0KpX`ZI[FAk)81Jdg%jC,T/X[BZ,/rq%=\OPc'VGEWVE9HsPgVA@YrcmttE#s6LeBp[#M2Q53&\Y'C-)(7+Gg%nQhJc&(cr&s89$K>dEG^-Ym]&ML[\fYd#1oiRERp/GqjE-3^:_X4VeLD]%O5ue,Yob<$[T[91j#8'U4c<><>$FXd?'TG0%GF70YR/t[=W?L;2E[,T6k!o\E`2OZPXo(&~> -endstream -endobj -332 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 331 0 R -/Annots 333 0 R ->> -endobj -333 0 obj -[ -334 0 R -336 0 R -] -endobj -334 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 365.736 581.0 411.006 571.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 335 0 R -/H /I ->> -endobj -336 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 365.13 327.28 419.85 317.28 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 337 0 R -/H /I ->> -endobj -338 0 obj -<< /Length 2611 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatTJ9lo@'m[ddZaX'O!dHXs,hKHNeRJ,-*4hK2-p-;h]_RG],MGh+dpC@lc!L..CDr16jJ0OMT!/*T)DVff%*T(p$B33l5cI7dAGjtU^;8I,5`m4Mj.slk_F(gr451,i'R,]5opOEfonqpcO),CGD(FnLFYO3SMMZX._hJ`ZXSChm;qcuR(?:3Q`ekHC-mWK;(03GP%n7=;Sr6@bR[$E2gFn1KM\9R,.%doHZH2^0HiAXt:!#=bZ+[)M1o`EeQ)-Seg.?rta7P?F9@'\,X;(Pt[H-N^9?r3IXKQI_`Fr.PdlY^4i-IQAF,2,,M0CbRkc$U'"/q,*A&@\p$<,;r`C^`PH?Msf#B<\!p2dmg/Cr+EnXU,_BsT@V,H$=V,UL,K8*,UAM7DA1!6$]3M).kAI]cS)OFUg>dVQcs&!N\]9_p?dE@0a:K_aV8+KEG%59e:#Q9^sV>3:nsbhHE"<$g>mj6H>/BLi1[2!NC[d\#_=jS#5U39-E"SnO(E%'?h7]ctP5iF&]\LoG[Zo"_.n7\DSiDc1k_?H6b2a.Pp7&rKMnp@@J4;"iT6r5j5e1R5H16i:6")?,2[FL/gF1HR5#,DAE'IhsEpg]HBBn0\6&(_cED28VNFu1=!^i[:d1T[\Xe6/I+H6=Se`@%IVNPMs0%(IZ^JN:CIPeSOS#9HM\Lk)aobb/k<#*S7&3E)W;#1o[KDq7I;^[M=++^`i,OIQ\L053IP3IVE%]_8;CaOH0g,q[erO:dUURp#br8)GX0Jb*9nir8,]3)m)<^m)g6btd).5%S(,s?*;L7V%WR-eN_dR#X<2"0^EO)O"MUQH,pmp"l^(PMp4^M`r%lMM"t_iS]\-*Wd]E.b@2=sK#*#l_?C@:!\(fkr9,g+d"jZDFc6auC/NuM3#Z9*u(5e-gZh*!T!>O2L?,n*W%N3brl*bG272nk\Iik-=HC;J7sjuqDYN<$9&$\(G/dkjpXVe*X+&Ag>qr,Xde<>C_Fi72nF=t/dM2WNC@r"1aGi@3(&q$`-?B3)Gp-q*e[SpP_n^K61t6/4_hBA'm)=@6@`m)@l%\4d]4X)pPqHW/up?Jq\bq^<+"kCN^::pZl:nt%NLZ^Jj'+T-ZC&-,oAq%Rs63?JkR)HiEDLptr!B,3o!F(JJmEkQT;Wr>T2BFsJAf?/5>j!^KMp=cPY>Kb$*+c=Gn/AE?8(LA_H@F]n4]sMKqK4fq?o$s4;'OiU!ZQShZ.65W?NH.XW)f-q^)RVu6REB`nisgnqG>aG[@%D#^"'+MfFOFVY)V!0?m,5Qju9VZYb6drM@rq;^VtcIO+tn=QRR/Lq#QqJ"rM_h:f*nnLb,c2[B4(+5G.~> -endstream -endobj -339 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 338 0 R ->> -endobj -340 0 obj -<< /Length 1693 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm<95iQE&AJ$C(qj_efTN22Pq@#)\cLO&!k[s(.2K9Y=`!bM8NF&6rqIccarJR2irp2!%.Q4Qk*m/7+4`7B.@h^0n`K.Hk0:@k2#"p1RO>h:Mc8M97ItXbs)LU>jF4h%4h:<%ZF7kh8)%XLkDGSi!BK(a=-89%2X(B^!oH;[s%.X^+9,S!:);Jo_?(Hh^-D/uG;QW\*R%C?po?2i;&VHg5B;b:Q?6$B,]V6nd1`\.r@GI6j9l>n-.0q.m-E1!H`caBena!)dHD@dcl+/B/JjRci6;nF!-J`a+"/>o.&^oDDfGK6X4VC7\>]i0Oh_]Zo+t$)!]KuCWk1V`:8,`B;?1T#WbT4IjV`N_nRTS/L.RMEcID/bg:UEQqKI+;D.9O@a",*1"Z.cKnIufgXY.Si3G8Hnj!!ZVS@C8Y^Dn?YQZGTs^'nUf\853trm;J0Iq+_VP.2E,+OV*J`)NRoW.=+q>`V^O0r9',-f-U(V/]2^j5o)LSH>O,hQ;jXq&]O.rYQ6fhnoid7T.k@@3(KpgNm(*]J2GtmhiG]!KMECd)Ai[grdMT!@&5[Om*!Gd:t*MG;lPiZi=KDaPtJnhM\YC9o=\X66l=sI,0HQN8m=t&#L"o*Kc-ZuQC)L77%+855N>qY*b<76;-dn?1q???!kR"Y#k-$_jAgbVoLq`l<=MgR./.,AKaXXah4m;]dkh8*9KsOG*Q*9?0)V7NGt/6:sWk'2[O*DDmnGiPC4/%"FBnEJq]o:Y[i]1ahg(:L>FrEdHAragl#(RsJe!*Vn&7$[Wk3!0S!jfi/-]6.b_.mfjVo=&)USk2[n*g-t#q`+t2=B/a;4Du/=l):Dc0A2Y[JbdJk6dLL_WaVV<_N;V -endstream -endobj -341 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 340 0 R ->> -endobj -342 0 obj -<< /Length 3382 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%&>Hcek&UlsZ_J_F8]S^j:AZ(Fi)J#%D*u]6:?ls^k5g,Bd7$b3SFO"lUI4qpa/EZU67[3*mu#;n;RLoHF49jJUAcB`e^V@tDg_Bm-u4M6(2g2Th;tsO&67$.n?.&BCh$]rna/,Xa^#![]0&[uhlOiHMP1iAb45'6IhPU6Q*ql?Y;m!u*PmmlW]q09h2P6D>YF9]b%!8bRP'b'Pc(!Tk=ah`NHZM\B3EDQoM)6]L%uq?ERc/*X&XTEOdiOuEOQTuF+MuLpL/W9L)/+lV;=15JE-=o2I61;b?5SC!)chY,GNVGO/TXgL8,0S=]a)Rf3m\`=O[e&j?T%9"$O%T@JTJnQ<9coTK@cf9_ga6n,FTpEAFb06!dRn7Hs[mP)[Hkg5\b%LiUNW*`C5ssR_KN6]bLOO-a,p=n1iC;'\&k1b1,4ICZWImm].*b`:MDcbV'EF*[k-6d4eS*/C[m.<\f#jN"qcOT8emq*_n8o\1+hR!QBd0&#md>Nd6gt9eI0^.$%%mr)qcbf_Ero0JE0_CT)+&d9!:7fr<$:;'\?qO']+DO:kCTt:HC+h]e)(n^;lc*Hbo&(eAWsr$k%(fV[OuAS(&AVq&<;Q1'ueYVV2o'I-:"2/'ht(#b&OXs3IGQQ1\GZ[;)\R""N?/1!N8VV(Vn8Z!?I+qW8X-;t:K9IML`Ok@rlp,#bqAUr^a.0h#Ibklo]O%)?G?YicQ#YKh#o7;W,8N&(Z*9QVT7KKZr^CHfPIgVr26X9/dVnQ;rat>C^QC?h21u439OFQiBbiT[O]#>iha7eZsMc#bHCuim*3\bJ4mbP>_fSB3J9ZNJR`nP*,R<_AgB@-gQmgBOWo?:J4X\qc]ZDspVuno0CS9Zb0lYWF&n52D-Nu+*)rd2lb&Oc0K6?m`FLpj#\h!to4_\EHZ^NQL&JR0XGNM/jfuFeY?+V#W_[u^j.8!.pmq8n`!"b88fJI>p^^=#7$-AQDfIK$TUX*FM^`keCME@#(0ppPjHp(0%09d1@IopQAlGj#54g:/j!EQD6'sr^etd"T-KSs$=pDWFmMUYJSLJ**@.fi/YC9r&IL=TN==X:/D'G>`YaujI4Hf#HE_T7m0PQ\hkP3bcKg=Q5.'@Uu(Xirf8,>r9E&)UP3n^&Ri2T;3b=C6RC*TW8=@"4@'W'6k$#VSi_"mg#`54@!sGFA%/-of/j%1(D)uU73kCd@L3Z2Fe)OdcP:"*&10<>VkF3aCa<6&/S]1mA'CaQ7.,6]O@aUdU_.k;$[HZ$ka1t1%7Ve]p4C4C7Yck`bH#U]MgW[bS%4ZpH#cm76c88S8a;6*:QN_*3f,]$u/#$]p<`"A`Wm,+-ejHWKeV[nj^:7puCl_#\hU6j?L$1p;(&=S1!3m(WEj$"3m2qNQL8Pe_]I6kddr?'MNN@V=nV)d4B]JQ,0j(l3$(+CG`cn&:F&n38p(K-H*7:KVElAg=_8V3r@8nUO<46D^I=YbPj^8Ak\`!g(F:*Pt)d'YuBJOLBI&<\GuEql[&\nZEt^V*:4%4&2CXkb/*L3dLp+IeAo*GKR&.U',"%tQV>bF/?Y=-\d[hF@XIfRL3g?LjD8t+XB9TNQdS:Z`61r4pt+D3;O^?H!.9N\)aMQQ4L[P_SL(pc^bj?^[U5t1tahJ6O.T5K[*9BtpWfq19SJ#eJf?Uh?i,i3DI^n-FO@HKgLEBP0Qb,Oo)P3Jr+&,d7egDV]$502sj3WT.^!&f8=EgrR:iSOV(-h]fC!Pue);g.RMqjA_ZIcG?b1`+Wjpo52mJe\*m<3MC&OFDNRHdg;bHEi=:PNCFqkf215XXmFs-"(J,/VUkf9LW6;.SMk+M0r_rM4u*3W5*is2;;*Ep75S2=g@1p0-uVVT$B[!:_i\t+=>jVPPrkY9JjS-OI*CgEfH+&\:1#fm_F^WL7YK&Os%u+dRce)L@DF&0)1=0kfLNYr`"A!R+@bNskM)j""qMN:P1!S3!X?+G``"i$nu-ZX4N#VL+R[62MQM#noMQH;-`1F-qgp6@3L?SA9l%0`5!1p+4[EBW>Dk/7DHXlq[uLBge[>cec"g,Fo!i/efDWUZp4%kN*qc?6Q*0eD=h3./#9u~> -endstream -endobj -343 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 342 0 R ->> -endobj -344 0 obj -<< /Length 2811 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU5D3*_c&cTMZ_H/RWU'Oq5K755+JsL)>4djf^dVdiI?V3\#L9thW5dA+VcXV!-3#iE`eApa-5CG"?=dl.UkL2f03Bq&DeGa$KI;ZTDRO?d;o6fBloBDIeJ)#FDmjlRGZ*$GJ0R`)9+iK'DUp&ndUa!RP'=Kdu3c[%GQAE*Egh[S;&ikTY&YQAa./CaQ5`OaSord1K8MlGsa>94j2@[-QaM9.pLt2("c1>;DGO*5[hQpco-M8POXd/Rm)\Mk[WjAO_)>)PiMqmkuDO)?<+j"7lR3m\G:%QWYo0o%.M/fRAO*\kY/)>4d;W(HkB'ajJ.mQ.0-I#-H.iX/!A=@3QAA]X%?8#PRekF97`LIih'6,B3pYrs\9Xa((bIJ'&eqIYT#-O0?eN'F`X+0)7i>clr@kG94A([4IHr:kKb6K@TP:R)GCpJJP+6^k![PCVgFi1A0eQM..3,:]OE.;uH$jjeC[&1HjmPA:q#e:qZRV)@F%"EbFQ$+PDnd6rCRo[3c6,Ge'gAd+DR$R0RNDu3E7@f(4O1\nrJOli*XKHF"-WeK=?P!ktuTaMrj"+jkkhl\Z9ZM?k;Yq,2#7C5AJKXKG82KcVH!WZ;C!$K)`inI5dJtKGCBr:I3%91Q_mPVD0.5,#d=#j0>g"?>LP<3jQo4>=^l^J+lVUH]hYU\$9r?RgPG`Q>gfYY5#^ZdJ&\QC&7gK8cWRr*&*42-tLedm6!PP3$1+:.G9m3*8=PN,EH[;7Pl.F2k*h1_pONFq?nK:<6jgmq8GkbGLG(r85&,2XX@.7ZLb"0g7Ho2g)qn@bBN/,>4n\?6ULZMN?-,Z8(*B#k'N$FU.-o.aVt:;*ab9M9Fb[B[OKZ,D>LTePPI2L-RmIM-i)/2%?p,/Otq+$e$>a#I-KTtf-)7Q%JMAqSQrW$L[%(-Sd,HP.Hn)p%R@uG-`9Z>$ka.]b\#JB75P@;SsC!0JFIaYQF@H;*!IRq4tb7BrOE=jqFaOZJmEA+tKrUrBiCIo,!Qdahq"#q`1)H`[Z!eR@D9$c/\',G$gV!a1d)0NF6+i+_@^]eX(i]52aTY3j,X`q2Cn8NZ>N]Ff$Bl37ITHE&TbpO3(lW7n+^-QNY#S_\j/O4W?$$A8KrGnQ=O+VZ*d`q(q5Y(q['h#?((fp4$(dk9Z0dk7#mfZa]fAB-"K$E2F0.=oN9KF,6ZFf/68pkD*r43SLZ"gobO?C=qbK%.!0ZhLp\&i^=b#^kkJlg1n)hN5648IYZO_fmCk\,mP`ai4@dO`u1u)"G9C),&`P@:Ydd&]]oql2793(bY`%#@LFZYILe^V)[835]<7\XWK4!!dE;O0nU^k[W,8"KV743[>5;cTMk5?eje]^^/DfF(LR`^H++@RdP[!(`d0G3L#t59sYYk&(f&/?-ej9LUl)g=l^+#L%Kk:lt"beU'$?euf[*jT5Qr.^WOc,Co*T/M40I"PRKXofd^^!X_;.]Ah<4F?@g,ZJi,Ype`Ir,ThHZ"/LFAou`V^3C%hM_CW?hAjifSM_KXIG5[7?eZ=*O-[2"keA($L5-Jh]*8G1WkMS-$]TW(<`5^Zspj93"q*%L_AHC5.Q2Y8dAn1G3Z*%J$&jf/L/^+u%7QRciQA5?g`,\)AV_bR=LtoHNO:.A#kUL-hQ:k)gqI+%!iL!<#pb\g)@cp!V^`*qaiG\G8JA,OEqTEp\&E1s4kDb"5('k4B2@d:bj$[1o0./U]^Yoo9`m]i',!ki?)kO]:OSJ/6D.uWOFHm?/k\1aPi1m,)^ji^r1#,"MXZ13B5fZSCAq/]&Wrrq\e#V'n>JEn=,JU?CjXt*n$8bEm&K;CC2-tADb^gmJ,&dYI2BB,o3_KGeEf"d/DF7Z2#-=Uq26;bNTPHi@Q,.5@RRW1A_pWL'PTJ?[3dtJ_lc -endstream -endobj -345 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 344 0 R -/Annots 346 0 R ->> -endobj -346 0 obj -[ -347 0 R -] -endobj -347 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 88.94 687.0 139.77 677.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://groups.yahoo.com/group/jamboost/message/1667) -/S /URI >> -/H /I ->> -endobj -348 0 obj -<< /Length 2355 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau`U>Ar7S'RnB3&GkB#E#;l^>H.Ig6#PIB[/jFubQ08JGq;L,sh\pYMWrWXZ?i,"<%f@aMVN[t,l-h`\g6qN91:$c[HkJQss:-Nlt(?OekF5t:q8eX.CSEj8D4iqR)I7II,=ku8c5!%GBl51>V6.?ud*ta7Kh'D9A]2^.9$N16aIZQVBHQiTppD3Jh:"PUd_h)!0N@PrUKdG_PFL\\#J[mo$RF]d:.e$:$qarBU3TFec@I-IgF8bh6$QI2*Bl/OKAlJob^J'T>Np"QKcM2?gWLfu7HQ^3A#n#d7edC?\JN[/dck9*.qQu-"/J[ut,L+<`a@@]i7`)!MQa:PFb$>6!k-QNB\+FMsCC%[X11HV?L.Xa'44l7R=hfF/\.Qdu>W!gQ1"dmZ[S7T-aER<3j@c[uj:47Z1OK4"PVp_F00diF/%_>LI+u(,[U^7.D`)&P]j/3L(nk?DUr2V9FEmVGs+PoXdZ*XDMC#oF%mXrHg,)27TMH)_Wut5p3&2^,gWBA%+QZs4B8R9A!`tFaKDMXV6&l2=*Tjtc`O-$[-.*WIV>4C78GS9*!PeD.c2s=HO8ui/ZCcC]6eQQNi't^N`Q95iD!H#Val)MhI*H2,T[t29Es$$a?3qkE8PQ_;IMu'?COtk:O\EP8A7,J$ecO'M7[YAO2dfn2Mam`F_0H9)30Ot6iW7Xk\.BCUG*+O=0U1\/h@n0qkW*JI-'sQg=?kL$B9k,fDToW-V]GP(-:R.=\:hI61%a-h2&k$"7??%afJ@kLasQXEk^deY<^'X[Vgp8N[N/LX\4]OqBg1-3-Q11FVR3kOBmX5n$$Lme:cqALRu&df6a'df5-M/dJ]c5C0AT`q0btg1fka)J6CRHn1WqSCiGU]G)]pD[M0Q$Y$07]?&e36%4M)m1^+hTNnHab45dIF=Q4fM;*j+a0DU@$[^CH;6MrZ/n[O'VA]:iKMP^tmW"-,>\sG91KD\/Jf:?QO;2[1:H?n4UY,E2N)irRH4rkpjKmHn]/1s^-O.hd>P2_jimTHDt(,tH)Z);]^!`T%1Dohj[T*Jht%%L=Z+VZq8inc$`h+KL"0Y1SuRojDCQd.k!+ISUP.n)TuBKu,Ffb[ci\KD^Q/@\RKsn:PkDULOFM#]8%cBIS*'(?TP>f;]m`qglmD(Vn91M0g4'03C#Z;OXmu8G1QnM7Y9$CuM'XrG^>0)&M7b/,1]n9,8JUR1_(Gme&OW-eOKJV9m[,Vscl-gZ"NM:U/:cEUl[Ip)g;nUpulE).BD9!eGM>V"djJGISPt[qc*1VG6NY)Rf>0nJSA2B-ko(B(aP2$;lp?DC,Y@EBE#na78_u-SOrt>N;'J-pa$d]@r2oc(gF+K,[[SC*i5&&Ba1#/>$jWI[)7CMkg*$_347\2\!f=Zq8%)V"1Mf!YA<:SO3)-'`qRUY8@q!GR\$(Ldu_,)c<*pAlL?/.qCS/W9nA/HIDp;bn-oiH7oGYG.CE&mf34Sk:@S>BmLN\0X -endstream -endobj -349 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 348 0 R -/Annots 350 0 R ->> -endobj -350 0 obj -[ -351 0 R -352 0 R -] -endobj -351 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 515.032 138.711 543.352 128.711 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 89 0 R -/H /I ->> -endobj -352 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 127.711 100.33 117.711 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 89 0 R -/H /I ->> -endobj -353 0 obj -<< /Length 2600 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gatm=D/\Gm')nJ0@0DAQ#5,!ZojYJ`lXA7Xcn/Gnc2CI\Mh77oR#!#fUu]JglYe%HR\?h$h-T%nI"p^$1n7YDG'io(h.@8oT"iq?=8q4Y.TlK8$Pr%Cd#uYr9B4"">l=G%PdOK8c/MIWGKX?[Eo.X;,N57RMr,<)Y9t=s0#f8_iF:nqlS.S+^_J=-]m.o\=7Qq]YL[K-ZhBUUicQJOSB7d.Z>bZ.Ou6=#kV%h?V:p"`mnna_ZiO5.J)`tHA-BE+WoF]cdYk-aWp6e:;A:F^Th6s'1,>j(*BnWQ1/=HZ2i(?27Xq,?h)Zb[mS33=o*X#VHE`QnsQ8M)$*60G[,'[(]iLc,[g!$KB?>hqjNW)[Gg!.mrS=r&d96$JJaWM5[Y_'Q^+*d=K;%#-^QE8dbTb%s,IMC$-;(e)N&=0tDKRAgO27l=c562(;Tm5-ZF]p!6Oi*I[H?W(!ntZ(FZFrI^4&:O/,,a^pB-J.>:F2KOrA[tBlKd%L?3F#$f2@5u&5)+D*o_AYN_=($et\1-$)Dl_k^U_3!)DkIm!?t$he++K6BO#mUTYu=>eOC2mCNm77"g\OCWMOf.+`ejGUMkKW_jtr%k@&J^[4#_G7Z^b%D.R*UT0J^IdoGBroR;kZJEcXkX3"dFGClRs&"J/AuorbqQ/9o0"ZUiHgncNN46CRCU-Ns"]PnI%u\1p^m"iob+/25`WEGlLHC'l.aPA[]/#3aI2L29,\9'>Ot)sL;OYU:(V8Nm-t5/J-&0?3i:NP$t@>@TgConnG"MkN:k6Z4bOYjG-W=c#(f@s>hk="j%Rr5adD)t^,bab$H`o9q,ZOL0CG78$Rb,jCOnBBf:]n#P/%Aq[.`-4jTUD^I,oWP7JoKqJNfKlgLh5&:g\$g'UkL)+N*ug^DcAm`5^?kJtZ9a.62$8X!Z##&WKC.sfcD4ufi/P!L8hi.si4''5TC;[\clok#_Grkj2T?AUPI,k/C\.864F:]U_0,3+l!bfCu)3$P;HV",)S[Ap9nQ\:>-l3?YNJK9G\M%"K0k)HW@"'_6^c35\cEB1Y5i`*]J.bIn*bUeIDF$n$6/BQLEIECs&l8"5nQTn')`G#E0'N`OL"B@SE>$KBjQBjLb@%*46CgB!s;qZW,UNr8/+j)omHrrao$uub7BVE@!CE$D3qm(`_W2/b1e3A-&JH.R''*H;Cd,HW_>:WP\;;>u*$Sj<4>db?P1HCJ0.PP>ln@FM_f.X5]/Y14TD2,r9KfVU3+V]is3R&&99+;PWc'^n7?OA"2T([]K61fj#%AH?S%d(UllpQGrLZ<;Z&5QtcAu37\Hg+8iI1/nRTQA8-:H+W[N(>M8%_3htT1I>,%[Y`Lm)mWQ85?ab*f9C"\a]jU3r_s[X'908B.g)+"L>YU91YQe7_7Fh6I1S7JXs-Lo<^!eB@J^p9I?)ZT`'im'qSb'[O/f!O$b#-*D[%"=LKkUKHlT.[)f$oAj+\7'[%]of5OCjQW#NEZlp%Ro&"#mg4X1h*%$BjbkIO950+?3eDa(7DSS:r,p)lsAs(1o21%)4C6TX5WWp=_)dLhP.KU(??]on=<+$<0gT]q`*S'c1Nfmu5"[]*k1moEcEI#r6=0pknaIkN3-=Dtio4h%ccmIFM-;a"GN!TnuUjuq`QpgYDSc8e[u*+Y!V&J!?`_p0jcl,/=!5l?;KnHQAqh@.!JKMWLCR5oag+Nr*+K4s>'sa+:_rJHgrQ>-@bp8,$.U1K#N](VV:s -endstream -endobj -354 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 353 0 R ->> -endobj -355 0 obj -<< /Length 2422 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau0E>Hcg?%XpXW@ZZp%fSjS@m^/HPZ>$Qqd%p&(YUJ5"eTg-mj_-3cQV8a@IVDH`.*q8pBQ8P)Oci7mUcsp4=0&qd^<%/?,Mlm0gj+hF*F3pZ7i.!m]K#LS)D,"e`@k#_b*dXg=N4[^qT61Zs':l"lo)M]gje&:06[->]/RM)qsF.8^O5Y,&[9JZ=bs3ArFUgl5$e)p=FCGJ7?`/&D=BbH[_41!hE9PVNXQT647kBhm7?UUm)t;iN5r,hhuMj)8hT\pg#=4+[OghL+&:NlJQLGA[,E]=Pr$O1EIc4VX2E"ZR>.d*Df')I;UA86TGR3q2Zis`c@Y8@-G+dqJi^VVo2BK3md3$p;p*B*n90I]<`#k&cMl%%DC.+!Nrjm%tediD\%2n,%&t+]gGmU5[gh7IQgS_BM,p_tBcQD_nAO("A$kmL$GVn.JBXX#Q>Mcs(+ghpN2(iTlkXEZ?)0jH*EAo%'Z-K-)CF?/[?$F\X3jljm1`NF>2jQgU/rq0adaHSkbr;lp7[E=Fs/<1"\Z7L\b5\tYHb;ukJ`mJs6g>F&VYa[ACII[toW"Z=NRig8-Lm][,jP&]\"r'DpL:HU#bkB;?(@AFAacAA5X5nYLh'3l1930A7_qL[)JJYG&#PXhP>F>7F:'+E2j&&NZJ6YM!Zi0K2"i;B@nk%m[\\1R-CW6(3Y29.s[N$Dc+'usAJPYL.k@N%]A9<=GkJbh;X(gLS^j"lL#%#eT6#8U:nIb1Oe"s:rRPX$S24?4ak#d>2j[*@.=laloXl!LU=9s%n&Gkf1>M^6)l+e."c!,D;NTO(Z(\7,:63M:E<>c4RpBsi^'rMqO_;t1CK.\XIXsX.)?b:Xb>Q/Go\uGhg,IjPp#,pjkW:4LdU=g$)`gbm&">P"Pp`LfQZ*Su$87#;^>bC#J.is#(.)Yk$Ag\5+G/^5EYPRVCMpK:pJ"_bZ:EXT6`ULY[/)D$InK?ID:!A#H",BW0.7c_u`A+b]JoHq,"suR>I>+BGl*lH9j#C\-*8F$YXEm7n?i7Grlj",(B7["iH6h)#P\r(lEsOI8P(-U$$\"T\F\\Z):FVAY/]]o"SJ&lI=#Rb_]ghjmWU##-ND'4X8GeiBF0BfSu+g>u+e3-AYUi:uq$aSsF0W66CLh5BD$7bI#CAL7`=BBF#nq8mTW/X/=9$"'4>tFVE/'/!.V:-Z@Qd'Ul-HNO>ipTj?0?'qt7$06>4fUF#FE![,D.h]VT:D#DQ3A(1!3q=Wu&%Te><$!&qhDVE61apu[Gk]eo61PR9fmYhTXo:5'k#"GC/(AqQs8r9iBqq,']IJIP#`(GM/2-Rr0B(bu8H&;3]0YL?e:VQ";FReG,UEme,dRL=*fHUAj$r]tuoMefE'h=U.qWcemd_oZr?ct0.$/-h\:mR]EWDd;>>PlQAq[>20aHpCS4shGer\7gY>!'"00=irN-_&HX*U`pfp@7_k-15c0jdJk$P]=)X[P_]pd+&OQFR(!c/B:W7W`H`6PE#?r-?VP%@S)2Gq:9r:0oO7KUFGhN_kbP;]4tQV%6c9t@nJRP:Tcg&>oHkt*R$Ih1S<<^q5EdO%igekV@>"B7,J,?BMaNHI3Zlu+&JMD4I`NHLSJ/n77.t51Cq_7q!2&n(P.>\gKgjd-6?rZ_dEVJMLX-J&*V#LR/!;Uc^MEZT*'_O*cfNN@3R*m74f(lV^a2\*<@M%C/"J)eI%S:WiW#f?Z721j1(_pX`d/O+g@Y+4~> -endstream -endobj -356 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 355 0 R -/Annots 357 0 R ->> -endobj -357 0 obj -[ -358 0 R -] -endobj -358 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 142.54 252.448 230.03 242.448 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A 27 0 R -/H /I ->> -endobj -359 0 obj -<< /Length 3146 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%&D/UB(&cV3*TaqgW^V=__S0eh67^'ed9X^N:HM]bfgHeiV-8dXBf8=99Sum#XXkZj4E1;Z>`$-tF"+.;=gPeA=gHSRW7O,>'AHNkC$4XHp#NlOLL3C8jia(D?7YboL"rWLl6nA*O8Ib88eC4rN=Vc>27ID!(5rcGiYQTl7Y7Ske64cA4N]1ec$@(PAJ5[;pRST;7_"eZC,iP-!hXVUQJ1T+A/e0QG,bkPGG^A2M)og>X9&a7%:ELWBrVZZ(GJF+RnajAJT0.1!RcJ'r=*mC3rUl`c/5+n>$&9P6/kE'*=G2H^uGb[1pTJXfAQrD&"W1-4kEZ4)`f[XfRN'UO(*!"2!n[Zed+G=U?Q92M"R\WpU<=,3l(DrM7U-/Q!X^_>%B&qF7FX,5G/rDPIVM**SaBCc^3PM\ncYTLup'1k/Q!,bIQL1^V`KlV9Vg6=S6ES-L$(;0FkTGa2Z3#H3C:GX]c7kfT3jqY)M_%.@r";@<'$KgdP")B]7!`aB[;AKUI[F/pI7>R&eHD)N_#>e`(W_T4\h4=26Pc<.73!m!hb2WYR0g+6:/l*]StiX8_h=3W$cXQK=Mc'c#dR7j"3;'*$m*C$b*esG$h/^I\Lirs5Z-JT1:k)2l*Re?&%k!V9hd03i1!5>3OX/CLK"ZVI3oi]Xt4[W5"i#)X:K!A-V".M$a"!nZ7A\niN<@&!IU=Q-KnpL+45;U^W.NH&Z+F\(g)K8_?WnqR[eI0'qH_5;k0g,<:K)l--$:(;!N+^(37DW-P"K8HEq4lL8p7g3?b-Y$RB^mAkG^9Fu'1]Ka1IscEO:b?='[T;1_l#G(&F?JK[Z[X[o6Qkf?B9e$Wkr?O$:N]Y>Dj](f`[@I,)D?q#?bjNj!a!;Yp`dI(16T>j0:&Y]ZfdU.ph:bh.e46[GVaH1:6),`-9a`G$MG?E)XZ0WE.AkWG4^Fh1b`Y]]9c.u!ZOV6CA,?,V-2!+KP.`ENJ/[c2i\2O8hIi*Fm#E;mqV44R1#kVd6]"IV-\WV;7H6b0qCdZG_>*M1%o?9%g+5P&Rq?>;X55UsK=N>D5DuB=t2Q[9J@5g%:ccSY-DU5nF0^3!rZ?Mq[gd51@mWk2KFN`YoHJF4[ko-/ArA'f?]PQ!s*2D#B4DD\SOkTAGlF,PF4B8TUcJ%uQ[Tf">D\5=T$pTeB"PXK=-kP*&cS1GOD)e0kej"OC5^m)#&b?$S%`FR>@l2nEoh6+nM%"*9B,lIOua(+iJ7RbAj*h/A7sZ#TTC-C2-8g"W[KB(t`0$]b\`VA;`P]TVjp_(Vg[KucIr6sXG(VF3=:qJW+\#*p5\dib;n]9XfFr9J3TD(RJSQ$i;qbm5.cbO1]0(ZTO4V+&(PtYiakqbq/W,,'6r=;%OW>t~> -endstream -endobj -360 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 359 0 R ->> -endobj -361 0 obj -<< /Length 2580 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat%%=c_UQ&Us1U@JFEGJMpU(Ogc4pJLh?X!K=[epOSVZRkqA6V'LDY?_?=$YpdfO]fj.ropJf*lhFSH^2BQlr$>Z<#q:aV[B6'Qe_qr^"n40MjUhf"=](>5a]I6GlG(YPc=b_rq4B=@9bc_-8V:jPr.TCT=!>/HHl[IjT=7UG49_P%i"),355k>Ba%AFEs2/<2A/Rq-=CIApG#/-eqRX)GTX?I31aD>^8A1mne0EM23*dSm`oSR]scmrDbB`:`H/$7)\t6Bd=,2":4^ZkQ:#j/1;QY#7B\d`ZoVO]I%d"933`@Yf'=W4rF,^>M-R4$g/pu!llr?Eb%Ke;`+KqcW/c$edSSrh^`Afg<_n_B-Pm)I`&$55+nIY3=M770FouM8Q=:nSXB!UTG3>Uq@@PCAfj;h,?3ei*_KgaB3)+UEEN=Cu'CuR#0TJ&L"H**db/@eu)TS0*r$LWOF9J5r/q/l9G3S(D2MRg,mZ1lf\;J1_-koUsXXi(n/W*0_`;=bKTd^@lhgo,ar#"IF^J':7gR:!A.k#5nfC&!X"BDAYe5IC%T]6FsH4BmEpSO;j/n);NX3-koF@B_&AeVVnAdq,S!CKqAZoOakgI,"L9Z+;dU%NEYR@WF^d#6)&i9A$b,7'BZL`Ld5sBS9Pq\R9H>VFaR19>_DI*OdQ8c#Wi,\U0u[;dOI6#'/L(Io:P'^Fn59fWZ5"F)S,mE;X3HU:ck+-'#ZZT$VFj95L_")#^-7sn!=sdnSZR?U"jrj;-loO]fcJFc>9X>P,dEFpBoJ3Mi7"jDSU"d\BoK-qeqHr>dDJfZ$b*=n;@.hZ-Xm('g)B&>\YU\Il@To,%/))hTXk/GZ[oPFEuAWKh9D9`MAeaN2RB6g1E4\fg(e8":qj)=52iD@.V-.SEH3(?3.28cL>K:(SXSHOSHYGfBgJjj/Uf'3%/5\3Wj'i?/?b5k1s1-Y$,#UhCD0KP9Q"\EX_tVRbR_3lW@XPSg'^RMDNDkdgrC*h,XHi#'kTG1POd"S)T*9!m@_@t?@B+)fqGB0g8'`2kJ9r0^Yjo.h<@0j#@[r,tbY!A#EbOA#=q$C5&/Dp:X1nH7.RpY/!s -endstream -endobj -362 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 361 0 R ->> -endobj -363 0 obj -<< /Length 3423 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatoCbP[M8CCjgmr?"c1r^?K^'@jp9DL%_`3JGS%Ek8ml,G,0);uG?(;qbbSs$&Sj.8;)N-!_f(ZhdLl0CPO]N<\hCpc9[o,pp,.4=6`2>%'\:artAZ0'K/:4`JIBe4d$+p<;i>I(c>/?h:C^+NbbA+YC]9ubBeeRlP,B3iC'.$^gn;Fn"ZMK%/&n9j>Gi*E2ODcZg?GGQ')%>u>8__Br[iN0]%(t9/6(_J1!A;`kmp:)5^%@J>A1N;$P5oK0fG\:crQLV3W4Q&>Y&s$p<-q_lWFQ>q2%aIGNYen?6,qt[:76\"5X_QIM#buYV>os?noYg@C`sM$e7D.\M-X13.Y_Ij620J#=19;c`FfVIl98*_lj**WEmU[rlb#W=*7=7=@WK+Lc'L[WQ#q3!*7b7=QRfEW;bJ!q("aFb1EqFQW?jeC,?#tB#aVl\B:c@OB;lE23Gp`A7>Eaa8g]?)h:[gSl^p#N7irP(ahDUarnGE^]DT/?p@1elsP2gc2[4O*N?Njm.6>Y]j@"Lg'8cWo-a)u/"D>!?1Z[6f/$kR_%iZEC(CM?ot`%uGl.-UGtWN'*Spd9hhQJPR;C5E@t2LqA5pN(65l1_*1iN&X,@$4RoMO=F[G79;eM1'%E@n')JJRa*,W#Ur&.]\r9'BY+q>qoHXn[(UC0S^b6bBhjp/AIBQ2`1i#pgk6]XP@-XkWroA0b$"4f/2jO@jD[trm_+KPP$,&-bVhm3!6l1(-5$,4Z`00b^%:em'rKs_.?63l-&Q*V%p[puX"qW36`l@YLI7ae*^m:N!+laVG8VO(h>=oib%&`=lcUW([2fe%Z1>`7Kt*L=G,cEM4C+*^3J;eL.plj_eN&WNhuq?G=q2c'5b"7R>esjhT1J?^Efpah1BS91Bq_E!5-Ol3%;i5!2.GMh=tDWL8@Z"AOmK5nc)34PPLVNnbdqEpW$"OMO>5us!C;$25aWT-Km#fU/Km.b(;QXJJGuRsor0PmO.B'FahcOPZOk8t8K3EB[DALD+PI5V`b>76YTqL?Ue+Xa12s/X!\^V4XF>Gs4Im!Gs3=FCK.u)FY*LQc5Ok*\pL-+Et:6Dfj]RH<*qNs5U;4+l6)&ZXiH<[VY:$Kq.JGRqj^9Q>BM2*Z$L+gEauW)LM(*g,-6>D0Hblo*a3;qW,._ohcLrR.fWlJS5SS0A*Tlol9@8loQs4gGY&utZi(,8SC51B5G\i:4WIRs"K>2m6&1-FDlhmDRefg_4%V#6*:Q[e/Z338?lEH89mrX3m8QC#o5\1h'J.:L8fc5RNM<>dn1.]Q%[WceH'iUmt?)R/nVWo`IT.Z[kldGoDq$b"@]'E(=i,joPcJAC&e1S.$7j[;H%p3kY-s/8(5^`j9b^Yo*XWmM6id;B(O>@[;HkgG`/JZR,g;GXnZJ',/YDF6jW@Y5uFctlQS>>T;(2c:me16!=*gC"R@[E,BiphCHRbakLc)uq.j?^&sh&VU%I[?:&\h&]or?,Zie3#tH,B0Yo5?Ml*H9N&G-,43'c*PC_p&#g;&1Wu'K]#+ppUnF*'B"ml!jSc*p#.%e"-.k3D81PDlK66KfZpbbjU]3BW.hb.VGn6cB*A-RYH/k(?^p/R`%BEbrft'=*`Y4TN+Z#V0[=!t^;X%mlo4[qPj4US([a)/0GdkHYMf&$0Z;5"<+3dk&cM';u0D9:3SE=N84PYV40-8uPX>l*82N(sste4>Nbf@q-/,N5pE!&Bsj7^YO>9jl^![$UOc:)R*`sVdtE=ZUSZ9%&ca\@Sgt4Y7,sF#Q0gG0]WKV&+"j7jT)Nkd@?"d9*4=+I]*MM1/'+g_N)[./;GlC0Lc3WRC^,8aPsBbd8@l6eo.HXp`f2%SqYR29l'Q4A,+@RaaSJWCiVk2Ui+@,!U(<OGtEdEAEWt=FM$cW<8nu*6b;@$,Unmj;sZKm(B8tPs8"K6#93^=na>PKl!JH"D`AKEZ;$c(C)j79jI=WChf%B//cIRsr`SiFA1&s#PjS4oe'#Vsn7t`loHqaSXW*mP$=/>l^e2s_~> -endstream -endobj -364 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 363 0 R ->> -endobj -365 0 obj -<< /Length 3257 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau0Fh36U%&V%R16;\ii9[4'],a.R_a,\IZBA2"?Q"aji4?sVK"IgTHP.J"!q_#,]mQsG.4It`l$[t`VZ.N@K#B[.M=$OE%bb?csB<0dfE-?F?bsM2`Am#PL/<#30S#pk?5G%i-o_SIp\mpVtH2QD]s1r)Qe6P0&jp2K%;f3K@bhZ3=3\bfb-MYHMA3Oqp=f/2`K(:u6pMBogV9pPMqc7+I1VK=]!Q#LdV19HJ@\b\D$@]Pj:QDL8.jJ;GdP$?*$YP-fPml;#sf$%*=;gHWq!6'3f`AW]6ukEB)o_Ju:bl`dDS+71sr?+ln/,Q/_^2#ZcP;iT^P>=^A`nb:G'!s%,2W8t(h,%\:%k/=+,H.#NEAPob@m-^S3UnmNl.h3ak8asRTqWSW^A0th@M]PG+8V`Zg'B:iX.,ZXSufoY'XHd-%R>lB]U/]f)_l]H=,>#o.l;3h"ZHd'QDVH/2%HFieDI?*,V/JcUUGFpsgem,uHaCF8=2tJX0_<6^esc^'?2,pU.&JlD/.R:`=[%#^0FPan^dZhkcf5FO5o)).jO,kbkE@B;_1-pABPmhPZIh-U=?40NsGl6i]a8`l!q>*0-D6%MQ-E&3R*uY@A>j_-0e!Y>)VL1;pVIO;1aK6N,'dB#kb52uP`nG[f5SOK1%@(:.bm=[\Oq^=SSfu6I@'8'dhnnKD1[SZlB8jWoO,V5YKh>q6e/L-;Og?4NFc86t4LEXJp0)DSP]G"[UEK[:J:h*)X;B=F+On8)L&XE`]n-8d%,[@S>G1TEmAoV1e@]F8KgS:-.r=jgcCJ(A#UHt@7BLW2f=*q2a]U"4XCT+h"6QVX"4lq.IM)AC$dAC^os$5aXkk;SE\#,Zp'BH#f9qE.J@I=JHGNP"fVZI_GV*"JIiO3TH-PWKTOlEroTDDci>G&3$-XtSbNuq+EoHttg0`:d#uC(qoRKK7J:c*7;aTo`I]/39L(\/0t,$A,E@Zr"5;1PKiTJI:j*+t)1\,Oi%N"3SpN#"r7fr^#lHXC.e^&ck?1NkI-c#GF7kn]GDRMbH;#:SDhr@7eNIUF&&@RNnhR$(77&U[u'/gJTue2+3nHL=_Aa-g,]U=eFH$Jd?sR%G_Z7:>>&^*\cgh*`f0;r-*mFNeLs9\AsDhTi1S`0YFR%\C?k@b9/J92(gqQki)aP:Ygo3(sM(j-YsD1be-l=.k+ls=SN189[2U)n50W\#Ham&Rom39/1]9F\eSGViZg>*9V;CI&39.rJ^=q*pS98BZ'V"5AHsMJh$9:J#Q8oda1f!R1`t3u=aIAerat.,o1@,Yq8mK1F8M2pGW6t"L71N+e7?F$]YY5)TY!fe9ImBi-U]Vp9FsdG-uT86,K@?m'l4D"8)'^jh'g]1d]q`-3KQiepsHR'@#%m=J:68d#7$R,(DB\2emq[7N^Pi:'ef-oGRl^7HNX+(1/YL@oDQ+sO7R-a(Y,6MpZa-@20muqX'0NPWg&MUJ-LN)C]/a2jar/>a`oIPPJQZ>ul`?SdQE_\DG-r'mjG0a72qir"(Pc8XWdGq%0)B9306&"-gBW]sADZ.KlmRUOec"g^=XnEI:o(&TY%aR0h-l.q7*q?h@D/#Cn+QJi!n88&!_r@ao'T#HcbH'6Q7Ud]fm#'k`)9B6&-TjQ>bnI&WbFYD>!MA!9\YD^H+l?X](pCoGe#_tl*3)^:CfGQ.'s]Vfg:(\0TBbIame%]b@:CGQ"K3:/pojVZL?2A"KdGX97CR"afRZ+fCD;8gV_5E;oV!A?W"Jad#pqrPBL*KXMMU8[q?BaQ-)*U^UNTj]P+uBH!$=BShcmn).N<1Y(q5fDfgOir;TCO8tCmGH0HI]dROm4aqoV%%NHI)B#p;N5A*"C^I'u\N)q6d"3"2Q,m%T>P\a]R)s!pE&1Ji>6)(s;!mm4dGDBoa%Pco.sX33PDHRjLO(].ZJ_h`:oNtS_0jh!k8lkJk]/bL*XQq6FfVi@Z/?]&hThT+X"[-jFLoaO?[?(RDm]SUK8mCF\fV7]F9ZCEkbA1d:kE_]o>Woqqq2u*[eIh@!!So^lC31?87ciA3K0+@2^\<-S'Ar=^^t\)b+T?N?'ae;%aN'4AkEXpi:H*FJrOOHWN2GC[o7+kF?/pKXqj!l-:^MV>s&Y]?.j,+R(mTZn2e&S3e9QP."W@5EI?okhW]`oV::J/jc1f@kaP7bTAD&sP:r.bCd=0/5GMNiI32pWf#Pe*/P4m"Kb&NTr:UMa+6?gL"pi'5$dD`c>>%9IoOXeXFQgT,g0]iq!)YDi7qn9(dLLI4Lg/6ggMC&#.J^;ouQXSL#@)3P1&N]o'@:(q(gdic1L<>%d=:CBaUP#R?m)>t@aCW9'~> -endstream -endobj -366 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 365 0 R ->> -endobj -367 0 obj -<< /Length 2911 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat=.h2gSS%Y(+c,++_Q5nhjnm!L?"$ZrRR@/&X,U&j[jV["WY'!#ePWBV`#6iZpR,%XUmAa\:*(]Pn?UaV+rR/M9>qt>emOi1,031TEr`VD,h`9L^8fVXP7NRK=T:dqkKDS&:GNe?'5LW=[$q$S;3=H`<3gn!==S1>q'J]MDm.rEpD7.le$C8-'cel.g[`W%jRH;X$tQeghaatkm(#,#KEoYam)5&P8YVoWCPRe-Z[p=Q`Tb<&h@;i`mG_jKTgL%pY$B'L_K>?.fR4hFjlH;1c?Db4FM!Ab:CIf;@]17JK8Y=X-6jadFkhP&Pm!BM_V5^2";4rf.bbaka5M`R-(.YfU:ST8OH$L@b+8ooF+L@tPXD;1#E4r8-=[pR=e$G+bEb5#_?#*%X=#7NPSR@9m4uOt]TcGCU`ASr1G%7dUF9c.OG"H6&(-N@AUQ3>_&u'V3Bs)DFplR>g`iZ,KmlU0>NcB?d:891MkB2`BH"ZkfB_()<1Z]d"At_XBfL(Ju-JOE,^qN3;`je;gV"CE]El`enMhH7Xnf(H,6TK:dlWKH7+?:YnN:`C-aoEkkMo`LI`%`9*f]#Oh.t=YT5(,fP3VIPd!h9Dh80Eel?=/B<>`hl2eb"tML1/:1@oRsW$0WtT<./"RdKgp%6,3P;2P_X]3Ci[]NQ8hN$aaL@R4aMo2Nde;J7R*"4r;V!uQ5+IPjnNi-[.1EmsXWHm*5!H&KDNXH0aoeh8@b)cHV>e18*DO8iUAb(6?(1blTZmDH0'QW-5D$K-b"^GfQPh1C'Q^iV<:9Ks(oNe"(fH4#^u$Y7\&8]b!R8ti385:0ZTLk-Z2YK/Z-K*qJJn&RVoCgh1lq4L)mk5iPC6b=J,9%So!\38a]'=OHX!B4Yr"obIdH,!Zi)f9ml$$rpjl5gHD8R2C_C%^!=?Qdo9Z#Y1)?`97m/:kR0o?Ym0JSeG0rKLD"19dj,X-tMN0W%Klg9/^fN:jPZJbP8GtZt)h*rm/[(7kD3Ssa\B`5rqO:GV,'+h\.%O&a;l-Y"@a#bk&R5b&O!GY$%7)GmEK$rQ5bkP,aHO*G\mKcaa^?PY_HA%)R^.8e]KJ9YaOH?ELk/67!>06#%D-&]QCdpG`dI$jREt4df,MliPPosFF7kQg5gA=Cod<'aLJ+j+_K%O>:5(HYMO[M?Ee)M/d22Aq>S!lYKB5dEOODH]Nc_-Ea'i%8mZdK7m?09`+P=6Q!ef:n^*]+GADC:3jGna(`R;_BWXZEQ.ml2rlc9$3#r%<^ph#N#TIcd"pZNZZ`M8B7bPSn&>AM\AtX@>-s:n8j=llq!.9K;V$-#'?h,e*.eD(#Co3`Tq755O\&9lXJ4iT))I'>k-IC\9DA@Nh?6qGc'XDMJ9+]5hY"B,[\LaGBb_4Wn)XPq@qh)9D;VltAmYThPP)j=e8qtklD8msmE/Qtl?cM?]F1^.meGbsQVVE6#dVQ"Hg+qa[b0eBl4hR$ZuKkd:Gi+G^+ZW['I'^s52*YsP;;!PJeRi!o`>;F$cZnF8(mV%C3lD$?$3H:MlZhc>n+hTGA)hUY6mjNXf/r9C4V0;?7ZN([%KNl`!>GeHn6KE;7QMqK=nJ:1TeDP`_VEQ"Vk^.cMo4U&M@V=3ZB%-ekE"rID"J;Ic+AJD"VAf1WA07Sm"@5.th8dU;8-/\nXl0Mqh[FRlBUS4r;V$]OS*a=.1akH$K6dk5M%pJgd[+C"JBesnM$NasRJ,_%5BD6,N:+O5WSB[@r"oo]D8FT\?_Y4DpDMH'YiL]f!XOTKW3N_T+m:IK2'@ac5$-`V:gg^iP7_W"2@^):gfrN]*"K>jW[CtTqEQ(gr=>$(`5_q:q-5a)=&GUDr?`9@)d7Ug=9.cscr%YSr.:jDN,B)5T8L*Rge*t\^#8FiOBnVujhHa1[Foh$jHn[l_=^D((n'L9ceEGcdL.Oh%0N1&U,PY[R`a9\g]t1`%I:.&7/2;*a@J<`8Uq4=:YF9/GQ8:Z6_@XS7#;J?TmQslR>e"mo0u*bGD,gE6-d9;D#p'B/O(h\1M>oM*_kk=7S6HleJ3<`C;AEmWY1pgGgj!<&i@qBK'.aK*0566X*qG7~> -endstream -endobj -368 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 367 0 R ->> -endobj -369 0 obj -<< /Length 2511 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -GatU5D/U@P%/ui*@H:@F-*$Fa^7a]:Cb(SK)`B8"5-u=QT4OYGH^gg(C1'8T3k\E-\a?g>-q#+FOUimuP&KeB?G%^faVq9_pP4\"l?JGmf(*1Rg8'm5DGud90XdIIqH9_P%8<&StN+3F5FZ],-mb.UgT@V'?TiK,Y_-N!qU/5l]k^98bLdjpZX1.X^tk/^K98a,B\m5OeaC$oGTCDSD<=RG9f=[1\P,emJV:%IY`?b:/OkJI=[''Z`$c$)JF;,iIhLV:7)!YB)9ST-=Fn/L0_?:lVQME1M;anHGF\t/PJ^OI;+-c;;h=FOHYAujG+JMHuos)U]0bi_e@FT6d'BZ"moI's675F)rJGo,NsP1A1DOI$hg=)h>B7c[!mdd1fH`A/XQb'\R!L]9Lpndf*Mp0?aqel\s\?acr\B(bLU)&Jm_XWX^cJj'1&8'F+NE>9?QIGR#Ni'R`]$/-!Pa^EY]%D.pJT$[t-jFI;:PhuHC)@UF=OTX;_:r#ES$r[OMglZ[/5;o61sPVi^li$P@DcZ]5DOoLBVdmhTrgP8.e%>DcS)-&2T%`Qc8ZrPC+6)Y5AM1/TWrNt#)lSsGX+C-=`PIN0r9k1_-2]n*&"bD3:N#tc!(m+Y*VU)tGm6H"p(quA/8#hPjb,Y!*Q`j[>HAC8?BagRI%8*eB0NQp&?FW0NKCkE/2$JAOl%2bfW3*EJ%S01b1$Q2#=>B$:,p9mm4m0SL(b_Gj#Yj";l3/"Z>8&2%,-@s\`52_3Im`GGXMXbN5/.H1YF#gh=YDn>:SpskF"7KP0_e+^9nC(`?:kO%rL"Zj)Tm4HP[jZuut#e(["6PG[:!q*q*R<#8p\2d8Widr"1i-']DW2cd6?i%t3-&=%e@Zi5$JLu:oQotn[]bHt7:Z9I%Kn>ZZ`TGO((@3=Z'OMl=YKD'9i*4HT$qjdj,sZW'n=)C=rd?EO(s']P%Tqj4`7G5[(t;+&Cok=o?k@,jV?"rXE4Z4Rc_iRRgR@7bjO;aR1niYZTcWDOEHP)J>Y9C%p&FQ4W?=NrV0am=F'qAu.9f4LBi>*dG'2*KR'tMl+lZD!DQnG6Bj[TqX[06,2Dd^h:El=NgTZYrXYeFSNU-,3%O)iDK<J"&m]AIF$U249D'!Bko'1l,nOd@JA.Wm@Q0)IHt#?^i.-qRq6>3ZYVR#7a>7Z2dZc"eAI&CUF/BRWE#_oDdCCV2b]/$SYk0kig0jqVkTo#%S5#*0sdFg,]fbK,;DP[b)>VfD0STdml/b0lECN6TCs).^\0"@-Dn_u7P]lM!:JEh8q5Q'_*Sp0*In=WK,D\[]=[`$4*MTC9L,=LAl8Z.Y@^b2RGZRt;?M"KNJ&+(CFSbY9p_,%d*#b!'T@[SG3I!scu. -endstream -endobj -370 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 369 0 R ->> -endobj -371 0 obj -<< /Length 3057 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gat=.?]WsO&V&\6@H:u5e>l]WAD)a45^'=sEt8G3o-"W=+)$M>fZ9d;9']]S+2/G%8.N1NP&'X*q3d`j%YsY2g;j0JqiA]?>pZPjrcknUSF4hE9)h['AYu_QPpL.TfUiu[I!aehQ1OG"iZThLq/6e=BPUDDJXs=AZli!c;r;kiEf8!kBiUa546NTa-HKHA.L';+]LEh+JjYUf$rFEo,rFYACg*sSa0P3k47fd6)&s'"c=$#R9,VTu'2^d`$9Y#_T&9Bbd**&P`u*]lMRgUaG\Gmt:8SuX$oIZ0U!'dAN:PMXIoI?A"FOSof3/CMT[V*eu]0[W?Ffg1X\U=NVk_@+umm])UE7)c`4T6$e^He)ZY@Ifp+qj/gGIl7E>6bKlCh:HiY1Rp\KI-8"eDKs3o_'%K<;P7+.E+&X$&"WtK0HMl))gK'gaJ4u78:H-g"/O7?mujabK\K?:WM6HIZ0!P+ckErDW)#c<3;)Xd&G_ST7]hdX%U=qMA7sip8/Q7gm*'U?1"L[:N7F!W>.jmFF.jtO^FGFa!V8Nhm[KJ%L^3_L(QU\45LNo%9.qMqdac:KfTjQr#L))OBj5D][VM9"8-S51%n2NV+0;k-Qu8H)7"q8h2N.BJ(.FXUcHc9[P./c1@8d61)3sNp':C^4$;5.BHZ;[Ugf37j%2?9'TX"q,4RM[NrTXRViX$!;\S]7o!Su>oP1CF_n$MbP7[[4c)P>G@p8WB6/OU,Me(kq,+YlY4q+\hcRY\KS.!a"<\\YbR5q$!-U)5'CT`<=>5LTkRj1DNKQeF1r%+IKkD4NNe,X2!JLf^?SBZ*Bm$84pS\D-FCH^+fROmt&rZNLQpYbEp&gr&!B@.=T$4^]KYk_bJ,-/,XLq`YZW@ZYj*6Kcrf'1'ck.kpE\Wm$C:r4L:_ulV;QQn;Am++I1!p[uIPm=oel:M1aGd$`"f`S?=M9;%E``RM\=+lR4RgI\9["MuW<*6hYJH*nF?!P[q[X=Ee.o(J),=Gk8DUsRf#4-K(XEF3#dB$).-o;2p]d$^!r0[Q102/30I^hi\[IaEs&3+u&2\E5oJ<;trBAi"bpF=`-1=`$A4Y\7/^n$mK,5lWVnM"bUc-"_Rik1#/F(]@q)38NCD;sg;3dh"GfP).??^;bJE^/,Tir.e,#_=\ORT,X5-)oM%WID1OWB=SR*ZU(]n\hVOkm=RBN56SfiJ5I>SNI'i"3+,iO\H-A9BS4-%-Do;%9^]l/?&M/9Qu#87_8b6N/O5Z+N+Cj>d?B^K=P7n,$(1=<:cM.f;6,;G#5M5=4MKg!]%@SP=`TCM/K1aZJLIuQm,6CD8@=_8\aDf9O[di)9#N]D#[eh.ZCbb&5J]]OsAcb5tt]HJd6n,iuQ(+rf/QOh5F#'eQtCPKPbDPpqf,5e?f,G]cLq%/X&<9K1`!MDW[B%Q;j2DgaD2^VHK6s;A>FJSjhB6a(o.LAsQNYJ,8^O?2)OSLjc]hqJE*%ag,hsR6SX$#5h9.lg?.\^64RrN!.sCD=PRE4$OtAX^F.R"-#!WY0Mp%V6gU-q;KBorTS[2i*(?;--H%Q/dT^m/Tn)?/e>-15j74:DXkU@=2\c=):P2^_-t[',U0"at>U'\Y5b09N8HRKRZ?KA.8Z*cT]Q`\n/;sZE9G,p+@E((p]7$-f*X(nd#CL;@Eq*,]-fe'Xk5=O'#aDKW?f>*)F7/-H$im"E[%K0H&8l.4$M'mRIQiC1sQSb?M!i%XL=3/lKr[G?L=qK.:l6Dq?h`H&Dak/;d$\(d'1\nib1Df1qEDg$?R4RgZQ3mBkZ$gZ\!kS%%$_6JCUG2DkUYDP?5]$7^$4f2H`1bdB#9:fi)Vf*+]X"tQ:HZ[9#/r>R72GW\NZVc6&FU=\)39B"SLePN4!ElDi0Pi\;hi9M"AP-`W6P^i*PF]On:r`Q[(2WY,bP?Hf=md=](aB"e+Y\Ws>@-[QUM(Y_UB[mgI(U=t*]&OqKNs_,LV,0=?+ua8F6_FH)ZY2AX&jc+IAYfo4&$m5c]#iqR1sf%+1Rof\eB;peuirW/OdJ;4Y8p#Q/H!8b3\%Z$BKg3b+^-42V>2?jpa4%k&OWE&,ut5TRp>>msb963-LpL6;$,7WKWUVj_%pIB1iY*;GiM!PX!?;L!Xo&lIlZ5g`Y&KUV.6^sAVHb\S)Bk'YOn)MQ*Yr&/&[NrXj"1ul[5&[7C]U8d17I;+7'2M#./b`,eIa[=k7(%`mNHn3;"bh9g+\UIkPbYFU;e!9V8^"*HnpG`sZNSK"/-1)#+jI%ah#7GimBfp0,fuK^9'UJXge\GUeVNH6!1gLq`4rC#Li[ALSk8iNN!;K[ASdaC"[cs"T#>!IqYBVb*T:gaU"?oVgr2j4urf*r"&(Gi\kIm*EAJ4#Qc>.!5qJij=;$q4(<#Xr9$C,8lJF]7n=?7]fCfZcBP^>-E#L=m5]=8$.Z.BCnDD#t6T~> -endstream -endobj -372 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 371 0 R -/Annots 373 0 R ->> -endobj -373 0 obj -[ -374 0 R -] -endobj -374 0 obj -<< /Type /Annot -/Subtype /Link -/Rect [ 72.0 677.0 114.23 667.0 ] -/C [ 0 0 0 ] -/Border [ 0 0 0 ] -/A << /URI (http://public.perforce.com:8080/@md=d&cd=//public/jam/src/&ra=s&c=kVu@//2614?ac=10) -/S /URI >> -/H /I ->> -endobj -375 0 obj -<< /Length 1427 /Filter [ /ASCII85Decode /FlateDecode ] - >> -stream -Gau`S9on$e&A@sB#WZ`%RkaT<7?F1#AqBSNTWN-j76sS2`C;%O8m9:6od*%!*::no1%9m8baE_rc4!2RLWtUpbene7pC?:sn!uAhgT)Fi&mr`nlm&$FLW4\PlRshYP+Ge-;u,9sp("hdj_.\d'QN3//;P(QEiA5LDs(a6MS-QQju&:.EtV6o%VS?QEqkb_Ac8f"3T1I0\e>Po_)B_am)3T=,];9a,FloYPFO.hb&_1@*9hG!rC*[fn)d=\-QH8FIX:0F:Ms;krp@%EcYe$([5arWrW3W-bPN5-`^u&,)B+V@,#>St-BqJtBLuQR2_r0NLgh(Q6QX6$V1DZ"<;n<""7%EalphSW'-%6X(Cm$>?U5?:8L@=k5(Pbu0Jc,[IB)JOnJk;F*6;BIMUjoD/#)#VmJHf+#dP-)4M_jePZ69^Q3D_WXk,)s^-YW;pE+1Jb^UhqlErR\g?F7bY;g<5P+/O3GYkq!*Lu*kOu!nPeTWNg@7+GY#dCJ)#:]XL2Or]1;93.VaVAh"1]J$"GNR:Dt3I2FfaUnZ&KX34&-]^Nc$D#Cb9hZ9gDYGI7ZN);:d\cLWSA/5HTCFUJ89aOt,-m:*^bo?!OCY4h`(S^^CZtu$/[k"p)A90"^@nTabc>Ut;T#V6AD%R`6&@g2SoX'k`UtSOe`QW*d"ub2\\TJPEQ7\4aD%,Hnr?#!ekkce#j$cN2ao432Fs"cI^K!B^J-$]C%'XV,lDi(**E/jEU3,gfe(UUT"]KLo[[kjP8_uA1/4P)sE2AK^rl+tdXGGnjb#dNk/;>&s4T]Yoj`LG0]!cB3@al4`^EiV6#Bd0O"IbpEkYZU5r!kju&VE1"Q4hlQ1HDTS!)D[o)Qqs`TAj7Ahu^8:qRr6\0ri&_cRCHK]^9.mk0$7@gQfXU^_5Tg5@.uV.gCR57Y56qYe,42FI1U8A)YP9#0E"Y1jXP]O*ekQ^dWMh$F[<+OQc%tCnZ0l]2hY:]>(j.%_Y7dkWE4!:fK:.V:Z4m4cCZ#i8lFrLj![cC^\UEF&>JL<__c+t6biD8d)mm3K]G1>TVAj$688sM@pEM'5MbVZ8%2#'>#nM[%/g^'\;?=~> -endstream -endobj -376 0 obj -<< /Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 612 792 ] -/Resources 3 0 R -/Contents 375 0 R ->> -endobj -379 0 obj -<< - /Title (\376\377\0\120\0\141\0\162\0\164\0\240\0\111\0\56\0\240\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\166\0\62\0\40\0\125\0\163\0\145\0\162\0\40\0\115\0\141\0\156\0\165\0\141\0\154) - /Parent 377 0 R - /Next 381 0 R - /A 378 0 R ->> endobj -381 0 obj -<< - /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) - /Parent 377 0 R - /Prev 379 0 R - /Next 382 0 R - /A 380 0 R ->> endobj -382 0 obj -<< - /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\165\0\163\0\145\0\40\0\164\0\150\0\151\0\163\0\40\0\144\0\157\0\143\0\165\0\155\0\145\0\156\0\164) - /Parent 377 0 R - /Prev 381 0 R - /Next 383 0 R - /A 11 0 R ->> endobj -383 0 obj -<< - /Title (\376\377\0\111\0\156\0\163\0\164\0\141\0\154\0\154\0\141\0\164\0\151\0\157\0\156) - /Parent 377 0 R - /Prev 382 0 R - /Next 384 0 R - /A 13 0 R ->> endobj -384 0 obj -<< - /Title (\376\377\0\124\0\165\0\164\0\157\0\162\0\151\0\141\0\154) - /Parent 377 0 R - /First 385 0 R - /Last 395 0 R - /Prev 383 0 R - /Next 396 0 R - /Count -9 - /A 15 0 R ->> endobj -385 0 obj -<< - /Title (\376\377\0\110\0\145\0\154\0\154\0\157\0\54\0\40\0\167\0\157\0\162\0\154\0\144) - /Parent 384 0 R - /Next 386 0 R - /A 17 0 R ->> endobj -386 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163) - /Parent 384 0 R - /First 388 0 R - /Last 390 0 R - /Prev 385 0 R - /Next 391 0 R - /Count -2 - /A 19 0 R ->> endobj -388 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\163\0\40\0\141\0\156\0\144\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163) - /Parent 386 0 R - /Next 390 0 R - /A 387 0 R ->> endobj -390 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163) - /Parent 386 0 R - /Prev 388 0 R - /A 389 0 R ->> endobj -391 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\40\0\110\0\151\0\145\0\162\0\141\0\162\0\143\0\150\0\151\0\145\0\163) - /Parent 384 0 R - /Prev 386 0 R - /Next 392 0 R - /A 21 0 R ->> endobj -392 0 obj -<< - /Title (\376\377\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\164\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 384 0 R - /Prev 391 0 R - /Next 393 0 R - /A 23 0 R ->> endobj -393 0 obj -<< - /Title (\376\377\0\123\0\164\0\141\0\164\0\151\0\143\0\40\0\141\0\156\0\144\0\40\0\163\0\150\0\141\0\162\0\145\0\144\0\40\0\154\0\151\0\142\0\141\0\162\0\151\0\145\0\163) - /Parent 384 0 R - /Prev 392 0 R - /Next 394 0 R - /A 25 0 R ->> endobj -394 0 obj -<< - /Title (\376\377\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\141\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\166\0\145\0\163) - /Parent 384 0 R - /Prev 393 0 R - /Next 395 0 R - /A 27 0 R ->> endobj -395 0 obj -<< - /Title (\376\377\0\120\0\162\0\145\0\142\0\165\0\151\0\154\0\164\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 384 0 R - /Prev 394 0 R - /A 29 0 R ->> endobj -396 0 obj -<< - /Title (\376\377\0\125\0\163\0\145\0\162\0\40\0\144\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156) - /Parent 377 0 R - /First 397 0 R - /Last 421 0 R - /Prev 384 0 R - /Next 428 0 R - /Count -21 - /A 31 0 R ->> endobj -397 0 obj -<< - /Title (\376\377\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156) - /Parent 396 0 R - /Next 398 0 R - /A 33 0 R ->> endobj -398 0 obj -<< - /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163) - /Parent 396 0 R - /First 400 0 R - /Last 403 0 R - /Prev 397 0 R - /Next 404 0 R - /Count -4 - /A 35 0 R ->> endobj -400 0 obj -<< - /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) - /Parent 398 0 R - /Next 401 0 R - /A 399 0 R ->> endobj -401 0 obj -<< - /Title (\376\377\0\115\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 398 0 R - /Prev 400 0 R - /Next 402 0 R - /A 185 0 R ->> endobj -402 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\152\0\145\0\143\0\164\0\163) - /Parent 398 0 R - /Prev 401 0 R - /Next 403 0 R - /A 144 0 R ->> endobj -403 0 obj -<< - /Title (\376\377\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\40\0\125\0\164\0\151\0\154\0\151\0\164\0\171\0\40\0\122\0\165\0\154\0\145\0\163) - /Parent 398 0 R - /Prev 402 0 R - /A 188 0 R ->> endobj -404 0 obj -<< - /Title (\376\377\0\124\0\150\0\145\0\40\0\102\0\165\0\151\0\154\0\144\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163) - /Parent 396 0 R - /First 406 0 R - /Last 410 0 R - /Prev 398 0 R - /Next 411 0 R - /Count -3 - /A 37 0 R ->> endobj -406 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\162\0\145\0\161\0\165\0\145\0\163\0\164) - /Parent 404 0 R - /Next 408 0 R - /A 405 0 R ->> endobj -408 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\141\0\40\0\155\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164) - /Parent 404 0 R - /Prev 406 0 R - /Next 410 0 R - /A 407 0 R ->> endobj -410 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\141\0\40\0\160\0\162\0\157\0\152\0\145\0\143\0\164) - /Parent 404 0 R - /Prev 408 0 R - /A 409 0 R ->> endobj -411 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\164\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\164\0\171\0\160\0\145\0\163) - /Parent 396 0 R - /First 413 0 R - /Last 419 0 R - /Prev 404 0 R - /Next 420 0 R - /Count -5 - /A 39 0 R ->> endobj -413 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\163) - /Parent 411 0 R - /Next 415 0 R - /A 412 0 R ->> endobj -415 0 obj -<< - /Title (\376\377\0\114\0\151\0\142\0\162\0\141\0\162\0\151\0\145\0\163) - /Parent 411 0 R - /Prev 413 0 R - /Next 416 0 R - /A 414 0 R ->> endobj -416 0 obj -<< - /Title (\376\377\0\101\0\154\0\151\0\141\0\163) - /Parent 411 0 R - /Prev 415 0 R - /Next 417 0 R - /A 158 0 R ->> endobj -417 0 obj -<< - /Title (\376\377\0\111\0\156\0\163\0\164\0\141\0\154\0\154\0\151\0\156\0\147) - /Parent 411 0 R - /Prev 416 0 R - /Next 419 0 R - /A 242 0 R ->> endobj -419 0 obj -<< - /Title (\376\377\0\124\0\145\0\163\0\164\0\151\0\156\0\147) - /Parent 411 0 R - /Prev 417 0 R - /A 418 0 R ->> endobj -420 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\164\0\151\0\156\0\40\0\146\0\145\0\141\0\164\0\165\0\162\0\145\0\163) - /Parent 396 0 R - /Prev 411 0 R - /Next 421 0 R - /A 41 0 R ->> endobj -421 0 obj -<< - /Title (\376\377\0\104\0\151\0\146\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\164\0\157\0\40\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\126\0\61) - /Parent 396 0 R - /First 423 0 R - /Last 427 0 R - /Prev 420 0 R - /Count -3 - /A 43 0 R ->> endobj -423 0 obj -<< - /Title (\376\377\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156) - /Parent 421 0 R - /Next 425 0 R - /A 422 0 R ->> endobj -425 0 obj -<< - /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163) - /Parent 421 0 R - /Prev 423 0 R - /Next 427 0 R - /A 424 0 R ->> endobj -427 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\160\0\162\0\157\0\143\0\145\0\163\0\163) - /Parent 421 0 R - /Prev 425 0 R - /A 426 0 R ->> endobj -428 0 obj -<< - /Title (\376\377\0\105\0\170\0\164\0\145\0\156\0\144\0\145\0\162\0\40\0\115\0\141\0\156\0\165\0\141\0\154) - /Parent 377 0 R - /First 429 0 R - /Last 436 0 R - /Prev 396 0 R - /Next 437 0 R - /Count -7 - /A 45 0 R ->> endobj -429 0 obj -<< - /Title (\376\377\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) - /Parent 428 0 R - /Next 430 0 R - /A 47 0 R ->> endobj -430 0 obj -<< - /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\164\0\171\0\160\0\145\0\163) - /Parent 428 0 R - /First 432 0 R - /Last 432 0 R - /Prev 429 0 R - /Next 433 0 R - /Count -1 - /A 49 0 R ->> endobj -432 0 obj -<< - /Title (\376\377\0\123\0\143\0\141\0\156\0\156\0\145\0\162\0\163) - /Parent 430 0 R - /A 431 0 R ->> endobj -433 0 obj -<< - /Title (\376\377\0\124\0\157\0\157\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163) - /Parent 428 0 R - /Prev 430 0 R - /Next 434 0 R - /A 51 0 R ->> endobj -434 0 obj -<< - /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163) - /Parent 428 0 R - /Prev 433 0 R - /Next 435 0 R - /A 53 0 R ->> endobj -435 0 obj -<< - /Title (\376\377\0\115\0\141\0\151\0\156\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\162\0\165\0\154\0\145\0\163) - /Parent 428 0 R - /Prev 434 0 R - /Next 436 0 R - /A 55 0 R ->> endobj -436 0 obj -<< - /Title (\376\377\0\124\0\157\0\157\0\154\0\163\0\145\0\164\0\40\0\155\0\157\0\144\0\165\0\154\0\145\0\163) - /Parent 428 0 R - /Prev 435 0 R - /A 57 0 R ->> endobj -437 0 obj -<< - /Title (\376\377\0\104\0\145\0\164\0\141\0\151\0\154\0\145\0\144\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145) - /Parent 377 0 R - /First 438 0 R - /Last 463 0 R - /Prev 428 0 R - /Next 474 0 R - /Count -25 - /A 59 0 R ->> endobj -438 0 obj -<< - /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\154\0\40\0\151\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\157\0\156) - /Parent 437 0 R - /First 439 0 R - /Last 440 0 R - /Next 444 0 R - /Count -4 - /A 61 0 R ->> endobj -439 0 obj -<< - /Title (\376\377\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156) - /Parent 438 0 R - /Next 440 0 R - /A 170 0 R ->> endobj -440 0 obj -<< - /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145) - /Parent 438 0 R - /First 442 0 R - /Last 443 0 R - /Prev 439 0 R - /Count -2 - /A 110 0 R ->> endobj -442 0 obj -<< - /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145\0\40\0\141\0\162\0\147\0\165\0\155\0\145\0\156\0\164\0\163) - /Parent 440 0 R - /Next 443 0 R - /A 441 0 R ->> endobj -443 0 obj -<< - /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\154\0\151\0\156\0\145\0\40\0\157\0\160\0\164\0\151\0\157\0\156\0\163) - /Parent 440 0 R - /Prev 442 0 R - /A 318 0 R ->> endobj -444 0 obj -<< - /Title (\376\377\0\127\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\163) - /Parent 437 0 R - /First 446 0 R - /Last 446 0 R - /Prev 438 0 R - /Next 447 0 R - /Count -1 - /A 63 0 R ->> endobj -446 0 obj -<< - /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\150\0\145\0\141\0\144\0\145\0\162\0\163) - /Parent 444 0 R - /A 445 0 R ->> endobj -447 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\160\0\162\0\157\0\143\0\145\0\163\0\163) - /Parent 437 0 R - /First 449 0 R - /Last 451 0 R - /Prev 444 0 R - /Next 452 0 R - /Count -2 - /A 65 0 R ->> endobj -449 0 obj -<< - /Title (\376\377\0\101\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\166\0\145\0\40\0\163\0\145\0\154\0\145\0\143\0\164\0\151\0\157\0\156) - /Parent 447 0 R - /Next 451 0 R - /A 448 0 R ->> endobj -451 0 obj -<< - /Title (\376\377\0\104\0\145\0\164\0\145\0\162\0\155\0\151\0\156\0\151\0\156\0\147\0\40\0\143\0\157\0\155\0\155\0\157\0\156\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163) - /Parent 447 0 R - /Prev 449 0 R - /A 450 0 R ->> endobj -452 0 obj -<< - /Title (\376\377\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\163) - /Parent 437 0 R - /First 453 0 R - /Last 462 0 R - /Prev 447 0 R - /Next 463 0 R - /Count -8 - /A 67 0 R ->> endobj -453 0 obj -<< - /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163) - /Parent 452 0 R - /First 455 0 R - /Last 458 0 R - /Next 459 0 R - /Count -3 - /A 136 0 R ->> endobj -455 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\151\0\144\0\151\0\164\0\171) - /Parent 453 0 R - /Next 456 0 R - /A 454 0 R ->> endobj -456 0 obj -<< - /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\40\0\101\0\164\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\163) - /Parent 453 0 R - /Prev 455 0 R - /Next 458 0 R - /A 139 0 R ->> endobj -458 0 obj -<< - /Title (\376\377\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\40\0\104\0\145\0\143\0\154\0\141\0\162\0\141\0\164\0\151\0\157\0\156) - /Parent 453 0 R - /Prev 456 0 R - /A 457 0 R ->> endobj -459 0 obj -<< - /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\40\0\126\0\141\0\162\0\151\0\141\0\156\0\164\0\163) - /Parent 452 0 R - /Prev 453 0 R - /Next 460 0 R - /A 337 0 R ->> endobj -460 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\162\0\145\0\146\0\151\0\156\0\145\0\155\0\145\0\156\0\164) - /Parent 452 0 R - /Prev 459 0 R - /Next 461 0 R - /A 232 0 R ->> endobj -461 0 obj -<< - /Title (\376\377\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163) - /Parent 452 0 R - /Prev 460 0 R - /Next 462 0 R - /A 203 0 R ->> endobj -462 0 obj -<< - /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\151\0\144\0\145\0\156\0\164\0\151\0\146\0\151\0\145\0\162\0\163\0\40\0\141\0\156\0\144\0\40\0\162\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163) - /Parent 452 0 R - /Prev 461 0 R - /A 200 0 R ->> endobj -463 0 obj -<< - /Title (\376\377\0\107\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163) - /Parent 437 0 R - /First 465 0 R - /Last 473 0 R - /Prev 452 0 R - /Count -5 - /A 69 0 R ->> endobj -465 0 obj -<< - /Title (\376\377\0\123\0\145\0\154\0\145\0\143\0\164\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\162\0\141\0\156\0\153\0\151\0\156\0\147\0\40\0\166\0\151\0\141\0\142\0\154\0\145\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163) - /Parent 463 0 R - /Next 467 0 R - /A 464 0 R ->> endobj -467 0 obj -<< - /Title (\376\377\0\122\0\165\0\156\0\156\0\151\0\156\0\147\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\157\0\162\0\163) - /Parent 463 0 R - /Prev 465 0 R - /Next 469 0 R - /A 466 0 R ->> endobj -469 0 obj -<< - /Title (\376\377\0\123\0\145\0\154\0\145\0\143\0\164\0\151\0\156\0\147\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171\0\40\0\147\0\162\0\141\0\160\0\150) - /Parent 463 0 R - /Prev 467 0 R - /Next 471 0 R - /A 468 0 R ->> endobj -471 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\144\0\152\0\165\0\163\0\164\0\155\0\145\0\156\0\164) - /Parent 463 0 R - /Prev 469 0 R - /Next 473 0 R - /A 470 0 R ->> endobj -473 0 obj -<< - /Title (\376\377\0\124\0\162\0\141\0\156\0\163\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\143\0\141\0\143\0\150\0\145) - /Parent 463 0 R - /Prev 471 0 R - /A 472 0 R ->> endobj -474 0 obj -<< - /Title (\376\377\0\106\0\162\0\145\0\161\0\165\0\145\0\156\0\164\0\154\0\171\0\40\0\101\0\163\0\153\0\145\0\144\0\40\0\121\0\165\0\145\0\163\0\164\0\151\0\157\0\156\0\163) - /Parent 377 0 R - /First 475 0 R - /Last 483 0 R - /Prev 437 0 R - /Next 484 0 R - /Count -9 - /A 71 0 R ->> endobj -475 0 obj -<< - /Title (\376\377\0\111\0\47\0\155\0\40\0\147\0\145\0\164\0\164\0\151\0\156\0\147\0\40\0\42\0\104\0\165\0\160\0\154\0\151\0\143\0\141\0\164\0\145\0\40\0\156\0\141\0\155\0\145\0\40\0\157\0\146\0\40\0\141\0\143\0\164\0\165\0\141\0\154\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\42\0\40\0\145\0\162\0\162\0\157\0\162\0\56\0\40\0\127\0\150\0\141\0\164\0\40\0\144\0\157\0\145\0\163\0\40\0\151\0\164\0\40\0\155\0\145\0\141\0\156\0\77) - /Parent 474 0 R - /Next 476 0 R - /A 73 0 R ->> endobj -476 0 obj -<< - /Title (\376\377\0\101\0\143\0\143\0\145\0\163\0\163\0\151\0\156\0\147\0\40\0\145\0\156\0\166\0\151\0\162\0\157\0\156\0\155\0\145\0\156\0\164\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\163) - /Parent 474 0 R - /Prev 475 0 R - /Next 477 0 R - /A 75 0 R ->> endobj -477 0 obj -<< - /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\157\0\162\0\144\0\145\0\162\0\77) - /Parent 474 0 R - /Prev 476 0 R - /Next 478 0 R - /A 77 0 R ->> endobj -478 0 obj -<< - /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\164\0\150\0\145\0\40\0\154\0\151\0\142\0\162\0\141\0\162\0\171\0\40\0\157\0\162\0\144\0\145\0\162\0\40\0\157\0\156\0\40\0\125\0\156\0\151\0\170\0\77) - /Parent 474 0 R - /Prev 477 0 R - /Next 479 0 R - /A 79 0 R ->> endobj -479 0 obj -<< - /Title (\376\377\0\103\0\141\0\156\0\40\0\111\0\40\0\147\0\145\0\164\0\40\0\157\0\165\0\164\0\160\0\165\0\164\0\40\0\157\0\146\0\40\0\145\0\170\0\164\0\145\0\162\0\156\0\141\0\154\0\40\0\160\0\162\0\157\0\147\0\162\0\141\0\155\0\40\0\141\0\163\0\40\0\141\0\40\0\166\0\141\0\162\0\151\0\141\0\142\0\154\0\145\0\40\0\151\0\156\0\40\0\141\0\40\0\112\0\141\0\155\0\146\0\151\0\154\0\145\0\77) - /Parent 474 0 R - /Prev 478 0 R - /Next 480 0 R - /A 81 0 R ->> endobj -480 0 obj -<< - /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\147\0\145\0\164\0\40\0\164\0\150\0\145\0\40\0\160\0\162\0\157\0\152\0\145\0\143\0\164\0\55\0\162\0\157\0\157\0\164\0\40\0\154\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\77) - /Parent 474 0 R - /Prev 479 0 R - /Next 481 0 R - /A 83 0 R ->> endobj -481 0 obj -<< - /Title (\376\377\0\110\0\157\0\167\0\40\0\164\0\157\0\40\0\143\0\150\0\141\0\156\0\147\0\145\0\40\0\143\0\157\0\155\0\160\0\151\0\154\0\141\0\164\0\151\0\157\0\156\0\40\0\146\0\154\0\141\0\147\0\163\0\40\0\146\0\157\0\162\0\40\0\157\0\156\0\145\0\40\0\146\0\151\0\154\0\145\0\77) - /Parent 474 0 R - /Prev 480 0 R - /Next 482 0 R - /A 85 0 R ->> endobj -482 0 obj -<< - /Title (\376\377\0\127\0\150\0\171\0\40\0\141\0\162\0\145\0\40\0\164\0\150\0\145\0\40\0\144\0\154\0\154\0\55\0\160\0\141\0\164\0\150\0\40\0\141\0\156\0\144\0\40\0\150\0\141\0\162\0\144\0\143\0\157\0\144\0\145\0\55\0\144\0\154\0\154\0\55\0\160\0\141\0\164\0\150\0\163\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\165\0\163\0\145\0\146\0\165\0\154\0\77) - /Parent 474 0 R - /Prev 481 0 R - /Next 483 0 R - /A 87 0 R ->> endobj -483 0 obj -<< - /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\163\0\40\0\151\0\156\0\40\0\163\0\151\0\164\0\145\0\55\0\143\0\157\0\156\0\146\0\151\0\147\0\56\0\152\0\141\0\155) - /Parent 474 0 R - /Prev 482 0 R - /A 89 0 R ->> endobj -484 0 obj -<< - /Title (\376\377\0\101\0\160\0\160\0\145\0\156\0\144\0\151\0\170\0\240\0\101\0\56\0\240\0\102\0\157\0\157\0\163\0\164\0\56\0\102\0\165\0\151\0\154\0\144\0\40\0\166\0\62\0\40\0\141\0\162\0\143\0\150\0\151\0\164\0\145\0\143\0\164\0\165\0\162\0\145) - /Parent 377 0 R - /First 485 0 R - /Last 494 0 R - /Prev 474 0 R - /Count -15 - /A 91 0 R ->> endobj -485 0 obj -<< - /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) - /Parent 484 0 R - /Next 486 0 R - /A 93 0 R ->> endobj -486 0 obj -<< - /Title (\376\377\0\124\0\150\0\145\0\40\0\142\0\165\0\151\0\154\0\144\0\40\0\154\0\141\0\171\0\145\0\162) - /Parent 484 0 R - /First 488 0 R - /Last 492 0 R - /Prev 485 0 R - /Next 493 0 R - /Count -3 - /A 95 0 R ->> endobj -488 0 obj -<< - /Title (\376\377\0\115\0\145\0\164\0\141\0\164\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 486 0 R - /Next 490 0 R - /A 487 0 R ->> endobj -490 0 obj -<< - /Title (\376\377\0\126\0\151\0\162\0\164\0\165\0\141\0\154\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 486 0 R - /Prev 488 0 R - /Next 492 0 R - /A 489 0 R ->> endobj -492 0 obj -<< - /Title () - /Parent 486 0 R - /Prev 490 0 R - /A 491 0 R ->> endobj -493 0 obj -<< - /Title (\376\377\0\124\0\150\0\145\0\40\0\164\0\157\0\157\0\154\0\163\0\40\0\154\0\141\0\171\0\145\0\162) - /Parent 484 0 R - /Prev 486 0 R - /Next 494 0 R - /A 97 0 R ->> endobj -494 0 obj -<< - /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 484 0 R - /First 496 0 R - /Last 496 0 R - /Prev 493 0 R - /Count -8 - /A 99 0 R ->> endobj -496 0 obj -<< - /Title (\376\377\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171\0\40\0\163\0\143\0\141\0\156\0\156\0\151\0\156\0\147) - /Parent 494 0 R - /First 498 0 R - /Last 504 0 R - /Count -7 - /A 495 0 R ->> endobj -498 0 obj -<< - /Title (\376\377\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\40\0\146\0\157\0\162\0\40\0\144\0\151\0\146\0\146\0\145\0\162\0\145\0\156\0\164\0\40\0\163\0\143\0\141\0\156\0\156\0\151\0\156\0\147\0\40\0\141\0\154\0\147\0\157\0\162\0\151\0\164\0\150\0\155\0\163) - /Parent 496 0 R - /Next 500 0 R - /A 497 0 R ->> endobj -500 0 obj -<< - /Title (\376\377\0\101\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\164\0\157\0\40\0\163\0\143\0\141\0\156\0\40\0\164\0\150\0\145\0\40\0\163\0\141\0\155\0\145\0\40\0\146\0\151\0\154\0\145\0\40\0\163\0\145\0\166\0\145\0\162\0\141\0\154\0\40\0\164\0\151\0\155\0\145\0\163) - /Parent 496 0 R - /Prev 498 0 R - /Next 502 0 R - /A 499 0 R ->> endobj -502 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\40\0\144\0\145\0\164\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\151\0\145\0\163\0\40\0\157\0\156\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\146\0\151\0\154\0\145\0\163\0\56) - /Parent 496 0 R - /Prev 500 0 R - /Next 504 0 R - /A 501 0 R ->> endobj -504 0 obj -<< - /Title (\376\377\0\120\0\162\0\157\0\160\0\145\0\162\0\40\0\144\0\145\0\164\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\144\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\151\0\145\0\163\0\40\0\146\0\162\0\157\0\155\0\40\0\147\0\145\0\156\0\145\0\162\0\141\0\164\0\145\0\144\0\40\0\146\0\151\0\154\0\145\0\163) - /Parent 496 0 R - /First 506 0 R - /Last 510 0 R - /Prev 502 0 R - /Count -3 - /A 503 0 R ->> endobj -506 0 obj -<< - /Title (\376\377\0\106\0\151\0\154\0\145\0\40\0\164\0\141\0\162\0\147\0\145\0\164\0\163) - /Parent 504 0 R - /First 508 0 R - /Last 508 0 R - /Next 510 0 R - /Count -1 - /A 505 0 R ->> endobj -508 0 obj -<< - /Title (\376\377\0\124\0\171\0\160\0\145\0\163) - /Parent 506 0 R - /A 507 0 R ->> endobj -510 0 obj -<< - /Title (\376\377\0\124\0\141\0\162\0\147\0\145\0\164\0\40\0\160\0\141\0\164\0\150\0\163) - /Parent 504 0 R - /Prev 506 0 R - /A 509 0 R ->> endobj -511 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F3 -/BaseFont /Helvetica-Bold -/Encoding /WinAnsiEncoding >> -endobj -512 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F5 -/BaseFont /Times-Roman -/Encoding /WinAnsiEncoding >> -endobj -513 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F10 -/BaseFont /Courier-Oblique -/Encoding /WinAnsiEncoding >> -endobj -514 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F6 -/BaseFont /Times-Italic -/Encoding /WinAnsiEncoding >> -endobj -515 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F1 -/BaseFont /Helvetica -/Encoding /WinAnsiEncoding >> -endobj -516 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F11 -/BaseFont /Courier-Bold -/Encoding /WinAnsiEncoding >> -endobj -517 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F9 -/BaseFont /Courier -/Encoding /WinAnsiEncoding >> -endobj -518 0 obj -<< /Type /Font -/Subtype /Type1 -/Name /F7 -/BaseFont /Times-Bold -/Encoding /WinAnsiEncoding >> -endobj -1 0 obj -<< /Type /Pages -/Count 57 -/Kids [6 0 R 8 0 R 101 0 R 114 0 R 127 0 R 131 0 R 133 0 R 141 0 R 147 0 R 149 0 R 155 0 R 160 0 R 164 0 R 180 0 R 182 0 R 192 0 R 205 0 R 210 0 R 216 0 R 227 0 R 237 0 R 245 0 R 249 0 R 257 0 R 265 0 R 272 0 R 281 0 R 283 0 R 290 0 R 294 0 R 296 0 R 298 0 R 303 0 R 307 0 R 309 0 R 311 0 R 313 0 R 315 0 R 321 0 R 323 0 R 327 0 R 332 0 R 339 0 R 341 0 R 343 0 R 345 0 R 349 0 R 354 0 R 356 0 R 360 0 R 362 0 R 364 0 R 366 0 R 368 0 R 370 0 R 372 0 R 376 0 R ] >> -endobj -2 0 obj -<< /Type /Catalog -/Pages 1 0 R - /Outlines 377 0 R - /PageMode /UseOutlines - >> -endobj -3 0 obj -<< -/Font << /F3 511 0 R /F5 512 0 R /F10 513 0 R /F1 515 0 R /F6 514 0 R /F9 517 0 R /F11 516 0 R /F7 518 0 R >> -/ProcSet [ /PDF /ImageC /Text ] >> -endobj -11 0 obj -<< -/S /GoTo -/D [101 0 R /XYZ 67.0 725.0 null] ->> -endobj -13 0 obj -<< -/S /GoTo -/D [114 0 R /XYZ 67.0 725.0 null] ->> -endobj -15 0 obj -<< -/S /GoTo -/D [131 0 R /XYZ 67.0 725.0 null] ->> -endobj -17 0 obj -<< -/S /GoTo -/D [131 0 R /XYZ 67.0 687.009 null] ->> -endobj -19 0 obj -<< -/S /GoTo -/D [131 0 R /XYZ 67.0 241.503 null] ->> -endobj -21 0 obj -<< -/S /GoTo -/D [141 0 R /XYZ 67.0 684.14 null] ->> -endobj -23 0 obj -<< -/S /GoTo -/D [147 0 R /XYZ 67.0 725.0 null] ->> -endobj -25 0 obj -<< -/S /GoTo -/D [149 0 R /XYZ 67.0 502.846 null] ->> -endobj -27 0 obj -<< -/S /GoTo -/D [155 0 R /XYZ 67.0 434.852 null] ->> -endobj -29 0 obj -<< -/S /GoTo -/D [155 0 R /XYZ 67.0 142.786 null] ->> -endobj -31 0 obj -<< -/S /GoTo -/D [164 0 R /XYZ 67.0 725.0 null] ->> -endobj -33 0 obj -<< -/S /GoTo -/D [164 0 R /XYZ 67.0 328.009 null] ->> -endobj -35 0 obj -<< -/S /GoTo -/D [182 0 R /XYZ 67.0 652.28 null] ->> -endobj -37 0 obj -<< -/S /GoTo -/D [216 0 R /XYZ 67.0 401.548 null] ->> -endobj -39 0 obj -<< -/S /GoTo -/D [227 0 R /XYZ 67.0 114.542 null] ->> -endobj -41 0 obj -<< -/S /GoTo -/D [257 0 R /XYZ 67.0 378.267 null] ->> -endobj -43 0 obj -<< -/S /GoTo -/D [265 0 R /XYZ 67.0 138.42 null] ->> -endobj -45 0 obj -<< -/S /GoTo -/D [281 0 R /XYZ 67.0 725.0 null] ->> -endobj -47 0 obj -<< -/S /GoTo -/D [281 0 R /XYZ 67.0 687.009 null] ->> -endobj -49 0 obj -<< -/S /GoTo -/D [283 0 R /XYZ 67.0 632.28 null] ->> -endobj -51 0 obj -<< -/S /GoTo -/D [290 0 R /XYZ 67.0 436.4 null] ->> -endobj -53 0 obj -<< -/S /GoTo -/D [298 0 R /XYZ 67.0 714.0 null] ->> -endobj -55 0 obj -<< -/S /GoTo -/D [307 0 R /XYZ 67.0 328.521 null] ->> -endobj -57 0 obj -<< -/S /GoTo -/D [309 0 R /XYZ 67.0 479.26 null] ->> -endobj -59 0 obj -<< -/S /GoTo -/D [313 0 R /XYZ 67.0 725.0 null] ->> -endobj -61 0 obj -<< -/S /GoTo -/D [313 0 R /XYZ 67.0 687.009 null] ->> -endobj -63 0 obj -<< -/S /GoTo -/D [321 0 R /XYZ 67.0 426.069 null] ->> -endobj -65 0 obj -<< -/S /GoTo -/D [321 0 R /XYZ 67.0 120.724 null] ->> -endobj -67 0 obj -<< -/S /GoTo -/D [327 0 R /XYZ 67.0 580.56 null] ->> -endobj -69 0 obj -<< -/S /GoTo -/D [343 0 R /XYZ 67.0 663.28 null] ->> -endobj -71 0 obj -<< -/S /GoTo -/D [349 0 R /XYZ 67.0 725.0 null] ->> -endobj -73 0 obj -<< -/S /GoTo -/D [349 0 R /XYZ 67.0 687.009 null] ->> -endobj -75 0 obj -<< -/S /GoTo -/D [349 0 R /XYZ 67.0 199.037 null] ->> -endobj -77 0 obj -<< -/S /GoTo -/D [354 0 R /XYZ 67.0 665.56 null] ->> -endobj -79 0 obj -<< -/S /GoTo -/D [354 0 R /XYZ 67.0 433.794 null] ->> -endobj -81 0 obj -<< -/S /GoTo -/D [354 0 R /XYZ 67.0 162.448 null] ->> -endobj -83 0 obj -<< -/S /GoTo -/D [356 0 R /XYZ 67.0 549.98 null] ->> -endobj -85 0 obj -<< -/S /GoTo -/D [356 0 R /XYZ 67.0 433.934 null] ->> -endobj -87 0 obj -<< -/S /GoTo -/D [356 0 R /XYZ 67.0 197.868 null] ->> -endobj -89 0 obj -<< -/S /GoTo -/D [360 0 R /XYZ 67.0 383.42 null] ->> -endobj -91 0 obj -<< -/S /GoTo -/D [362 0 R /XYZ 67.0 725.0 null] ->> -endobj -93 0 obj -<< -/S /GoTo -/D [362 0 R /XYZ 67.0 604.018 null] ->> -endobj -95 0 obj -<< -/S /GoTo -/D [362 0 R /XYZ 67.0 505.692 null] ->> -endobj -97 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 639.0 null] ->> -endobj -99 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 584.674 null] ->> -endobj -110 0 obj -<< -/S /GoTo -/D [315 0 R /XYZ 67.0 725.0 null] ->> -endobj -136 0 obj -<< -/S /GoTo -/D [327 0 R /XYZ 67.0 547.234 null] ->> -endobj -139 0 obj -<< -/S /GoTo -/D [327 0 R /XYZ 67.0 170.596 null] ->> -endobj -144 0 obj -<< -/S /GoTo -/D [205 0 R /XYZ 67.0 371.12 null] ->> -endobj -152 0 obj -<< -/S /GoTo -/D [341 0 R /XYZ 67.0 196.801 null] ->> -endobj -158 0 obj -<< -/S /GoTo -/D [245 0 R /XYZ 67.0 251.692 null] ->> -endobj -168 0 obj -<< -/S /GoTo -/D [321 0 R /XYZ 67.0 582.819 null] ->> -endobj -170 0 obj -<< -/S /GoTo -/D [313 0 R /XYZ 67.0 653.683 null] ->> -endobj -178 0 obj -<< -/S /GoTo -/D [313 0 R /XYZ 67.0 340.804 null] ->> -endobj -185 0 obj -<< -/S /GoTo -/D [182 0 R /XYZ 67.0 442.515 null] ->> -endobj -188 0 obj -<< -/S /GoTo -/D [210 0 R /XYZ 67.0 111.824 null] ->> -endobj -195 0 obj -<< -/S /GoTo -/D [210 0 R /XYZ 67.0 652.0 null] ->> -endobj -200 0 obj -<< -/S /GoTo -/D [341 0 R /XYZ 67.0 624.56 null] ->> -endobj -203 0 obj -<< -/S /GoTo -/D [339 0 R /XYZ 67.0 250.203 null] ->> -endobj -214 0 obj -<< -/S /GoTo -/D [null /XYZ 0.0 0.0 null] ->> -endobj -221 0 obj -<< -/S /GoTo -/D [null /XYZ 0.0 0.0 null] ->> -endobj -223 0 obj -<< -/S /GoTo -/D [null /XYZ 0.0 0.0 null] ->> -endobj -232 0 obj -<< -/S /GoTo -/D [339 0 R /XYZ 67.0 373.642 null] ->> -endobj -235 0 obj -<< -/S /GoTo -/D [332 0 R /XYZ 67.0 608.0 null] ->> -endobj -240 0 obj -<< -/S /GoTo -/D [182 0 R /XYZ 67.0 349.076 null] ->> -endobj -242 0 obj -<< -/S /GoTo -/D [249 0 R /XYZ 67.0 521.12 null] ->> -endobj -255 0 obj -<< -/S /GoTo -/D [265 0 R /XYZ 67.0 419.42 null] ->> -endobj -262 0 obj -<< -/S /GoTo -/D [265 0 R /XYZ 67.0 484.42 null] ->> -endobj -278 0 obj -<< -/S /GoTo -/D [265 0 R /XYZ 67.0 612.42 null] ->> -endobj -288 0 obj -<< -/S /GoTo -/D [307 0 R /XYZ 67.0 253.195 null] ->> -endobj -318 0 obj -<< -/S /GoTo -/D [321 0 R /XYZ 67.0 714.0 null] ->> -endobj -330 0 obj -<< -/S /GoTo -/D [332 0 R /XYZ 67.0 533.0 null] ->> -endobj -335 0 obj -<< -/S /GoTo -/D [182 0 R /XYZ 67.0 403.076 null] ->> -endobj -337 0 obj -<< -/S /GoTo -/D [339 0 R /XYZ 67.0 479.081 null] ->> -endobj -377 0 obj -<< - /First 379 0 R - /Last 484 0 R ->> endobj -378 0 obj -<< -/S /GoTo -/D [6 0 R /XYZ 67.0 725.0 null] ->> -endobj -380 0 obj -<< -/S /GoTo -/D [8 0 R /XYZ 67.0 715.0 null] ->> -endobj -387 0 obj -<< -/S /GoTo -/D [133 0 R /XYZ 67.0 519.56 null] ->> -endobj -389 0 obj -<< -/S /GoTo -/D [133 0 R /XYZ 67.0 243.687 null] ->> -endobj -399 0 obj -<< -/S /GoTo -/D [182 0 R /XYZ 67.0 618.954 null] ->> -endobj -405 0 obj -<< -/S /GoTo -/D [216 0 R /XYZ 67.0 224.088 null] ->> -endobj -407 0 obj -<< -/S /GoTo -/D [227 0 R /XYZ 67.0 684.14 null] ->> -endobj -409 0 obj -<< -/S /GoTo -/D [227 0 R /XYZ 67.0 290.701 null] ->> -endobj -412 0 obj -<< -/S /GoTo -/D [237 0 R /XYZ 67.0 725.0 null] ->> -endobj -414 0 obj -<< -/S /GoTo -/D [237 0 R /XYZ 67.0 522.987 null] ->> -endobj -418 0 obj -<< -/S /GoTo -/D [257 0 R /XYZ 67.0 554.426 null] ->> -endobj -422 0 obj -<< -/S /GoTo -/D [272 0 R /XYZ 67.0 704.0 null] ->> -endobj -424 0 obj -<< -/S /GoTo -/D [272 0 R /XYZ 67.0 620.561 null] ->> -endobj -426 0 obj -<< -/S /GoTo -/D [272 0 R /XYZ 67.0 317.682 null] ->> -endobj -431 0 obj -<< -/S /GoTo -/D [283 0 R /XYZ 67.0 210.934 null] ->> -endobj -441 0 obj -<< -/S /GoTo -/D [315 0 R /XYZ 67.0 601.561 null] ->> -endobj -445 0 obj -<< -/S /GoTo -/D [321 0 R /XYZ 67.0 371.743 null] ->> -endobj -448 0 obj -<< -/S /GoTo -/D [323 0 R /XYZ 67.0 505.0 null] ->> -endobj -450 0 obj -<< -/S /GoTo -/D [323 0 R /XYZ 67.0 327.561 null] ->> -endobj -454 0 obj -<< -/S /GoTo -/D [327 0 R /XYZ 67.0 250.795 null] ->> -endobj -457 0 obj -<< -/S /GoTo -/D [339 0 R /XYZ 67.0 577.0 null] ->> -endobj -464 0 obj -<< -/S /GoTo -/D [343 0 R /XYZ 67.0 442.82 null] ->> -endobj -466 0 obj -<< -/S /GoTo -/D [343 0 R /XYZ 67.0 200.381 null] ->> -endobj -468 0 obj -<< -/S /GoTo -/D [345 0 R /XYZ 67.0 682.0 null] ->> -endobj -470 0 obj -<< -/S /GoTo -/D [345 0 R /XYZ 67.0 609.561 null] ->> -endobj -472 0 obj -<< -/S /GoTo -/D [345 0 R /XYZ 67.0 323.122 null] ->> -endobj -487 0 obj -<< -/S /GoTo -/D [362 0 R /XYZ 67.0 123.366 null] ->> -endobj -489 0 obj -<< -/S /GoTo -/D [364 0 R /XYZ 67.0 334.42 null] ->> -endobj -491 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 704.0 null] ->> -endobj -495 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 399.348 null] ->> -endobj -497 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 211.909 null] ->> -endobj -499 0 obj -<< -/S /GoTo -/D [366 0 R /XYZ 67.0 153.71 null] ->> -endobj -501 0 obj -<< -/S /GoTo -/D [368 0 R /XYZ 67.0 517.98 null] ->> -endobj -503 0 obj -<< -/S /GoTo -/D [370 0 R /XYZ 67.0 180.66 null] ->> -endobj -505 0 obj -<< -/S /GoTo -/D [372 0 R /XYZ 67.0 208.406 null] ->> -endobj -507 0 obj -<< -/S /GoTo -/D [372 0 R /XYZ 67.0 130.906 null] ->> -endobj -509 0 obj -<< -/S /GoTo -/D [376 0 R /XYZ 67.0 703.0 null] ->> -endobj -xref -0 519 -0000000000 65535 f -0000206879 00000 n -0000207384 00000 n -0000207477 00000 n -0000000015 00000 n -0000000071 00000 n -0000000399 00000 n -0000000505 00000 n -0000002747 00000 n -0000002867 00000 n -0000003201 00000 n -0000207643 00000 n -0000003336 00000 n -0000207708 00000 n -0000003470 00000 n -0000207773 00000 n -0000003605 00000 n -0000207838 00000 n -0000003740 00000 n -0000207905 00000 n -0000003875 00000 n -0000207972 00000 n -0000004010 00000 n -0000208038 00000 n -0000004145 00000 n -0000208103 00000 n -0000004280 00000 n -0000208170 00000 n -0000004415 00000 n -0000208237 00000 n -0000004550 00000 n -0000208304 00000 n -0000004685 00000 n -0000208369 00000 n -0000004820 00000 n -0000208436 00000 n -0000004955 00000 n -0000208502 00000 n -0000005090 00000 n -0000208569 00000 n -0000005225 00000 n -0000208636 00000 n -0000005360 00000 n -0000208703 00000 n -0000005495 00000 n -0000208769 00000 n -0000005630 00000 n -0000208834 00000 n -0000005765 00000 n -0000208901 00000 n -0000005900 00000 n -0000208967 00000 n -0000006035 00000 n -0000209032 00000 n -0000006170 00000 n -0000209097 00000 n -0000006305 00000 n -0000209164 00000 n -0000006440 00000 n -0000209230 00000 n -0000006575 00000 n -0000209295 00000 n -0000006710 00000 n -0000209362 00000 n -0000006845 00000 n -0000209429 00000 n -0000006980 00000 n -0000209496 00000 n -0000007114 00000 n -0000209562 00000 n -0000007249 00000 n -0000209628 00000 n -0000007384 00000 n -0000209693 00000 n -0000007519 00000 n -0000209760 00000 n -0000007654 00000 n -0000209827 00000 n -0000007789 00000 n -0000209893 00000 n -0000007924 00000 n -0000209960 00000 n -0000008059 00000 n -0000210027 00000 n -0000008194 00000 n -0000210093 00000 n -0000008329 00000 n -0000210160 00000 n -0000008464 00000 n -0000210227 00000 n -0000008599 00000 n -0000210293 00000 n -0000008734 00000 n -0000210358 00000 n -0000008869 00000 n -0000210425 00000 n -0000009003 00000 n -0000210492 00000 n -0000009138 00000 n -0000210557 00000 n -0000009273 00000 n -0000010375 00000 n -0000010501 00000 n -0000010594 00000 n -0000010732 00000 n -0000010870 00000 n -0000011008 00000 n -0000011146 00000 n -0000011281 00000 n -0000011421 00000 n -0000210624 00000 n -0000011562 00000 n -0000011699 00000 n -0000011902 00000 n -0000015314 00000 n -0000015440 00000 n -0000015541 00000 n -0000015768 00000 n -0000015964 00000 n -0000016187 00000 n -0000016414 00000 n -0000016637 00000 n -0000016828 00000 n -0000017019 00000 n -0000017249 00000 n -0000017454 00000 n -0000017655 00000 n -0000018314 00000 n -0000018440 00000 n -0000018469 00000 n -0000018637 00000 n -0000021291 00000 n -0000021401 00000 n -0000024426 00000 n -0000024552 00000 n -0000024597 00000 n -0000210690 00000 n -0000024734 00000 n -0000024874 00000 n -0000210758 00000 n -0000025008 00000 n -0000028010 00000 n -0000028136 00000 n -0000028173 00000 n -0000210826 00000 n -0000028308 00000 n -0000028443 00000 n -0000031575 00000 n -0000031685 00000 n -0000034542 00000 n -0000034668 00000 n -0000034705 00000 n -0000210893 00000 n -0000034841 00000 n -0000034976 00000 n -0000038333 00000 n -0000038459 00000 n -0000038488 00000 n -0000210961 00000 n -0000038624 00000 n -0000040663 00000 n -0000040789 00000 n -0000040818 00000 n -0000040952 00000 n -0000043981 00000 n -0000044107 00000 n -0000044208 00000 n -0000044348 00000 n -0000211029 00000 n -0000044487 00000 n -0000211097 00000 n -0000044628 00000 n -0000044765 00000 n -0000044901 00000 n -0000045036 00000 n -0000045172 00000 n -0000045393 00000 n -0000045595 00000 n -0000211165 00000 n -0000045736 00000 n -0000048550 00000 n -0000048660 00000 n -0000051127 00000 n -0000051253 00000 n -0000051314 00000 n -0000211233 00000 n -0000051451 00000 n -0000051588 00000 n -0000211301 00000 n -0000051725 00000 n -0000051865 00000 n -0000052003 00000 n -0000055027 00000 n -0000055153 00000 n -0000055230 00000 n -0000211369 00000 n -0000055367 00000 n -0000055506 00000 n -0000055673 00000 n -0000055811 00000 n -0000211435 00000 n -0000055950 00000 n -0000056085 00000 n -0000211502 00000 n -0000056222 00000 n -0000059184 00000 n -0000059310 00000 n -0000059347 00000 n -0000059481 00000 n -0000059618 00000 n -0000063153 00000 n -0000063279 00000 n -0000063316 00000 n -0000063457 00000 n -0000211570 00000 n -0000063596 00000 n -0000066530 00000 n -0000066656 00000 n -0000066725 00000 n -0000066862 00000 n -0000066999 00000 n -0000211630 00000 n -0000067136 00000 n -0000211690 00000 n -0000067272 00000 n -0000067411 00000 n -0000067546 00000 n -0000070645 00000 n -0000070771 00000 n -0000070832 00000 n -0000070969 00000 n -0000071107 00000 n -0000211750 00000 n -0000071248 00000 n -0000071389 00000 n -0000211818 00000 n -0000071530 00000 n -0000074700 00000 n -0000074826 00000 n -0000074871 00000 n -0000211884 00000 n -0000075010 00000 n -0000211952 00000 n -0000075148 00000 n -0000075287 00000 n -0000078032 00000 n -0000078158 00000 n -0000078187 00000 n -0000078326 00000 n -0000080936 00000 n -0000081062 00000 n -0000081115 00000 n -0000081253 00000 n -0000081392 00000 n -0000081530 00000 n -0000212019 00000 n -0000081671 00000 n -0000084262 00000 n -0000084388 00000 n -0000084441 00000 n -0000084575 00000 n -0000084710 00000 n -0000212086 00000 n -0000084847 00000 n -0000084985 00000 n -0000088281 00000 n -0000088407 00000 n -0000088460 00000 n -0000088598 00000 n -0000088733 00000 n -0000088869 00000 n -0000089007 00000 n -0000091786 00000 n -0000091912 00000 n -0000091973 00000 n -0000092111 00000 n -0000092250 00000 n -0000092385 00000 n -0000212153 00000 n -0000092526 00000 n -0000092664 00000 n -0000095418 00000 n -0000095528 00000 n -0000098390 00000 n -0000098516 00000 n -0000098561 00000 n -0000098754 00000 n -0000098892 00000 n -0000212220 00000 n -0000099031 00000 n -0000102230 00000 n -0000102356 00000 n -0000102385 00000 n -0000102523 00000 n -0000105782 00000 n -0000105892 00000 n -0000108324 00000 n -0000108434 00000 n -0000111669 00000 n -0000111795 00000 n -0000111832 00000 n -0000111972 00000 n -0000112108 00000 n -0000114554 00000 n -0000114680 00000 n -0000114709 00000 n -0000114842 00000 n -0000117501 00000 n -0000117611 00000 n -0000120708 00000 n -0000120818 00000 n -0000121917 00000 n -0000122027 00000 n -0000124356 00000 n -0000124466 00000 n -0000126512 00000 n -0000126638 00000 n -0000126675 00000 n -0000212288 00000 n -0000126814 00000 n -0000126953 00000 n -0000129743 00000 n -0000129853 00000 n -0000132204 00000 n -0000132330 00000 n -0000132359 00000 n -0000132495 00000 n -0000136017 00000 n -0000136143 00000 n -0000136172 00000 n -0000212354 00000 n -0000136312 00000 n -0000139639 00000 n -0000139765 00000 n -0000139802 00000 n -0000212420 00000 n -0000139939 00000 n -0000212488 00000 n -0000140076 00000 n -0000142781 00000 n -0000142891 00000 n -0000144678 00000 n -0000144788 00000 n -0000148264 00000 n -0000148374 00000 n -0000151279 00000 n -0000151405 00000 n -0000151434 00000 n -0000151633 00000 n -0000154082 00000 n -0000154208 00000 n -0000154245 00000 n -0000154385 00000 n -0000154521 00000 n -0000157215 00000 n -0000157325 00000 n -0000159841 00000 n -0000159967 00000 n -0000159996 00000 n -0000160134 00000 n -0000163374 00000 n -0000163484 00000 n -0000166158 00000 n -0000166268 00000 n -0000169785 00000 n -0000169895 00000 n -0000173246 00000 n -0000173356 00000 n -0000176361 00000 n -0000176471 00000 n -0000179076 00000 n -0000179186 00000 n -0000182337 00000 n -0000182463 00000 n -0000182492 00000 n -0000182721 00000 n -0000184242 00000 n -0000212556 00000 n -0000212610 00000 n -0000184352 00000 n -0000212674 00000 n -0000184636 00000 n -0000184837 00000 n -0000185077 00000 n -0000185249 00000 n -0000185439 00000 n -0000185594 00000 n -0000212738 00000 n -0000185796 00000 n -0000212805 00000 n -0000186106 00000 n -0000186299 00000 n -0000186512 00000 n -0000186713 00000 n -0000186966 00000 n -0000187226 00000 n -0000187406 00000 n -0000187656 00000 n -0000187819 00000 n -0000212873 00000 n -0000188056 00000 n -0000188190 00000 n -0000188362 00000 n -0000188511 00000 n -0000188721 00000 n -0000212941 00000 n -0000188963 00000 n -0000213009 00000 n -0000189126 00000 n -0000213076 00000 n -0000189356 00000 n -0000189548 00000 n -0000213144 00000 n -0000189808 00000 n -0000213210 00000 n -0000189942 00000 n -0000190097 00000 n -0000190228 00000 n -0000213278 00000 n -0000190389 00000 n -0000190517 00000 n -0000190712 00000 n -0000213346 00000 n -0000191008 00000 n -0000213412 00000 n -0000191172 00000 n -0000213480 00000 n -0000191368 00000 n -0000191531 00000 n -0000191762 00000 n -0000191919 00000 n -0000213548 00000 n -0000192132 00000 n -0000192251 00000 n -0000192469 00000 n -0000192617 00000 n -0000192817 00000 n -0000192991 00000 n -0000193241 00000 n -0000193481 00000 n -0000193651 00000 n -0000213616 00000 n -0000193850 00000 n -0000194066 00000 n -0000194270 00000 n -0000213684 00000 n -0000194507 00000 n -0000194679 00000 n -0000213752 00000 n -0000194898 00000 n -0000213818 00000 n -0000195109 00000 n -0000195367 00000 n -0000195575 00000 n -0000213886 00000 n -0000195839 00000 n -0000196026 00000 n -0000213954 00000 n -0000196234 00000 n -0000196433 00000 n -0000196617 00000 n -0000196831 00000 n -0000197063 00000 n -0000197344 00000 n -0000214020 00000 n -0000197531 00000 n -0000214087 00000 n -0000197847 00000 n -0000214155 00000 n -0000198055 00000 n -0000214221 00000 n -0000198310 00000 n -0000214289 00000 n -0000198524 00000 n -0000198735 00000 n -0000199031 00000 n -0000199526 00000 n -0000199810 00000 n -0000200097 00000 n -0000200435 00000 n -0000200906 00000 n -0000201221 00000 n -0000201583 00000 n -0000202044 00000 n -0000202281 00000 n -0000202638 00000 n -0000202771 00000 n -0000214357 00000 n -0000203001 00000 n -0000214425 00000 n -0000203153 00000 n -0000214492 00000 n -0000203343 00000 n -0000203421 00000 n -0000203609 00000 n -0000214558 00000 n -0000203778 00000 n -0000214626 00000 n -0000204004 00000 n -0000214694 00000 n -0000204332 00000 n -0000214761 00000 n -0000204684 00000 n -0000214828 00000 n -0000205090 00000 n -0000214895 00000 n -0000205530 00000 n -0000214963 00000 n -0000205729 00000 n -0000215031 00000 n -0000205830 00000 n -0000205987 00000 n -0000206101 00000 n -0000206212 00000 n -0000206328 00000 n -0000206440 00000 n -0000206549 00000 n -0000206662 00000 n -0000206769 00000 n -trailer -<< -/Size 519 -/Root 2 0 R -/Info 4 0 R ->> -startxref -215097 -%%EOF diff --git a/v2/example/boost-build.jam b/v2/example/boost-build.jam deleted file mode 100644 index efcc231fe..000000000 --- a/v2/example/boost-build.jam +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2002, 2003 Vladimir Prus -# 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) - - -boost-build ../kernel ; diff --git a/v2/example/customization/Jamfile b/v2/example/customization/Jamfile deleted file mode 100644 index eee0f4f4c..000000000 --- a/v2/example/customization/Jamfile +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2003, 2004 Vladimir Prus -# 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) - - -exe codegen : codegen.cpp class.verbatim usage.verbatim - t1.verbatim ; diff --git a/v2/example/customization/class.verbatim b/v2/example/customization/class.verbatim deleted file mode 100644 index 5c0d7b803..000000000 --- a/v2/example/customization/class.verbatim +++ /dev/null @@ -1,7 +0,0 @@ -class_template - -class %class_name% { -public: - %class_name%() {} - ~%class_name%() {} -}; \ No newline at end of file diff --git a/v2/example/customization/codegen.cpp b/v2/example/customization/codegen.cpp deleted file mode 100644 index 6cdb45e4d..000000000 --- a/v2/example/customization/codegen.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright Vladimir Prus, 2003 -// 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) - -// Please see 'usage.verbatim' file for usage notes. - -#include -#include -#include -using std::cout; -using std::string; -using std::strlen; - -extern const char class_template[]; -extern const char usage[]; - -int main(int ac, char* av[]) -{ - if (av[1]) { - - string class_name = av[1]; - string s = class_template; - - string::size_type n; - while((n = s.find("%class_name%")) != string::npos) { - s.replace(n, strlen("%class_name%"), class_name); - } - std::cout << "Output is:\n"; - std::cout << s << "\n"; - return 0; - } else { - std::cout << usage << "\n"; - return 1; - } -} diff --git a/v2/example/customization/inline_file.py b/v2/example/customization/inline_file.py deleted file mode 100644 index a48c5fc9d..000000000 --- a/v2/example/customization/inline_file.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python - -# Copyright 2003 Vladimir Prus -# 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 sys -from string import strip - -def quote_line(line): - - result = "" - - for i in line: - if (i == '\\'): - result = result + '\\\\' - elif (i == '\"'): - result = result + '\\\"' - elif (i != '\r' and i != '\n'): - result = result + i; - - return '\"' + result + '\\n\"' - -def quote_file(file): - result = "" - - for i in file.readlines(): - result = result + quote_line(i) + "\n" - - return result - -if len(sys.argv) < 3: - print "Usage: inline_file.py output_c_file file_to_include" -else: - output_c_file = sys.argv[1] - out_file = open(output_c_file, "w"); - - file_to_include = sys.argv[2] - - in_file = open(file_to_include, "r"); - variable_name = strip(in_file.readline()) - out_file.write("extern const char %s[] = {\n%s};\n\n" % (variable_name, quote_file(in_file))) - in_file.close() - out_file.close() diff --git a/v2/example/customization/project-root.jam b/v2/example/customization/project-root.jam deleted file mode 100644 index ab8bbf880..000000000 --- a/v2/example/customization/project-root.jam +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2003 Vladimir Prus -# 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 verbatim ; diff --git a/v2/example/customization/readme.txt b/v2/example/customization/readme.txt deleted file mode 100644 index da0e37972..000000000 --- a/v2/example/customization/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -Copyright 2003 Vladimir Prus -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) - - -This example show how to add a new target type and a new tool -support to Boost.Build. Please refer to extender manual for -complete description of this example. - -Note that this example requires Python. If cygwin Python on Windows is -to be used, please go to "verbatim.jam" and follow instructions there. diff --git a/v2/example/customization/t1.verbatim b/v2/example/customization/t1.verbatim deleted file mode 100644 index 144540f29..000000000 --- a/v2/example/customization/t1.verbatim +++ /dev/null @@ -1,2 +0,0 @@ -t1 -//###include "t2.verbatim" \ No newline at end of file diff --git a/v2/example/customization/t2.verbatim b/v2/example/customization/t2.verbatim deleted file mode 100644 index e69de29bb..000000000 diff --git a/v2/example/customization/usage.verbatim b/v2/example/customization/usage.verbatim deleted file mode 100644 index ff88b44ed..000000000 --- a/v2/example/customization/usage.verbatim +++ /dev/null @@ -1,6 +0,0 @@ -usage -Usage: codegen class_name - -This program takes a template of C++ code and replaces of -occurences of %class_name% with the passed 'class_name' -parameter. \ No newline at end of file diff --git a/v2/example/customization/verbatim.jam b/v2/example/customization/verbatim.jam deleted file mode 100644 index 931fdce33..000000000 --- a/v2/example/customization/verbatim.jam +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2003, 2004 Vladimir Prus -# 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) - -# This file shows some of the primary customization mechanisms in Boost.Build V2 -# and should serve as a basic for your own customization. -# Each part has a comment describing its purpose, and you can pick the parts -# which are relevant to your case, remove everything else, and then change names -# and actions to taste. - -# Declare a new target type. This allows Boost.Build to do something sensible -# when targets with the .verbatim extension are found in sources. -import type ; -type.register VERBATIM : verbatim ; - -# Declare a dependency scanner for the new target type. The -# 'inline-file.py' script does not handle includes, so this is -# only for illustraction. -import scanner ; -# First, define a new class, derived from 'common-scanner', -# that class has all the interesting logic, and we only need -# to override the 'pattern' method which return regular -# expression to use when scanning. -class verbatim-scanner : common-scanner -{ - rule pattern ( ) - { - return "//###include[ ]*\"([^\"]*)\"" ; - } -} - -# Register the scanner class. The 'include' is -# the property which specifies the search path -# for includes. -scanner.register verbatim-scanner : include ; -# Assign the scanner class to the target type. -# Now, all .verbatim sources will be scanned. -# To test this, build the project, touch the -# t2.verbatim file and build again. -type.set-scanner VERBATIM : verbatim-scanner ; - -import generators ; -generators.register-standard verbatim.inline-file : VERBATIM : CPP ; - -# Note: To use Cygwin Python on Windows change the following line -# to "python inline_file.py $(<) $(>)" -# Also, make sure that "python" in in PATH. -actions inline-file -{ - "./inline_file.py" $(<) $(>) -} diff --git a/v2/example/generate/Jamroot b/v2/example/generate/Jamroot deleted file mode 100644 index bc8563a4a..000000000 --- a/v2/example/generate/Jamroot +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2007 Vladimir Prus -# 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 common ; -import "class" : new ; - -rule generate-example ( project name : property-set : sources * ) -{ - local result ; - for local s in $(sources) - { - #local ea = [ $(s).action ] ; - #local ep = [ $(ea).properties ] ; - - # Create a new action, that takes the source target - # and runs 'common.copy' comamnd on it. - local a = [ - new non-scanning-action $(s) : common.copy : $(property-set) ] ; - - local source-name = [ $(s).name ] ; - - # Create the target to represent the result of the action. - # The target has the name that was specified in Jamfile - # and passed here via the 'name' parameter, - # and the same type and project as the source. - result += [ new file-target $(name) - : [ $(s).type ] - : $(project) - : $(a) ] ; - } - return $(result) ; -} - -generate a2 : a.cpp : @generate-example ; diff --git a/v2/example/generate/REAME.txt b/v2/example/generate/REAME.txt deleted file mode 100644 index e8cecc1ed..000000000 --- a/v2/example/generate/REAME.txt +++ /dev/null @@ -1,15 +0,0 @@ - -This example shows the 'generate' rule, that -allows you to construct target using any arbitrary -set of transformation and commands. - -The rule is similar to 'make' and 'notfile', but -unlike those, you can operate in terms of -Boost.Build 'virtual targets', which is more -flexible. - -Please consult the docs for more explanations. - -# Copyright 2007 Vladimir Prus -# 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) diff --git a/v2/example/generate/a.cpp b/v2/example/generate/a.cpp deleted file mode 100644 index 364975671..000000000 --- a/v2/example/generate/a.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -int main() -{ -} - -/* -Copyright 2007 Vladimir Prus -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) - */ diff --git a/v2/example/generator/Jamroot b/v2/example/generator/Jamroot deleted file mode 100644 index 9703134db..000000000 --- a/v2/example/generator/Jamroot +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2006 Vladimir Prus -# 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 soap ; -exe foo : foo.gci : on ; diff --git a/v2/example/generator/README.txt b/v2/example/generator/README.txt deleted file mode 100644 index c711dd206..000000000 --- a/v2/example/generator/README.txt +++ /dev/null @@ -1,7 +0,0 @@ - -This example shows how to declare a new generator class. It's necessary -when generator's logic is more complex that just running a single tool. - -# Copyright 2006 Vladimir Prus -# 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) diff --git a/v2/example/generator/foo.gci b/v2/example/generator/foo.gci deleted file mode 100644 index 2ccc45c6c..000000000 --- a/v2/example/generator/foo.gci +++ /dev/null @@ -1,10 +0,0 @@ - -int main() -{ - return 0; -} -/* -Copyright 2006 Vladimir Prus -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) - */ diff --git a/v2/example/generator/soap.jam b/v2/example/generator/soap.jam deleted file mode 100644 index d28bfdecc..000000000 --- a/v2/example/generator/soap.jam +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2006 Vladimir Prus -# 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) - -# This is example of a fictional code generator tool. -# It accepts a single input of type '.gci' and produces -# either one or two outputs of type .cpp, depending -# on the value of the feature -# -# This example is loosely based on gSOAP code generator. - -import type ; -import generators ; -import feature ; -import common ; -import "class" : new ; - -type.register GCI : gci ; - -feature.feature server : off on : incidental ; - -class soap-generator : generator -{ - import "class" : new ; - - rule __init__ ( * : * ) - { - generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - } - - rule run ( project name ? : property-set : sources * ) - { - if ! $(sources[2]) - { - # Accept only single source. - local t = [ $(sources[1]).type ] ; - if $(t) = GCI - { - # The type is correct. - - # If no output name is specified, guess it from sources. - if ! $(name) - { - name = [ generator.determine-output-name $(sources) ] ; - } - - # Produce one output, using just copy. - local a = [ new action $(sources[1]) - : common.copy : $(property-set) ] ; - local t = [ new file-target $(name) : CPP : $(project) - : $(a) ] ; - - # If in server mode, create another output -- an - # empty file. If this were a real SOAP generator, we - # might have created a single action, and two targets - # both using that action. - local t2 ; - if [ $(property-set).get ] = "on" - { - local a = [ new action : soap.touch : $(property-set) ] ; - t2 = [ new file-target $(name)_server : CPP : $(project) - : $(a) ] ; - } - return [ virtual-target.register $(t) ] - [ virtual-target.register $(t2) ] ; - } - } - } -} - -generators.register [ new soap-generator soap.soap : GCI : CPP ] ; - -TOUCH = [ common.file-touch-command ] ; -actions touch -{ - $(TOUCH) $(<) -} diff --git a/v2/example/gettext/Jamfile b/v2/example/gettext/Jamfile deleted file mode 100644 index d5096df30..000000000 --- a/v2/example/gettext/Jamfile +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2003, 2006 Vladimir Prus -# 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) - - -# Declare a main target. -exe main : main.cpp ; - -# Declare an action for updating translations -# After changing main.cpp, invocation of -# -# bjam update-russian -# -# will update translations in russian.po -gettext.update update-russian : russian.po main ; - -# Compiled message catalog. -gettext.catalog russian : russian.po ; - -# A stage rule which installs message catalog to the -# location gettext expects. -stage messages-russian : russian - : messages/ru_RU.KOI8-R/LC_MESSAGES - main.mo - ; - diff --git a/v2/example/gettext/main.cpp b/v2/example/gettext/main.cpp deleted file mode 100644 index 6888e1aba..000000000 --- a/v2/example/gettext/main.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright Vladimir Prus 2003. -// 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) - - -#include -#include -#define i18n(s) gettext(s) - -#include -using namespace std; - -int main() -{ - // Specify that translations are stored in directory - // "messages". - bindtextdomain("main", "messages"); - textdomain("main"); - - // Switch to russian locale. - setlocale(LC_MESSAGES, "ru_RU.KOI8-R"); - - // Output localized message. - std::cout << i18n("hello") << "\n"; - - return 0; -} diff --git a/v2/example/gettext/project-root.jam b/v2/example/gettext/project-root.jam deleted file mode 100644 index 862f8930c..000000000 --- a/v2/example/gettext/project-root.jam +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2003 Vladimir Prus -# 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) - - -using gettext ; diff --git a/v2/example/gettext/readme.txt b/v2/example/gettext/readme.txt deleted file mode 100644 index 05816978a..000000000 --- a/v2/example/gettext/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright 2003 Vladimir Prus -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) - - -This example shows how it's possible to used GNU gettext utilities with -Boost.Build. - -A simple translation file is compiled and installed as message catalog for -russian. The main application explicitly switches to russian locale and -output the translation of "hello". - -To test: - - bjam - bin/gcc/debug/main - -To test even more: - - - add more localized strings to "main.cpp" - - run "bjam update-russian" - - edit "russian.po" - - run bjam - - run "main" - diff --git a/v2/example/gettext/russian.po b/v2/example/gettext/russian.po deleted file mode 100644 index daa7121c3..000000000 --- a/v2/example/gettext/russian.po +++ /dev/null @@ -1,21 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2003-07-01 15:45+0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: main.cpp:16 -msgid "hello" -msgstr "international hello" diff --git a/v2/example/hello/Jamroot b/v2/example/hello/Jamroot deleted file mode 100644 index 2d46eebe8..000000000 --- a/v2/example/hello/Jamroot +++ /dev/null @@ -1,2 +0,0 @@ - -exe hello : hello.cpp ; diff --git a/v2/example/hello/hello.cpp b/v2/example/hello/hello.cpp deleted file mode 100644 index 680802289..000000000 --- a/v2/example/hello/hello.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2003 Vladimir Prus -// -// 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) -// -// http://www.boost.org -// - -#include - -int main() -{ - std::cout << "Hello!\n"; - return 1; -} diff --git a/v2/example/libraries/Jamroot b/v2/example/libraries/Jamroot deleted file mode 100644 index 5e0dc4814..000000000 --- a/v2/example/libraries/Jamroot +++ /dev/null @@ -1,4 +0,0 @@ - -use-project /library-example/foo : util/foo ; - -build-project app ; diff --git a/v2/example/libraries/app/Jamfile b/v2/example/libraries/app/Jamfile deleted file mode 100644 index ed2054e13..000000000 --- a/v2/example/libraries/app/Jamfile +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2002, 2003, 2005 Vladimir Prus -# 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) - - -# Declare a executable file, which uses a library. Note that -# includes that for library will be automatically used -# when compiling 'app.cpp' -exe app : app.cpp /library-example/foo//bar ; diff --git a/v2/example/libraries/app/app.cpp b/v2/example/libraries/app/app.cpp deleted file mode 100644 index f62c1c35d..000000000 --- a/v2/example/libraries/app/app.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2003 Vladimir Prus -// -// 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) -// -// http://www.boost.org -// - -#include - -int main() -{ - foo(); -} diff --git a/v2/example/libraries/util/foo/Jamfile b/v2/example/libraries/util/foo/Jamfile deleted file mode 100644 index 7b6359ea4..000000000 --- a/v2/example/libraries/util/foo/Jamfile +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2005 Vladimir Prus -# 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) - - -project - : usage-requirements include ; - -lib bar : bar.cpp ; diff --git a/v2/example/libraries/util/foo/bar.cpp b/v2/example/libraries/util/foo/bar.cpp deleted file mode 100644 index e6339ee9b..000000000 --- a/v2/example/libraries/util/foo/bar.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2003 Vladimir Prus -// -// 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) -// -// http://www.boost.org -// - -#ifdef _WIN32 -__declspec(dllexport) -#endif -void foo() {} diff --git a/v2/example/libraries/util/foo/include/lib1.h b/v2/example/libraries/util/foo/include/lib1.h deleted file mode 100644 index 50f5e19d2..000000000 --- a/v2/example/libraries/util/foo/include/lib1.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2003 Vladimir Prus -// -// 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) -// -// http://www.boost.org -// - -void foo(); diff --git a/v2/example/make/Jamroot b/v2/example/make/Jamroot deleted file mode 100644 index 4fb950b83..000000000 --- a/v2/example/make/Jamroot +++ /dev/null @@ -1,23 +0,0 @@ - -import notfile ; -import common ; - -exe main : main.cpp ; - -# Create 'main.cpp' from 'main.cpp.pro' using action -# 'do-something' defined below. -# -make main.cpp : main_cpp.pro : @do-something ; - -# In this example, we'll just copy a file. -# Need to find out the name of a command to copy a file. -CP = [ common.copy-command ] ; - -# The action itself. -# The 'CP' variable is defined below -# $(>) is source -# $(<) is target -actions do-something -{ - $(CP) $(>) $(<) -} diff --git a/v2/example/make/main_cpp.pro b/v2/example/make/main_cpp.pro deleted file mode 100644 index d38ae81af..000000000 --- a/v2/example/make/main_cpp.pro +++ /dev/null @@ -1,2 +0,0 @@ - -int main() { return 0; } diff --git a/v2/example/make/readme.txt b/v2/example/make/readme.txt deleted file mode 100644 index 9d0f162d2..000000000 --- a/v2/example/make/readme.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright 2002, 2005 Vladimir Prus -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) - - -Example of using custom command to create one file from -another, using the builtin 'make' rule. diff --git a/v2/example/pch/Jamroot b/v2/example/pch/Jamroot deleted file mode 100644 index 115164aae..000000000 --- a/v2/example/pch/Jamroot +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2006 Ilya Sokolov -# -# 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) - -# pch ########################################################################## - -import pch ; - -cpp-pch pch - : # sources - include/pch.hpp - : # requirements - include - ; -explicit pch ; - -# exe ########################################################################## - -exe hello_world - : # sources - pch - source/hello_world.cpp - : # requirements - include - : # default build - : # usage requirements - ; diff --git a/v2/example/pch/include/pch.hpp b/v2/example/pch/include/pch.hpp deleted file mode 100644 index 8f05cc43d..000000000 --- a/v2/example/pch/include/pch.hpp +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright 2006 Vladimir Prus - - 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) -*/ - -#ifdef BOOST_BUILD_PCH_ENABLED - -#ifdef FOO2 -int bar(); -#endif - -class TestClass { -public: - TestClass(int, int) {} -}; - -#endif diff --git a/v2/example/pch/source/hello_world.cpp b/v2/example/pch/source/hello_world.cpp deleted file mode 100644 index f618056a0..000000000 --- a/v2/example/pch/source/hello_world.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright 2006 Ilya Sokolov - Copyright 2006 Vladimir Prus - - 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) -*/ - -#include - -int main() -{ - TestClass c(1, 2); - return 0; -} diff --git a/v2/example/python_modules/Jamroot b/v2/example/python_modules/Jamroot deleted file mode 100644 index c53e75d58..000000000 --- a/v2/example/python_modules/Jamroot +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2006 Vladimir Prus -# 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 python_helpers ; - -ECHO "test1:" [ python_helpers.test1 ] ; -ECHO "test2:" [ python_helpers.test2 1234 : 5678 ] ; diff --git a/v2/example/python_modules/python_helpers.jam b/v2/example/python_modules/python_helpers.jam deleted file mode 100644 index d6363af67..000000000 --- a/v2/example/python_modules/python_helpers.jam +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2006 Vladimir Prus -# 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 the Python rules to Boost.Build -PYTHON_IMPORT_RULE python_helpers : test1 : python_helpers : test1 ; -PYTHON_IMPORT_RULE python_helpers : test2 : python_helpers : test2 ; - -# Make the new rules accessible to everybody who imports us. -EXPORT python_helpers : test1 test2 ; diff --git a/v2/example/python_modules/python_helpers.py b/v2/example/python_modules/python_helpers.py deleted file mode 100644 index 8148f57c3..000000000 --- a/v2/example/python_modules/python_helpers.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2006 Vladimir Prus -# 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) - -# Declare a couple of functions called from Boost.Build -# -# Each function will receive as many arguments as there ":"-separated -# arguments in bjam call. Each argument is a list of strings. -# As a special exception (aka bug), if no arguments are passed in bjam, -# Python function will be passed a single empty list. -# -# All Python functions must return a list of strings, which may be empty. - -def test1(l): - return ["foo", "bar"] - -def test2(l, l2): - return [l[0], l2[0]] \ No newline at end of file diff --git a/v2/example/python_modules/readme.txt b/v2/example/python_modules/readme.txt deleted file mode 100644 index 7eb87ffaf..000000000 --- a/v2/example/python_modules/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -Copyright 2006 Vladimir Prus -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) - - -This example shows how you can use Python modules from Boost.Build. - -In order to do this, you need to build bjam with Python support, by running: - - ./build.sh --with-python=/usr - -in jam directory. (Replace /usr with the root of your Python installation.) - -The integration between Python and bjam is very basic now, but enough to -be useful. diff --git a/v2/example/qt/README.txt b/v2/example/qt/README.txt deleted file mode 100644 index c7af17cf0..000000000 --- a/v2/example/qt/README.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2005 Vladimir Prus -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) - - -This directory contains Boost.Build examples for the Qt library -(http://www.trolltech.com/products/qt/index.html). - -The current examples are: -1. Basic setup -- application with several sources and moccable header. -2. Using of .ui source file. -3. Running .cpp files via the moc tool. - -For convenience, there are examples both for 3.* and 4.* version of Qt, -they are mostly identical and differ only in source code. - -All examples assumes that you just installed Boost.Build and that QTDIR -environment variables is set (typical values can be /usr/share/qt3 and -/usr/share/qt4). After adding "using qt ..." to your user-config.jam, you'd -have to removing "using qt ; " statements from Jamroot file of examples. - diff --git a/v2/example/qt/qt3/hello/Jamroot b/v2/example/qt/qt3/hello/Jamroot deleted file mode 100644 index 03be582e5..000000000 --- a/v2/example/qt/qt3/hello/Jamroot +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright Vladimir Prus 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) - -using qt ; - -project - # built MT version, unless asked otherwise. - : default-build multi - ; - -exe canvas : main.cpp canvas.cpp canvas.h : /qt//qt ; \ No newline at end of file diff --git a/v2/example/qt/qt3/hello/canvas.cpp b/v2/example/qt/qt3/hello/canvas.cpp deleted file mode 100644 index c6d23c9d4..000000000 --- a/v2/example/qt/qt3/hello/canvas.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright Vladimir Prus 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) - -#include "canvas.h" - -#include -#include -#include - -Canvas::Canvas(QWidget* parent) -: QWidget(parent) -{ - m_pen = QPen(QColor(255, 128, 128)); - m_brushes = new QBrush[2]; - m_brushes[0] = QBrush(QColor(255, 0, 0)); - m_brushes[1] = QBrush(QColor(0, 255, 0)); - m_current_brush = 0; - - m_canvas = new QCanvas(this); - m_canvas->resize(4*1600, 600); - - redraw(); - - QVBoxLayout* l = new QVBoxLayout(this); - - m_canvas_view = new QCanvasView(m_canvas, this); - l->addWidget(m_canvas_view); - m_canvas_view->resize(rect().size()); - m_canvas_view->show(); -} - -Canvas::~Canvas() -{ - delete m_brushes; -} - -void Canvas::redraw() -{ - QCanvasItemList l = m_canvas->allItems(); - for(QCanvasItemList::iterator i = l.begin(), - e = l.end(); i != e; ++i) - { - delete *i; - } - - unsigned count = 0; - for (unsigned x = 10; x < 4*1600; x += 20) - for (unsigned y = 10; y < 600; y += 20) { - QCanvasRectangle* r = new QCanvasRectangle(x, y, 10, 10, m_canvas); - r->setPen(m_pen); - r->setBrush(m_brushes[m_current_brush]); - r->show(); - ++count; - QCanvasText* t = new QCanvasText("D", m_canvas); - t->move(x, y); - t->show(); - ++count; - } - - (new QCanvasText(QString::number(count), m_canvas))->show(); - m_canvas->setAllChanged(); - -} - -void Canvas::change_color() -{ - m_current_brush = (m_current_brush + 1)%2; - redraw(); - m_canvas->update(); -} - diff --git a/v2/example/qt/qt3/hello/canvas.h b/v2/example/qt/qt3/hello/canvas.h deleted file mode 100644 index f9f950267..000000000 --- a/v2/example/qt/qt3/hello/canvas.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Vladimir Prus 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) - - -#ifndef CANVAS_VP_2004_08_31 -#define CANVAS_VP_2004_08_31 - -#include -#include -#include - -class Canvas : public QWidget -{ - Q_OBJECT -public: - Canvas(QWidget* parent); - - virtual ~Canvas(); - -public slots: - void change_color(); - -private: - void redraw(); - class QCanvas* m_canvas; - class QCanvasView* m_canvas_view; - class QPen m_pen; - class QBrush* m_brushes; - int m_current_brush; -}; - -#endif - diff --git a/v2/example/qt/qt3/hello/main.cpp b/v2/example/qt/qt3/hello/main.cpp deleted file mode 100644 index 8f1ffc2fb..000000000 --- a/v2/example/qt/qt3/hello/main.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright Vladimir Prus 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) - -#include "canvas.h" -#include -#include -#include - -class Window : public QMainWindow -{ -public: - Window() - { - setCaption("QCanvas test"); - QVBox* vb = new QVBox(this); - setCentralWidget(vb); - - Canvas* c = new Canvas(vb); - QPushButton* b = new QPushButton("Change color", vb); - connect(b, SIGNAL(clicked()), c, SLOT(change_color())); - } -}; - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - Window *w = new Window(); - - app.setMainWidget(w); - w->show(); - - return app.exec(); -} - diff --git a/v2/example/qt/qt3/moccable-cpp/Jamroot b/v2/example/qt/qt3/moccable-cpp/Jamroot deleted file mode 100644 index 85778da20..000000000 --- a/v2/example/qt/qt3/moccable-cpp/Jamroot +++ /dev/null @@ -1,11 +0,0 @@ - -using qt ; -import cast ; - -project - : default-build multi - ; - -exe main : main.cpp [ cast _ moccable-cpp : main.cpp ] - /qt//qt - ; diff --git a/v2/example/qt/qt3/moccable-cpp/main.cpp b/v2/example/qt/qt3/moccable-cpp/main.cpp deleted file mode 100644 index ed36f7469..000000000 --- a/v2/example/qt/qt3/moccable-cpp/main.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Vladimir Prus 2005. -// 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) - - -#include -#include -#include - -#include - -class My_widget : public QWidget -{ - Q_OBJECT -public: - My_widget() : QWidget() - { - QPushButton* b = new QPushButton("Push me", this); - - connect(b, SIGNAL(clicked()), this, SLOT(theSlot())); - } - -private slots: - void theSlot() - { - std::cout << "Clicked\n"; - } - -}; - -int main(int ac, char* av[]) -{ - QApplication app(ac, av); - My_widget mw; - mw.show(); - app.setMainWidget(&mw); - app.exec(); -} - -#include "main.moc" diff --git a/v2/example/qt/qt3/uic/Jamroot b/v2/example/qt/qt3/uic/Jamroot deleted file mode 100644 index d0b806294..000000000 --- a/v2/example/qt/qt3/uic/Jamroot +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright Felix E. Klee, 2003 -# 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) - -# Tell that QT should be used. QTDIR will give installation -# prefix. -using qt ; - -project - : default-build multi - ; - -exe hello : main.cpp hello_world_widget.ui : /qt//qt ; - diff --git a/v2/example/qt/qt3/uic/hello_world_widget.ui b/v2/example/qt/qt3/uic/hello_world_widget.ui deleted file mode 100644 index 26cc73487..000000000 --- a/v2/example/qt/qt3/uic/hello_world_widget.ui +++ /dev/null @@ -1,58 +0,0 @@ - -HelloWorldWidget - - - - - - HelloWorldWidget - - - - 0 - 0 - 124 - 63 - - - - Hello World! - - - - unnamed - - - 11 - - - 6 - - - - TextLabel2 - - - Hello World! - - - AlignCenter - - - - - OkButton - - - OK - - - - - - diff --git a/v2/example/qt/qt3/uic/main.cpp b/v2/example/qt/qt3/uic/main.cpp deleted file mode 100644 index f2a08b5fa..000000000 --- a/v2/example/qt/qt3/uic/main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright Felix E. Klee, 2003 -// 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) - -#include "hello_world_widget.h" -#include - -#include - -int main(int argc, char **argv) { - QApplication a(argc, argv); - HelloWorldWidget w; - QObject::connect(static_cast(w.OkButton), SIGNAL(clicked()), &w, SLOT(close())); - a.setMainWidget(&w); - w.show(); - return a.exec(); -} diff --git a/v2/example/qt/qt4/hello/Jamroot b/v2/example/qt/qt4/hello/Jamroot deleted file mode 100644 index 83952f17b..000000000 --- a/v2/example/qt/qt4/hello/Jamroot +++ /dev/null @@ -1,14 +0,0 @@ - -import qt4 ; - -if ! [ qt4.initialized ] -{ - ECHO "Warning: Qt4 not initialized in user-config.jam" ; - ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ; - ECHO "This is very likely won't work for you. " ; - using qt4 : /space/p2/ghost/build/Qt4 ; -} - -project : requirements multi ; - -exe arrow : main.cpp arrow.cpp arrow.h /qt//QtGui ; \ No newline at end of file diff --git a/v2/example/qt/qt4/hello/arrow.cpp b/v2/example/qt/qt4/hello/arrow.cpp deleted file mode 100644 index e821b1690..000000000 --- a/v2/example/qt/qt4/hello/arrow.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright Vladimir Prus 2005. -// 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) - -#include "arrow.h" - -#include - -#include -#include -#include - -#include -#include - -Arrow_widget::Arrow_widget(QWidget* parent) : QWidget(parent), color_(0) -{ - QPalette pal = palette(); - pal.setBrush(backgroundRole(), QBrush(Qt::white)); - setPalette(pal); -} - -void Arrow_widget::slotChangeColor() -{ - color_ = (color_ + 1) % 3; - update(); -} - -void -Arrow_widget::draw_arrow(int x1, int y1, int x2, int y2, QPainter& painter) -{ - // The length of the from the tip of the arrow to the point - // where line starts. - const int arrowhead_length = 16; - - QPainterPath arrow; - arrow.moveTo(x1, y1); - - // Determine the angle of the straight line. - double a1 = (x2-x1); - double a2 = (y2-y1); - double b1 = 1; - double b2 = 0; - - double straight_length = sqrt(a1*a1 + a2*a2); - - double dot_product = a1*b1 + a2*b2; - double cosine = dot_product/ - (sqrt(pow(a1, 2) + pow(a2, 2))*sqrt(b1 + b2)); - double angle = acos(cosine); - if (y1 < y2) - { - angle = -angle; - } - double straight_angle = angle*180/M_PI; - - double limit = 10; - - double angle_to_vertical; - if (fabs(straight_angle) < 90) - angle_to_vertical = fabs(straight_angle); - else if (straight_angle > 0) - angle_to_vertical = 180-straight_angle; - else - angle_to_vertical = 180-(-straight_angle); - - double angle_delta = 0; - if (angle_to_vertical > limit) - angle_delta = 30 * (angle_to_vertical - limit)/90; - double start_angle = straight_angle > 0 - ? straight_angle - angle_delta : - straight_angle + angle_delta; - - - QMatrix m1; - m1.translate(x1, y1); - m1.rotate(-start_angle); - - double end_angle = straight_angle > 0 - ? (straight_angle + 180 + angle_delta) : - (straight_angle + 180 - angle_delta); - - QMatrix m2; - m2.reset(); - m2.translate(x2, y2); - m2.rotate(-end_angle); - - arrow.cubicTo(m1.map(QPointF(straight_length/2, 0)), - m2.map(QPointF(straight_length/2, 0)), - m2.map(QPointF(arrowhead_length, 0))); - - painter.save(); - painter.setBrush(Qt::NoBrush); - painter.drawPath(arrow); - painter.restore(); - - painter.save(); - painter.translate(x2, y2); - - painter.rotate(-90); - painter.rotate(-end_angle); - painter.rotate(180); - - QPolygon arrowhead(4); - arrowhead.setPoint(0, 0, 0); - arrowhead.setPoint(1, arrowhead_length/3, -arrowhead_length*5/4); - arrowhead.setPoint(2, 0, -arrowhead_length); - arrowhead.setPoint(3, -arrowhead_length/3, -arrowhead_length*5/4); - - painter.drawPolygon(arrowhead); - - painter.restore(); - -} - - -void Arrow_widget::paintEvent(QPaintEvent*) -{ - QPainter p(this); - - p.setRenderHint(QPainter::Antialiasing); - - int base_x = 550; - int base_y = 200; - - if (color_ == 0) - p.setBrush(Qt::black); - else if (color_ == 1) - p.setBrush(Qt::green); - else if (color_ == 2) - p.setBrush(Qt::yellow); - else - p.setBrush(Qt::black); - - for (int x_step = 0; x_step < 6; ++x_step) - { - for (int y_step = 1; y_step <= 3; ++y_step) - { - draw_arrow(base_x, base_y, base_x+x_step*100, - base_y - y_step*50, p); - - draw_arrow(base_x, base_y, base_x+x_step*100, - base_y + y_step*50, p); - - draw_arrow(base_x, base_y, base_x-x_step*100, - base_y + y_step*50, p); - - draw_arrow(base_x, base_y, base_x-x_step*100, - base_y - y_step*50, p); - } - } - - draw_arrow(50, 400, 1000, 450, p); - draw_arrow(1000, 400, 50, 450, p); - -} - diff --git a/v2/example/qt/qt4/hello/arrow.h b/v2/example/qt/qt4/hello/arrow.h deleted file mode 100644 index d7743864f..000000000 --- a/v2/example/qt/qt4/hello/arrow.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Vladimir Prus 2005. -// 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) - -#include - -#include -#include -#include - -#include -#include - -class Arrow_widget : public QWidget -{ - Q_OBJECT -public: - Arrow_widget(QWidget* parent = 0); - -public slots: - void slotChangeColor(); - -private: - void draw_arrow(int x1, int y1, int x2, int y2, QPainter& painter); - void paintEvent(QPaintEvent*); - -private: - int color_; -}; diff --git a/v2/example/qt/qt4/hello/main.cpp b/v2/example/qt/qt4/hello/main.cpp deleted file mode 100644 index df27444bd..000000000 --- a/v2/example/qt/qt4/hello/main.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Vladimir Prus 2005. -// 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) - -#include "arrow.h" - -#include -#include - -int main(int ac, char* av[]) -{ - QApplication app(ac, av); - Arrow_widget* w = new Arrow_widget; - w->resize(1100, 480); - - QTimer timer; - QObject::connect(&timer, SIGNAL(timeout()), - w, SLOT(slotChangeColor())); - - timer.start(2000); - - w->show(); - app.exec(); - return 0; -} - diff --git a/v2/example/qt/qt4/moccable-cpp/Jamroot b/v2/example/qt/qt4/moccable-cpp/Jamroot deleted file mode 100644 index d07b9c7d3..000000000 --- a/v2/example/qt/qt4/moccable-cpp/Jamroot +++ /dev/null @@ -1,18 +0,0 @@ - -import qt4 ; -if ! [ qt4.initialized ] -{ - ECHO "Warning: Qt4 not initialized in user-config.jam" ; - ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ; - ECHO "This is very likely won't work for you. " ; - using qt4 : /space/p2/ghost/build/Qt4 ; -} - -import cast ; -exe main : main.cpp - [ cast _ moccable-cpp : main.cpp ] - /qt//QtGui - : multi - ; - - diff --git a/v2/example/qt/qt4/moccable-cpp/main.cpp b/v2/example/qt/qt4/moccable-cpp/main.cpp deleted file mode 100644 index ffc96cc3e..000000000 --- a/v2/example/qt/qt4/moccable-cpp/main.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright Vladimir Prus 2005. -// 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) - -#include -#include -#include - -#include - -class My_widget : public QWidget -{ - Q_OBJECT -public: - My_widget() : QWidget() - { - QPushButton* b = new QPushButton("Push me", this); - - connect(b, SIGNAL(clicked()), this, SLOT(theSlot())); - } - -private slots: - void theSlot() - { - std::cout << "Clicked\n"; - } - -}; - -int main(int ac, char* av[]) -{ - QApplication app(ac, av); - My_widget mw; - mw.show(); - app.exec(); -} - -#include "main.moc" diff --git a/v2/example/qt/qt4/uic/Jamroot b/v2/example/qt/qt4/uic/Jamroot deleted file mode 100644 index 40675a72e..000000000 --- a/v2/example/qt/qt4/uic/Jamroot +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright Felix E. Klee, 2003 -# 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) - -import qt4 ; -if ! [ qt4.initialized ] -{ - ECHO "Warning: Qt4 not initialized in user-config.jam" ; - ECHO "Assuming /space/p2/ghost/build/Qt4 as location." ; - ECHO "This is very likely won't work for you. " ; - using qt4 : /space/p2/ghost/build/Qt4 ; -} - -project : requirements multi - ; - -exe hello : main.cpp hello_world_widget.ui : /qt//QtGui ; diff --git a/v2/example/qt/qt4/uic/hello_world_widget.ui b/v2/example/qt/qt4/uic/hello_world_widget.ui deleted file mode 100644 index 67060b336..000000000 --- a/v2/example/qt/qt4/uic/hello_world_widget.ui +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - HelloWorldWidget - - - - 0 - 0 - 124 - 63 - - - - Hello World! - - - - 11 - - - 6 - - - - - Hello World! - - - Qt::AlignCenter - - - - - - - OK - - - - - - - qPixmapFromMimeSource - - - diff --git a/v2/example/qt/qt4/uic/main.cpp b/v2/example/qt/qt4/uic/main.cpp deleted file mode 100644 index fc72fd5e6..000000000 --- a/v2/example/qt/qt4/uic/main.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright Felix E. Klee, 2003 -// 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) - -#include "ui_hello_world_widget.h" -#include -#include - -#include - -int main(int argc, char **argv) { - QApplication a(argc, argv); - - QWidget w; - Ui::HelloWorldWidget wm; - wm.setupUi(&w); - - QObject::connect(wm.OkButton, SIGNAL(clicked()), &w, SLOT(close())); - - w.show(); - return a.exec(); -} diff --git a/v2/example/variant/Jamfile b/v2/example/variant/Jamfile deleted file mode 100644 index 8ae5990d0..000000000 --- a/v2/example/variant/Jamfile +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2004 Vladimir Prus -# 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) - - -# By default, build the project with two variants -# we've defined in project-root.jam -project - : default-build crazy super_release - ; - -exe a : a.cpp libs//l ; - diff --git a/v2/example/variant/a.cpp b/v2/example/variant/a.cpp deleted file mode 100644 index 42b69f335..000000000 --- a/v2/example/variant/a.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright Vladimir Prus 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) - -void l(); -int main() { l(); return 0; } diff --git a/v2/example/variant/libs/Jamfile b/v2/example/variant/libs/Jamfile deleted file mode 100644 index 4366b7624..000000000 --- a/v2/example/variant/libs/Jamfile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2004 Vladimir Prus -# 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) - - -lib l : l.cpp ; diff --git a/v2/example/variant/libs/l.cpp b/v2/example/variant/libs/l.cpp deleted file mode 100644 index 26cb4b1e6..000000000 --- a/v2/example/variant/libs/l.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright Vladimir Prus 2002-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) - -#ifdef _WIN32 -__declspec(dllexport) -#endif -void l() {} diff --git a/v2/example/variant/project-root.jam b/v2/example/variant/project-root.jam deleted file mode 100644 index e19476ccc..000000000 --- a/v2/example/variant/project-root.jam +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2004 Vladimir Prus -# 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) - - -# Define a build variant which is just combination -# of four properties. -variant crazy : speed off - on on ; - -# Define a built variant inherited from 'release'. -# It defines one new property and get all properties -# from parent variant. -variant super_release : release : USE_ASM ; diff --git a/v2/example/variant/readme.txt b/v2/example/variant/readme.txt deleted file mode 100644 index 119cdafd9..000000000 --- a/v2/example/variant/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -Copyright 2004 Vladimir Prus -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) - - -This example shows how user can create his own build variants. -Two variants are defined: "crazy", which is just random combination -of properties, and "super-release", which is inherited from "release", -and differs by a single define. - -See the project-root.jam for the definitions. diff --git a/v2/example/versioned/hello.cpp b/v2/example/versioned/hello.cpp deleted file mode 100644 index 8a86ff048..000000000 --- a/v2/example/versioned/hello.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright Rene Rivera, 2003 -// 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) - -#include - -int main() -{ - std::cout << "Hello!\n"; - return 1; -} diff --git a/v2/example/versioned/jamfile.jam b/v2/example/versioned/jamfile.jam deleted file mode 100644 index 913cdf4d7..000000000 --- a/v2/example/versioned/jamfile.jam +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2003 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) - -#~ exe hello : hello.cpp : 1.0 ; -lib hello : hello.cpp : 1.0 ; - -symlink hello_debug hello_release : hello/debug hello/release ; -symlink links/hello_release : hello/release ; diff --git a/v2/example/versioned/project-root.jam b/v2/example/versioned/project-root.jam deleted file mode 100644 index 981d3eb50..000000000 --- a/v2/example/versioned/project-root.jam +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2003 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 gcc ; -import toolset ; -import modifiers ; diff --git a/v2/generators_prototype.py b/v2/generators_prototype.py deleted file mode 100644 index 80d910a09..000000000 --- a/v2/generators_prototype.py +++ /dev/null @@ -1,731 +0,0 @@ -# Copyright 2003 Dave Abrahams -# 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) - -# Importing by a different name keeps PyChecker happy -from __future__ import generators as generators_ -import sys - - -class Generator(object): - """Representation of a transformation from source to target types. - - sources and targets may be either strings or sequences of - strings. - - >>> print Generator(('obj*', 'lib*'), 'exe') - exe <- obj*,lib* - - >>> assert Generator('c','o').unary - """ - - def __init__(self, sources, targets): - """ - >>> g = Generator(['obj*', 'z', 'cpp'], ['lib','dll']) - >>> g.signature - [('cpp', 1, 1), ('obj', 0, '*'), ('z', 1, 1)] - >>> g = Generator('cpp', 'obj') - >>> g.signature - [('cpp', 1, 1)] - """ - self.sources = _sequence_of_strings(sources) - self.targets =_sequence_of_strings(targets) - self.targets_ = _string_multiset(targets) - - signature = {} - stars = {} - for s in self.sources: - if s.endswith('*'): - stars[s[:-1]] = 1 - signature.setdefault(s[:-1],0) - else: - signature[s] = signature.get(s,0) + 1 - - self.signature = [] - for t, n in signature.items(): - if t in stars: - self.signature.append((t, n, '*')) - else: - self.signature.append((t, n, n)) - - self.signature.sort() # makes doctests nicer - - # Remember whether the signature is strictly unary - self.unary = not stars and len(self.sources) == 1 - - def match(self, group): - """If group satisfies an element of the signature, returns an - amended signature that consists of all other elements. - Otherwise, returns None. - >>> g = Generator(['obj*', 'z', 'cpp', 'z'], ['lib','dll']) - >>> g.match(TargetTypeGroup('obj',12)) - [('cpp', 1, 1), ('z', 2, 2)] - >>> g.match(TargetTypeGroup('cpp',12)) # None - - >>> g.match(TargetTypeGroup('cpp',1)) - [('obj', 0, '*'), ('z', 2, 2)] - - >>> g.match(TargetTypeGroup('z',2)) - [('cpp', 1, 1), ('obj', 0, '*')] - - >>> Generator('cpp','obj').match(TargetTypeGroup('cpp',1)) - [] - - >>> Generator('cpp','obj').match(TargetTypeGroup('cpp',12)) - [] - """ - if self in group.generators: - return None - - for i in range(len(self.signature)): - e = self.signature[i] - if e[0] == group.target_type: - if self.unary: - return [] - if e[1] > group.size or e[2] < group.size: - return None - else: - return self.signature[:i] + self.signature[i+1:] - return None - - def __str__(self): - """Make a nice human-readable representation - >>> g = Generator(['obj*', 'z', 'cpp'], ['lib','dll']) - >>> print g - lib,dll <- obj*,z,cpp - """ - return ','.join(self.targets) + ' <- ' + ','.join(self.sources) - - def __type_list_rep(self, type_list): - if len(type_list) == 1: - return repr(type_list[0]) - else: - return repr(type_list) - - def __repr__(self): - return ( - self.__module__ + '.' + type(self).__name__ + '(' + - self.__type_list_rep(self.sources) - + ', ' + self.__type_list_rep(self.targets) + ')' - ) - -def _dict_tuple(d): - l = d.items() - l.sort() - return tuple(l) - -def _sorted(list): - list.sort() - return list - -class GeneratorSet(object): - def __init__(self): - self.all_generators = {} - self.generators_by_type = {} - - def __iadd__(self, generator): - """Add a generator to the set - - >>> s = GeneratorSet() - >>> s += Generator('foo', 'bar') - >>> s += Generator('foo', 'baz') - >>> s += Generator(['foo','bar'], 'baz') - >>> s += Generator('bar', ['baz', 'mumble']) - >>> s += Generator('bar*', ['bing']) - >>> print s - { - bar: - baz <- foo,bar - baz,mumble <- bar - bing <- bar* - foo: - bar <- foo - baz <- foo - baz <- foo,bar - } - - """ - if not generator in self.all_generators: - self.all_generators[generator] = 1 - for t in generator.sources: - if t.endswith('*'): - t = t[:-1] - l = self[t] - l.append(generator) - return self - - def __isub__(self, generator): - for t in generator.sources: - if t.endswith('*'): - t = t[:-1] - self[t].remove(generator) - return self - - def __getitem__(self, t): - """Given a target type, return a list of all the generators - which can consume that target type. - """ - return self.generators_by_type.setdefault(t,[]) - - def __str__(self): - # import pprint - # return pprint.pformat(self.generators_by_type) - - s = [] - - for k,v in _sorted(self.generators_by_type.items()): - s += [ ' ' + k + ':\n ' + '\n '.join([ str(x) for x in v ]) ] - - return '{\n' + '\n'.join(s) + '\n}' - -def _dicts_intersect(d1, d2): - """True iff d1 and d2 have a key in common - - >>> assert _dicts_intersect({1:0, 2:0}, {2:0}) - >>> assert _dicts_intersect({2:0}, {1:0, 2:0}) - >>> assert not _dicts_intersect({1:0, 3:0}, {2:0}) - >>> assert not _dicts_intersect({2:0}, {1:0, 3:0}) - """ - if len(d2) < len(d1): - tmp = d1 - d1 = d2 - d2 = tmp - for k in d1.iterkeys(): - if k in d2: - return True - return False - -class TargetTypeGroup(object): - instances = 0 - - def __init__( - self - , target_type - , size # how many of that type are in the group. - , parents = () - , generator = None): - """ - >>> g1 = TargetTypeGroup('x', 1) - >>> assert not g1.extra_targets - >>> assert g1.consumed_sources == { g1:1 } - >>> g2 = TargetTypeGroup('x', 1) - - >>> g3 = TargetTypeGroup('x', 1, [g1,g2]) - >>> assert g1 in g3.consumed_sources - >>> assert g2 in g3.consumed_sources - >>> assert not g3 in g3.consumed_sources - """ - self.target_type = target_type - self.size = size - self.parents = parents - self.generator = generator - self.siblings = None - self.id = TargetTypeGroup.instances - self.ambiguous = reduce(lambda x,y: x or y.ambiguous and 1, - parents, None) - - self.generators = { generator : 1 } # it doesn't hurt to store None here - ignored = [ self.generators.update(p.generators) for p in parents ] - - self.__constituents = None - self.__extra_targets = None - - TargetTypeGroup.instances += 1 - - if generator: - self.moves = { (id(generator),id(parents)) : 1 } - else: - self.moves = {} - - if not parents: - self.consumed_sources = {self:1} - self.__extra_targets = () - else: - ignored = [ self.moves.update(p.moves) for p in parents ] - - if len(parents) == 1: - self.consumed_sources = parents[0].consumed_sources - else: - self.consumed_sources = {} - for c in parents: - self.consumed_sources.update(c.consumed_sources) - - # constituents property - the set of all target groups consumed in - # creating this group - def __get_constituents(self): - if self.__constituents is None: - self.__constituents = {self:1} - for c in self.parents: - self.__constituents.update(c.constituents) - return self.__constituents - - constituents = property(__get_constituents) - - cost = property(lambda self: len(self.moves)) - - # extra targets property - in general, every target group sits at - # the root of a DAG. The extra targets are the ones produced by - # generators that run in this DAG but which are not part of the - # DAG, i.e. are not constituents. In the example below, X and Y - # are extra targets of A. - # - # A X B,C <- D - # / \ / C,Y <- E - # B C Y A,X <- B,C - # \ / \ / - # Sources: D E - # - # We use the extra targets to determine the equivalence of two - # search States - def __get_extra_targets(self): - if self.__extra_targets is None: - - if len(self.parents) == 1 and not self.siblings: - self.__extra_targets = self.parents[0].extra_targets - else: - # all siblings are created incidentally - if self.siblings: - t = tuple([s for s in self.siblings if s != self]) - else: - t = () - - # Any groups created incidentally as part of generating my - # parents are also incidental to my generation - for c in self.parents: - for i in c.extra_targets: - if i not in self.constituents: - t += (i,) - - self.__extra_targets = _sort_tuple(t) - return self.__extra_targets - - extra_targets = property(__get_extra_targets) - - def set_siblings(self, sibs): - assert self.__extra_targets is None, \ - "can't set siblings after extra targets already computed." - - assert self.parents, "original source nodes don't have siblings" - self.siblings = sibs - - def __repr__(self): - return '%s.%s(#%s$%s)' % (self.size,self.target_type,self.id,self.cost) - - def is_compatible_with(self, other): - """True iff self and other can be used to trigger a generator. - - >>> g1 = TargetTypeGroup('x', 1) - >>> g2 = TargetTypeGroup('x', 1) - >>> assert g1.is_compatible_with(g2) - - >>> g3 = TargetTypeGroup('x', 1, [g1]) - >>> g4 = TargetTypeGroup('x', 1, [g2]) - >>> assert g3.is_compatible_with(g4) - >>> assert g3.is_compatible_with(g2) - >>> assert not g3.is_compatible_with(g1) - >>> assert not g2.is_compatible_with(g4) - - >>> g5 = TargetTypeGroup('x', 1, [g3]) - >>> assert not g5.is_compatible_with(g1) - """ - return not _dicts_intersect( - self.constituents, other.constituents) - - def all_compatible(self, others): - """True iff self is_compatible with every element of other - """ - for o in others: - if not self.is_compatible_with(o): - return False - return True - - def atoms(self): - """If this group was formed by combining other groups without - a generator, return a set of its nearest parent groups which - were not formed that way. Otherwise, return a set - containing only this group. - - >>> g1 = TargetTypeGroup('x',1) - >>> g2 = TargetTypeGroup('x',1) - >>> a = TargetTypeGroup('x',2, [g1,g2]).atoms() - >>> assert g1 in a and g2 in a and len(a) == 2 - """ - if self.generator or not self.parents: - return (self,) - x = () - for p in self.parents: - x += p.atoms() - return x - - - def consumes(self, others): - """True iff not self is_compatible with every element of other - """ - for o in others: - if self.is_compatible_with(o): - return False - return True - -def _string_multiset(s): - x = {} - for t in _sequence_of_strings(s): - x[t] = x.get(t,0) + 1 - return x - - -def parent_sets(chosen, signature, all_groups, generator): - """Given an already-chosen tuple of TargetTypeGroups and a signature - of the groups left to choose, generates all mutually-compatible - combinations of groups starting with chosen - - >>> TargetTypeGroup.instances = 0 - >>> groups = { - ... 'x': [ TargetTypeGroup('x', 1) ], - ... 'y': [ TargetTypeGroup('y', 1), TargetTypeGroup('y',2) ], - ... 'z': [ TargetTypeGroup('z', 1) ] - ... } - >>> signature = (('y',0,'*'),('z',1,'1')) - >>> chosen = (groups['x'][0],) - >>> [ x for x in parent_sets(chosen, signature, groups, Generator('x',('y*', 'z'))) ] - [(1.x(#0$0), 1.z(#3$0)), (1.x(#0$0), 1.y(#1$0), 1.z(#3$0)), (1.x(#0$0), 2.y(#2$0), 1.z(#3$0))] - """ - if len(signature) == 0: - # The entire signature was satisfied; we can just yield the - # one result - yield chosen - else: - # find all ways to satisfy the next element of the signature - # which are compatible with the already-chosen groups. If - # there are no ways, we will fall off the end here and the - # ultimate result will be empty. - t, min, max = signature[0] - - if min == 0: - for s in parent_sets(chosen, signature[1:], all_groups, generator): - yield s - - for g in all_groups[t]: - - # can only use a generator once in any path - if generator in g.generators: - continue - - if (g.size >= min and g.size <= max and - g.all_compatible(chosen)): - - for s in parent_sets( - chosen + (g,), signature[1:], all_groups, generator - ): - yield s - -debug = None - -def _sort_tuple(t): - """copies the given sequence into a new tuple in sorted order""" - l = list(t) - l.sort() - return tuple(l) - -def _sequence_of_strings(s_or_l): - """if the argument is a string, wraps a tuple around it. - Otherwise, returns the argument untouched - """ - if isinstance(s_or_l, type('')): - return (s_or_l,) - else: - return s_or_l - -def _examine_edge(states, queue, g): - """Handle a possible new state in the search. - """ - g_state = State(g) - v = states.setdefault(g_state, g_state) - - if v.group is g: - queue.append(g_state) - return False - - if v.group.cost > g.cost: - if debug: - print 'reducing cost of state(%s) via %s' % (v.group,g) - v.group.ambiguous = None - v.group = g - - elif v.group.cost < g.cost: - if debug: - print 'discarding %s due to lower cost state(%s)' % (g, v.group) - - elif not (g.generator or v.group.generator) \ - and _sort_tuple(g.atoms()) == _sort_tuple(v.group.atoms()): - # These are two different ways of combining the same groups of - # a given type to produce a larger group, without using a generator - if debug: - print 'discarding %s as a redundant formulation of %s' % (g,v.group) - else: - if debug: - print '%s is an ambiguous path due to %s' % (v.group, g) - # Remember the group which caused the ambiguity - v.group.ambiguous = g - - return True - -class State(object): - """A wrapper around a TargetTypeGroup which makes it hashable on - the part of its data which determines its ability to contribute to - producing the goal target type. - """ - def __init__(self, group): - self.group = group - - def __hash__(self): - g = self.group - x = g.consumed_sources.keys() - x.sort() - return hash((g.target_type, g.size, _sort_tuple(g.extra_targets), tuple(x))) - - def __eq__(self, other): - return ( - self.group.target_type == other.group.target_type - and self.group.size == other.group.size - and self.group.extra_targets == other.group.extra_targets - and self.group.consumed_sources == other.group.consumed_sources) - -queue_moves = 0 - -def optimal_graphs(target_type, source_groups, generators): - """A 'simple generator' that produces the sequence of least-cost - solutions for producing the - target type from a subset of the source_groups, using the given - generators. - """ - # An index from target type to lists of groups with that type. - all_groups = {} - - # Prime the priority Queue - q = [ State(g) for g in source_groups ] - - # Keep a record of all known states in the search - states = dict([ (s,s) for s in q ]) - - solution_cost = None - while q: - # remove a group from the queue - g = q[0].group - del q[0] - - global queue_moves - queue_moves += 1 - - global debug - if debug: - print '-------' - print graph(g) - - if g.target_type == target_type: # and g.consumes(source_groups): - solution_cost = g.cost - yield g - - if g.consumes(source_groups): # Nothing left to find - return - - # combine with all like groups which are compatible - for g2 in all_groups.get(g.target_type,()): - - if g2.is_compatible_with(g): - - _examine_edge( - states, q, - TargetTypeGroup(g.target_type, g2.size + g.size, (g,g2))) - - # expand with all generators which can be triggered as a - # result of adding this group - for generator in generators[g.target_type]: - - match = generator.match(g) - if match is None: - continue - - if debug: - print generator,' matched with ', match - - # for all sets of parents which match the generator and - # include g - for s in parent_sets((g,), match, all_groups, generator): - - # Create the products of running this generator with - # the given parent set - siblings = () - for t,n in generator.targets_.items(): - # Unary generators run as many times as necessary - # to consume the group - if (generator.unary): - n *= g.size - - siblings += (TargetTypeGroup(t, n, s, generator),) - - # Make sure groups know about their siblings - if len(siblings) > 1: - for product in siblings: - product.set_siblings(siblings) - - if debug: - print siblings, '<-', list(s) - - # Add new search states to the queue - for sib in siblings: - _examine_edge(states, q, sib) - - # Add to the set of all groups so that we can combine it with - # others in future iterations - l = all_groups.get(g.target_type) - if l is None: - l = all_groups.setdefault(g.target_type,[]) - l.append(g) - - # Sort the queue; in 'real life' use a priority queue - q.sort(lambda v1,v2: v1.group.cost - v2.group.cost) - - -def graph(group, indent = 0, visited = None): - - """Produce a string representation of the search graph - that produced the given group. - """ - if (visited is None): - visited = {} - s = indent * ' ' - s += repr(group) - if group in visited: - s += '...\n' - else: - visited[group] = True - s += '[%s]' % group.generator - - if group.ambiguous: - s += ' *ambiguous* ' - if type(group.ambiguous) is not type(1): - s += 'due to %s' % group.ambiguous - if group.siblings: - s += ' siblings ' + str([sib for sib in group.siblings if - sib != group]) - s += '\n' + '\n'.join( - [graph(g,indent+1,visited) for g in group.parents]) - return s - -def ambiguities(group): - """Returns a list of groups that caused ambiguities with this one - or its constituents. - """ - result = [] - for g in group.parents: - result.extend(ambiguities(g)) - if group.ambiguous and type(group.ambiguous) is not type(1): - result.append(group.ambiguous) - return result - -def search(generators, targets, sources): - import sys - global queue_moves - - TargetTypeGroup.instances = 0 - queue_moves = 0 - - # Remember what we started with - source_groups = tuple([ - TargetTypeGroup(i[0],i[1]) - for i in _string_multiset(sources).items() ]) - - solutions = {} - max_consumed = 0 - - for g in optimal_graphs(targets, source_groups, generators): - - if len(g.consumed_sources) > max_consumed: - max_consumed = len(g.consumed_sources) - - g2 = solutions.setdefault(len(g.consumed_sources), g) - if g2 is not g: - if g2.cost == g.cost: - g2.ambiguous = g - - if max_consumed: - g = solutions[max_consumed] - - print 80 * '=' - print graph(g) - - if g.ambiguous: - print 40 * '-' - print 'ambiguities:' - for a in ambiguities(g): - print graph(a) - print - - print queue_moves, 'queue_moves' - print 80 * '=' - sys.stdout.flush() - - print queue_moves, 'queue moves' - print '\n\n*****\n\n' - - -def test(): - """Runs Volodya's example, but doesn't get the result he'd like. - """ - # EST_EXE <- OBJ* - # OBJ <- CPP - # {CPP,STATIC_DATA} <- NM_ASM - # {CPP,CPP} <- ECPP (only first CPP must be further converted into NM_ASM) - # NM_ASM <- CPP - # {CPP,STATIC_DATA} <- STATIC_DATA* - # STATIC_DATA <- NM_ASM - # NM_OBJ <- NM_ASM - # NM_EXE <- NM_OBJ* - generators = GeneratorSet() - generators += Generator('OBJ*', 'EST_EXE') - generators += Generator('CPP', 'OBJ') - generators += Generator('NM_ASM', ('CPP', 'STATIC_DATA')) - generators += Generator('ECPP', ('CPP','CPP')) - generators += Generator('CPP', 'NM_ASM') - generators += Generator('STATIC_DATA*', ('CPP', 'STATIC_DATA')) - generators += Generator('NM_ASM', 'NM_OBJ') - generators += Generator('NM_OBJ*', 'NM_EXE') - - search(generators, 'EST_EXE', ('CPP', 'NM_ASM', 'ECPP')) - # Try the same search with a source type that can't be consumed. - # This will exhaust all transformations before stopping. - search(generators, 'EST_EXE', ('CPP', 'NM_ASM', 'ECPP', 'FOO')) - search(generators, 'NM_EXE', ('CPP')) - -def run(args = None): - import doctest - import sys - - if args is not None: - sys.argv = args - - error = doctest.testmod(sys.modules.get(__name__)) - - if not error[0]: - global debug - if '--debug' in sys.argv: - debug = 1 - test() - - return error - -if __name__ == '__main__': - import sys - sys.exit(run()[0]) - - - - - - - - - - - - diff --git a/v2/hacking.txt b/v2/hacking.txt deleted file mode 100644 index a65adce0b..000000000 --- a/v2/hacking.txt +++ /dev/null @@ -1,154 +0,0 @@ -Copyright 2003, 2006 Vladimir Prus -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) - - - ---------------------------------- - Boost.Build contributor guidelines - ---------------------------------- - -Boost.Build is an open-source project. This means that we welcome and -appreciate all contributions --- be it ideas, bug reports, or patches. -This document contains guidelines which helps to assure that development -goes on smoothly, and changes are made quickly. - -The guidelines are not mandatory, and you can decide for yourself which one -to follow. But note, that 10 mins that you spare writing a comment, for -example, might lead to significally longer delay for everyone. - -Before contributing, make sure you are subscribed to our mailing list - - boost-build@lists.boost.org - -Additional resources include - - - The issue tracker - http://zigzag.cs.msu.su/boost.build - - - commits mailing list: - boost-build@lists.sourceforge.net - http://sourceforge.net/mailarchive/forum.php?forum_id=9097 - - -BUGS and PATCHES - -Both bugs and patches can be send to our mailing list. - -When reporting a bug, please try to provide the following information. - - - What you did. A minimal reproducible testcase is very much appreciated. - Shell script with some annotations is much better than verbose description of - the problem. A regression test is the best (see test/test_system.html). - - What you got. - - What you expected. - - What version of Boost.Build and Boost.Jam did you use. If possible, - please try to test with the CVS HEAD state. - -When submitting a patch, please: - - - make a single patch for a single logical change - - follow the policies and coding conventions below, - - send patches in unified diff format, - (using either "cvs diff -u" or "diff -u") - - provide a log message together with the patch - - put the patch and the log message as attachment to your email. - -The purpose of log message serves to communicate what was changed, and -*why*. Without a good log message, you might spend a lot of time later, -wondering where a strange piece of code came from and why it was necessary. - -The good log message mentions each changed file and each rule/method, saying -what happend to it, and why. Consider, the following log message - - Better direct request handling. - - * new/build-request.jam - (directly-requested-properties-adjuster): Redo. - - * new/targets.jam - (main-target.generate-really): Adjust properties here. - - * new/virtual-target.jam - (register-actual-name): New rule. - (virtual-target.actualize-no-scanner): Call the above, to detected bugs, - where two virtual target correspond to one Jam target name. - -The log messages for the last two files are good. They tell what was -changed. The change to the first file is clearly undercommented. - -It's OK to use terse log messages for uninteresting changes, like -ones induces by interface changes elsewhere. - - -POLICIES. - -1. Testing. - -All serious changes must be tested. New rules must be tested by the module -where they are declared. Test system (test/test_system.html) should be used -to verify user-observable behaviour. - -2. Documentation. - -It turns out that it's hard to have too much comments, but it's easy to have -too little. Please prepend each rule with a comment saying what the rule does -and what arguments mean. Stop for a minute and consider if the comment makes -sense for anybody else, and completely describes what the rules does. Generic -phrases like "adjusts properties" are really not enough. - -When applicable, make changes to the user documentation as well. - - -CODING CONVENTIONS. - - 1. All names of rules and variables are lowercase with "-" to separate - words. - - rule call-me-ishmael ( ) ... - - 2. Names with dots in them are "intended globals". Ordinary globals use - a dot prefix: - - .foobar - $(.foobar) - - 3. Pseudofunctions or associations are .: - - $(argument).name = hello ; - $($(argument).name) - - 4. Class attribute names are prefixed with "self.": - - self.x - $(self.x) - - 5. Builtin rules are called via their ALL_UPPERCASE_NAMES: - - DEPENDS $(target) : $(sources) ; - - 6. Opening and closing braces go on separate lines: - - if $(a) - { - # - } - else - { - # - } - -HTML DOCUMENTATION. - - Please pass HTML files though HTML Tidy (http://tidy.sf.net) before - comitting. This has to important purposes: - - detecting bad HTML - - converting files to uniform indentation style, which inverses effect - of different editors and makes differences between revisions much - smaller and easy for review. - - Alas, the way Tidy indents HTML differs between version. Please use - the version awailable at - - http://tidy.sourceforge.net/src/old/tidy_src_020411.tgz - - and "-i -wrap 78" command line parameters. diff --git a/v2/index.html b/v2/index.html deleted file mode 100644 index 1e974d866..000000000 --- a/v2/index.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - Boost.Build V2 - - - - -

Boost.Build V2 - -

- - - - -

Overview

- -

Boost.Build is an easy way to build C++ projects, everywhere. You - name you executables and libraries and list their sources. Boost.Build - takes care about compiling your sources with right options, creating - static and shared libraries, making executables, and other chores -- - whether you're using gcc, msvc, or a dozen more supported C++ - compilers -- on Windows, OSX, Linux and commercial UNIX systems. - -

Some of the most important features: -

    -
  • Simple and high level build description. In most - cases a name of target and list of sources is all you need.
  • - -
  • Portability. Most important build properties have symbolic - names that work everywhere. Why memorize compiler flags necessary - for multi-threaded 64-bit shared library, if Boost.Build can do it for you? - -
  • Variant builds. When you build the same project - twice with different properties, all produced files are placed - in different directories, so you can build with 2 versions of - gcc, or both debug and release variants in one invocation.
  • - -
  • Global dependencies. No matter what directory you build - in, Boost.Build will always check all dependencies in your entire - project, preventing inconsistent binaries. And it's easy to - use one Boost.Build project in other, again with full dependency - tracking. - -
  • Usage requirements. A target can specify properties, - like include paths and preprocessor defines, that are necessary to use - it. Those properties will be automatically applied whenever the target - is used.
  • - -
  • Standalone. Boost.Build's only dependency is a C compiler, - so it's easy to setup. You can even include all of Boost.Build in your - project. Boost.Build does not use depend on C++ Boost in any way.
  • -
- -

Status and future

- -

Boost.Build is ready to use today, and new features are being actively - developed. - -

The current version of 2.0 Milestone 12, which added support for - precompiled headers on gcc, and added 3 new C++ compilers - (full changelog). - -

Milestone 13 is planned as bugfix release. Milestone 14 will - focus on improving user documentation. Milestone 15 will see most - of Boost.Build reimplemented in Python, to make extending - Boost.Build even easier for end users (see PythonPort). - The specific issues planned for each release can be found on the - roadmap. - - - -

Feedback and contributing

- -

Should you have any questions or comments, we'd be glad to hear them. - Post everything to the mailing list.

- -

Bugs and feature requests can be entered at our - bug tracker. - -

If you'd like to help with development, just pick a bug - in the tracker that you'd like to fix, or feel free to implement - any feature you like. There's a separate - guidelines document for working on code.

-
- -

© Copyright David Abrahams and Vladimir Prus 2002-2007. - Permission to copy, use, modify, sell and distribute this document is - granted provided this copyright notice appears in all copies. This - document is provided "as is" without express or implied warranty, and - with no claim as to its suitability for any purpose.

- -

Revised - Oct 4, 2007 - -

- - - - - - diff --git a/v2/kernel/boost-build.jam b/v2/kernel/boost-build.jam deleted file mode 100755 index 377f6ec02..000000000 --- a/v2/kernel/boost-build.jam +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2003 Dave Abrahams -# 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) - -boost-build . ; diff --git a/v2/kernel/bootstrap.jam b/v2/kernel/bootstrap.jam deleted file mode 100755 index 59b46762d..000000000 --- a/v2/kernel/bootstrap.jam +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2003, 2005, 2006 Rene Rivera -# Copyright 2003, 2005, 2006 Vladimir Prus -# 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) - -# First of all, check the jam version - -if $(JAM_VERSION:J="") < 030112 -{ - ECHO "error: Boost.Jam version 3.1.12 or later required" ; - EXIT ; -} - -local required-rules = GLOB-RECURSIVELY HAS_NATIVE_RULE ; - -for local r in $(required-rules) -{ - if ! $(r) in [ RULENAMES ] - { - ECHO "error: builtin rule '$(r)' is not present" ; - ECHO "error: your version of bjam is likely out of date" ; - ECHO "error: please get a fresh version from CVS." ; - EXIT ; - } -} - -local native = - regex transform 2 - ; -while $(native) -{ - if ! [ HAS_NATIVE_RULE $(native[1]) : - $(native[2]) : - $(native[3]) ] - { - ECHO "error: missing native rule '$(native[1]).$(native[2])'" ; - ECHO "error: or interface version of that rule is too low" ; - ECHO "error: your version of bjam is likely out of date" ; - ECHO "error: please get a fresh version from CVS." ; - EXIT ; - } - native = $(native[4-]) ; -} - -# Check that the builtin .ENVIRON module is present. We don't have a -# builtin to check that a module is present, so we assume that the PATH -# environment variable is always set and verify that the .ENVIRON module -# has non-empty value of that variable. -module .ENVIRON -{ - local p = $(PATH) $(Path) $(path) ; - if ! $(p) - { - ECHO "error: no builtin module .ENVIRON is found" ; - ECHO "error: your version of bjam is likely out of date" ; - ECHO "error: please get a fresh version from CVS." ; - EXIT ; - } -} - -# Check that @() functionality is present. Similarly to modules, -# we don't have a way to test that directly. Instead we check that -# $(TMPNAME) functionality is present which was added at roughly -# the same time (more precisely it was added just before). -{ - if ! $(TMPNAME) - { - ECHO "error: no @() functionality found" ; - ECHO "error: your version of bjam is likely out of date" ; - ECHO "error: please get a fresh version from CVS." ; - EXIT ; - } -} - - - -# Bootstrap the module system. Then bring the import rule into the global module. -# -SEARCH on modules.jam = $(.bootstrap-file:D) ; -module modules { include modules.jam ; } -IMPORT modules : import : : import ; - -{ - # Add module subdirectories to the BOOST_BUILD_PATH, which allows - # us to make an incremental refactoring step by moving modules to - # the appropriate subdirectories, thereby achieving some physical - # separation of different layers without changing all of our code - # to specify subdirectories in import statements or use an extra - # level of qualification on imported names. - - local subdirs = - kernel # only the most-intrinsic modules: modules, errors - util # low-level substrate: string/number handling, etc. - build # essential elements of the build system architecture - tools # toolsets for handling specific build jobs and targets. - - new # until we get everything sorted out, there is - # still some code here - - . # build-system.jam lives here - - ; - local whereami = [ NORMALIZE_PATH $(.bootstrap-file:DT) ] ; - BOOST_BUILD_PATH += $(whereami:D)/$(subdirs) ; - - modules.poke .ENVIRON : BOOST_BUILD_PATH : $(BOOST_BUILD_PATH) ; -} - -# Reload the modules, to clean up things. The modules module can tolerate -# being included twice. -# -import modules ; - -# Process option plugins first to alow them to prevent loading -# the rest of the build system. -# -import option ; -local dont-build = [ option.process ] ; - -# Should we skip building, i.e. loding the build system, according -# to the options processed? -# -if ! $(dont-build) -{ - # Allow users to override the build system file from the - # command-line (mostly for testing) - local build-system = [ MATCH --build-system=(.*) : $(ARGV) ] ; - build-system ?= build-system ; - - # Use last element in case of multiple command-line options - import $(build-system[-1]) ; -} - diff --git a/v2/kernel/class.jam b/v2/kernel/class.jam deleted file mode 100644 index 2857718ab..000000000 --- a/v2/kernel/class.jam +++ /dev/null @@ -1,431 +0,0 @@ -# Copyright 2001, 2002, 2003 Dave Abrahams -# Copyright 2002, 2005 Rene Rivera -# Copyright 2002, 2003 Vladimir Prus -# 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) - -# Polymorphic class system built on top of core Jam facilities. -# -# Classes are defined by 'class' keywords:: -# -# class myclass ( arg1 ) -# { -# rule __init__ ( ) # constructor -# { -# self.attribute = $(arg1) ; -# } -# -# rule method1 ( ) # method -# { -# return [ method2 ] ; -# } -# -# rule method2 ( ) # method -# { -# return $(self.attribute) ; -# } -# } -# -# The __init__ rule is the constructor, and sets member variables. -# -# New instances are created by invoking [ new ]:: -# -# local x = [ new myclass foo ] ; # x is a new myclass object -# assert.result foo : [ $(x).method1 ] ; # $(x).method1 returns "foo" -# -# Derived class are created by mentioning base classes in the declaration:: -# -# class derived : myclass -# { -# rule __init__ ( arg ) -# { -# myclass.__init__ $(arg) ; # call base __init__ -# -# } -# -# rule method2 ( ) # method override -# { -# return $(self.attribute)XXX ; -# } -# } -# -# All methods operate virtually, replacing behavior in the base -# classes. For example:: -# -# local y = [ new derived foo ] ; # y is a new derived object -# assert.result fooXXX : [ $(y).method1 ] ; # $(y).method1 returns "foo" -# -# Each class instance is its own core Jam module. All instance -# attributes and methods are accessible without additional -# qualification from within the class instance. All rules imported in -# class declaration, or visible in base classses are also visible. -# Base methods are available in qualified form: base-name.method-name. -# By convention, attribute names are prefixed with "self.". - -import numbers ; -import errors : * ; -import set ; -import modules ; -import assert ; - -classes = ; - - -rule xinit ( instance : class ) -{ - module $(instance) - { - __class__ = $(2) ; - __name__ = $(1) ; - } -} - - -rule new ( class args * : * ) -{ - .next-instance ?= 1 ; - local id = object($(class))@$(.next-instance) ; - - xinit $(id) : $(class) ; - - INSTANCE $(id) : class@$(class) ; - IMPORT_MODULE $(id) : ; - $(id).__init__ $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - - # bump the next unique object name - .next-instance = [ numbers.increment $(.next-instance) ] ; - - # Return the name of the new instance. - return $(id) ; -} - - -rule bases ( class ) -{ - #if ! ( $(class) in $(classes) ) - #{ - # error class $(class) not defined ; - #} - - module class@$(class) - { - return $(__bases__) ; - } -} - -rule is-derived ( class : bases + ) -{ - #local all = $(class) $(bases) ; - #if ! ( $(all) in $(classes) ) - #{ - # error class(es) [ set.difference $(class) $(bases) : $(classes) ] not defined ; - #} - - local stack = $(class) ; - local visited found ; - while ( ! $(found) ) && $(stack) - { - local top = $(stack[1]) ; - stack = $(stack[2-]) ; - if ! ( $(top) in $(visited) ) - { - visited += $(top) ; - stack += [ bases $(top) ] ; - - if $(bases) in $(visited) - { - found = true ; - } - } - } - return $(found) ; -} - -# Returns true if the 'value' is a class instance. -rule is-instance ( value # The value to check - ) -{ - return [ MATCH "^(object\\()[^@]+\\)@.*" : $(value) ] ; -} - -# Check if the given value is of the given type. -# -rule is-a ( - instance # The value to check. - : type # The type to test for. - ) -{ - if [ is-instance $(instance) ] - { - return [ class.is-derived [ modules.peek $(instance) : __class__ ] : $(type) ] ; - } -} - -local rule typecheck ( x ) -{ - local class-name = [ MATCH "^\\[(.*)\\]$" : [ BACKTRACE 1 ] ] ; - if ! [ is-a $(x) : $(class-name) ] - { - return "Expected an instance of "$(class-name)" but got \""$(x)"\" for argument" ; - } -} - -local rule __test__ ( ) -{ - import "class" : * ; - import assert ; - import errors : * ; - - # This will be the construction function for a class called - # 'myclass' - class myclass - { - import assert : nonempty-variable ; - - rule __init__ ( x_ * : y_ * ) - { - # set some instance variables - x = $(x_) ; - y = $(y_) ; - foo += 10 ; - } - - rule set-x ( newx * ) - { - x = $(newx) ; - } - - rule get-x ( ) - { - return $(x) ; - } - - rule set-y ( newy * ) - { - y = $(newy) ; - } - - rule get-y ( ) - { - return $(y) ; - } - - rule f ( ) - { - return [ g $(x) ] ; - } - - rule g ( args * ) - { - if $(x) in $(y) - { - return $(x) ; - } - else if $(y) in $(x) - { - return $(y) ; - } - else - { - return ; - } - } - - rule get-class ( ) - { - return $(__class__) ; - } - - rule get-instance ( ) - { - return $(__name__) ; - } - - rule invariant ( ) - { - assert.equal 1 : 1 ; - } - - rule get-foo ( ) - { - return $(foo) ; - } - } -# class myclass ; - - class derived1 : myclass - { - rule __init__ ( z_ ) - { - myclass.__init__ $(z_) : X ; - z = $(z_) ; - } - - # override g - rule g ( args * ) - { - return derived1.g ; - } - - rule h ( ) - { - return derived1.h ; - } - - rule get-z ( ) - { - return $(z) ; - } - - # Check that 'assert.equal' visible in base class is visible - # here. - rule invariant2 ( ) - { - assert.equal 2 : 2 ; - } - - # Check that 'nonempty-variable' visible in base class is - # visible here. - rule invariant3 ( ) - { - local v = 10 ; - nonempty-variable v ; - } - } -# class derived1 : myclass ; - - class derived2 : myclass - { - rule __init__ ( ) - { - myclass.__init__ 1 : 2 ; - } - - # override g - rule g ( args * ) - { - return derived2.g ; - } - - rule get-x ( ) - { - # Test the ability to call base class functions with qualification. - return [ myclass.get-x ] ; - } - } -# class derived2 : myclass ; - - class derived2a : derived2 - { - rule __init__ - { - derived2.__init__ ; - } - } -# class derived2a : derived2 ; - - local rule expect_derived2 ( [derived2] x ) { } - - local a = [ new myclass 3 4 5 : 4 5 ] ; - local b = [ new derived1 4 ] ; - local b2 = [ new derived1 4 ] ; - local c = [ new derived2 ] ; - local d = [ new derived2 ] ; - local e = [ new derived2a ] ; - - expect_derived2 $(d) ; - expect_derived2 $(e) ; - - # argument checking is set up to call exit(1) directly on - # failure, and we can't hijack that with try, so we'd better - # not do this test by default. We could fix this by having - # errors look up and invoke the EXIT rule instead; EXIT can be - # hijacked (;-) - if --fail-typecheck in [ modules.peek : ARGV ] - { - try ; - { - expect_derived2 $(a) ; - } - catch - "Expected an instance of derived2 but got" instead - ; - } - - - #try ; - #{ - # new bad_subclass ; - #} - #catch - # bad_subclass.bad_subclass failed to call base class constructor myclass.__init__ - # ; - - #try ; - #{ - # class bad_subclass ; - #} - #catch bad_subclass has already been declared ; - - assert.result 3 4 5 : $(a).get-x ; - assert.result 4 5 : $(a).get-y ; - assert.result 4 : $(b).get-x ; - assert.result X : $(b).get-y ; - assert.result 4 : $(b).get-z ; - assert.result 1 : $(c).get-x ; - assert.result 2 : $(c).get-y ; - assert.result 4 5 : $(a).f ; - assert.result derived1.g : $(b).f ; - assert.result derived2.g : $(c).f ; - assert.result derived2.g : $(d).f ; - - assert.result 10 : $(b).get-foo ; - - $(a).invariant ; - $(b).invariant2 ; - $(b).invariant3 ; - - # Check that the __class__ attribute is getting properly set. - assert.result myclass : $(a).get-class ; - assert.result derived1 : $(b).get-class ; - assert.result $(a) : $(a).get-instance ; - - $(a).set-x a.x ; - $(b).set-x b.x ; - $(c).set-x c.x ; - $(d).set-x d.x ; - assert.result a.x : $(a).get-x ; - assert.result b.x : $(b).get-x ; - assert.result c.x : $(c).get-x ; - assert.result d.x : $(d).get-x ; - - class derived3 : derived1 derived2 - { - rule __init__ ( ) - { - } - } - - - assert.result : bases myclass ; - assert.result myclass : bases derived1 ; - assert.result myclass : bases derived2 ; - assert.result derived1 derived2 : bases derived3 ; - - assert.true is-derived derived1 : myclass ; - assert.true is-derived derived2 : myclass ; - assert.true is-derived derived3 : derived1 ; - assert.true is-derived derived3 : derived2 ; - assert.true is-derived derived3 : derived1 derived2 myclass ; - assert.true is-derived derived3 : myclass ; - - assert.false is-derived myclass : derived1 ; - - assert.true is-instance $(a) ; - assert.false is-instance bar ; - - assert.true is-a $(a) : myclass ; - assert.true is-a $(c) : derived2 ; - assert.true is-a $(d) : myclass ; - assert.false is-a literal : myclass ; -} diff --git a/v2/kernel/errors.jam b/v2/kernel/errors.jam deleted file mode 100755 index 838bbde3b..000000000 --- a/v2/kernel/errors.jam +++ /dev/null @@ -1,264 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2004 Vladimir Prus -# 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) - -# Print a stack backtrace leading to this rule's caller. Each -# argument represents a line of output to be printed after the first -# line of the backtrace. -rule backtrace ( skip-frames prefix messages * : * ) -{ - local frame-skips = 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 ; - local drop-elements = $(frame-skips[$(skip-frames)]) ; - if ! ( $(skip-frames) in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ) - { - ECHO warning: backtrace doesn't support skipping - $(skip-frames) frames; using 1 instead. ; - drop-elements = 5 ; - } - - local args = $(.args) ; - if $(.user-modules-only) - { - local bt = [ nearest-user-location ] ; - ECHO "$(prefix) at $(bt) " ; - for local n in $(args) - { - if $($(n))-is-not-empty - { - ECHO $(prefix) $($(n)) ; - } - } - } - else - { - # get the whole backtrace, then drop the initial quadruples - # corresponding to the frames that must be skipped. - local bt = [ BACKTRACE ] ; - bt = $(bt[$(drop-elements)-]) ; - - while $(bt) - { - local m = [ MATCH ^(.+)\\.$ : $(bt[3]) ] ; - ECHO $(bt[1]):$(bt[2]): "in" $(bt[4]) "from module" $(m) ; - - - # the first time through, print each argument on a separate - # line - for local n in $(args) - { - if $($(n))-is-not-empty - { - ECHO $(prefix) $($(n)) ; - } - } - args = ; # kill args so that this never happens again - - # Move on to the next quadruple - bt = $(bt[5-]) ; - } - } -} - -.args ?= messages 2 3 4 5 6 7 8 9 ; -.disabled ?= ; -.last-error-$(.args) ?= ; - -# try-catch -- -# -# This is not really an exception-handling mechanism, but it does -# allow us to perform some error-checking on our -# error-checking. Errors are suppressed after a try, and the first one -# is recorded. Use catch to check that the error message matched -# expectations. - -# begin looking for error messages -rule try ( ) -{ - .disabled += true ; - .last-error-$(.args) = ; -} - -# stop looking for error messages; generate an error if an argument of -# messages is not found in the corresponding argument in the error call. -rule catch ( messages * : * ) -{ - .disabled = $(.disabled[2-]) ; # pop the stack - - import sequence ; - - if ! $(.last-error-$(.args))-is-nonempty - { - error-skip-frames 3 expected an error, but none occurred ; - } - else - { - for local n in $(.args) - { - if ! $($(n)) in $(.last-error-$(n)) - { - local v = [ sequence.join $($(n)) : " " ] ; - v ?= "" ; - local joined = [ sequence.join $(.last-error-$(n)) : " " ] ; - - .last-error-$(.args) = ; - error-skip-frames 3 expected \"$(v)\" in argument $(n) of error - : got \"$(joined)\" instead ; - } - } - } -} - -rule error-skip-frames ( skip-frames messages * : * ) -{ - if ! $(.disabled) - { - backtrace $(skip-frames) error: $(messages) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - EXIT ; - } - else if ! $(.last-error-$(.args)) - { - for local n in $(.args) - { - # Add an extra empty string so that we always have - # something in the event of an error - .last-error-$(n) = $($(n)) "" ; - } - } -} - -if --no-error-backtrace in [ modules.peek : ARGV ] -{ - .no-error-backtrace = true ; -} - - -# Print an error message with a stack backtrace and exit. -rule error ( messages * : * ) -{ - if $(.no-error-backtrace) - { - # Print each argument on a separate line. - for local n in $(.args) - { - if $($(n))-is-not-empty - { - if ! $(first-printed) - { - ECHO error: $($(n)) ; - first-printed = true ; - } - else - { - ECHO $($(n)) ; - } - } - } - EXIT ; - } - else - { - error-skip-frames 3 $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; - } -} - -# Same as 'error', but the generated backtrace will include only user files. -rule user-error ( messages * : * ) -{ - .user-modules-only = 1 ; - error-skip-frames 3 $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; -} - - -# Print a warning message with a stack backtrace and exit. -rule warning -{ - backtrace 2 warning: $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; -} - -# convert an arbitrary argument list into a list with ":" separators -# and quoted elements representing the same information. This is -# mostly useful for formatting descriptions of the arguments with -# which a rule was called when reporting an error. -rule lol->list ( * ) -{ - local result ; - local remaining = 1 2 3 4 5 6 7 8 9 ; - while $($(remaining)) - { - local n = $(remaining[1]) ; - remaining = $(remaining[2-]) ; - - if $(n) != 1 - { - result += ":" ; - } - result += \"$($(n))\" ; - } - return $(result) ; -} - -# Return the file:line for the nearest entry in backtrace which correspond -# to a user module. -rule nearest-user-location ( ) -{ - local bt = [ BACKTRACE ] ; - - local result ; - while $(bt) && ! $(result) - { - local m = [ MATCH ^(.+)\\.$ : $(bt[3]) ] ; - local user-modules = ([Jj]amroot(.jam|.v2|)|([Jj]amfile(.jam|.v2|)|user-config.jam|site-config.jam|project-root.jam) ; - - if [ MATCH $(user-modules) : $(bt[1]:D=) ] - { - result = $(bt[1]):$(bt[2]) ; - } - bt = $(bt[5-]) ; - } - return $(result) ; -} - -# If optimized rule is available in jam, use it. -if NEAREST_USER_LOCATION in [ RULENAMES ] -{ - rule nearest-user-location ( ) - { - local r = [ NEAREST_USER_LOCATION ] ; - return $(r[1]):$(r[2]) ; - } -} - - - -rule __test__ ( ) -{ - # show that we can correctly catch an expected error - try ; - { - error an error occurred : somewhere ; - } - catch an error occurred : somewhere ; - - # show that unexpected errors generate real errors - try ; - { - try ; - { - error an error occurred : somewhere ; - } - catch an error occurred : nowhere ; - } - catch expected \"nowhere\" in argument 2 ; - - # show that not catching an error where one was expected is an - # error - try ; - { - try ; - { - } - catch ; - } - catch expected an error, but none occurred ; -} diff --git a/v2/kernel/modules.jam b/v2/kernel/modules.jam deleted file mode 100755 index 580c1bac4..000000000 --- a/v2/kernel/modules.jam +++ /dev/null @@ -1,331 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2003, 2005 Vladimir Prus -# 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) - -# Essentially an include guard; ensures that no module is loaded multiple times -.loaded ?= ; - -# A list of modules currently being loaded for error reporting of circular dependencies -.loading ?= ; - -# A list of modules needing to be tested via __test__ rule -.untested ?= ; - -# A list of modules which have been tested via __test__ -.tested ?= ; - -# meant to be invoked from import when no __test__ rule is defined in a given -# module -local rule no-test-defined -{ - import modules ; - if ! ( --quiet in [ modules.peek : ARGV ] ) - { - ECHO warning: no __test__ rule defined in module $(__module__) ; - } -} - -# return the binding of the given module -rule binding ( module ) -{ - return $($(module).__binding__) ; -} - -# Sets the module-local value of a variable. This is the most -# reliable way to set a module-local variable in a different module; -# it eliminates issues of name shadowing due to dynamic scoping. -rule poke ( module-name ? : variables + : value * ) -{ - module $(<) - { - $(>) = $(3) ; - } -} - -# Returns the module-local value of a variable. This is the most -# reliable way to examine a module-local variable in a different -# module; it eliminates issues of name shadowing due to dynamic -# scoping. -rule peek ( module-name ? : variables + ) -{ - module $(<) - { - return $($(>)) ; - } -} - -# Call the given rule locally in the given module. Use this for rules -# which accept rule names as arguments, so that the passed rule may be -# invoked in the context of the rule's caller (for example, if the -# rule accesses module globals or is a local rule). -rule call-in ( module-name ? : rule-name args * : * ) -{ - module $(module-name) - { - return [ $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ; - } -} - -# Given a possibly qualified rule name and arguments, remove any -# initial module qualification from the rule and invoke it in that -# module. If there is no module qualification, the rule is invoked in -# the global module. -rule call-locally ( qualified-rule-name args * : * ) -{ - local module-rule = [ MATCH (.*)\\.(.*) : $(qualified-rule-name) ] ; - local rule-name = $(module-rule[2]) ; - rule-name ?= $(qualified-rule-name) ; - return [ - call-in $(module-rule[1]) - : $(rule-name) $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) - ] ; -} - -# load the indicated module if it is not already loaded. -rule load ( - module-name # name of module to load. Rules will be defined in this module - : filename ? # (partial) path to file; Defaults to $(module-name).jam - : search * # Directories in which to search for filename. Defaults to $(BOOST_BUILD_PATH) -) -{ - # Avoid loading modules twice - if ! ( $(module-name) in $(.loaded) ) - { - filename ?= $(module-name).jam ; - - # Mark the module loaded so we don't try to load it recursively - .loaded += $(module-name) ; - - # suppress tests if any module loads are already in progress. - local suppress-test = $(.loading[1]) ; - - # Push this module on the loading stack - .loading += $(module-name) ; - - # Remember that it's untested - .untested += $(module-name) ; - - # Insert the new module's __name__ and __file__ globals - poke $(module-name) : __name__ : $(module-name) ; - poke $(module-name) : __file__ : $(filename) ; - - module $(module-name) - { - # Prepare a default behavior, in case no __test__ is defined. - IMPORT modules : no-test-defined : $(__name__) : __test__ ; - - # Add some grist so that the module will have a unique target name - local module-target = $(__file__:G=module@) ; - - local search = $(3) ; - search ?= [ modules.peek : BOOST_BUILD_PATH ] ; - SEARCH on $(module-target) = $(search) ; - BINDRULE on $(module-target) = modules.record-binding ; - - include $(module-target) ; - - # Allow the module to see its own names with full qualification - local rules = [ RULENAMES $(__name__) ] ; - IMPORT $(__name__) : $(rules) : $(__name__) : $(__name__).$(rules) ; - } - - if $(module-name) != modules && ! [ binding $(module-name) ] - { - import errors ; - errors.error "couldn't find module" $(module-name) in $(search) ; - } - - # Pop the loading stack. Must happen before testing or we'll find a circular loading dependency - .loading = $(.loading[1--2]) ; - - # Run any pending tests if this is an outer load - if ! $(suppress-test) - { - local argv = [ peek : ARGV ] ; - for local m in $(.untested) - { - if ( ! $(m) in $(.tested) ) # avoid recursive test invocations - && ( ( --debug in $(argv) ) || ( --debug-module=$(m) in $(argv) ) ) - { - .tested += $(m) ; - if ! ( --quiet in $(argv) ) - { - ECHO testing module $(m)... ; - } - - # Import m's rules into __test-$(m)__ for easy access - IMPORT $(m) : [ RULENAMES $(m) ] : __test-$(m)__ : [ RULENAMES $(m) ] ; - - # execute the module's __test__ rule in its own module to - # eliminate the inadvertent effects of testing - # module dependencies (such as assert) on the module itself. - IMPORT $(m) : __test__ : __test-$(m)__ : __test__ : LOCALIZE ; - - module __test-$(m)__ - { - # set up the name of the module we're testing - # so that no-test-defined can find it. - __module__ = $(1) ; - __test__ ; - } - } - } - .untested = ; - } - } - else if $(module-name) in $(.loading) - { - import errors ; - errors.error loading \"$(module-name)\" - : circular module loading dependency: - : $(.loading)" ->" $(module-name) ; - } -} - -# This helper is used by load (above) to record the binding (path) of -# each loaded module. -rule record-binding ( module-target : binding ) -{ - $(.loading[-1]).__binding__ = $(binding) ; -} - -# Transform each path in the list, with all backslashes converted to -# forward slashes and all detectable redundancy removed. Something -# like this is probably needed in path.jam, but I'm not sure of that, -# I don't understand it, and I'm not ready to move all of path.jam -# into the kernel. -local rule normalize-raw-paths ( paths * ) -{ - local result ; - for p in $(paths:T) - { - result += [ NORMALIZE_PATH $(p) ] ; - } - return $(result) ; -} - -.cwd = [ PWD ] ; - - -# load the indicated module and import rule names into the current -# module. Any members of rules-opt will be available without -# qualification in the caller's module. Any members of rename-opt will -# be taken as the names of the rules in the caller's module, in place -# of the names they have in the imported module. If rules-opt = '*', -# all rules from the indicated module are imported into the caller's -# module. If rename-opt is supplied, it must have the same number of -# elements as rules-opt. -rule import ( module-names + : rules-opt * : rename-opt * ) -{ - if $(rules-opt) = * || ! $(rules-opt) - { - if $(rename-opt) - { - errors.error "rule aliasing is only available for explicit imports." ; - } - } - - if $(module-names[2]) && ( $(rules-opt) || $(rename-opt) ) - { - errors.error when loading multiple modules, no specific rules or renaming is allowed ; - } - - local caller = [ CALLER_MODULE ] ; - - # Import each specified module - for local m in $(module-names) - { - if ! $(m) in $(.loaded) - { - # if the importing module isn't already in the BOOST_BUILD_PATH, - # prepend it to the path. We don't want to invert the search - # order of modules that are already there. - - local caller-location ; - if $(caller) - { - caller-location = [ binding $(caller) ] ; - caller-location = $(caller-location:D) ; - caller-location = [ normalize-raw-paths $(caller-location:R=$(.cwd)) ] ; - } - - local search = [ peek : BOOST_BUILD_PATH ] ; - search = [ normalize-raw-paths $(search:R=$(.cwd)) ] ; - - if $(caller-location) && ! $(caller-location) in $(search) - { - search = $(caller-location) $(search) ; - } - - load $(m) : : $(search) ; - } - - IMPORT_MODULE $(m) : $(caller) ; - - if $(rules-opt) - { - local source-names ; - if $(rules-opt) = * - { - local all-rules = [ RULENAMES $(m) ] ; - source-names = $(all-rules) ; - } - else - { - source-names = $(rules-opt) ; - } - local target-names = $(rename-opt) ; - target-names ?= $(source-names) ; - IMPORT $(m) : $(source-names) : $(caller) : $(target-names) ; - } - } -} - -# Define exported copies in $(target-module) of all rules exported -# from $(source-module). Also make them available in the global -# module with qualification, so that it is just as though the rules -# were defined originally in $(target-module). -rule clone-rules ( - source-module - target-module - ) -{ - local rules = [ RULENAMES $(source-module) ] ; - - IMPORT $(source-module) : $(rules) : $(target-module) : $(rules) : LOCALIZE ; - EXPORT $(target-module) : $(rules) ; - IMPORT $(target-module) : $(rules) : : $(target-module).$(rules) ; -} - -# These rules need to be available in all modules to implement -# module loading itself and other fundamental operations. -local globalize = peek poke record-binding ; -IMPORT modules : $(globalize) : : modules.$(globalize) ; - -local rule __test__ ( ) -{ - import assert ; - import modules : normalize-raw-paths ; - - module modules.__test__ - { - foo = bar ; - } - - assert.result bar : peek modules.__test__ : foo ; - poke modules.__test__ : foo : bar baz ; - assert.result bar baz : peek modules.__test__ : foo ; - assert.result c:/foo/bar : normalize-raw-paths c:/x/../foo/./xx/yy/../../bar ; - assert.result . : normalize-raw-paths . ; - assert.result .. : normalize-raw-paths .. ; - assert.result ../.. : normalize-raw-paths ../.. ; - assert.result .. : normalize-raw-paths ./.. ; - assert.result / / : normalize-raw-paths / \\ ; - assert.result a : normalize-raw-paths a ; - assert.result a : normalize-raw-paths a/ ; - assert.result /a : normalize-raw-paths /a/ ; - assert.result / : normalize-raw-paths /a/.. ; -} - - diff --git a/v2/nightly.sh b/v2/nightly.sh deleted file mode 100755 index c93eb29e6..000000000 --- a/v2/nightly.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# Copyright 2004, 2005, 2006 Vladimir Prus -# 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) - -# This script create a nightly tarball of Boost.Build V2 -# and updates the web site. - -# Create the packages -set -e -trap "echo 'Nightly build failed'" ERR - -export QTDIR=/usr/share/qt3 -export LC_ALL=C -export LC_MESSAGES=C -export LANG=C -cd /tmp -rm -rf boost-build -echo "Checking out sources" -svn co http://svn.boost.org/svn/boost/trunk/tools boost-build > /tmp/boost_build_checkout_log -mv /tmp/boost_build_checkout_log boost-build/checkout-log -cd boost-build/build/v2 -echo "Building packages and uploading docs" -./roll.sh > ../roll-log 2>&1 -cd .. -echo "Uploading packages" -scp boost-build.zip boost-build.tar.bz2 vladimir_prus@shell.sourceforge.net:/home/groups/b/bo/boost/htdocs/boost-build2 > scp-log -echo "Nightly build successful" diff --git a/v2/notes/README.txt b/v2/notes/README.txt deleted file mode 100644 index c2e6ff629..000000000 --- a/v2/notes/README.txt +++ /dev/null @@ -1,8 +0,0 @@ -Copyright 2005 Vladimir Prus -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) - - -This directory contains various development notes. Some of them -may eventually find the way into documentation, so are purely -imlementation comments. diff --git a/v2/notes/build_dir_option.txt b/v2/notes/build_dir_option.txt deleted file mode 100644 index 9bb50560e..000000000 --- a/v2/notes/build_dir_option.txt +++ /dev/null @@ -1,80 +0,0 @@ -Copyright 2005 Vladimir Prus -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) - - -Summary -------- - -We need a --build-dir option that users building from read-only -medium can use to force building to some other location. Pretty much -every project need this functionality, so it's desirable to have it -out-of-the box, without explicit setup. - -Design ------- - -We can achieve the desired effect manually by adding something like this -to Jamroot: - - project .... : build-dir [ my-rule-to-compute-build-dir ] ; - -Where 'my-rule-to-compute-build-dir' would look at the --build-dir option. - -We need to automate this, but essentially, --build-dir will only affect -the 'build-dir' attribute of Jamroots. - -If Jamroot contains: - - project foo ; - -and --build-dir options' value if /tmp/build, then we'll act as if Jamroot -contained: - - project foo : build-dir /tmp/build/foo ; - -If the 'project' rule has explicit 'build-dir': - - project foo : build-dir bin.v2 ; - -then with the same value of --build-dir we'd act as if Jamroot contained: - - project foo : build-dir /tmp/build/foo/bin.v2 ; - -We can't drop "bin.v2" because it's quite possible that the name of build -dir have specific meaning. For example, it can be used to -separate Boost.Build V2 and V1 build results. - -The --build-dir option has no effect if Jamroot does not define any project -id. Dowing otherwise can lead to nasty problems if we're building two distinct -projects (that is with two different Jamroot). They'll get the same build -directory. Most likely, user will see -the "duplicate target" error, which is generally confusing. - -It is expected that any non-trivial project will have top-level "project" -invocation with non empty id, so the above limitation is not so drastic. -We'll emit a warning if Jamroot does not define project id, and --build-dir -is specified. - -Here's the exact behavior of the --build-dir option. If we're loading a -Jamfile (either root or non-root), that declare some project id and some -build-dir attribute, the following table gives the value of build-dir -that will actually be used. - - -Root? Id Build-dir attribute Resulting build dir -yes none * --build-dir is ignored, with warning -yes 'foo' none /tmp/build/foo -yes 'foo' 'bin.v2' /tmp/build/foo/bin.v2 -yes 'foo' '/tmp/bar' Error [1] -no * none --build-dir has no effect, inherited build dir is used -no * non-empty Error [2] - -[1] -- not clear what to do -[2] -- can be made to work, but non-empty build-dir -attribute in non-root Jamfile does not make much sense even without --build-dir - - - - - diff --git a/v2/notes/relative_source_paths.txt b/v2/notes/relative_source_paths.txt deleted file mode 100644 index 2f0557893..000000000 --- a/v2/notes/relative_source_paths.txt +++ /dev/null @@ -1,76 +0,0 @@ -Copyright 2005 Vladimir Prus -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) - - -Hi, -recently, we had a couple of problems caused by using relative file paths, and -I'd like to discuss what to do. - -Let's use the case from CÊdric. Simplified version is: - - exe a : a.cpp dir1/qt_file.h ; - exe b : a.cpp dir2/qt_file.h ; - -Both exes have the same source cpp file but different *.h files -- which are -processed by Qt tools. V2 currently strips directory name from all targets, -so it tries to - - - create "bin/mvsc/debug/moc_qt_file.cpp" from dir1/qt_file.h - - create "bin/msvc/debug/moc_qt_file.cpp" from dir2/qt_file.h - -There are two solutions that I see: - - 1. Rewrite the code like: - - lib aux : a.cpp - exe a : aux dir1/qt_file.h : a ; - exe b : aux dir2/qt_file.h : b ; - - This way, two version of moc_qt_file.cpp will be generated to different - places. - - 2. Rewrite the code like: - - obj a_moc : dir1/qt_file.h : /qt//qt ; - exe a : a.cpp a_moc ; - obj b_moc : dir2/qt_file.h : /qt//qt ; - exe b : a.cpp b_moc ; - - Explicitly changing name for the problematic files. - - 3. Generally change V2 so that directory part of source is preserved. This - will generate targets: - "bin/msvc/debug/dir1/moc_qt_file.cpp" and - "bin/msvc/debug/dir2/moc_qt_file.cpp". No problems. - - However, there are some additional questions: - - - What if source has absolute file name? - - What if source is "../../include/qt_file.h"? - - We can ignore directory names in those cases (i.e. use the current - behaviour) but that would be a bit inconsistent. - -Any opinions? - -Pedro Ferreira: - -I think this is a corner case and BB should not try to solve everything -automatically - otherwise it will become really complex. -I don't see a problem in requiring the user to help the build system by -using solutions 1 or 2. -Of course, the better the error reporting, the easier it will be to -find the cause and the cure of the problem. - -TEMPLIE Cedric: - -I agree with Pedro. Solution 1 or 2 is the best way to deal with this -problem. Of course I have a preference for the solution 1, but the -solution 2 has the advantage to work without any modification... - -Toon Knapen: - -I agree. - - diff --git a/v2/options/help.jam b/v2/options/help.jam deleted file mode 100755 index 9ee45159d..000000000 --- a/v2/options/help.jam +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright 2003 Dave Abrahams -# Copyright 2003, 2006 Rene Rivera -# Copyright 2003, 2006 Vladimir Prus -# 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) - -# This module is the plug-in handler for the --help and --help-.* -# command-line options -import modules ; -import assert ; -import doc : do-scan set-option set-output set-output-file print-help-usage print-help-top ; -import sequence ; -import set ; -import project ; -import print ; -import os ; -import version ; -import path ; - -# List of possible modules, but which really aren't. -# -.not-modules = - boost-build bootstrap site-config test user-config - -tools allyourbase boost-base features python stlport testing unit-tests ; - -# The help system options are parsed here and handed off to the doc -# module to translate into documentation requests and actions. The -# understood options are:: -# -# --help-all -# --help-enable-