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