背景

  • 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))

就很明了了!

参考

https://www.cnblogs.com/dakewei/p/11326453.html