条件包括kbuild中的来源

时间:2012-07-05 18:22:17

标签: linux-kernel

假设有一个带有一些函数func_a的源文件a.c。我想基于某些功能定义调用func_a,并且还希望a.c包含在基于理想相同功能定义的模块中。

所以在我的模块源码中总是存在(比如main.c)我可以有像

这样的东西
#ifdef FEATURE_A
func_a();
#endif

和kbuild中的模块类似

obj - $(CONFIG_SAMPLE)+ = sample.o sample-objs:= main.o utils.o

仅在定义了FEATURE_A时,将a.c包含在示例模块

???

但这可能没有意义,因为一个是预处理器指令而另一个是编译器/链接器/构建指令。也许预处理器指令使用kbuild定义的某个标志的另一种方式更有意义吗?有没有办法实现这个目标?

感谢。

2 个答案:

答案 0 :(得分:1)

请阅读3.7 Compilation flags

据我了解,在编译时传递的Kconfig选项和预处理宏之间存在松散的关联。内核开发人员可以定义在编译期间使用哪些预处理程序标志。

例如net/rds/Makefile

ccflags-$(CONFIG_RDS_DEBUG)    :=      -DDEBUG

如果内核配置了Kconfig选项DEBUG,那么将传递预处理程序标志CONFIG_RDS_DEBUG

答案 1 :(得分:1)

我将通过指出NFS模块中有条件地包含sysctl支持来回答您的问题(我确定还有其他示例,但这是我所熟悉的):

内核配置系统维护一个文件“include / linux / autoconf.h”,它将您的配置选项公开为C预处理器宏。因此,上面列出的文件的编译方式会有所不同,具体取决于您是否配置了sysctl支持。

如果启用了sysctl支持:标题“include / linux / nfs_fs.h”检查宏CONFIG_SYSCTL并声明C函数nfs_register_sysctl()。该函数在“fs / nfs / super.c”中调用。 Makefile(看到nfs-y += sysctl.o)指示构建系统在文件“fs / nfs / sysctl.c”中编译到模块中,该模块定义函数nfs_register_sysctl()

如果禁用了sysctl支持:标头“include / linux / nfs_fs.h”检查宏CONFIG_SYSCTL并声明预处理器宏nfs_register_sysctl()为{{1 }}。该宏在“fs / nfs / super.c”中用于绕过一些(死的)错误处理代码。 Makefile(看到0)不编译或链接“fs / nfs / sysctl.c”。