2010-06-06 87 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來完成這項工作。