2

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

所以在我总是存在的模块源中(比如main.c)我可以有类似的东西

#ifdef FEATURE_A
func_a();
#endif

并在模块的 kbuild 中类似于

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

仅当定义了 FEATURE_A 时,才将 ac 包含到示例模块中

???

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

谢谢。

4

2 回答 2

2

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

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

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

如果禁用 sysctl 支持:头文件“include/linux/nfs_fs.h”检查宏CONFIG_SYSCTL并将预处理器宏声明nfs_register_sysctl()0. 该宏在“fs/nfs/super.c”中用于绕过一些(死)错误处理代码。Makefile (seeing nfs-n += sysctl.o) 不会编译或链接“fs/nfs/sysctl.c”。

于 2012-07-06T07:12:57.117 回答
1

请阅读3.7 编译标志

据我了解,在编译时传递的 Kconfig 选项和预处理宏之间存在无懈可击的关系。由内核开发人员定义在编译期间使用哪些预处理器标志。

例如在net/rds/Makefile

ccflags-$(CONFIG_RDS_DEBUG)    :=      -DDEBUG

DEBUG如果你的内核配置了 Kconfig 选项,这里预处理器标志将被传递CONFIG_RDS_DEBUG

于 2012-07-05T21:08:10.183 回答