场景1:我试图用普通内核3.10 (实际上是Elrepo的kernel-lt )将IBM GPFS驱动程序安装到RHEL6上。由于以下原因,GPL部分无法编译:
他们的代码在库存的RHEL/Suse内核上编译得很好,这些内核比我的更早或更新,但是在这里失败了。
场景2: --我试图用股票内核在RHEL6上编译开放源码softiwarp驱动程序,但是失败时出现了与场景1相同的错误,但是它在普通内核上编译得很好。
这都是因为它们的特性检查头看起来如下所示:
#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。
发布于 2016-06-22 13:14:38
如何编写将检查功能而不是版本号的代码?在用户空间程序中,我将使用autoconf宏
AC_CHECK_MEMBER/AC_CHECK_FUNC。
标准的预处理器的能力比一些人想象的要小得多。它没有能力直接做你想做的事。Autoconf在这方面也没有神奇之处;它只是在配置时执行测试,通常只需检查编译器是否接受给定的代码,并主要通过定义预处理器宏来将结果与编译器进行通信。(您负责在条件测试中根据需要使用这些宏,与示例中的宏非常相似。)
但是,由于我们讨论的是Autoconf,只要它运行在与您构建的内核对应的内核头上,至少有一些Autoconf宏可以为您工作,并且您应该能够为其他人编写自定义的Autoconf测试。实际上,编译器在构建时可以检测到的任何问题,Autoconf也应该能够进行测试。
当然,还有一种选择,就是让模块构建器能够显式地指出所需的配置细节,这样的棘手问题就会出现。例如,调整特征选择宏以注意为生成器保留的符号以调整结果。
https://stackoverflow.com/questions/37968134
复制相似问题