diff mbox

[U-Boot,RFC,2/2] linux/kconfig.h: add C macros useful for per-image config options

Message ID 1437651116-3057-3-git-send-email-yamada.masahiro@socionext.com
State Superseded
Headers show

Commit Message

Masahiro Yamada July 23, 2015, 11:31 a.m. UTC
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@socionext.com>
---

 include/linux/kconfig.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

Comments

Tom Rini July 27, 2015, 3:08 p.m. UTC | #1
On Thu, Jul 23, 2015 at 08:31:56PM +0900, Masahiro Yamada wrote:

> 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@socionext.com>

Reviewed-by: Tom Rini <trini@konsulko.com>
diff mbox

Patch

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 */