xref: /linux/tools/include/linux/kconfig.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1*93281c4aSBorislav Petkov /* SPDX-License-Identifier: GPL-2.0 */
2*93281c4aSBorislav Petkov #ifndef _TOOLS_LINUX_KCONFIG_H
3*93281c4aSBorislav Petkov #define _TOOLS_LINUX_KCONFIG_H
4*93281c4aSBorislav Petkov 
5*93281c4aSBorislav Petkov /* CONFIG_CC_VERSION_TEXT (Do not delete this comment. See help in Kconfig) */
6*93281c4aSBorislav Petkov 
7*93281c4aSBorislav Petkov #define __ARG_PLACEHOLDER_1 0,
8*93281c4aSBorislav Petkov #define __take_second_arg(__ignored, val, ...) val
9*93281c4aSBorislav Petkov 
10*93281c4aSBorislav Petkov /*
11*93281c4aSBorislav Petkov  * The use of "&&" / "||" is limited in certain expressions.
12*93281c4aSBorislav Petkov  * The following enable to calculate "and" / "or" with macro expansion only.
13*93281c4aSBorislav Petkov  */
14*93281c4aSBorislav Petkov #define __and(x, y)			___and(x, y)
15*93281c4aSBorislav Petkov #define ___and(x, y)			____and(__ARG_PLACEHOLDER_##x, y)
16*93281c4aSBorislav Petkov #define ____and(arg1_or_junk, y)	__take_second_arg(arg1_or_junk y, 0)
17*93281c4aSBorislav Petkov 
18*93281c4aSBorislav Petkov #define __or(x, y)			___or(x, y)
19*93281c4aSBorislav Petkov #define ___or(x, y)			____or(__ARG_PLACEHOLDER_##x, y)
20*93281c4aSBorislav Petkov #define ____or(arg1_or_junk, y)		__take_second_arg(arg1_or_junk 1, y)
21*93281c4aSBorislav Petkov 
22*93281c4aSBorislav Petkov /*
23*93281c4aSBorislav Petkov  * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
24*93281c4aSBorislav Petkov  * these only work with boolean and tristate options.
25*93281c4aSBorislav Petkov  */
26*93281c4aSBorislav Petkov 
27*93281c4aSBorislav Petkov /*
28*93281c4aSBorislav Petkov  * Getting something that works in C and CPP for an arg that may or may
29*93281c4aSBorislav Petkov  * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
30*93281c4aSBorislav Petkov  * we match on the placeholder define, insert the "0," for arg1 and generate
31*93281c4aSBorislav Petkov  * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
32*93281c4aSBorislav Petkov  * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
33*93281c4aSBorislav Petkov  * the last step cherry picks the 2nd arg, we get a zero.
34*93281c4aSBorislav Petkov  */
35*93281c4aSBorislav Petkov #define __is_defined(x)			___is_defined(x)
36*93281c4aSBorislav Petkov #define ___is_defined(val)		____is_defined(__ARG_PLACEHOLDER_##val)
37*93281c4aSBorislav Petkov #define ____is_defined(arg1_or_junk)	__take_second_arg(arg1_or_junk 1, 0)
38*93281c4aSBorislav Petkov 
39*93281c4aSBorislav Petkov /*
40*93281c4aSBorislav Petkov  * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
41*93281c4aSBorislav Petkov  * otherwise. For boolean options, this is equivalent to
42*93281c4aSBorislav Petkov  * IS_ENABLED(CONFIG_FOO).
43*93281c4aSBorislav Petkov  */
44*93281c4aSBorislav Petkov #define IS_BUILTIN(option) __is_defined(option)
45*93281c4aSBorislav Petkov 
46*93281c4aSBorislav Petkov /*
47*93281c4aSBorislav Petkov  * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
48*93281c4aSBorislav Petkov  * otherwise.
49*93281c4aSBorislav Petkov  */
50*93281c4aSBorislav Petkov #define IS_MODULE(option) __is_defined(option##_MODULE)
51*93281c4aSBorislav Petkov 
52*93281c4aSBorislav Petkov /*
53*93281c4aSBorislav Petkov  * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
54*93281c4aSBorislav Petkov  * code can call a function defined in code compiled based on CONFIG_FOO.
55*93281c4aSBorislav Petkov  * This is similar to IS_ENABLED(), but returns false when invoked from
56*93281c4aSBorislav Petkov  * built-in code when CONFIG_FOO is set to 'm'.
57*93281c4aSBorislav Petkov  */
58*93281c4aSBorislav Petkov #define IS_REACHABLE(option) __or(IS_BUILTIN(option), \
59*93281c4aSBorislav Petkov 				__and(IS_MODULE(option), __is_defined(MODULE)))
60*93281c4aSBorislav Petkov 
61*93281c4aSBorislav Petkov /*
62*93281c4aSBorislav Petkov  * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
63*93281c4aSBorislav Petkov  * 0 otherwise.
64*93281c4aSBorislav Petkov  */
65*93281c4aSBorislav Petkov #define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
66*93281c4aSBorislav Petkov 
67*93281c4aSBorislav Petkov #endif /* _TOOLS_LINUX_KCONFIG_H */
68