Re: kernel coding style for if ... else which cross #ifdef

From: Sam Ravnborg
Date: Sat May 24 2008 - 07:27:09 EST


On Sat, May 24, 2008 at 11:06:21AM +0100, Jeremy Fitzhardinge wrote:
> Sam Ravnborg wrote:
> >On Fri, May 23, 2008 at 10:42:58PM -0700, H. Peter Anvin wrote:
> >
> >>Sam Ravnborg wrote:
> >>
> >>>>*However*, the best would really be if we changed Kconfig to emit
> >>>>configuration constants what were 0/1 instead of undefined/defined.
> >>>>That way we could do:
> >>>>
> >>>> if (CONFIG_SOMETHING && foo) {
> >>>> /* ... something ... */
> >>>> } else if ((mode & S_IWUGO) == 0) {
> >>>> /* ... */
> >>>>
> >>>We could do that - but then it would need another
> >>>name not to clash with all the places where we rely
> >>>on CONFIG_FOO='n' => CONFIG_FOO is not defined.
> >>>
> >>>We could teach kconfig to emit something like:
> >>>#define KFOO 0 (for the 'n' value)
> >>>And 1 or 2 for the y and m values.
> >>>
> >>>
> >>I don't think we want to use "1 or 2"... I suspect we want to use the
> >>same booleans we currently have.
> >>
> >I'm a bit dense (or I need more coffe - it's morning here).
> >What "same booleans"?
> >
>
> They should be plain 0/1 booleans. For a bool/tristate option FOO, it
> would define:
>
> Enabled y:
>
> #define CONFIG_FOO
> #define CFG_FOO 1
> #undef CONFIG_FOO_MODULE
> #define CFG_FOO_MODULE 0
Agreed

>
> Enabled m:
>
> #define CONFIG_FOO
> #define CFG_FOO 1
> #define CONFIG_FOO_MODULE
> #define CFG_FOO_MODULE 1

I assume you wanted to say:
> #undef CONFIG_FOO
> #define CFG_FOO 1
> #define CONFIG_FOO_MODULE
> #define CFG_FOO_MODULE 1
Because then the CONFIG_* is not changed
and we do not want to change that.

I'm not fully convinced about:
> #define CFG_FOO 1
But on the other hand it is only in odd
cases we distingush between built-in and module.
So it makes most sense.

> Disabled n:
>
> #undef CONFIG_FOO
> #define CFG_FOO 0
> #undef CONFIG_FOO_MODULE
> #define CFG_FOO_MODULE 0
Agree.

>
> Not sure what CFG_* should be for string/numeric options. Probably "1"
> if the value is defined, "0" if not, with CONFIG_* being the actual
> value (so a CONFIG_ value of 0 is distinguishable from not defined).
For non-boolean/tristate values we simply skip CFG_ values - thats
the most simple approach.

Sam
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/