[PATCH v3 2/3] kconfig: new macro IF_ENABLED()

Simon Glass sjg at chromium.org
Tue Feb 21 20:41:58 CET 2023


Hi Heinrich,

On Mon, 20 Feb 2023 at 10:15, Andre Przywara <andre.przywara at arm.com> wrote:
>
> On Sun, 19 Feb 2023 12:36:28 +0100
> Heinrich Schuchardt <heinrich.schuchardt at canonical.com> wrote:
>
> Hi,
>
> > We want to move from using #ifdef to using if in our code. A lot of our
> > code using #ifdef is structured like:
> >
> >     #ifdef CONFIG_FOO
> >         fun(CONFIG_FOO_OPT);
> >     #endif
> >
> > In Kconfig you will find
> >
> >     config FOO
> >         bool "enable foo"
> >
> >     config FOO_OPT
> >         string "value for foo"
> >         depends on FOO
> >
> > We cannot use CONFIG_FOO_OPT in our code directly if CONFIG_FOO is not
> > defined.
> >
> >      if (IS_ENABLED(CONFIG_FOO)
> >          fun(CONFIG_FOO_OPT);
> >
> > This would result in an error due to the undefined symbol CONFIG_FOO_OPT.
> >
> > The new macro IF_ENABLED(CONFIG_FOO, opt_cfg, def_val) which evaluates
> > to opt_cfg if CONFIG_FOO is set to 'y' and to def_val otherwise comes to
> > the rescue:
> >
> >      if (IS_ENABLED(CONFIG_FOO)
> >          fun(IF_ENABLED(CONFIG_FOO, CONFIG_FOO_OPT, "");
>
> Ah, yeah, I like this one, this is indeed the most common pattern that
> prevents many "#if to if" conversions.
> I briefly thought about unifying those two lines, but it's probably
> limiting, as it appears more flexible this way:
>
> >
> > If CONFIG_FOO is not defined, the compiler will see
> >
> >     if (0)
> >         fun("");
> >
> > and be happy.
> >
> > If CONFIG_FOO is defined, the compiler will see
> >
> >     if (1)
> >         fun(CONFIG_FOO_OPT)
> >
> > and be equally happy.
> >
> > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>
> Reviewed-by: Andre Przywara <andre.przywara at arm.com>
>
> Cheers,
> Andre
>
> > ---
> > v3:
> >       new patch
> > ---
> >  include/linux/kconfig.h | 7 +++++++
> >  1 file changed, 7 insertions(+)
> >
> > diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
> > index 2bc704e110..7fea72da1a 100644
> > --- a/include/linux/kconfig.h
> > +++ b/include/linux/kconfig.h
> > @@ -28,6 +28,13 @@
> >   */
> >  #define IS_ENABLED(option)   config_enabled(option, 0)
> >
> > +/*
> > + * IF_ENABLED(CONFIG_FOO, opt_cfg, def_val) evalutes to opt_cfg if
> > + * CONFIG_FOO is set to 'y' and to def_val otherwise.
> > + */
> > +#define IF_ENABLED(option, opt_cfg, def_val) \
> > +     config_opt_enabled(IS_ENABLED(option), opt_cfg, def_val)
> > +
> >  /*
> >   * U-Boot add-on: Helper macros to reference to different macros (prefixed by
> >   * CONFIG_, CONFIG_SPL_, CONFIG_TPL_ or CONFIG_TOOLS_), depending on the build
>

This looks good to me, but what should we do with the existing
IF_ENABLED_INT()? Perhaps we should drop that in favour of this one,
or do we need both?

Regards,
Simon


More information about the U-Boot mailing list