[U-Boot] [RFC PATCH 0/2] Add macros to ease our life with independent CONFIGs between U-Boot and SPL

Refer to Simon's question, too: http://lists.denx.de/pipermail/u-boot/2015-July/219598.html
Since U-boot introduced SPL (not since Kconfig), enabling features for U-boot and SPL independently is always a PITA.
- decide if each feature should be supported for SPL or not - Add CONFIG_SPL_FRED_SUPPORT into Makefile.spl - Add #undef include/config_uncmd_spl.h to disable features we do not want to support on SPL - Add "ifdef CONFIG_SPL_BUILD ... endif" here and there to adjust things - Add "#ifdef CONFIG_SPL_BUILD ... #endif" here and there to fix things up
Things are getting more and more crappy.
When U-boot switched to Kconfig, first I introduced separate .config (.config, spl/.config, tpl/.config) to clean up them. But it turned out to be a pain.
So, I believe the current single .config is much better. But I also admit we need something systematic to subdue our PITA.
One possibility is to support "spl-y" in makefiles. (This idea is cribbed from barebox.)
obj-$(CONFIG_FOO) += foo.o spl-$(CONFIG_SPL_FOO) += foo.o
is cleaner than
ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o else obj-$(CONFIG_FOO) += foo.o endif
It is a nice improvement in makefile side. But we still need to do something with C files.
Another option is something like CONFIG_FOO=yyn (yes for U-boot, yes for SPL, no for TPL)
To achieve this, I think a big operation is needed in Kconfig core. I cannot do that. (Of course, Patches are welcome if someone else can do that.)
So, I was thinking of something different.
My idea was inspired by IS_ENABLED() macro in include/linux/kconfig.h.
Linux defines different macros for built-in and module, and it is possible to write #if IS_ENABLED(CONFIG_FOO) ... #endif
instead of
#if defined(CONFIG_FOO) || defined(CONFIG_FOO_MODULE) ... #endif
So, I'd like to propose new macros to write code like
#if CONFIG_IS_ENABLED(FOO) ... #endif
instead of
#if (!defined(CONFIG_SPL_BUILD) && defined(CONFIG_FOO)) || \ (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_FOO)) ... #endif
I hope this series will make our life easier.
I know scripts/basic/fixdep.c must be tweaked for generating correct .cmd files.
But I think this series is enough to show my intention. Looks nice or not? Comments are welcome.
Masahiro Yamada (2): kbuild: add a makefile macro useful with per-image config options linux/kconfig.h: add C macros useful for per-image config options
include/linux/kconfig.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ scripts/Kbuild.include | 3 +++ 2 files changed, 51 insertions(+)

Commit e02ee2548afe ("kconfig: switch to single .config configuration") made the configuration itself pretty simple, instead, we lost the way to systematically enable/disable config options for each image independently.
Our current strategy is, put entries into Makefile.spl for options we need separate enabling, or once enable the options globally in Kconfig and then undef them in Makefile.uncmd_spl if we do not want to compile the features for SPL at all. Things are getting really messy. Besides, "ifdef CONFIG_SPL_BUILD" are sprinkled everywhere in makefiles.
This commit adds a macro to help describe makefile simpler, allowing separate switch for U-boot main and SPL.
This macro takes a config option without the prefix CONFIG_. $(call CONFIG,FOO) evaluates to $(CONFIG_FOO) if CONFIG_SPL_BUILD is undefined (U-boot build), $(CONFIG_SPL_FOO) if CONFIG_SPL_BUILD is defined (SPL_BUILD).
That is,
$(call CONFIG,FOO) += foo.o
is a shorthand for
ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o else obj-$(CONFIG_FOO) += foo.o endif
If CONFIG_SPL_FOO does not exist in Kconfig, it is equivalent to
ifndef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o endif
This is the pattern we often see in our current makefiles.
To take advantage of this macro, we should prefix SPL_ for the SPL version of the option that we need independent control between U-boot and SPL. With this naming scheme, we only have to add a single line in a Makefile for each config option.
It means we want to rename existing config options as follows in the long run:
CONFIG_SPL_SERIAL_SUPPORT -> CONFIG_SPL_SERIAL CONFIG_SPL_I2C_SUPPORT -> CONFIG_SPL_I2C CONFIG_SPL_GPIO_SUPPORT -> CONFIG_SPL_GPIO CONFIG_SPL_SPI_SUPPORT -> CONFIG_SPL_SPI CONFIG_SPL_DISABLE_OF_CONTROL -> CONFIG_SPL_OF_CONTROL (inverting the logic)
Then drivers/Makefile would be re-worked as follows:
obj-$(call CONFIG,SERIAL) += serial/ obj-$(call CONFIG,I2C) += i2c/ obj-$(call CONFIG,GPIO) += gpio/ obj-$(call CONFIG,SPI) += spi/ ...
Eventually, SPL-specialized entries in Makefile.spl would go away.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com ---
scripts/Kbuild.include | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index d20f20a..335d656 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -294,3 +294,6 @@ why = \
echo-why = $(call escsq, $(strip $(why))) endif + +# U-Boot only +CONFIG = $(if $(CONFIG_SPL_BUILD),$(CONFIG_SPL_$(1)),$(CONFIG_$(1)))

