场景1:我尝试使用vanilla内核3.10(实际上,来自Elrepo的IBM
)将GPFS
kernel-lt
驱动程序安装到RHEL6上。由于以下原因,GPL部分不会编译:
他们的代码编译好RHEL / Suse内核比我的更老或更新,但在这里失败。
场景2:
我尝试使用stock内核在softiwarp
上编译开源RHEL6
驱动程序,但是它失败并且与方案1中的错误相同。但是,它在vanilla内核上编译得很好。
这一切都是因为他们的功能检查标题如下所示:
#if LINUX_KERNEL_VERSION >= 2061300
#define FOO <newer variant>
#else
#define FOO <older variant>
#endif
但是RHEL和Suse有很多后退和错误修正,所以他们的3.10.101
与香草3.10.101
不一样。
如何编写将检查功能的代码,而不是版本号?在用户空间程序中,我将使用autoconf宏AC_CHECK_MEMBER
/ AC_CHECK_FUNC
答案 0 :(得分:0)
如何编写能检查功能的代码,而不是版本号?在用户空间程序中,我将使用autoconf宏
AC_CHECK_MEMBER
/AC_CHECK_FUNC
标准预处理器的功能远远低于某些人的想象。它没有能力直接做你想做的事。 Autoconf在这方面也没有任何魔力;它只是在配置时执行测试,通常只需检查编译器是否接受给定的代码片段,并通过导致预处理器宏定义,将结果传递给编译器。 (并且您负责在条件测试中根据需要使用这些宏,就像您的示例中那样。)
因为我们正在谈论Autoconf,但是,只要它针对与你正在构建的内核相对应的内核头文件运行,至少有一些Autoconf宏应该适合你,你应该能够为他人编写自定义Autoconf测试。实际上,编译器在构建时可以检测到的任何问题,Autoconf也应该能够测试。
当然,还可以选择让模块构建器明确指出所需的配置详细信息,以便出现棘手的问题。例如,调整特征选择宏以注意为构建器保留的符号,以用于调整结果。