用表格简单的表示如下:
.config中的配置 | IS_ENABLED(CONFIG_XXX) | CONFIG_XXX |
CONFIG_XXX=y | 1 | 1 |
CONFIG_XXX=m | 1 | 0 |
CONFIG_XXX=n | 0 | 0 |
所以#ifdef CONFIG_XXX只能判断是不是设置为y,也就是编译进内核,如果是m或者n则为假。
IS_ENABLED(CONFIG_XXX)判断y和m为真,也就是无论编译进内核还是模块都为真,只有n为假。
原因在kernel代码中有注释:
/*
* 如果CONFIG_FOO设置为'y'或者'm'则IS_ENABLED(CONFIG_FOO)等于1,否则为0.
* 注意CONFIG_FOO=y会使autoconf.h中定义"#define CONFIG_FOO 1" ,
* 然而CONFIG_FOO=m 会定义为"#define CONFIG_FOO_MODULE 1".
*/
/*
* IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
* 0 otherwise. Note that CONFIG_FOO=y results in "#define CONFIG_FOO 1" in
* autoconf.h, while CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1".
*/
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))