2

私のプログラムには少なくとも Linux 2.6.26 が必要です (timerfd とその他の Linux 固有の機能を使用しています)。

このマクロの書き方については大まかな考えはありますが、Autoconf 用のテスト マクロの書き方については十分な知識がありません。アルゴリズム:

  1. 「uname --release」を実行して出力を保存する
  2. 出力を解析し、Linux のバージョン番号 (MAJOR.MINOR.MICRO) を減算します。
  3. バージョン比較

コマンドを実行し、出力を保存して解析する方法がわかりません。

そのようなマクロが既に存在し、利用可能である可能性があります (何も見つかりませんでした)。

4

4 に答える 4

6

AC_CHECK_FUNC特定のカーネル バージョンではなく、を使用して必要な特定の機能を検出する方がよいと思います。これにより、将来のある時点でクロスコンパイルを行った場合の破損も防ぐことができます。

于 2010-06-06T14:04:47.300 に答える
2

Linux のバージョン番号を確認するのではなく、必要または機能する特定のタイプを確認することをお勧めします。timerfd_settime()誰かが2.4.xへのバックポートを決定したのではないでしょうか? だから私はあなたの友達と似ていると思いAC_CANONICAL_TARGETますAC_CHECK_LIB。関数の引数やテストの動作を確認する必要がある場合は、単純なプログラムを作成し、AC_LANG_CONFTEST([AC_LANG_PROGRAM(...)])/AC_TRY_RUNを使用してその作業を行うことをお勧めします。

于 2010-06-10T09:01:41.610 に答える
1

深入りせずに、autoconf マクロを適切に記述します (いずれにせよ望ましいことですが)、configure.ac は基本的に m4 によって前処理されたシェル スクリプトであることを忘れないでください。したがって、シェル コマンドを直接記述できます。

# 前へ configure.ac の一部
 if test `uname -r |cut -d. -f1` -lt 2 その後; echo "メジャー v. エラー"; 出口1; フィ
 if test `uname -r |cut -d. -f2` -lt 6 その後; echo "マイナー v. エラー"; 出口1; フィ
 if test `uname -r |cut -d. -f3` -lt 26 then; echo "マイクロエラー"; 出口1; フィ
 # ...

これは、autoconf 用のマクロを作成せずに実行したい場合の単なるアイデアです。この選択は良くありませんが、うまくいくはずです...

最善の方法は、すでに提案されている方法です。機能を確認する必要があります。したがって、将来、カーネル timerfd が使用できなくなったとします... またはコードが壊れて変更されました... バージョンをテストするので、それをキャッチできません。

編集

ユーザー foof がコメントで (他の言葉で) 言っているように、major.minor.micro をチェックするのは単純な方法です。たとえば、3.5.1 は 5 が lt 6 であるため失敗しますが、3.5.1 は 2.6.26 の後にあるため (おそらく) 受け入れられるはずです。xyz を、各バージョンを「自然な」順序で配置する表現に変換するために使用できる多くのトリックがあります。たとえば、x、y、または z が 999 を超えないと予想される場合、メジャー 1000000、マイナー 1000、ミクロ 1 を掛けるなどの処理を実行できます。したがって、Foof がコメントで提案したように、結果を 2006026 と比較できます。 )。

于 2010-06-06T17:07:43.990 に答える