On Thu, Jul 23, 2015 at 08:31:55PM +0900, Masahiro Yamada wrote:
Commit e02ee2548afe ("kconfig: switch to single .config configuration") made the configuration itself pretty simple, instead, we lost the way to systematically enable/disable config options for each image independently.
Our current strategy is, put entries into Makefile.spl for options we need separate enabling, or once enable the options globally in Kconfig and then undef them in Makefile.uncmd_spl if we do not want to compile the features for SPL at all. Things are getting really messy. Besides, "ifdef CONFIG_SPL_BUILD" are sprinkled everywhere in makefiles.
This commit adds a macro to help describe makefile simpler, allowing separate switch for U-boot main and SPL.
This macro takes a config option without the prefix CONFIG_. $(call CONFIG,FOO) evaluates to $(CONFIG_FOO) if CONFIG_SPL_BUILD is undefined (U-boot build), $(CONFIG_SPL_FOO) if CONFIG_SPL_BUILD is defined (SPL_BUILD).
That is,
$(call CONFIG,FOO) += foo.o
is a shorthand for
ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o else obj-$(CONFIG_FOO) += foo.o endif
If CONFIG_SPL_FOO does not exist in Kconfig, it is equivalent to
ifndef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o endif
This is the pattern we often see in our current makefiles.
To take advantage of this macro, we should prefix SPL_ for the SPL version of the option that we need independent control between U-boot and SPL. With this naming scheme, we only have to add a single line in a Makefile for each config option.
It means we want to rename existing config options as follows in the long run:
CONFIG_SPL_SERIAL_SUPPORT -> CONFIG_SPL_SERIAL CONFIG_SPL_I2C_SUPPORT -> CONFIG_SPL_I2C CONFIG_SPL_GPIO_SUPPORT -> CONFIG_SPL_GPIO CONFIG_SPL_SPI_SUPPORT -> CONFIG_SPL_SPI CONFIG_SPL_DISABLE_OF_CONTROL -> CONFIG_SPL_OF_CONTROL (inverting the logic)
Then drivers/Makefile would be re-worked as follows:
obj-$(call CONFIG,SERIAL) += serial/ obj-$(call CONFIG,I2C) += i2c/ obj-$(call CONFIG,GPIO) += gpio/ obj-$(call CONFIG,SPI) += spi/ ...
Eventually, SPL-specialized entries in Makefile.spl would go away.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
Reviewed-by: Tom Rini trini@konsulko.com

