2010-06-06 86 views
1

我的程序至少需要Linux 2.6.26(我使用timerfd和其他Linux特有的功能)。如何使用Autoconf检查Linux版本?

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

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

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

也许这样的宏已经存在,它是可用的(我还没有找到任何)?

回答

1

不要太深刻,并且正确编写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在评论中提出的建议进行比较, 。

+1

请注意,示例代码会因主/次版本更改而中断。 :-) 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

+0

当然你是对的。这是如何在这些数字上添加一些测试的便宜的直接示例。它应该被看作是“工具演示”,而不是工具的“正确用法”:)要添加一些关于 – ShinTakezou 2013-09-27 14:25:13

+1

的文字(请注意,某些内核版本具有大于99的微版本 - 以前版本为1.3.100和2.1.132(请参阅https://www.kernel.org/pub/linux/kernel/的子目录)。编辑的答案仍可用于*检查2.6.26 *,但有人阅读您的代码需要使用额外的思路周期记住/怀疑微版本溢出;也有人可能会复制粘贴解决方案,但它不会发生工作,但当然不太可能有人认真使用这样一个旧的内核版本。我保证这是最后的评论关于这个问题!) – FooF 2013-09-30 05:25:02

5

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

+0

这对我不起作用,因为Linux函数自2.6.26版开始接受functrion timerfd_settime()中的标志,我只能在运行时检查它。 有没有其他想法? – Goofy 2010-06-06 15:17:50

+0

你的意思是它接受2.6.26中以前不存在的某些标志吗?你可以使用'AC_CHECK_DECL'检查这些标志的存在,如果其他所有标志都失败了,你可以使用'AC_RUN_IFELSE'来编译和运行一个测试程序来检查其他的东西,只能在运行时测试 – Hasturkun 2010-06-06 15:54:41

+0

是的,自2.6.26版开始,Linux支持此功能中的标志。在旧内核上使用AFAIR时使用任何标志时,timerfd_settime()使用EINVAL错误。 我会尝试按照你的建议使用AC_RUN_IFELSE。 – Goofy 2010-06-06 17:43:48

2

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