1fe52b1f5SJerome Forissier# Generate/check/update a .h file to reflect the values of Makefile 2fe52b1f5SJerome Forissier# variables 3fe52b1f5SJerome Forissier# 4fe52b1f5SJerome Forissier# Example usage (by default, check-conf-h will consider all CFG_* 55ef74e73SJerome Forissier# and _CFG_* variables plus PLATFORM_*): 6fe52b1f5SJerome Forissier# 7fe52b1f5SJerome Forissier# path/to/conf.h: FORCE 8fe52b1f5SJerome Forissier# $(call check-conf-h) 9fe52b1f5SJerome Forissier# 10fe52b1f5SJerome Forissier# Or, to include only the variables with the given prefix(es): 11fe52b1f5SJerome Forissier# 12fe52b1f5SJerome Forissier# path/to/crypto_config.h: FORCE 13fe52b1f5SJerome Forissier# $(call check-conf-h,CFG_CRYPTO_ CRYPTO_) 14fe52b1f5SJerome Forissierdefine check-conf-h 15fe52b1f5SJerome Forissier $(q)set -e; \ 1662428631SJens Wiklander $(cmd-echo-silent) ' CHK $@'; \ 17bef37b8bSJerome Forissier cnf='$(strip $(foreach var, \ 18fe52b1f5SJerome Forissier $(call cfg-vars-by-prefix,$1), \ 19bef37b8bSJerome Forissier $(call cfg-make-define,$(var))))'; \ 20*c8a2a652SRasmus Villemoes guardpath="$(patsubst $(out-dir)/%,%,$@)" \ 21*c8a2a652SRasmus Villemoes guard="_`echo "$${guardpath}" | tr -- -/.+ _`_"; \ 22fe52b1f5SJerome Forissier mkdir -p $(dir $@); \ 23fe52b1f5SJerome Forissier echo "#ifndef $${guard}" >$@.tmp; \ 24fe52b1f5SJerome Forissier echo "#define $${guard}" >>$@.tmp; \ 25fe52b1f5SJerome Forissier echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp; \ 26fe52b1f5SJerome Forissier echo "#endif" >>$@.tmp; \ 273354f9b2SJerome Forissier $(call mv-if-changed,$@.tmp,$@) 28fe52b1f5SJerome Forissierendef 29fe52b1f5SJerome Forissier 30b924c494SJens Wiklanderdefine check-conf-cmake 31b924c494SJens Wiklander $(q)set -e; \ 32b924c494SJens Wiklander $(cmd-echo-silent) ' CHK $@'; \ 33b924c494SJens Wiklander cnf='$(strip $(foreach var, \ 34b924c494SJens Wiklander $(call cfg-vars-by-prefix,$1), \ 35b924c494SJens Wiklander $(call cfg-cmake-set,$(var))))'; \ 36b924c494SJens Wiklander mkdir -p $(dir $@); \ 37b924c494SJens Wiklander echo "# auto-generated TEE configuration file" >$@.tmp; \ 38b924c494SJens Wiklander echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \ 39b924c494SJens Wiklander echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp; \ 40b924c494SJens Wiklander $(call mv-if-changed,$@.tmp,$@) 41b924c494SJens Wiklanderendef 42b924c494SJens Wiklander 433354f9b2SJerome Forissierdefine check-conf-mk 44dde0e235Setienne carriere $(q)set -e; \ 4562428631SJens Wiklander $(cmd-echo-silent) ' CHK $@'; \ 46bef37b8bSJerome Forissier cnf='$(strip $(foreach var, \ 47dde0e235Setienne carriere $(call cfg-vars-by-prefix,CFG_), \ 48bef37b8bSJerome Forissier $(strip $(var)=$($(var))_nl_)))'; \ 49dde0e235Setienne carriere mkdir -p $(dir $@); \ 50dde0e235Setienne carriere echo "# auto-generated TEE configuration file" >$@.tmp; \ 51b5569a68SPascal Brand echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \ 52dde0e235Setienne carriere echo "ARCH=${ARCH}" >>$@.tmp; \ 53dde0e235Setienne carriere echo "PLATFORM=${PLATFORM}" >>$@.tmp; \ 54dde0e235Setienne carriere echo "PLATFORM_FLAVOR=${PLATFORM_FLAVOR}" >>$@.tmp; \ 55dde0e235Setienne carriere echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp; \ 563354f9b2SJerome Forissier $(call mv-if-changed,$@.tmp,$@) 573354f9b2SJerome Forissierendef 583354f9b2SJerome Forissier 59fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix 60fe52b1f5SJerome Forissier $(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)), 615ef74e73SJerome Forissier $(call _cfg-vars-by-prefix,CFG_ _CFG_ PLATFORM_))) 62fe52b1f5SJerome Forissierendef 63fe52b1f5SJerome Forissier 64fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix 65fe52b1f5SJerome Forissier $(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES)))) 66fe52b1f5SJerome Forissierendef 67fe52b1f5SJerome Forissier 68fe52b1f5SJerome Forissier# Convert a makefile variable to a #define 69fe52b1f5SJerome Forissier# <undefined>, n => <undefined> 70fe52b1f5SJerome Forissier# y => 1 71fe52b1f5SJerome Forissier# <other value> => <other value> 72fe52b1f5SJerome Forissierdefine cfg-make-define 73fe52b1f5SJerome Forissier $(strip $(if $(filter y,$($1)), 74bef37b8bSJerome Forissier #define $1 1_nl_, 75fe52b1f5SJerome Forissier $(if $(filter xn x,x$($1)), 76bef37b8bSJerome Forissier /* $1 is not set */_nl_, 77bef37b8bSJerome Forissier #define $1 $($1)_nl_))) 78fe52b1f5SJerome Forissierendef 790a7f95b9SJerome Forissier 80b924c494SJens Wiklander# Convert a makefile variable to a cmake set statement 81b924c494SJens Wiklander# <undefined>, n => <undefined> 82b924c494SJens Wiklander# <other value> => <other value> 83b924c494SJens Wiklanderdefine cfg-cmake-set 84b924c494SJens Wiklander $(strip $(if $(filter xn x,x$($1)), 85b924c494SJens Wiklander # $1 is not set _nl_, 86b924c494SJens Wiklander set($1 $($1))_nl_)) 87b924c494SJens Wiklanderendef 88b924c494SJens Wiklander 899e8c816aSJerome Forissier# Returns 'y' if at least one variable is 'y', 'n' otherwise 900a7f95b9SJerome Forissier# Example: 910a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR) 929e8c816aSJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,n) 930a7f95b9SJerome Forissier 94b2a75cd4SJerome Forissier# Returns 'y' if all variables are 'y', 'n' otherwise 950a7f95b9SJerome Forissier# Example: 960a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR) 97b2a75cd4SJerome Forissiercfg-all-enabled = $(if $(strip $(1)),$(if $(call _cfg-all-enabled,$(1)),y,n),n) 98b2a75cd4SJerome Forissier_cfg-all-enabled = \ 990a7f95b9SJerome Forissier $(strip \ 1000a7f95b9SJerome Forissier $(if $(1), \ 1010a7f95b9SJerome Forissier $(if $(filter y,$($(firstword $(1)))), \ 102b2a75cd4SJerome Forissier $(call _cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \ 1030a7f95b9SJerome Forissier ), \ 1040a7f95b9SJerome Forissier y \ 1050a7f95b9SJerome Forissier ) \ 1060a7f95b9SJerome Forissier ) 1070a7f95b9SJerome Forissier 1080a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled 1090a7f95b9SJerome Forissier# Example: 1100a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ)) 1119ffea7b4SJerome Forissier# Will set FOO to 'n' if it is initially 'y' and BAR or BAZ are not 'y' 1120a7f95b9SJerome Forissiercfg-depends-all = \ 1130a7f95b9SJerome Forissier $(strip \ 1140a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 115b2a75cd4SJerome Forissier $(if $(filter y,$(call cfg-all-enabled,$(2))), \ 1160a7f95b9SJerome Forissier , \ 1170a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \ 1189ffea7b4SJerome Forissier override $(1) := n \ 1190a7f95b9SJerome Forissier ) \ 1200a7f95b9SJerome Forissier ) \ 1210a7f95b9SJerome Forissier ) 1220a7f95b9SJerome Forissier 1230a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled 1240a7f95b9SJerome Forissier# Example: 1250a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ)) 1269ffea7b4SJerome Forissier# Will set FOO to 'n' if it is initially 'y' and both BAR and BAZ are not 'y' 1270a7f95b9SJerome Forissiercfg-depends-one = \ 1280a7f95b9SJerome Forissier $(strip \ 1290a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 1309e8c816aSJerome Forissier $(if $(filter y,$(call cfg-one-enabled,$(2))), \ 1310a7f95b9SJerome Forissier , \ 1320a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \ 1339ffea7b4SJerome Forissier override $(1) := n \ 1340a7f95b9SJerome Forissier ) \ 1350a7f95b9SJerome Forissier ) \ 1360a7f95b9SJerome Forissier ) 137a8224611SJames Kung 138a8224611SJames Kung 139a8224611SJames Kung# Enable all depend variables 140a8224611SJames Kung# Example: 141a8224611SJames Kung# $(eval $(call cfg-enable-all-depends,FOO,BAR BAZ)) 142a8224611SJames Kung# Will enable BAR and BAZ if FOO is initially 'y' 143a8224611SJames Kungcfg-enable-all-depends = \ 144a8224611SJames Kung $(strip \ 145a8224611SJames Kung $(if $(2), \ 146a8224611SJames Kung $(if $(filter y, $($(1))), \ 147a8224611SJames Kung $(if $(filter y,$($(firstword $(2)))), \ 148a8224611SJames Kung , \ 149a8224611SJames Kung $(warning Warning: Enabling $(firstword $(2)) [required by $(1)]) \ 150c8212ba7SJerome Forissier $(eval override $(firstword $(2)) := y) \ 151a8224611SJames Kung ) \ 152a8224611SJames Kung $(call cfg-enable-all-depends,$(1),$(filter-out $(firstword $(2)),$(2))), \ 153a8224611SJames Kung ) \ 154a8224611SJames Kung , \ 155a8224611SJames Kung ) \ 156a8224611SJames Kung ) 157dffb0049SJerome Forissier 158c20f0d11SJerome Forissier# Check if a configuration variable has an acceptable value 159c20f0d11SJerome Forissier# Example: 160c20f0d11SJerome Forissier# $(call cfg-check-value,FOO,foo bar) 161c20f0d11SJerome Forissier# Will do nothing if $(CFG_FOO) is either foo or bar, and error out otherwise. 162c20f0d11SJerome Forissiercfg-check-value = \ 163c20f0d11SJerome Forissier $(if $(filter-out $(2),$(CFG_$(1))), \ 164c20f0d11SJerome Forissier $(error CFG_$(1) is set to '$(CFG_$(1))', valid values are: $(2))) 165c20f0d11SJerome Forissier 16610b7925cSJerome Forissier# Set a variable or error out if it was previously set to a different value 16710b7925cSJerome Forissier# The reason message (3rd parameter) is optional 168dffb0049SJerome Forissier# Example: 16910b7925cSJerome Forissier# $(call force,CFG_FOO,foo,required by CFG_BAR) 170dffb0049SJerome Forissierdefine force 171e5834434SJerome Forissier$(eval $(call _force,$(strip $(1)),$(2),$(3))) 172dffb0049SJerome Forissierendef 173dffb0049SJerome Forissier 174dffb0049SJerome Forissierdefine _force 175dffb0049SJerome Forissierifdef $(1) 176dffb0049SJerome Forissierifneq ($($(1)),$(2)) 17710b7925cSJerome Forissierifneq (,$(3)) 17810b7925cSJerome Forissier_reason := $$(_empty) [$(3)] 17910b7925cSJerome Forissierendif 18010b7925cSJerome Forissier$$(error $(1) is set to '$($(1))' (from $(origin $(1))) but its value must be '$(2)'$$(_reason)) 181dffb0049SJerome Forissierendif 182dffb0049SJerome Forissierendif 183dffb0049SJerome Forissier$(1) := $(2) 184dffb0049SJerome Forissierendef 185