Message ID | 1453536020-16196-2-git-send-email-zhaoshenglong@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Shannon Zhao writes: > From: Shannon Zhao <shannon.zhao@linaro.org> > > To support using CONFIG_ options in C/CPP expressions, import kconfig.h > from the Linux v4.3 tag (commit id > 6a13feb9c82803e2b815eca72fa7a9f5561d7861). > > CC: Doug Goldstein <cardoe@cardoe.com> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > --- > xen/include/xen/config.h | 2 +- > xen/include/xen/kconfig.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+), 1 deletion(-) > create mode 100644 xen/include/xen/kconfig.h > > diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h > index 7595599..eeb49db 100644 > --- a/xen/include/xen/config.h > +++ b/xen/include/xen/config.h > @@ -7,7 +7,7 @@ > #ifndef __XEN_CONFIG_H__ > #define __XEN_CONFIG_H__ > > -#include <generated/autoconf.h> > +#include <xen/kconfig.h> > > #ifndef __ASSEMBLY__ > #include <xen/compiler.h> > diff --git a/xen/include/xen/kconfig.h b/xen/include/xen/kconfig.h > new file mode 100644 > index 0000000..d68a7ed > --- /dev/null > +++ b/xen/include/xen/kconfig.h > @@ -0,0 +1,54 @@ > +#ifndef __XEN_KCONFIG_H > +#define __XEN_KCONFIG_H > + > +#include <generated/autoconf.h> > + > +/* > + * Helper macros to use CONFIG_ options in C/CPP expressions. Note that > + * these only work with boolean and tristate options. > + */ > + > +/* > + * Getting something that works in C and CPP for an arg that may or may > + * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" > + * we match on the placeholder define, insert the "0," for arg1 and generate > + * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). > + * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when > + * the last step cherry picks the 2nd arg, we get a zero. > + */ > +#define __ARG_PLACEHOLDER_1 0, > +#define config_enabled(cfg) _config_enabled(cfg) > +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) > +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) > +#define ___config_enabled(__ignored, val, ...) val > + > +/* > + * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 > + * otherwise. For boolean options, this is equivalent to > + * IS_ENABLED(CONFIG_FOO). > + */ > +#define IS_BUILTIN(option) config_enabled(option) > + > +/* > + * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0 > + * otherwise. > + */ > +#define IS_MODULE(option) config_enabled(option##_MODULE) > + > +/* > + * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled > + * code can call a function defined in code compiled based on CONFIG_FOO. > + * This is similar to IS_ENABLED(), but returns false when invoked from > + * built-in code when CONFIG_FOO is set to 'm'. > + */ > +#define IS_REACHABLE(option) (config_enabled(option) || \ > + (config_enabled(option##_MODULE) && config_enabled(MODULE))) > + > +/* > + * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm', > + * 0 otherwise. > + */ > +#define IS_ENABLED(option) \ > + (IS_BUILTIN(option) || IS_MODULE(option)) > + > +#endif /* __XEN_KCONFIG_H */ I am not sure that the complexity of this file is necessary since Xen does not support loadable modules. Essentially, IS_ENABLED(CONFIG_FOO) is as simple as #ifdef CONFIG_FOO.
On 23/01/16 17:14, Jonathan Creekmore wrote: > Shannon Zhao writes: > >> From: Shannon Zhao <shannon.zhao@linaro.org> >> >> To support using CONFIG_ options in C/CPP expressions, import kconfig.h >> from the Linux v4.3 tag (commit id >> 6a13feb9c82803e2b815eca72fa7a9f5561d7861). >> >> CC: Doug Goldstein <cardoe@cardoe.com> >> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >> --- >> xen/include/xen/config.h | 2 +- >> xen/include/xen/kconfig.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 55 insertions(+), 1 deletion(-) >> create mode 100644 xen/include/xen/kconfig.h >> >> diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h >> index 7595599..eeb49db 100644 >> --- a/xen/include/xen/config.h >> +++ b/xen/include/xen/config.h >> @@ -7,7 +7,7 @@ >> #ifndef __XEN_CONFIG_H__ >> #define __XEN_CONFIG_H__ >> >> -#include <generated/autoconf.h> >> +#include <xen/kconfig.h> >> >> #ifndef __ASSEMBLY__ >> #include <xen/compiler.h> >> diff --git a/xen/include/xen/kconfig.h b/xen/include/xen/kconfig.h >> new file mode 100644 >> index 0000000..d68a7ed >> --- /dev/null >> +++ b/xen/include/xen/kconfig.h >> @@ -0,0 +1,54 @@ >> +#ifndef __XEN_KCONFIG_H >> +#define __XEN_KCONFIG_H >> + >> +#include <generated/autoconf.h> >> + >> +/* >> + * Helper macros to use CONFIG_ options in C/CPP expressions. Note that >> + * these only work with boolean and tristate options. >> + */ >> + >> +/* >> + * Getting something that works in C and CPP for an arg that may or may >> + * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" >> + * we match on the placeholder define, insert the "0," for arg1 and generate >> + * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). >> + * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when >> + * the last step cherry picks the 2nd arg, we get a zero. >> + */ >> +#define __ARG_PLACEHOLDER_1 0, >> +#define config_enabled(cfg) _config_enabled(cfg) >> +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) >> +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) >> +#define ___config_enabled(__ignored, val, ...) val >> + >> +/* >> + * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 >> + * otherwise. For boolean options, this is equivalent to >> + * IS_ENABLED(CONFIG_FOO). >> + */ >> +#define IS_BUILTIN(option) config_enabled(option) >> + >> +/* >> + * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0 >> + * otherwise. >> + */ >> +#define IS_MODULE(option) config_enabled(option##_MODULE) >> + >> +/* >> + * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled >> + * code can call a function defined in code compiled based on CONFIG_FOO. >> + * This is similar to IS_ENABLED(), but returns false when invoked from >> + * built-in code when CONFIG_FOO is set to 'm'. >> + */ >> +#define IS_REACHABLE(option) (config_enabled(option) || \ >> + (config_enabled(option##_MODULE) && config_enabled(MODULE))) >> + >> +/* >> + * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm', >> + * 0 otherwise. >> + */ >> +#define IS_ENABLED(option) \ >> + (IS_BUILTIN(option) || IS_MODULE(option)) >> + >> +#endif /* __XEN_KCONFIG_H */ > I am not sure that the complexity of this file is necessary since Xen > does not support loadable modules. Essentially, IS_ENABLED(CONFIG_FOO) > is as simple as #ifdef CONFIG_FOO. I would like to be able to convert some of our "#ifdef CONFIG_FOO" code into "if ( IS_ENABLED(CONFIG_FOO) )" to reduce the quantity of code-rot in often-disabled options. However, I agree that we don't want all the module complexity. i.e. IS_ENABLED() is the only one of these we need. ~Andrew
On 2016/1/24 2:42, Andrew Cooper wrote: > On 23/01/16 17:14, Jonathan Creekmore wrote: >> Shannon Zhao writes: >> >>> From: Shannon Zhao <shannon.zhao@linaro.org> >>> >>> To support using CONFIG_ options in C/CPP expressions, import kconfig.h >>> from the Linux v4.3 tag (commit id >>> 6a13feb9c82803e2b815eca72fa7a9f5561d7861). >>> >>> CC: Doug Goldstein <cardoe@cardoe.com> >>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> >>> --- >>> xen/include/xen/config.h | 2 +- >>> xen/include/xen/kconfig.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++ >>> 2 files changed, 55 insertions(+), 1 deletion(-) >>> create mode 100644 xen/include/xen/kconfig.h >>> >>> diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h >>> index 7595599..eeb49db 100644 >>> --- a/xen/include/xen/config.h >>> +++ b/xen/include/xen/config.h >>> @@ -7,7 +7,7 @@ >>> #ifndef __XEN_CONFIG_H__ >>> #define __XEN_CONFIG_H__ >>> >>> -#include <generated/autoconf.h> >>> +#include <xen/kconfig.h> >>> >>> #ifndef __ASSEMBLY__ >>> #include <xen/compiler.h> >>> diff --git a/xen/include/xen/kconfig.h b/xen/include/xen/kconfig.h >>> new file mode 100644 >>> index 0000000..d68a7ed >>> --- /dev/null >>> +++ b/xen/include/xen/kconfig.h >>> @@ -0,0 +1,54 @@ >>> +#ifndef __XEN_KCONFIG_H >>> +#define __XEN_KCONFIG_H >>> + >>> +#include <generated/autoconf.h> >>> + >>> +/* >>> + * Helper macros to use CONFIG_ options in C/CPP expressions. Note that >>> + * these only work with boolean and tristate options. >>> + */ >>> + >>> +/* >>> + * Getting something that works in C and CPP for an arg that may or may >>> + * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" >>> + * we match on the placeholder define, insert the "0," for arg1 and generate >>> + * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). >>> + * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when >>> + * the last step cherry picks the 2nd arg, we get a zero. >>> + */ >>> +#define __ARG_PLACEHOLDER_1 0, >>> +#define config_enabled(cfg) _config_enabled(cfg) >>> +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) >>> +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) >>> +#define ___config_enabled(__ignored, val, ...) val >>> + >>> +/* >>> + * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 >>> + * otherwise. For boolean options, this is equivalent to >>> + * IS_ENABLED(CONFIG_FOO). >>> + */ >>> +#define IS_BUILTIN(option) config_enabled(option) >>> + >>> +/* >>> + * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0 >>> + * otherwise. >>> + */ >>> +#define IS_MODULE(option) config_enabled(option##_MODULE) >>> + >>> +/* >>> + * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled >>> + * code can call a function defined in code compiled based on CONFIG_FOO. >>> + * This is similar to IS_ENABLED(), but returns false when invoked from >>> + * built-in code when CONFIG_FOO is set to 'm'. >>> + */ >>> +#define IS_REACHABLE(option) (config_enabled(option) || \ >>> + (config_enabled(option##_MODULE) && config_enabled(MODULE))) >>> + >>> +/* >>> + * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm', >>> + * 0 otherwise. >>> + */ >>> +#define IS_ENABLED(option) \ >>> + (IS_BUILTIN(option) || IS_MODULE(option)) >>> + >>> +#endif /* __XEN_KCONFIG_H */ >> I am not sure that the complexity of this file is necessary since Xen >> does not support loadable modules. Essentially, IS_ENABLED(CONFIG_FOO) >> is as simple as #ifdef CONFIG_FOO. > > I would like to be able to convert some of our "#ifdef CONFIG_FOO" code > into "if ( IS_ENABLED(CONFIG_FOO) )" to reduce the quantity of code-rot > in often-disabled options. > > However, I agree that we don't want all the module complexity. i.e. > IS_ENABLED() is the only one of these we need. > Oh, yes. Will drop other macros. Thanks,
>>> On 23.01.16 at 09:00, <zhaoshenglong@huawei.com> wrote: > --- a/xen/include/xen/config.h > +++ b/xen/include/xen/config.h > @@ -7,7 +7,7 @@ > #ifndef __XEN_CONFIG_H__ > #define __XEN_CONFIG_H__ > > -#include <generated/autoconf.h> > +#include <xen/kconfig.h> Why? I don't see why all source files need to include this new header, no matter whether they make use of any of the definitions therein. Jan
On 2016/1/25 22:35, Jan Beulich wrote: >>>> On 23.01.16 at 09:00, <zhaoshenglong@huawei.com> wrote: >> > --- a/xen/include/xen/config.h >> > +++ b/xen/include/xen/config.h >> > @@ -7,7 +7,7 @@ >> > #ifndef __XEN_CONFIG_H__ >> > #define __XEN_CONFIG_H__ >> > >> > -#include <generated/autoconf.h> >> > +#include <xen/kconfig.h> > Why? I don't see why all source files need to include this new > header, no matter whether they make use of any of the > definitions therein. Will fix this. Thanks.
diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h index 7595599..eeb49db 100644 --- a/xen/include/xen/config.h +++ b/xen/include/xen/config.h @@ -7,7 +7,7 @@ #ifndef __XEN_CONFIG_H__ #define __XEN_CONFIG_H__ -#include <generated/autoconf.h> +#include <xen/kconfig.h> #ifndef __ASSEMBLY__ #include <xen/compiler.h> diff --git a/xen/include/xen/kconfig.h b/xen/include/xen/kconfig.h new file mode 100644 index 0000000..d68a7ed --- /dev/null +++ b/xen/include/xen/kconfig.h @@ -0,0 +1,54 @@ +#ifndef __XEN_KCONFIG_H +#define __XEN_KCONFIG_H + +#include <generated/autoconf.h> + +/* + * Helper macros to use CONFIG_ options in C/CPP expressions. Note that + * these only work with boolean and tristate options. + */ + +/* + * Getting something that works in C and CPP for an arg that may or may + * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" + * we match on the placeholder define, insert the "0," for arg1 and generate + * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). + * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when + * the last step cherry picks the 2nd arg, we get a zero. + */ +#define __ARG_PLACEHOLDER_1 0, +#define config_enabled(cfg) _config_enabled(cfg) +#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) +#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) +#define ___config_enabled(__ignored, val, ...) val + +/* + * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0 + * otherwise. For boolean options, this is equivalent to + * IS_ENABLED(CONFIG_FOO). + */ +#define IS_BUILTIN(option) config_enabled(option) + +/* + * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0 + * otherwise. + */ +#define IS_MODULE(option) config_enabled(option##_MODULE) + +/* + * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled + * code can call a function defined in code compiled based on CONFIG_FOO. + * This is similar to IS_ENABLED(), but returns false when invoked from + * built-in code when CONFIG_FOO is set to 'm'. + */ +#define IS_REACHABLE(option) (config_enabled(option) || \ + (config_enabled(option##_MODULE) && config_enabled(MODULE))) + +/* + * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm', + * 0 otherwise. + */ +#define IS_ENABLED(option) \ + (IS_BUILTIN(option) || IS_MODULE(option)) + +#endif /* __XEN_KCONFIG_H */