xref: /optee_os/mk/checkconf.mk (revision 0a7f95b9a565475390f041e6adc50974c049e3cd)
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