xref: /linux-6.15/include/linux/kconfig.h (revision c7c90e12)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
22a11c8eaSMichal Marek #ifndef __LINUX_KCONFIG_H
32a11c8eaSMichal Marek #define __LINUX_KCONFIG_H
42a11c8eaSMichal Marek 
52a11c8eaSMichal Marek #include <generated/autoconf.h>
62a11c8eaSMichal Marek 
7101110f6SArnd Bergmann #ifdef CONFIG_CPU_BIG_ENDIAN
8101110f6SArnd Bergmann #define __BIG_ENDIAN 4321
9101110f6SArnd Bergmann #else
10101110f6SArnd Bergmann #define __LITTLE_ENDIAN 1234
11101110f6SArnd Bergmann #endif
12101110f6SArnd Bergmann 
135e8754fdSMasahiro Yamada #define __ARG_PLACEHOLDER_1 0,
145e8754fdSMasahiro Yamada #define __take_second_arg(__ignored, val, ...) val
155e8754fdSMasahiro Yamada 
165e8754fdSMasahiro Yamada /*
175e8754fdSMasahiro Yamada  * The use of "&&" / "||" is limited in certain expressions.
184091fb95SMasahiro Yamada  * The following enable to calculate "and" / "or" with macro expansion only.
195e8754fdSMasahiro Yamada  */
205e8754fdSMasahiro Yamada #define __and(x, y)			___and(x, y)
215e8754fdSMasahiro Yamada #define ___and(x, y)			____and(__ARG_PLACEHOLDER_##x, y)
225e8754fdSMasahiro Yamada #define ____and(arg1_or_junk, y)	__take_second_arg(arg1_or_junk y, 0)
235e8754fdSMasahiro Yamada 
245e8754fdSMasahiro Yamada #define __or(x, y)			___or(x, y)
255e8754fdSMasahiro Yamada #define ___or(x, y)			____or(__ARG_PLACEHOLDER_##x, y)
265e8754fdSMasahiro Yamada #define ____or(arg1_or_junk, y)		__take_second_arg(arg1_or_junk 1, y)
275e8754fdSMasahiro Yamada 
282a11c8eaSMichal Marek /*
2969349c2dSPaul Gortmaker  * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
302a11c8eaSMichal Marek  * these only work with boolean and tristate options.
312a11c8eaSMichal Marek  */
322a11c8eaSMichal Marek 
332a11c8eaSMichal Marek /*
3469349c2dSPaul Gortmaker  * Getting something that works in C and CPP for an arg that may or may
3569349c2dSPaul Gortmaker  * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
3669349c2dSPaul Gortmaker  * we match on the placeholder define, insert the "0," for arg1 and generate
3769349c2dSPaul Gortmaker  * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
3869349c2dSPaul Gortmaker  * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
3969349c2dSPaul Gortmaker  * the last step cherry picks the 2nd arg, we get a zero.
4069349c2dSPaul Gortmaker  */
414f920843SMasahiro Yamada #define __is_defined(x)			___is_defined(x)
424f920843SMasahiro Yamada #define ___is_defined(val)		____is_defined(__ARG_PLACEHOLDER_##val)
434f920843SMasahiro Yamada #define ____is_defined(arg1_or_junk)	__take_second_arg(arg1_or_junk 1, 0)
4469349c2dSPaul Gortmaker 
4569349c2dSPaul Gortmaker /*
462a11c8eaSMichal Marek  * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
472a11c8eaSMichal Marek  * otherwise. For boolean options, this is equivalent to
482a11c8eaSMichal Marek  * IS_ENABLED(CONFIG_FOO).
492a11c8eaSMichal Marek  */
50c0a0aba8SMasahiro Yamada #define IS_BUILTIN(option) __is_defined(option)
512a11c8eaSMichal Marek 
522a11c8eaSMichal Marek /*
532a11c8eaSMichal Marek  * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
54*c7c90e12SBjorn Helgaas  * otherwise.  CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1" in
55*c7c90e12SBjorn Helgaas  * autoconf.h.
562a11c8eaSMichal Marek  */
57c0a0aba8SMasahiro Yamada #define IS_MODULE(option) __is_defined(option##_MODULE)
582a11c8eaSMichal Marek 
599b174527SArnd Bergmann /*
609b174527SArnd Bergmann  * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
619b174527SArnd Bergmann  * code can call a function defined in code compiled based on CONFIG_FOO.
629b174527SArnd Bergmann  * This is similar to IS_ENABLED(), but returns false when invoked from
639b174527SArnd Bergmann  * built-in code when CONFIG_FOO is set to 'm'.
649b174527SArnd Bergmann  */
655e8754fdSMasahiro Yamada #define IS_REACHABLE(option) __or(IS_BUILTIN(option), \
665e8754fdSMasahiro Yamada 				__and(IS_MODULE(option), __is_defined(MODULE)))
679b174527SArnd Bergmann 
6864131a87SMauro Carvalho Chehab /*
6902d699f1SMichal Simek  * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
70*c7c90e12SBjorn Helgaas  * 0 otherwise.  Note that CONFIG_FOO=y results in "#define CONFIG_FOO 1" in
71*c7c90e12SBjorn Helgaas  * autoconf.h, while CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1".
7202d699f1SMichal Simek  */
735e8754fdSMasahiro Yamada #define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
7402d699f1SMichal Simek 
752a11c8eaSMichal Marek #endif /* __LINUX_KCONFIG_H */
76