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.
Arnaud approach is nice as it does not require any additional
symbols to be generated.
+#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))