私は、システム全体の複数の操作(パッケージのインストールなど)を実行するターゲットを持つ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
の定義ですが、私は何も見ません。
@シェルターすべては、質問にリンクされている回答の中で説明されています。 EXITはトラップするシグナルの名前で、 'eval'のように見えます。そうでなければ' exec'はfdをコマンドとして解釈します。 – framos
今後の参考として、外部サイトへのリンクは良い考えではありません。質問はスタンドアロンでなければなりません。あなたの情報の外部ソースがある場合は、それを含めることができますが、関連するファクトを含めるようにQを編集する必要があります。下の答えはよさそうだ。がんばろう。 – shellter
ロックすることは難しく、ターゲットは何も実行しません。私は、makeが代替手段を提供するように設計されたものを行う非生産的な方法を強制しようとしていると思います。あなたは本当にここでロックする必要がありますか?プロセスAがプロセスBを「待機」する必要がある場合は、Bが完了した後にターゲットを作成し、そのターゲットにAの依存関係を作成させます。 – reinierpost