宏if IS_ENABLED(CONFIG_XXX)与ifdef CONFIG_XXX
背景
- kernel: v5.4.18
最近在合一个蓝牙驱动,遇到一个需要注意的小细节,特此记录!
驱动打成Y,没问题;打成M,有问题
后来定位问题在#ifdef CONFIG_XXX
,使用#if IS_ENABLED(CONFIG_XXX)
替换解决,
为什么呢?
分析
首先要分析config文件(.config)里面的配置CONFIG_XXX
是怎么影响内核源码里面的C文件的?
执行make menuconfig
并保存配置后,会根据config文件(.config)自动生成autoconf.h
文件,并自动包含到内核源码中,里面的内容类似如下:
#define CONFIG_XXX 1
#define CONFIG_XXX_MODULE 1
配置文件里面的CONFIG_XXX=y
会转化生成为#define CONFIG_XXX 1
,CONFIG_XXX=m
会转化生成为#define CONFIG_XXX_MODULE 1
;
这个就是问题关键所在!
#ifdef CONFIG_XXX
只判断CONFIG_XXX
,并没有判断模块形式的CONFIG_XXX_MODULE
而IS_ENABLED
呢? 再来看下IS_ENABLED
的定义:
/*
* 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) __is_defined(option)
/*
* IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
* otherwise.
*/
#define IS_MODULE(option) __is_defined(option##_MODULE)
/*
* IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
* 0 otherwise.
*/
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
就很明了了!
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DD'Notes!
评论