| # Copyright (c) 2005 Vladimir Prus. |
| # |
| # Use, modification and distribution is subject to the Boost Software |
| # License Version 1.0. (See accompanying file LICENSE_1_0.txt or |
| # http://www.boost.org/LICENSE_1_0.txt) |
| |
| import modules ; |
| |
| # Set a value for a named option, to be used when not overridden on the command |
| # line. |
| rule set ( name : value ? ) |
| { |
| .option.$(name) = $(value) ; |
| } |
| |
| rule get ( name : default-value ? : implied-value ? ) |
| { |
| local m = [ MATCH --$(name)=(.*) : [ modules.peek : ARGV ] ] ; |
| if $(m) |
| { |
| return $(m[1]) ; |
| } |
| else |
| { |
| m = [ MATCH (--$(name)) : [ modules.peek : ARGV ] ] ; |
| if $(m) && $(implied-value) |
| { |
| return $(implied-value) ; |
| } |
| else if $(.option.$(name)) |
| { |
| return $(.option.$(name)) ; |
| } |
| else |
| { |
| return $(default-value) ; |
| } |
| } |
| } |
| |
| |
| # Check command-line args as soon as possible. For each option try to load |
| # module named after option. Is that succeeds, invoke 'process' rule in the |
| # module. The rule may return "true" to indicate that the regular build process |
| # should not be attempted. |
| # |
| # Options take the general form of: --<name>[=<value>] [<value>] |
| # |
| rule process ( ) |
| { |
| local ARGV = [ modules.peek : ARGV ] ; |
| local BOOST_BUILD_PATH = [ modules.peek : BOOST_BUILD_PATH ] ; |
| |
| local dont-build ; |
| local args = $(ARGV) ; |
| while $(args) |
| { |
| local arg = [ MATCH ^--(.*) : $(args[1]) ] ; |
| while $(args[2-]) && ! $(arg) |
| { |
| args = $(args[2-]) ; |
| arg = [ MATCH ^--(.*) : $(args[1]) ] ; |
| } |
| args = $(args[2-]) ; |
| |
| if $(arg) |
| { |
| local split = [ MATCH ^(([^-=]+)[^=]*)(=?)(.*)$ : $(arg) ] ; |
| local full-name = $(split[1]) ; |
| local prefix = $(split[2]) ; |
| local values ; |
| |
| if $(split[3]) |
| { |
| values = $(split[4]) ; |
| } |
| if $(args) && ! [ MATCH ^(--).* : $(args[1]) ] |
| { |
| values += $(args[1]) ; |
| args = $(args[2-]) ; |
| } |
| |
| # Jook in options subdirectories of BOOST_BUILD_PATH for modules |
| # matching the full option name and then its prefix. |
| local plugin-dir = options ; |
| local option-files = [ GLOB $(plugin-dir:D=$(BOOST_BUILD_PATH)) : |
| $(full-name).jam $(prefix).jam ] ; |
| |
| if $(option-files) |
| { |
| # Load the file into a module named for the option. |
| local f = $(option-files[1]) ; |
| local module-name = --$(f:D=:S=) ; |
| modules.load $(module-name) : $(f:D=) : $(f:D) ; |
| |
| # If there is a process rule, call it with the full option name |
| # and its value (if any). If there was no "=" in the option, the |
| # value will be empty. |
| if process in [ RULENAMES $(module-name) ] |
| { |
| dont-build += [ modules.call-in $(module-name) : process |
| --$(full-name) : $(values) ] ; |
| } |
| } |
| } |
| } |
| |
| return $(dont-build) ; |
| } |