Bootstrap

#define IS_ENABLED(CONFIG_XXX)和#ifdef CONFIG_XXX

用表格简单的表示如下:

.config中的配置IS_ENABLED(CONFIG_XXX)CONFIG_XXX
CONFIG_XXX=y11
CONFIG_XXX=m10
CONFIG_XXX=n00

所以#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))

;