对内核模块源代码进行适当的功能检查

Proper feature checks for kernel module source code

场景 1: 我正在尝试将 IBM GPFS driver 安装到带有香草内核 3.10 的 RHEL6(实际上,kernel-lt 来自 Elrepo)。由于以下原因,GPL 部分无法编译:

他们的代码在库存 RHEL/Suse 比我的旧或新的内核上编译得很好,但在这里失败了。

场景二: 我正在尝试使用库存内核在 RHEL6 上编译开源 softiwarp driver,但它失败并出现与场景 1 中相同的错误。但是,它在 vanilla 内核上编译得很好。

这一切都是因为他们的 feature-check headers 看起来像这样:

#if LINUX_KERNEL_VERSION >= 2061300
#define FOO <newer variant>
#else
#define FOO <older variant>
#endif

但 RHEL 和 Suse 有许多向后移植和错误修复,因此它们的 3.10.101 与原版 3.10.101 不同。

如何编写将检查 功能 而不是版本号的代码?在 user-space 程序中,我会使用 autoconf 宏 AC_CHECK_MEMBER/AC_CHECK_FUNC

How to write code that will check features, not version number? In a user-space program I would use autoconf macros AC_CHECK_MEMBER/AC_CHECK_FUNC

标准预处理器的功能比某些人想象的要少得多。它没有能力直接做你想做的事。 Autoconf 在这方面也没有提供魔法。它只是在配置时执行测试,通常只是通过检查编译器是否接受给定的代码片段,并且主要通过定义预处理器宏来将结果传达给编译器。 (并且您有责任在条件测试中根据需要使用这些宏,就像您的示例中的宏一样。)

然而,由于我们谈论的是 Autoconf,只要它针对与您正在构建的内核相对应的内核头文件运行,至少一些 Autoconf 宏应该适用于您,并且您应该能够为其他人编写自定义 Autoconf 测试。事实上,编译器可以在构建时检测到的任何问题,Autoconf 也应该能够测试。

当然,也可以选择让模块构建器能够在出现此类棘手问题时明确指示所需的配置详细信息。例如,调整特征选择宏以同时注意为构建器保留的用于调整结果的符号。