3

FlexおよびBisonバージョン2.5以降が必要なプログラム用のBASHインストーラースクリプトを作成しています。

私はすでにそれをチェックするためのコードを持っていてflexbisonまったくインストールされています。

これがバージョン全体で一定であるかどうかはわかりませんが、flex --versionとの出力はbison --versionそれぞれ次のとおりです。

➜  ~  flex --version
flex 2.5.35
➜  ~  bison --version
bison (GNU Bison) 2.5
Written by Robert Corbett and Richard Stallman.

Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

システムにフレックスとバイソンが2.5以上あることを確認するための「正しい」方法はありますか?

4

3 に答える 3

2

bash は浮動小数点数を処理しないため、実際の比較は awk で行うことができます。

for cmd in flex bison; do
   [[ $("$cmd" --version) =~ ([0-9][.][0-9.]*) ]] && version="${BASH_REMATCH[1]}"
   if ! awk -v ver="$version" 'BEGIN { if (ver < 2.5) exit 1; }'; then
      printf 'ERROR: %s version 2.5 or higher required\n' "$cmd"
   fi
done

これを純粋な bash で機能させるには、各数値を個別に比較する必要があります。

req_version=(2 5)
for cmd in flex bison; do
   [[ $("$cmd" --version) =~ ([0-9][.][0-9.]*) ]] && IFS=. read -ra version <<< "${BASH_REMATCH[1]}"

   for (( i=0; i < "${#req_version[@]}"; i++)); do
      if (( "${req_version[i]}" > "${version[i]}" )); then
         printf 'ERROR: %s version 2.5 or higher required\n' "$cmd"
         exit 1
      fi
   done
done
于 2012-07-22T18:16:21.837 に答える
2

autotoolsの使用を検討してください。次に、 flexbisonの存在をテストする定義済みのマクロを用意します。

AX_PROG_FLEX(ACTION-IF-TRUE,ACTION-IF-FALSE)
AX_PROG_BISON(ACTION-IF-TRUE,ACTION-IF-FALSE)

残念ながら、特定のバージョンをテストできないようです。ただし、bison と flex の存在をテストするための m4 マクロは非常に短いため、簡単に変更できます。autotools が特定のバージョンの C++ Boost ライブラリを探す方法を調べることで、その方法についてのヒントが得られるかもしれません。実際、autotools に flex と bison のバージョン テストを含めるための変更を思いついた場合は、ソリューションの提供を検討してください:)

autotools を使用すると、他にも多くの利点が得られます。具体的には、高度にテストされたポータブルな環境を使用して、アプリケーションを構築およびインストールします。

カスタムの bash インストール ツールを使用したい場合は--version、(たとえば正規表現を使用して) 結果を使用および解析することが既に適切な方法であると言えます。--versionほとんどの (すべてではないにしても) GNU アプリケーションは、実際のプログラムのバージョンを確認する標準的な方法として、はるか昔からコマンドをサポートしています。

于 2012-07-22T17:14:01.073 に答える
0

2 つのバージョン番号を抽出した場合は、次のようなスクリプトでそれらを比較できます。

#!/usr/bin/env perl
#
#   Compare two version numbers:
#   Exit status 0 equal; 1 if first is larger, 2 if second is larger.

use strict;
use warnings;

die "Usage: $0 ver1 ver2\n" if (scalar(@ARGV) != 2);

my @v1 = split /[._-]/, $ARGV[0];
my @v2 = split /[._-]/, $ARGV[1];
my $n1 = scalar(@v1);
my $n2 = scalar(@v2);

my $n = $n1 < $n2 ? $n1 : $n2;

my $rc = 0;

for (my $i = 0; $i < $n && $rc == 0; $i++)
{
    $rc = 1 if ($v1[$i] > $v2[$i]);
    $rc = 2 if ($v2[$i] > $v1[$i]);
}

if ($rc == 0 && $n1 != $n2)
{
    $rc = ($n1 > $n2) ? 1 : 2;
}

exit $rc;

使用例

$ vercmp 2.3.5 2.3.5; echo $?
0
$ vercmp 2.3.35 2.3.5; echo $?
1
$ vercmp 2.5.35 2.3.5; echo $?
1
$ vercmp 2.5.35 2.6.5; echo $?
2
$

非常に多くの奇妙なバージョン番号の比較に対処できますが、おそらくすべてではありません。さまざまなステータスで終了するのではなく、ステータス (0、1、2) をエコーするように設計できます。

CPANには多数の「バージョン」モジュールも用意されています。

于 2012-07-22T19:29:19.183 に答える