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_* 5*0a7f95b9SJerome 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; \ 16fe52b1f5SJerome Forissier echo ' 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; \ 26fe52b1f5SJerome Forissier if [ -r $@ ] && cmp -s $@ $@.tmp; then \ 27fe52b1f5SJerome Forissier rm -f $@.tmp; \ 28fe52b1f5SJerome Forissier else \ 29fe52b1f5SJerome Forissier echo ' UPD $@'; \ 30fe52b1f5SJerome Forissier mv $@.tmp $@; \ 31fe52b1f5SJerome Forissier fi 32fe52b1f5SJerome Forissierendef 33fe52b1f5SJerome Forissier 34fe52b1f5SJerome Forissierdefine cfg-vars-by-prefix 35fe52b1f5SJerome Forissier $(strip $(if $(1),$(call _cfg-vars-by-prefix,$(1)), 36*0a7f95b9SJerome Forissier $(call _cfg-vars-by-prefix,CFG_ _CFG_))) 37fe52b1f5SJerome Forissierendef 38fe52b1f5SJerome Forissier 39fe52b1f5SJerome Forissierdefine _cfg-vars-by-prefix 40fe52b1f5SJerome Forissier $(sort $(foreach prefix,$(1),$(filter $(prefix)%,$(.VARIABLES)))) 41fe52b1f5SJerome Forissierendef 42fe52b1f5SJerome Forissier 43fe52b1f5SJerome Forissier# Convert a makefile variable to a #define 44fe52b1f5SJerome Forissier# <undefined>, n => <undefined> 45fe52b1f5SJerome Forissier# y => 1 46fe52b1f5SJerome Forissier# <other value> => <other value> 47fe52b1f5SJerome Forissierdefine cfg-make-define 48fe52b1f5SJerome Forissier $(strip $(if $(filter y,$($1)), 49fe52b1f5SJerome Forissier #define $1 1 /* '$($1)' */_nl_, 50fe52b1f5SJerome Forissier $(if $(filter xn x,x$($1)), 51fe52b1f5SJerome Forissier /* $1 is not set ('$($1)') */_nl_, 52fe52b1f5SJerome Forissier #define $1 $($1) /* '$($1)' */_nl_))) 53fe52b1f5SJerome Forissierendef 54*0a7f95b9SJerome Forissier 55*0a7f95b9SJerome Forissier# Returns 'y' if at least one variable is 'y', empty otherwise 56*0a7f95b9SJerome Forissier# Example: 57*0a7f95b9SJerome Forissier# FOO_OR_BAR := $(call cfg-one-enabled, FOO BAR) 58*0a7f95b9SJerome Forissiercfg-one-enabled = $(if $(filter y, $(foreach var,$(1),$($(var)))),y,) 59*0a7f95b9SJerome Forissier 60*0a7f95b9SJerome Forissier# Returns 'y' if all variables are 'y', empty otherwise 61*0a7f95b9SJerome Forissier# Example: 62*0a7f95b9SJerome Forissier# FOO_AND_BAR := $(call cfg-all-enabled, FOO BAR) 63*0a7f95b9SJerome Forissiercfg-all-enabled = \ 64*0a7f95b9SJerome Forissier $(strip \ 65*0a7f95b9SJerome Forissier $(if $(1), \ 66*0a7f95b9SJerome Forissier $(if $(filter y,$($(firstword $(1)))), \ 67*0a7f95b9SJerome Forissier $(call cfg-all-enabled,$(filter-out $(firstword $(1)),$(1))), \ 68*0a7f95b9SJerome Forissier ), \ 69*0a7f95b9SJerome Forissier y \ 70*0a7f95b9SJerome Forissier ) \ 71*0a7f95b9SJerome Forissier ) 72*0a7f95b9SJerome Forissier 73*0a7f95b9SJerome Forissier# Disable a configuration variable if some dependency is disabled 74*0a7f95b9SJerome Forissier# Example: 75*0a7f95b9SJerome Forissier# $(eval $(call cfg-depends-all,FOO,BAR BAZ)) 76*0a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and BAR or BAZ are not 'y' 77*0a7f95b9SJerome Forissiercfg-depends-all = \ 78*0a7f95b9SJerome Forissier $(strip \ 79*0a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 80*0a7f95b9SJerome Forissier $(if $(call cfg-all-enabled,$(2)), \ 81*0a7f95b9SJerome Forissier , \ 82*0a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires $(strip $(2))]) \ 83*0a7f95b9SJerome Forissier override $(1) := \ 84*0a7f95b9SJerome Forissier ) \ 85*0a7f95b9SJerome Forissier ) \ 86*0a7f95b9SJerome Forissier ) 87*0a7f95b9SJerome Forissier 88*0a7f95b9SJerome Forissier# Disable a configuration variable if all dependencies are disabled 89*0a7f95b9SJerome Forissier# Example: 90*0a7f95b9SJerome Forissier# $(eval $(call cfg-depends-one,FOO,BAR BAZ)) 91*0a7f95b9SJerome Forissier# Will clear FOO if it is initially 'y' and both BAR and BAZ are not 'y' 92*0a7f95b9SJerome Forissiercfg-depends-one = \ 93*0a7f95b9SJerome Forissier $(strip \ 94*0a7f95b9SJerome Forissier $(if $(filter y, $($(1))), \ 95*0a7f95b9SJerome Forissier $(if $(call cfg-one-enabled,$(2)), \ 96*0a7f95b9SJerome Forissier , \ 97*0a7f95b9SJerome Forissier $(warning Warning: Disabling $(1) [requires (one of) $(strip $(2))]) \ 98*0a7f95b9SJerome Forissier override $(1) := \ 99*0a7f95b9SJerome Forissier ) \ 100*0a7f95b9SJerome Forissier ) \ 101*0a7f95b9SJerome Forissier ) 102