diff mbox

[v5,1/8] Kconfig: import kconfig.h from Linux 4.3

Message ID 1453536020-16196-2-git-send-email-zhaoshenglong@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shannon Zhao Jan. 23, 2016, 8 a.m. UTC
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

Comments

Jonathan Creekmore Jan. 23, 2016, 5:14 p.m. UTC | #1
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.
Andrew Cooper Jan. 23, 2016, 6:42 p.m. UTC | #2
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
Shannon Zhao Jan. 25, 2016, 1:58 a.m. UTC | #3
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,
Jan Beulich Jan. 25, 2016, 2:35 p.m. UTC | #4
>>> 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
Shannon Zhao Jan. 26, 2016, 10:23 a.m. UTC | #5
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 mbox

Patch

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 */