如何使用Autoconf检查Linux版本?

时间:2010-06-06 13:51:47

标签: linux autoconf

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

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

  1. 运行“uname --release”并存储输出
  2. 解析输出并减去Linux版本号(MAJOR.MINOR.MICRO)
  3. 比较版本
  4. 我不知道如何运行命令,存储输出并解析它。

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

答案 2 :(得分: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在评论中所建议的那样