gpt4 book ai didi

linux-kernel - 有条件地包含 kbuild 中的源

转载 作者:行者123 更新时间:2023-12-04 05:40:18 24 4
gpt4 key购买 nike

假设有一个带有一些函数 func_a 的源文件 a.c。我想根据某些功能定义调用 func_a ,并且还希望根据理想情况下相同的功能定义将 a.c 包含在模块中。
所以在我总是存在的模块源中(比如main.c)我可以有类似的东西

#ifdef FEATURE_A
func_a();
#endif
并在模块的 kbuild 中类似于
obj-$(CONFIG_SAMPLE) += sample.o
样本-objs := main.o utils.o
仅当定义了 FEATURE_A 时,才将 a.c 包含到示例模块中
???
但这可能没有意义,因为一个是预处理器指令,另一个是编译器/链接器/构建指令。也许预处理器指令使用 kbuild 定义的某些标志的另一种方式更有意义?有没有办法做到这一点?
谢谢。

最佳答案

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

  • include/linux/nfs_fs.h
  • fs/nfs/Makefile
  • fs/nfs/super.c

  • 内核配置系统维护一个文件“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()成为 0 .该宏在“fs/nfs/super.c”中用于绕过一些(死)错误处理代码。 Makefile(见 nfs-n += sysctl.o)不编译或链接“fs/nfs/sysctl.c”。

    关于linux-kernel - 有条件地包含 kbuild 中的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350255/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com