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_* 50a7f95b9SJerome Forissier# and _CFG_* variables): 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 $@'; \ 17fe52b1f5SJerome Forissier cnf="$(strip $(foreach var, \ 18fe52b1f5SJerome Forissier $(call cfg-vars-by-prefix,$1), \ 19fe52b1f5SJerome Forissier $(call cfg-make-define,$(var))))"; \ 20fe52b1f5SJerome Forissier guard="_`echo $@ | tr -- -/. ___`_"; \ 21fe52b1f5SJerome Forissier mkdir -p $(dir $@); \ 22fe52b1f5SJerome Forissier echo "#ifndef $${guard}" >$@.tmp; \ 23fe52b1f5SJerome Forissier echo "#define $${guard}" >>$@.tmp; \ 24fe52b1f5SJerome Forissier echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp; \ 25fe52b1f5SJerome Forissier echo "#endif" >>$@.tmp; \ 263354f9b2SJerome Forissier $(call mv-if-changed,$@.tmp,$@) 27fe52b1f5SJerome Forissierendef 28fe52b1f5SJerome Forissier 293354f9b2SJerome Forissierdefine check-conf-mk 30dde0e235Setienne carriere $(q)set -e; \ 3162428631SJens Wiklander $(cmd-echo-silent) ' CHK $@'; \ 32dde0e235Setienne carriere cnf="$(strip $(foreach var, \ 33dde0e235Setienne carriere $(call cfg-vars-by-prefix,CFG_), \ 342c5782f1Setienne carriere $(strip $(var)=$($(var))_nl_)))"; \ 35dde0e235Setienne carriere mkdir -p $(dir $@); \ 36dde0e235Setienne carriere echo "# auto-generated TEE configuration file" >$@.tmp; \ 37*b5569a68SPascal Brand echo "# TEE version ${TEE_IMPL_VERSION}" >>$@.tmp; \ 38dde0e235Setienne carriere echo "ARCH=${ARCH}" >>$@.tmp; \ 39dde0e235Setienne carriere echo "PLATFORM=${PLATFORM}" >>$@.tmp; \ 40dde0e235Setienne carriere echo "PLATFORM_FLAVOR=${PLATFORM_FLAVOR}" >>$@.tmp; \ 41dde0e235Setienne carriere echo -n "$${cnf}" | sed 's/_nl_ */\n/g' >>$@.tmp; \ 423354f9b2SJerome Forissier $(call mv-if-changed,$@.tmp,$@) 433354f9b2SJerome Forissierendef 443354f9b2SJerome Forissier 453354f9b2SJerome Forissier# Rename $1 to $2 only if file content differs. Otherwise just delete $1. 463354f9b2SJerome Forissierdefine mv-if-changed 473354f9b2SJerome Forissier if [ -r $2 ] && cmp -s $2 $1; then \ 483354f9b2SJerome Forissier rm -f $1; \ 493354f9b2SJerome Forissier else \ 5062428631SJens Wiklander $(cmd-echo-silent) ' UPD $2'; \ 513354f9b2SJerome Forissier mv $1 $2; \ 523354f9b2SJerome Forissier fi 53dde0e235Setienne carriereendef 54dde0e235Setienne carriere 55fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix 56fe52b1f5SJerome Forissier $(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)), 570a7f95b9SJerome Forissier $(call _cfg-vars-by-prefix,CFG_ _CFG_))) 58fe52b1f5SJerome Forissierendef 59fe52b1f5SJerome Forissier 60fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix 61fe52b1f5SJerome Forissier $(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES)))) 62fe52b1f5SJerome Forissierendef 63fe52b1f5SJerome Forissier 64fe52b1f5SJerome Forissier# Convert a makefile variable to a #define 65fe52b1f5SJerome Forissier# <undefined>, n => <undefined> 66fe52b1f5SJerome Forissier# y => 1 67fe52b1f5SJerome Forissier# <other value> => <other value> 68fe52b1f5SJerome Forissierdefine cfg-make-define 69fe52b1f5SJerome Forissier $(strip $(if $(filter y,$($1)), 70fe52b1f5SJerome Forissier #define $1 1 /* '$($1)' */_nl_, 71fe52b1f5SJerome Forissier $(if $(filter xn x,x$($1)), 72fe52b1f5SJerome Forissier /* $1 is not set ('$($1)') */_nl_, 73fe52b1f5SJerome Forissier #define $1 $($1) /* '$($1)' */_nl_))) 74fe52b1f5SJerome Forissierendef 750a7f95b9SJerome Forissier 760a7f95b9SJerome Forissier# Returns 'y' if at least one variable is 'y', empty otherwise 770a7f95b9SJerome Forissier# Example: 780a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR) 790a7f95b9SJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,) 800a7f95b9SJerome Forissier 810a7f95b9SJerome Forissier# Returns 'y' if all variables are 'y', empty otherwise 820a7f95b9SJerome Forissier# Example: 830a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR) 840a7f95b9SJerome Forissiercfg-all-enabled = \ 850a7f95b9SJerome Forissier $(strip \ 860a7f95b9SJerome Forissier $(if $(1), \ 870a7f95b9SJerome Forissier $(if $(filter y,$($(firstword $(1)))), \ 880a7f95b9SJerome Forissier $(call cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \ 890a7f95b9SJerome Forissier ), \ 900a7f95b9SJerome Forissier y \ 910a7f95b9SJerome Forissier ) \ 920a7f95b9SJerome Forissier ) 930a7f95b9SJerome Forissier 940a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled 950a7f95b9SJerome Forissier# Example: 960a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ)) 970a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and BAR or BAZ are not 'y' 980a7f95b9SJerome Forissiercfg-depends-all = \ 990a7f95b9SJerome Forissier $(strip \ 1000a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 1010a7f95b9SJerome Forissier $(if $(call cfg-all-enabled,$(2)), \ 1020a7f95b9SJerome Forissier , \ 1030a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \ 1040a7f95b9SJerome Forissier override $(1) := \ 1050a7f95b9SJerome Forissier ) \ 1060a7f95b9SJerome Forissier ) \ 1070a7f95b9SJerome Forissier ) 1080a7f95b9SJerome Forissier 1090a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled 1100a7f95b9SJerome Forissier# Example: 1110a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ)) 1120a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and both BAR and BAZ are not 'y' 1130a7f95b9SJerome Forissiercfg-depends-one = \ 1140a7f95b9SJerome Forissier $(strip \ 1150a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 1160a7f95b9SJerome Forissier $(if $(call cfg-one-enabled,$(2)), \ 1170a7f95b9SJerome Forissier , \ 1180a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \ 1190a7f95b9SJerome Forissier override $(1) := \ 1200a7f95b9SJerome Forissier ) \ 1210a7f95b9SJerome Forissier ) \ 1220a7f95b9SJerome Forissier ) 123a8224611SJames Kung 124a8224611SJames Kung 125a8224611SJames Kung# Enable all depend variables 126a8224611SJames Kung# Example: 127a8224611SJames Kung# $(eval $(call cfg-enable-all-depends,FOO,BAR BAZ)) 128a8224611SJames Kung# Will enable BAR and BAZ if FOO is initially 'y' 129a8224611SJames Kungcfg-enable-all-depends = \ 130a8224611SJames Kung $(strip \ 131a8224611SJames Kung $(if $(2), \ 132a8224611SJames Kung $(if $(filter y, $($(1))), \ 133a8224611SJames Kung $(if $(filter y,$($(firstword $(2)))), \ 134a8224611SJames Kung , \ 135a8224611SJames Kung $(warning Warning: Enabling $(firstword $(2)) [required by $(1)]) \ 136c8212ba7SJerome Forissier $(eval override $(firstword $(2)) := y) \ 137a8224611SJames Kung ) \ 138a8224611SJames Kung $(call cfg-enable-all-depends,$(1),$(filter-out $(firstword $(2)),$(2))), \ 139a8224611SJames Kung ) \ 140a8224611SJames Kung , \ 141a8224611SJames Kung ) \ 142a8224611SJames Kung ) 143dffb0049SJerome Forissier 14410b7925cSJerome Forissier# Set a variable or error out if it was previously set to a different value 14510b7925cSJerome Forissier# The reason message (3rd parameter) is optional 146dffb0049SJerome Forissier# Example: 14710b7925cSJerome Forissier# $(call force,CFG_FOO,foo,required by CFG_BAR) 148dffb0049SJerome Forissierdefine force 14910b7925cSJerome Forissier$(eval $(call _force,$(1),$(2),$(3))) 150dffb0049SJerome Forissierendef 151dffb0049SJerome Forissier 152dffb0049SJerome Forissierdefine _force 153dffb0049SJerome Forissierifdef $(1) 154dffb0049SJerome Forissierifneq ($($(1)),$(2)) 15510b7925cSJerome Forissierifneq (,$(3)) 15610b7925cSJerome Forissier_reason := $$(_empty) [$(3)] 15710b7925cSJerome Forissierendif 15810b7925cSJerome Forissier$$(error $(1) is set to '$($(1))' (from $(origin $(1))) but its value must be '$(2)'$$(_reason)) 159dffb0049SJerome Forissierendif 160dffb0049SJerome Forissierendif 161dffb0049SJerome Forissier$(1) := $(2) 162dffb0049SJerome Forissierendef 163