2016-09-19 4 views
2

私は、システム全体の複数の操作(パッケージのインストールなど)を実行するターゲットを持つMakefileを持っているので、他のmakeプロセスがそのターゲットを待つようにターゲットをロックしたい、パラレル実行を防止します。全ターゲットをMakefileにロックする

私はthis answerで説明されているようにフロックを使ってみましたが、メイクファイルの特殊性が高まっていると思います。

これは私が今持っているものです。

LOCKFILE=/var/lock/makefile.lock 
LOCKFD=200 

mytarget: 
    # make sure to release the lock in any case 
    eval "exec $(LOCKFD)>$(LOCKFILE)"; trap "flock -xn $(LOCKFD) && rm -f $(LOCKFILE)" EXIT 
    # get exclusive waiting lock 
    flock -x $(LOCKFD) 
    [regular target operations...] 
    # release lock and delete the lock file 
    flock -u $(LOCKFD); flock -xn $(LOCKFD) && rm -f $(LOCKFILE) 

ファイルディスクリプタ200が正しく設定されていないので、それは、このエラーで失敗します。

$ make mytarget 
# make sure to release the lock in any case 
eval "exec 200>/var/lock/makefile.lock"; trap "flock -xn 200 && rm -f /var/lock/makefile.lock" EXIT 
# get exclusive waiting lock 
flock -x 200 
flock: 200: Bad file descriptor 
Makefile:57: recipe for target 'mytarget' failed 

はと間違って何かがなければなりませんevalの定義ですが、私は何も見ません。

+0

@シェルターすべては、質問にリンクされている回答の中で説明されています。 EXITはトラップするシグナルの名前で、 'eval'のように見えます。そうでなければ' exec'はfdをコマンドとして解釈します。 – framos

+0

今後の参考として、外部サイトへのリンクは良い考えではありません。質問はスタンドアロンでなければなりません。あなたの情報の外部ソースがある場合は、それを含めることができますが、関連するファクトを含めるようにQを編集する必要があります。下の答えはよさそうだ。がんばろう。 – shellter

+0

ロックすることは難しく、ターゲットは何も実行しません。私は、makeが代替手段を提供するように設計されたものを行う非生産的な方法を強制しようとしていると思います。あなたは本当にここでロックする必要がありますか?プロセスAがプロセスBを「待機」する必要がある場合は、Bが完了した後にターゲットを作成し、そのターゲットにAの依存関係を作成させます。 – reinierpost

答えて

3

Makeは、新しいシェルですべてのコマンドラインを実行します。私はあなたのfdがevalの後になくなったと思います。 1つのコマンドラインを使用して、 ";"でコマンドを区切ることができます。分かりやすくするためにコマンドラインを分割したい場合は、最後の行以外のすべてを "\"で終了する必要があります。メイクマニュアルSplitting Recipe Linesを参照してください。または、シェルスクリプトを使用します。

+0

答えを教えていただきありがとうございます。私はすべてをシェルスクリプトに解凍するというあなたの考えは一番うまくいくと思っています。私は試して報告して戻します。 – framos

+0

スクリプトにすべてを抽出してくれました。ありがとう@rveerd! – framos

関連する問題