我的程序至少需要Linux 2.6.26(我使用timerfd和其他一些特定于Linux的功能)。
我有一个大致的想法如何编写这个宏,但我没有足够的知识为Autoconf编写测试宏。算法:
我不知道如何运行命令,存储输出并解析它。
也许这样的宏已经存在并且它可用(我还没有发现)?
答案 0 :(得分:6)
我认为您最好使用AC_CHECK_FUNC
检测所需的特定功能,而不是特定的内核版本。
如果您在将来某个时候发现自己进行交叉编译,这也可以防止破坏
答案 1 :(得分:2)
我建议您不要检查Linux版本号,而是检查您需要的特定类型或功能。谁知道,也许有人决定将timerfd_settime()
向后移植到2.4.x?所以我认为AC_CANONICAL_TARGET
和AC_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在评论中所建议的那样