Tom,
2015-07-28 0:08 GMT+09:00 Tom Rini trini@konsulko.com:
On Thu, Jul 23, 2015 at 08:31:55PM +0900, Masahiro Yamada wrote:
Commit e02ee2548afe ("kconfig: switch to single .config configuration") made the configuration itself pretty simple, instead, we lost the way to systematically enable/disable config options for each image independently.
Our current strategy is, put entries into Makefile.spl for options we need separate enabling, or once enable the options globally in Kconfig and then undef them in Makefile.uncmd_spl if we do not want to compile the features for SPL at all. Things are getting really messy. Besides, "ifdef CONFIG_SPL_BUILD" are sprinkled everywhere in makefiles.
This commit adds a macro to help describe makefile simpler, allowing separate switch for U-boot main and SPL.
This macro takes a config option without the prefix CONFIG_. $(call CONFIG,FOO) evaluates to $(CONFIG_FOO) if CONFIG_SPL_BUILD is undefined (U-boot build), $(CONFIG_SPL_FOO) if CONFIG_SPL_BUILD is defined (SPL_BUILD).
That is,
$(call CONFIG,FOO) += foo.o
is a shorthand for
ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o else obj-$(CONFIG_FOO) += foo.o endif
If CONFIG_SPL_FOO does not exist in Kconfig, it is equivalent to
ifndef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o endif
This is the pattern we often see in our current makefiles.
To take advantage of this macro, we should prefix SPL_ for the SPL version of the option that we need independent control between U-boot and SPL. With this naming scheme, we only have to add a single line in a Makefile for each config option.
It means we want to rename existing config options as follows in the long run:
CONFIG_SPL_SERIAL_SUPPORT -> CONFIG_SPL_SERIAL CONFIG_SPL_I2C_SUPPORT -> CONFIG_SPL_I2C CONFIG_SPL_GPIO_SUPPORT -> CONFIG_SPL_GPIO CONFIG_SPL_SPI_SUPPORT -> CONFIG_SPL_SPI CONFIG_SPL_DISABLE_OF_CONTROL -> CONFIG_SPL_OF_CONTROL (inverting the logic)
Then drivers/Makefile would be re-worked as follows:
obj-$(call CONFIG,SERIAL) += serial/ obj-$(call CONFIG,I2C) += i2c/ obj-$(call CONFIG,GPIO) += gpio/ obj-$(call CONFIG,SPI) += spi/ ...
Eventually, SPL-specialized entries in Makefile.spl would go away.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
Reviewed-by: Tom Rini trini@konsulko.com
This patch was superseded by
http://patchwork.ozlabs.org/patch/500034/
If you do not mind, I will put your Reviewed-by there when I send the next version.

On Tue, Jul 28, 2015 at 12:19:07AM +0900, Masahiro Yamada wrote:
Tom,
2015-07-28 0:08 GMT+09:00 Tom Rini trini@konsulko.com:
On Thu, Jul 23, 2015 at 08:31:55PM +0900, Masahiro Yamada wrote:
Commit e02ee2548afe ("kconfig: switch to single .config configuration") made the configuration itself pretty simple, instead, we lost the way to systematically enable/disable config options for each image independently.
Our current strategy is, put entries into Makefile.spl for options we need separate enabling, or once enable the options globally in Kconfig and then undef them in Makefile.uncmd_spl if we do not want to compile the features for SPL at all. Things are getting really messy. Besides, "ifdef CONFIG_SPL_BUILD" are sprinkled everywhere in makefiles.
This commit adds a macro to help describe makefile simpler, allowing separate switch for U-boot main and SPL.
This macro takes a config option without the prefix CONFIG_. $(call CONFIG,FOO) evaluates to $(CONFIG_FOO) if CONFIG_SPL_BUILD is undefined (U-boot build), $(CONFIG_SPL_FOO) if CONFIG_SPL_BUILD is defined (SPL_BUILD).
That is,
$(call CONFIG,FOO) += foo.o
is a shorthand for
ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o else obj-$(CONFIG_FOO) += foo.o endif
If CONFIG_SPL_FOO does not exist in Kconfig, it is equivalent to
ifndef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FOO) += foo.o endif
This is the pattern we often see in our current makefiles.
To take advantage of this macro, we should prefix SPL_ for the SPL version of the option that we need independent control between U-boot and SPL. With this naming scheme, we only have to add a single line in a Makefile for each config option.
It means we want to rename existing config options as follows in the long run:
CONFIG_SPL_SERIAL_SUPPORT -> CONFIG_SPL_SERIAL CONFIG_SPL_I2C_SUPPORT -> CONFIG_SPL_I2C CONFIG_SPL_GPIO_SUPPORT -> CONFIG_SPL_GPIO CONFIG_SPL_SPI_SUPPORT -> CONFIG_SPL_SPI CONFIG_SPL_DISABLE_OF_CONTROL -> CONFIG_SPL_OF_CONTROL (inverting the logic)
Then drivers/Makefile would be re-worked as follows:
obj-$(call CONFIG,SERIAL) += serial/ obj-$(call CONFIG,I2C) += i2c/ obj-$(call CONFIG,GPIO) += gpio/ obj-$(call CONFIG,SPI) += spi/ ...
Eventually, SPL-specialized entries in Makefile.spl would go away.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
Reviewed-by: Tom Rini trini@konsulko.com
This patch was superseded by
http://patchwork.ozlabs.org/patch/500034/
If you do not mind, I will put your Reviewed-by there when I send the next version.
I kinda thought that's how it was looking in my inbox. I'll read that whole series later today.

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(+)
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 */

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
participants (2)
-
Masahiro Yamada
-
Tom Rini