我的程序至少需要Linux 2.6.26(我使用timerfd和其他Linux特有的功能)。如何使用Autoconf检查Linux版本?
我有一个大致的想法如何编写这个宏,但我没有足够的关于为Autoconf编写测试宏的知识。算法:
- 运行 “UNAME --release” 和存储输出
- 解析输出和减去的Linux版本号(MAJOR.MINOR.MICRO)
- 比较版本
我不知道如何运行命令,存储输出并解析它。
也许这样的宏已经存在,它是可用的(我还没有找到任何)?
我的程序至少需要Linux 2.6.26(我使用timerfd和其他Linux特有的功能)。如何使用Autoconf检查Linux版本?
我有一个大致的想法如何编写这个宏,但我没有足够的关于为Autoconf编写测试宏的知识。算法:
我不知道如何运行命令,存储输出并解析它。
也许这样的宏已经存在,它是可用的(我还没有找到任何)?
不要太深刻,并且正确编写autoconf宏(无论如何,这是最好的)不要忘记configure.ac基本上是shell脚本由m4进行预处理。所以你可以直接编写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大小,1000小大小和1微的东西:因此,您可以将结果与2006026作为Foof在评论中提出的建议进行比较, 。
我想你会更好地使用AC_CHECK_FUNC
而不是特定的内核版本检测您需要的特定功能。 如果您发现自己在将来的某个时间点进行交叉编译,这也可以防止破坏
这对我不起作用,因为Linux函数自2.6.26版开始接受functrion timerfd_settime()中的标志,我只能在运行时检查它。 有没有其他想法? – Goofy 2010-06-06 15:17:50
你的意思是它接受2.6.26中以前不存在的某些标志吗?你可以使用'AC_CHECK_DECL'检查这些标志的存在,如果其他所有标志都失败了,你可以使用'AC_RUN_IFELSE'来编译和运行一个测试程序来检查其他的东西,只能在运行时测试 – Hasturkun 2010-06-06 15:54:41
是的,自2.6.26版开始,Linux支持此功能中的标志。在旧内核上使用AFAIR时使用任何标志时,timerfd_settime()使用EINVAL错误。 我会尝试按照你的建议使用AC_RUN_IFELSE。 – Goofy 2010-06-06 17:43:48
我建议你不要检查Linux版本号,而是检查你需要的功能类型。谁知道,也许有人决定将timerfd_settime()
反向移植到2.4.x?所以我认为AC_CANONICAL_TARGET
和AC_CHECK_LIB
或类似的是你的朋友。如果您需要检查函数参数或测试行为,最好编写一个简单的程序并使用AC_LANG_CONFTEST([AC_LANG_PROGRAM(...)])
/AC_TRY_RUN
来完成这项工作。
请注意,示例代码会因主/次版本更改而中断。 :-) Linux内核版本3.5.25将失败两次。 (你可以简单地将主版本,微版本和微版本合并成一个版本号'v = $(uname -r | awk -F'[^ [0-9]] *''{print(1000000 * $ 1 + 1000 * $ 2 + $ 3)}')'并将这个'$ v'与'2006026'进行比较,以进行更强大的测试。) – FooF 2013-09-27 11:52:00
当然你是对的。这是如何在这些数字上添加一些测试的便宜的直接示例。它应该被看作是“工具演示”,而不是工具的“正确用法”:)要添加一些关于 – ShinTakezou 2013-09-27 14:25:13
的文字(请注意,某些内核版本具有大于99的微版本 - 以前版本为1.3.100和2.1.132(请参阅https://www.kernel.org/pub/linux/kernel/的子目录)。编辑的答案仍可用于*检查2.6.26 *,但有人阅读您的代码需要使用额外的思路周期记住/怀疑微版本溢出;也有人可能会复制粘贴解决方案,但它不会发生工作,但当然不太可能有人认真使用这样一个旧的内核版本。我保证这是最后的评论关于这个问题!) – FooF 2013-09-30 05:25:02