我的程序至少需要 Linux 2.6.26(我使用 timerfd 和其他一些 Linux 特定的功能)。
我对如何编写这个宏有一个大致的了解,但我对为 Autoconf 编写测试宏没有足够的知识。算法:
- 运行“uname --release”并存储输出
- 解析输出并减去 Linux 版本号 (MAJOR.MINOR.MICRO)
- 比较版本
我不知道如何运行命令、存储输出和解析它。
也许这样的宏已经存在并且可用(我还没有找到)?
我认为你最好检测你需要使用的特定功能AC_CHECK_FUNC
,而不是特定的内核版本。如果您发现自己在将来的某个时间进行交叉编译,这也将防止损坏
步骤 2(解析)和 3(比较)版本有一个宏ax_compare_version。例如:
linux_version=$(uname --release)
AX_COMPARE_VERSION($linux_version, [eq3], [2.6.26],
[AC_MSG_NOTICE([Ok])],
[AC_MSG_ERROR([Bad Linux version])])
这里我使用eq3
了这样,如果$linux_version
包含额外的字符串,例如-amd64
,比较仍然成功。有大量的比较运算符可用。
我建议您不要检查 Linux 版本号,而是检查您需要或功能的特定类型。谁知道呢,也许有人决定向后移植timerfd_settime()
到 2.4.x?所以我认为AC_CANONICAL_TARGET
和AC_CHECK_LIB
或类似的是你的朋友。如果您需要检查函数参数或测试行为,您最好编写一个简单的程序并使用AC_LANG_CONFTEST([AC_LANG_PROGRAM(...)])
/AC_TRY_RUN
来完成这项工作。
不要太深入并正确编写 autoconf 宏(无论如何这将是更可取的)不要忘记 configure.ac 基本上是由 m4 预处理的 shell 脚本。所以可以直接写shell命令。
# 上一页 configure.ac 的一部分 if test `uname -r |cut -d. -f1` -lt 2 然后;回声“主要诉错误”;1号出口;菲 if test `uname -r |cut -d. -f2` -lt 6 然后;回声“小诉错误”;1号出口;菲 if test `uname -r |cut -d. -f3` -lt 26 然后;echo "微错误"; 1号出口;菲 # ...
如果您想避免为 autoconf 编写宏,这只是一个想法。这个选择不好,但应该工作......
最好的方法是已经建议的方法:您应该检查功能;因此,假设将来内核 timerfd 不再可用...或以某种方式更改了您的代码已损坏...您将无法捕获它,因为您测试了版本。
编辑
正如用户 foof 在评论中所说(换句话说),检查major.minor.micro 是一种天真的方法。例如 3.5.1 将失败,因为 5 是 lt 6,但 3.5.1 出现在 2.6.26 之后,所以(很可能)它应该被接受。为了将 xyz 转换为将每个版本置于其“自然”顺序的表示,可以使用许多技巧。例如,如果我们预计 x、y 或 z 不会大于 999,我们可以做类似乘以 1000000 主要、1000 次要和 1 微:因此,您可以将结果与 2006026 进行比较,如 Foof 在评论中建议的(s )。