1# Copyright (c) 2005 Vladimir Prus. 2# 3# Use, modification and distribution is subject to the Boost Software 4# License Version 1.0. (See accompanying file LICENSE_1_0.txt or 5# http://www.boost.org/LICENSE_1_0.txt) 6 7import modules ; 8 9# Set a value for a named option, to be used when not overridden on the command 10# line. 11rule set ( name : value ? ) 12{ 13 .option.$(name) = $(value) ; 14} 15 16rule get ( name : default-value ? : implied-value ? ) 17{ 18 local m = [ MATCH --$(name)=(.*) : [ modules.peek : ARGV ] ] ; 19 if $(m) 20 { 21 return $(m[1]) ; 22 } 23 else 24 { 25 m = [ MATCH (--$(name)) : [ modules.peek : ARGV ] ] ; 26 if $(m) && $(implied-value) 27 { 28 return $(implied-value) ; 29 } 30 else if $(.option.$(name)) 31 { 32 return $(.option.$(name)) ; 33 } 34 else 35 { 36 return $(default-value) ; 37 } 38 } 39} 40 41 42# Check command-line args as soon as possible. For each option try to load 43# module named after option. Is that succeeds, invoke 'process' rule in the 44# module. The rule may return "true" to indicate that the regular build process 45# should not be attempted. 46# 47# Options take the general form of: --<name>[=<value>] [<value>] 48# 49rule process ( ) 50{ 51 local ARGV = [ modules.peek : ARGV ] ; 52 local BOOST_BUILD_PATH = [ modules.peek : BOOST_BUILD_PATH ] ; 53 54 local dont-build ; 55 local args = $(ARGV) ; 56 while $(args) 57 { 58 local arg = [ MATCH ^--(.*) : $(args[1]) ] ; 59 while $(args[2-]) && ! $(arg) 60 { 61 args = $(args[2-]) ; 62 arg = [ MATCH ^--(.*) : $(args[1]) ] ; 63 } 64 args = $(args[2-]) ; 65 66 if $(arg) 67 { 68 local split = [ MATCH "^(([^-=]+)[^=]*)(=?)(.*)$" : $(arg) ] ; 69 local full-name = $(split[1]) ; 70 local prefix = $(split[2]) ; 71 local values ; 72 73 if $(split[3]) 74 { 75 values = $(split[4]) ; 76 } 77 if $(args) && ! [ MATCH ^(--).* : $(args[1]) ] 78 { 79 values += $(args[1]) ; 80 args = $(args[2-]) ; 81 } 82 83 # Jook in options subdirectories of BOOST_BUILD_PATH for modules 84 # matching the full option name and then its prefix. 85 local plugin-dir = options ; 86 local option-files = [ GLOB $(plugin-dir:D=$(BOOST_BUILD_PATH)) : 87 $(full-name).jam $(prefix).jam ] ; 88 89 if $(option-files) 90 { 91 # Load the file into a module named for the option. 92 local f = $(option-files[1]) ; 93 local module-name = --$(f:D=:S=) ; 94 modules.load $(module-name) : $(f:D=) : $(f:D) ; 95 96 # If there is a process rule, call it with the full option name 97 # and its value (if any). If there was no "=" in the option, the 98 # value will be empty. 99 if process in [ RULENAMES $(module-name) ] 100 { 101 dont-build += [ modules.call-in $(module-name) : process 102 --$(full-name) : $(values) ] ; 103 } 104 } 105 } 106 } 107 108 return $(dont-build) ; 109} 110