如何使用Autoconf检查Linux版本?

问题描述 投票:1回答:4

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

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

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

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

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

linux autoconf
4个回答
1
投票

步骤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,那么比较仍然会成功。有许多比较运算符可供使用。


6
投票

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


2
投票

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


1
投票

不要太深入并正确编写autoconf宏(无论如何最好),不要忘记configure.ac基本上是由m4预处理的shell脚本。所以你可以直接编写shell命令。

 # prev. part of configure.ac
 if test `uname -r |cut -d. -f1` -lt 2 then; echo "major v. error"; exit 1; fi
 if test `uname -r |cut -d. -f2` -lt 6 then; echo "minor v. error"; exit 1; fi
 if test `uname -r |cut -d. -f3` -lt 26 then; echo "micro error"; exit 1; fi
 # ...

如果你想避免为autoconf编写宏,这只是一个想法。这个选择并不好,但应该有效......

最好的方法是已经建议的方法:你应该检查功能;所以,比如说在未来的内核中,timerfd不再可用......或者某些程度上你的代码被破坏了......自从你测试版本以来你就无法捕获它。

编辑

正如用户foof在评论中所说的那样(换句话说),检查major.minor.micro是一种天真的方法。例如。 3.5.1将因为5为低于6而失败,但3.5.1将在2.6.26之后出现,因此(可能)应该被接受。有许多技巧可用于将x.y.z转换为将每个版本置于其“自然”顺序的表示形式。例如。如果我们期望x,y或z不会超过999,我们可以做一些事情,比如乘以1000000 major,1000 minor和1 micro:因此,你可以将结果与2006026进行比较,如Foof在评论中所建议的那样。

© www.soinside.com 2019 - 2024. All rights reserved.