2

我的程序至少需要 Linux 2.6.26(我使用 timerfd 和其他一些 Linux 特定的功能)。

我对如何编写这个宏有一个大致的了解,但我对为 Autoconf 编写测试宏没有足够的知识。算法:

  1. 运行“uname --release”并存储输出
  2. 解析输出并减去 Linux 版本号 (MAJOR.MINOR.MICRO)
  3. 比较版本

我不知道如何运行命令、存储输出和解析它。

也许这样的宏已经存在并且可用(我还没有找到)?

4

4 回答 4

6

我认为你最好检测你需要使用的特定功能AC_CHECK_FUNC,而不是特定的内核版本。如果您发现自己在将来的某个时间进行交叉编译,这也将防止损坏

于 2010-06-06T14:04:47.300 回答
3

步骤 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,比较仍然成功。有大量的比较运算符可用。

于 2019-03-12T18:00:05.343 回答
2

我建议您不要检查 Linux 版本号,而是检查您需要或功能的特定类型。谁知道呢,也许有人决定向后移植timerfd_settime()到 2.4.x?所以我认为AC_CANONICAL_TARGETAC_CHECK_LIB或类似的是你的朋友。如果您需要检查函数参数或测试行为,您最好编写一个简单的程序并使用AC_LANG_CONFTEST([AC_LANG_PROGRAM(...)])/AC_TRY_RUN来完成这项工作。

于 2010-06-10T09:01:41.610 回答
1

不要太深入并正确编写 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 )。

于 2010-06-06T17:07:43.990 回答