web-dev-qa-db-ja.com

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

[〜#〜] gtd [〜#〜] -スタイルのシステムでタスクを計画するために org-mode を使い始めました。すべての組織ファイルを Dropbox フォルダーのディレクトリに置き、emacsを実行して、Cygwin、Mac OS X、Debianの3つの異なるローカルマシンからこれらのファイルを編集/管理します。私も MobileOrg を使用してiPadからこれらの組織ファイルにアクセスするため、変更が行われたときはchecksums.datファイルを最新の状態に保つ必要があります。これは、md5sum *.org > checksums.datを実行して実行できます。

問題は、md5sumコマンドに対して3つの異なるコマンドがあることです:Cygwinではmd5sum.exe、Macではmd5 OS X、およびDebianのmd5sum。最も理想的な状況は、Dropboxフォダーに格納されているmakefileで、現在のマシンで使用可能なコマンドを検出し、そのコマンドを実行してmd5チェックサム操作を実行します。

11

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

残念ながら、暗号化チェックサムを生成するための標準ユーティリティはありません。 CRCを生成する標準のユーティリティがあります: cksum ;これは、非悪意のある環境での変更を検出する目的にとって十分な場合があります。

MD5ではなくSHA1を使用することをお勧めします。 MD5ユーティリティはあるがSHA1がないシステムは多くありません。暗号化チェックサムを使用する場合は、既知の方法がないアルゴリズムを使用して衝突を見つけることもできます(サイズも確認する場合)。

標準ではないが一般的であり、ダイジェストを計算できるツールの1つは OpenSSL です。 Cygwin、Debian、OSXで利用できますが、残念ながらOSXのデフォルトインストールには含まれていません。

openssl dgst -sha1

OSX 10.6には shasum ユーティリティがあり、これはDebianにもあり(Perlパッケージの一部です)、私はCygwinも信じています。これはPerlスクリプトです。ほとんどのUNIXシステムにはPerlがインストールされているため、このスクリプトがどこでも利用できないのではないかと心配な場合は、メイクファイルと一緒にそのスクリプトをバンドルできます。

システムに適したコマンドの選択

さて、どこでも機能するコマンドが本当に見つからないとしましょう。

シェルで

組み込みの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 make

Shell function を使用して、メイクファイルがロードされたときにシェルスニペットを実行し、出力を変数に保存できます。

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

ポータブル(POSIX)make

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

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

これはハックのようなものですが、それぞれが存在するかどうかをテストし、存在する場合は実行することができます。

[ -x "`which md5 2>/dev/null`" ] && md5 newfile >>sums
[ -x "`which md5sum 2>/dev/null`" ] && md5sum newfile >>sums

Cygwinはmd5sumなしでコマンド(.exeを含む)を認識すると確信していますが、必要な場合はそれを含めます。

5
Kevin

Emacsを実行しているので、emacs自体を使用してチェックサムを計算できます: http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html

2
Alien Life Form

GNU autotools (コメントで述べたように)、または CMake もオプションです。

GNU autotoolsの方がより伝統的なアプローチですが、(そしておそらく自分自身についてだけ言えば)最初にそれらを使用してプロジェクトをセットアップするという見通しに人々がそれほど興奮しているとは思いません。まあ、いずれにしても、それは学習曲線です。 CMakeはブロックの新しい子供で、おそらくあまり一般的ではありません(まだ学習曲線があります)。独自の構文があり、プラットフォーム用のメイクファイルを生成します。 CMakeには、それほど**中心ではないという明確な利点があります。 unix、windows、macでも確実に動作します(たとえば、makefileの代わりにmsvcプロジェクトを生成できます)。

編集:そしてもちろん「メイクファイル」が提案されたので、この答えはその推測に沿っています。しかし、おそらくpythonスクリプトまたは(ガスプ)単純なJavaプログラムがこのタスクに適しています。スクリプト/プログラミング言語はこれを同じようにします。プラットフォーム間。

1
michael