# 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: --[=] [] # 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) ; }