Linux 内核 外部模块条件编译方法

在开发内核模块过程中,常常需要对特定内核做特定编译。这时候对不清楚内核Makefile的人来说如何传递CFLAGS成为问题。

在网上搜索发现ccflags-y变量可以传递

Make ccflags-y='-D【自定义宏】'   -C XXXX -M XXXX modules

但是发现这样问题比较大,因为有些ccflags-y 内核本身也用到了。会导致别的编译错误。

后来仔细阅读makefile 发现可以用KBUILD_CFLAGS_MODULE这个环境变量,他仅对module编译有效。

Make KBUILD_CFLAGS_MODULE:='-DMODULE -D【自定义宏】'   -C XXXX -M XXXX modules

自此即可在外部内核模块代码中使用【自定义宏】了。  (CentOS9系列内核头文件下无效,可以检查头文件目录Makefile以及子目录中的Makefile。如有KBUILD_CFLAGS_MODULE则可用。)

#if defined(【自定义宏】)
void fun(){
    ......
}
#endif