2016-03-29 11 views
2

私が保守しているメイクファイルにいくつかのRAIIライクなアクションを追加する方法を見つけようとしています。それは主にパフォーマンスするのではなく、正気を意味するように、複数のジョブを使用した場合メイクファイルルールでのRAIIのような動作

out: in 
    lockfile in.lock 
    echo in // Some action which can fail 
    rm -f in.lock 

このコードは正常に動作します:現在、私はこれに似た何かを持っています。少なくとも、私の行動が失敗していなければ。だから私はこれにフォールバックを追加するのが好きです。だから、要するに、それは次のようになります:

out: in 
    lockfile in.lock 
    (echo in) || (rm -f in.lock; false) 
    rm -f in.lock 
またしても私は二回 rm -f in.lockを書くことが好きではありませんが、格好良い、また実際の内容は、bashの数行のであれば (echo in)がエレガントに見えるん

-スクリプト。

これはのようになります。

out: in 
    lockfile in.lock 
    trap "rm -f in.lock" EXIT;   \ 
    (echo in) 

しかし、これはあなたが本当に独立している異なるルールを持っている場合、実際のルールはより複雑に見えるようになります。

SHOW_DEPENDENCY_ON_DEBUGは、特定の状況で echo [email protected] <=== $^等で @として定義することができる
out: in 
    lockfile in.lock 
    trap "rm -f in.lock" EXIT;   \ 
    $(SHOW_DEPENDENCY_ON_DEBUG)  && \ 
    (echo in) 

。だから私はすべてのコマンドをうまくつなぐことができるかどうかはわかりません。だから私はあなたが逃したいくつかの技を知っていることを願っています。

out: in 
    lockfile in.lock 
    echo in // Some action(s) which can fail 
    rm -f in.lock 

を常にrm -f in.lockを実行ように、チェーンのbash-コマンドを有するか、アクションを確定するために実行する必要があるアクション(複数可)を複製せずに:要するに

は、私が変換したいですルールであなたのロックファイル(または makeが行う任意のファイルを)確保の問題については

答えて

1

が削除され makeは、原液を持っているものかもしれない、来る:それ.INTERMEDIATE targetします。 次に、makeがファイルを作成すると、最後に自動的に削除されます。ここで

Makefileの

.PHONY: all clean 

all: out 

in: 
    touch [email protected] # Whatever 

.INTERMEDIATE: in.lock 

%.lock: % 
    touch [email protected] # Whatever 

out: in.lock 
    if [ "`shuf -i 0-1 -n 1`" = "0" ]; then echo Fail; false ; else echo Succeed; touch [email protected]; fi 
    rm -f $< 

clean: 
    rm -f in out 

コマンド:

if [ "`shuf -i 0-1 -n 1`" = "0" ]; then echo Fail; false ; else echo Succeed; touch [email protected]; fi 

は失敗または擬似ランダムコイン投げに成功します。

いくつかの実行:

$ make 
touch in # Whatever 
touch in.lock # Whatever 
if [ "`shuf -i 0-1 -n 1`" = "0" ]; then echo Fail; false ; else echo Succeed; touch out; fi 
Succeed 
rm -f in.lock 
$ make clean 
rm -f in out 
$ make 
touch in # Whatever 
touch in.lock # Whatever 
if [ "`shuf -i 0-1 -n 1`" = "0" ]; then echo Fail; false ; else echo Succeed; touch out; fi 
Fail 
Makefile:14: recipe for target 'out' failed 
make: *** [out] Error 1 
rm in.lock 

しかし、これまでのところレシピから

rm -f $< 

を削除するなど、この機能を押さないでください。 makeは、出口で中間品を削除します。これは、レシピが失敗した場合でも問題ありません。 しかし、レシピが成功した場合は、 makeが終了したときではなく、すぐにロックファイルを削除したほうがよいでしょう。

その後

.INTERMEDIATEは、%の.lockのように、ワイルドカードを参照することができます任意のチャンス?

あなたが意味する必要があると思い番号:

.INTERMEDIATE: %.lock 

をし、何の "ワイルドカード" がありません。左側に%がない場合、 パターンルールではなく、右側の%はただ%を意味します。

しかし、これは必要ありません。 をロックしたい、または少なくともmakefunctionsで計算する必要がある前提条件の名前を知っていなければなりません。 そうしないと、makefileをまったく書き込めません。そう、彼らはina inb incだと言う。 は、その後、あなたは作るすべてのロックのような中間体:

inputs := ina inb inc 
locks := $(patsubst %,%.lock,$(inputs)) 

.INTERMEDIATE: $(locks) 
+0

.INTERMEDIATEは、%の.lockのように、ワイルドカードを参照することができます任意のチャンス? – JVApen

+0

@JVApenいいえ、でも問題ありません。更新を参照してください。 –

+0

私はそのトリックを知っています、私の場合は単純ではありませんが、いくつかのビルディングブロックが何かを動かすことができると思います。どうしてそんなに簡単ではないのですか?とにかくTnx! – JVApen

関連する問題