makefileは、ローカルコンピュータでコマンドを使用できるかどうかをどのように検出しますか?

makefileは、ローカルコンピュータでコマンドを使用できるかどうかをどのように検出しますか?

使い始めた組織モデル私の仕事を計画するGTDスタイルシステム。各組織ファイルを次のディレクトリに配置します。ドロップボックスフォルダ内では、Cygwin、Mac OS X、Debianという3つの異なるローカルコンピュータでこのファイルを編集/管理するためにemacsを実行しています。私も使うからモバイル組織私のiPadからこれらの組織ファイルにアクセスするには、checksums.dat変更内容に応じてファイルを最新の状態に保つ必要があります。これはを実行することによって行うことができますmd5sum *.org > checksums.dat

問題はそこにあるサムコマンドの他のコマンドmd5summd5sum.exeCygwin、md5Mac OS X、およびmd5sumDebianで。理想的な状況は、現在のコンピュータで利用可能なコマンドを検出し、そのコマンドを実行してmd5チェックサム操作を実行するDropboxフォルダに保存されているmakefileです。

ベストアンサー1

チェックサムを生成するための可能なコマンド

残念ながら、暗号チェックサムを生成する標準ユーティリティはありません。 CRCを生成するための標準ユーティリティがあります。cksum;これは、敵対的でない環境で変更を検出するのに十分です。

MD5の代わりにSHA1を使用することをお勧めします。 MD5ユーティリティはありますが、SHA1はないシステムはあまりありません。暗号チェックサムを使用する場合は、競合を見つけるための既知の方法がないアルゴリズムを使用することをお勧めします(サイズも確認すると仮定)。

非標準ですが、要約を計算できる一般的なツールは次のとおりです。OpenSSL。 Cygwin、Debian、OSXで動作しますが、残念ながらOSXのデフォルトインストールには含まれていません。

openssl dgst -sha1

OSX 10.6ではshasumこのユーティリティはDebian(パッケージの一部perl)にも存在し、Cygwinにも存在すると思います。これはPerlスクリプトです。ほとんどのUnixシステムにはPerlがインストールされているため、このスクリプトをどこでも使用できないことが心配な場合は、makefileと一緒にバンドルできます。

システムに適したコマンドを選択してください

さて、実際にどこでも動作するコマンドが見つからないとしましょう。

殻に

組み込みコマンドを使用して、そのtypeコマンドが使用可能であることを確認してください。

sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
  if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org

GNUが作る

あなたはそれを使用することができますshell機能makefileがロードされたらシェルフラグメントを実行し、出力を変数に保存します。

sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
        $(sum) $< >$@

ポータブル(POSIX)ブランド

ルール内でのみシェルコマンドを実行できるため、チェックサムを計算する各ルールにはルックアップコードを含める必要があります。コードスニペットを変数に入れることができます。ルールの個々の行は独立して評価されることを覚えておいてください。また、$シェルに渡されるシンボルはエスケープする必要があることを覚えておいてください$$

determine_sum = \
        sum=; \
        for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
          if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
        done; \
        if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi

checksums.dat: FORCE
    $(determine_sum); \
    $$sum *.org

おすすめ記事