1# ConfigRules
2#
3# Contains rules providing the config variable feature. It allows to set the
4# values for certain variables for subdirectories in a central place. That is
5# one can, for instance, specify in a file like UserBuildConfig for which
6# directories to enable debugging, warnings, set special defines, compiler
7# flags and the like without needing to edit the Jamfiles for the respective
8# dirs.
9
10rule ConfigObject
11{
12	# ConfigObject <dir> [ : <varName> ] ;
13	#
14	# Private rule. Returns the dummy object on which the config variables are
15	# set for a given subdir.
16	#
17	# <dir>: Parameters as passed to the SubDir rule, i.e. the name of the
18	#        TOP variable and the subdir tokens.
19	#
20	local config = $(2:E=__config__) ;
21	local grist = [ FGrist root $(1) ] ;
22	return $(config:G=$(grist)) ;
23}
24
25rule SetConfigVar
26{
27	# SetConfigVar <var> : <dir> : <value> [ : <scope> ] ;
28	#
29	# Sets a config variable for a specified directory to the given value.
30	#
31	# <var>: The name of the variable to be set.
32	# <dir>: Parameters as passed to the SubDir rule, i.e. the name of the
33	#        TOP variable and the subdir tokens.
34	# <value>: The value to which the variable shall be set.
35	# <scope>: Either "global" or "local". The former implies that the variable
36	#          value shall also be used for subdirectories (recursively), if
37	#          for them the variable has not been set. The latter has the same
38	#          effect regarding subdirs as if the variable for the directory
39	#          is not set. Defaults to "global".
40	#
41	local var = $(1[1]) ;
42	local config = [ ConfigObject $(2) ] ;
43	local scope = $(4:E=global) ;
44
45	$(var) on $(config) = $(3) ;
46	__set_$(var) on $(config) = $(scope) ;
47
48	if $(scope) = global {
49		$(var) on [ ConfigObject $(2) : __inherited_config__ ] = $(3) ;
50	}
51
52	if ! [ on $(config) return $(__configured) ] {
53		__configured on $(config) = true ;
54		__dir_tokens on $(config) = $(2) ;
55
56		HAIKU_EXISTING_SUBDIR_CONFIGS += $(config) ;
57	}
58}
59
60rule AppendToConfigVar
61{
62	# AppendToConfigVar <var> : <dir> : <value> [ : <scope> ] ;
63	#
64	# Appends a value to a config variable for a specified directory. Shortcut
65	# for
66	#   SetConfigVar <var> : <dir> : [ ConfigVar <var> : <dir> ] <value
67	#                : <scope> ;
68	#
69	# <var>: The name of the variable to be set.
70	# <dir>: Parameters as passed to the SubDir rule, i.e. the name of the
71	#        TOP variable and the subdir tokens.
72	# <value>: The value which to append to the variables current value.
73	# <scope>: Either "global" or "local". The former implies that the variable
74	#          value shall also be used for subdirectories (recursively), if
75	#          for them the variable has not been set. The latter has the same
76	#          effect regarding subdirs as if the variable for the directory
77	#          is not set. Defaults to "global".
78	#
79	SetConfigVar $(1) : $(2) : [ ConfigVar $(1) : $(2) ] $(3) : $(4) ;
80}
81
82rule ConfigVar
83{
84	# ConfigVar <var> : <dir> [ : <scope> ] ;
85	#
86	# Returns the value of a configuration variable for a given subdir.
87	# If the variable is not set for the subdir, the rule is invoked
88	# recursively for the parent directory with the scope "global". When
89	# the root is reached without yielding a value, the value of the global
90	# variable <var> is returned.
91	#
92	# <var>: The name of the variable whose value shall be returned.
93	# <dir>: Parameters as passed to the SubDir rule, i.e. the name of the
94	#        TOP variable and the subdir tokens.
95	# <scope>: If not given any scope passed to SetConfigVar for the given
96	#          directory will be accepted, otherwise it must match the scope
97	#          passed to SetConfigVar.
98	#
99	local var = $(1[1]) ;
100	local dir = $(2) ;
101	local config = [ ConfigObject $(dir) ] ;
102	local scope = $(3) ;
103	local varScope = [ on $(config) return $(__set_$(var)) ] ;
104	if ( ! $(scope) && $(varScope) )
105		|| ( $(scope) && $(scope) = $(varScope) )
106		|| ! $(dir) {
107		on $(config) return $($(var)) ;
108	} else {
109		dir = [ FReverse $(dir) ] ;
110		return [ ConfigVar $(var) : [ FReverse $(dir[2-]) ] : global ] ;
111	}
112}
113
114rule PrepareSubDirConfigVariables
115{
116	local dirTokens = $(1) ;
117	local config = [ ConfigObject $(dirTokens) ] ;
118
119	if ! [ on $(config) return $(__prepared) ] {
120		# prepare config for parent dir
121		local parentDir = [ FReverse $(dirTokens) ] ;
122		parentDir = [ FReverse $(parentDir[2-]) ] ;
123		PrepareSubDirConfigVariables $(parentDir) ;
124
125		# set values for all config variables for the config and the inherited
126		# config for this directory
127		local inheritedConfig = [ ConfigObject $(dirTokens)
128			: __inherited_config__ ] ;
129
130		on [ ConfigObject $(parentDir) : __inherited_config__ ] {
131			local var ;
132			for var in $(AUTO_SET_UP_CONFIG_VARIABLES) {
133				$(var) on $(config) ?= $($(var)) ;
134				$(var) on $(inheritedConfig) ?= $($(var)) ;
135			}
136		}
137
138		HAIKU_INHERITED_SUBDIR_CONFIG on $(config) = $(inheritedConfig) ;
139
140		__prepared on $(config) = true ;
141	}
142}
143
144rule PrepareConfigVariables
145{
146	# initialize variables on the root config and the root inherited config
147	# objects to the global values
148	local rootConfig = [ ConfigObject ] ; # the root config object
149	local inheritedRootConfig = [ ConfigObject : __inherited_config__ ] ;
150
151	local var ;
152	for var in $(AUTO_SET_UP_CONFIG_VARIABLES) {
153		$(var) on $(rootConfig) = $($(var)) ;
154		$(var) on $(inheritedRootConfig) = $($(var)) ;
155	}
156	__prepared on $(rootConfig) = true ;
157
158	HAIKU_INHERITED_SUBDIR_CONFIG = $(rootConfig) ;
159
160	local config ;
161	for config in $(HAIKU_EXISTING_SUBDIR_CONFIGS) {
162		PrepareSubDirConfigVariables [ on $(config) return $(__dir_tokens) ] ;
163	}
164}
165
166# Some config variables that should be set up automatically for subdirs.
167AUTO_SET_UP_CONFIG_VARIABLES +=
168	CCFLAGS C++FLAGS DEBUG DEFINES HDRS JAMFILE LINKFLAGS OPTIM OPTIMIZE
169	SYSHDRS WARNINGS
170;
171