[U-Boot] [RFC PATCH 2/2] linux/kconfig.h: add C macros useful for per-image config options
Masahiro Yamada
yamada.masahiro at socionext.com
Thu Jul 23 13:31:56 CEST 2015
The previous commit introduced a useful macro used in makefiles,
which references to different variables (CONFIG_ or CONFIG_SPL_
prefixed), in order to enable/disable features independently
for each of images.
Per-image config option control is a PITA in C sources, too.
So, introduce some macros useful in C/CPP expressions.
CONFIG_IS_ENABLED(FOO) is a shorthand for
(!defined(CONFIG_SPL_BUILD) && defined(CONFIG_FOO)) || \
(defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_FOO))
For example, it is useful to describe C code as follows,
#if CONFIG_IS_ENABLED(OF_CONTROL)
(device tree code)
#else
(board file code)
#endif
The ifdef conditional above is switched by CONFIG_OF_CONTROL during
the U-Boot proper building (CONFIG_SPL_BUILD is not defined), and by
CONFIG_SPL_OF_CONTROL during SPL building (CONFIG_SPL_BUILD is
defined).
The macro can be used in C context as well, so you can also write the
equivalent code as follows:
if (CONFIG_IS_ENABLED(OF_CONTROL)) {
(device tree code)
} else {
(board file code)
}
Another useful macro is CONFIG_VALUE().
CONFIG_VALUE(FOO) is expanded into CONFIG_FOO during the main build,
and into CONFIG_SPL_FOO during SPL build.
You can write as follows:
text_base = CONFIG_VALUE(TEXT_BASE);
instead of:
#ifdef CONFIG_SPL_BUILD
text_base = CONFIG_SPL_TEXT_BASE;
#else
text_base = CONFIG_TEXT_BASE;
#endif
Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
---
include/linux/kconfig.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
index be342b9..73679be 100644
--- a/include/linux/kconfig.h
+++ b/include/linux/kconfig.h
@@ -43,4 +43,52 @@
*/
#define IS_MODULE(option) config_enabled(option##_MODULE)
+/*
+ * U-Boot add-on: Helper macros to reference to different macros
+ * (CONFIG_ or CONFIG_SPL_ prefixed), depending on the build context.
+ */
+#ifdef CONFIG_SPL_BUILD
+#define _IS_SPL 1
+#endif
+
+#define config_val(cfg) _config_val(_IS_SPL, cfg)
+#define _config_val(x, cfg) __config_val(x, cfg)
+#define __config_val(x, cfg) ___config_val(__ARG_PLACEHOLDER_##x, cfg)
+#define ___config_val(arg1_or_junk, cfg) \
+ ____config_val(arg1_or_junk CONFIG_SPL_##cfg, CONFIG_##cfg)
+#define ____config_val(__ignored, val, ...) val
+
+/*
+ * CONFIG_VAL(FOO) evaluates to the value of
+ * CONFIG_FOO if CONFIG_SPL_BUILD is undefined,
+ * CONFIG_SPL_FOO if CONFIG_SPL_BUILD is defined.
+ */
+#define CONFIG_VAL(option) config_val(option)
+
+/*
+ * CONFIG_IS_ENABLED(FOO) evaluates to
+ * 1 if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y' or 'm',
+ * 1 if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y' or 'm',
+ * 0 otherwise.
+ */
+#define CONFIG_IS_ENABLED(option) \
+ config_enabled(CONFIG_VAL(option)) || \
+ config_enabled(CONFIG_VAL(option##_MODULE))
+
+/*
+ * CONFIG_IS_BUILTIN(FOO) evaluates to
+ * 1 if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'y',
+ * 1 if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'y',
+ * 0 otherwise.
+ */
+#define CONFIG_IS_BUILTIN(option) config_enabled(CONFIG_VAL(option))
+
+/*
+ * CONFIG_IS_MODULE(FOO) evaluates to
+ * 1 if CONFIG_SPL_BUILD is undefined and CONFIG_FOO is set to 'm',
+ * 1 if CONFIG_SPL_BUILD is defined and CONFIG_SPL_FOO is set to 'm',
+ * 0 otherwise.
+ */
+#define CONFIG_IS_MODULE(option) config_enabled(CONFIG_VAL(option##_MODULE))
+
#endif /* __LINUX_KCONFIG_H */
--
1.9.1
More information about the U-Boot
mailing list