lkml.org 
[lkml]   [2011]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] kconfig: Only generate config_is_xxx for bool and tristate options
    On 13.7.2011 22:08, Sam Ravnborg wrote:
    > On Wed, Jul 13, 2011 at 03:22:45PM +0200, Michal Marek wrote:
    >> On 18.5.2011 08:23, Arnaud Lacombe wrote:
    >>> I've been playing a bit with the preprocessor, and reached that point:
    >>>
    >>> #define EXPAND(x) __ ## x
    >>> #define CONFIGURED(x) \
    >>> ({ int __1 __maybe_unused = 1; \
    >>> int __ ## x __maybe_unused = 0; \
    >>> EXPAND(x); })
    >>>
    >>> I am not specifically proud of that, use case would be:
    >>>
    >>> extern func(void);
    >>> int fn()
    >>> {
    >>> if(CONFIGURED(CONFIG_FOO))
    >>> func();
    >>> }
    >>
    >> I finally got round to revisit this. Your approach inspired me to a much
    >> simpler scheme: Instead of generating the config_is_xxx macros for
    >> direct use in the code, name them __enabled_CONFIG_XXX or similar and
    >> have a macro that expands given CONFIG_XXX symbol to the other form:
    >
    > But then we clutter the namesapce with another set of variables that will
    > be misued. If not in the kernel then by other kconfig users.

    Well, no sane person will prefix their variables with
    "__enabled_CONFIG_", so I'm not so worried about the namespace pollution.


    > Arnaud approach is nice as it does not require any additional
    > symbols to be generated.

    Sure, I would also prefer a solution without that doesn't require
    generating new macros. But your's and Arnaud's trick doesn't eliminate
    the configured-out code at -O0, while with the help of the generated
    helper macros, the compiler sees an if(0) or if(1).


    > +#include<linux/compiler.h>
    > +
    > +#define __symbol_value(sym) __ ## x
    > +#define __symbol_module(sym) __symbol_value(__ ## sym ## _MODULE)
    > +
    > +/* return 1 if x is defined and not a module */
    > +#define KCONFIG_NON_MODULE(sym) \
    > + ({ int __1 __maybe_unused = 1; \
    > + int __ ## sym __maybe_unused = 0; \
    > + __symbol_value(sym); })
    > +
    > +/* return 1 if sym is a module symbol */
    > +#define KCONFIG_MODULE(sym) \
    > + ({ int __1 __maybe_unused = 1; \
    > + int __ ## sym ## _MODULE __maybe_unused = 0; \
    > + __symbol_value(sym); })
    > +
    > +/* return 1 if sym is defined - module or not */
    > +#define KCONFIG(sym) (KCONFIG_NON_MODULE(sym) || KCONFIG_MODULE(sym))

    With this extra expansion, the passed CONFIG_FOO expands to 1 here and
    the KCONFIG(_NON)_MODULE macros will then only see the 1 and fail.

    Michal


    \
     
     \ /
      Last update: 2011-07-19 15:47    [W:0.037 / U:0.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site