複数の出力をもつプログラムのルールの記述にflockを使ってみる

昨日のGNU Parallelを使った書き方を試していて、make -jを実行して並列に実行しようとしているのに、実行を待っているタスクが多くなってしまうという問題があることがわかった。

そこで、どうせ同じコマンドを実行するだけなので、ロックされていたら終了するように変えてみることにした。semコマンドではタイムアウトがまだ実装されていないので、今回はflockコマンドを使って書いてみた。

data.c data.h data.w data.x: data.foo data.bar
    lockfile=/tmp/data.lock; touch $$lockfile; \
    flock -nx $$lockfile -c 'if [ -e $@ ] && [ $@ = `ls -td $@ $+ | head -1` ]; then :; \
    else \
        foo data.foo data.bar; \
    fi'; \
    result=$$?; if [ $$result -eq 1 ]; then exit 0; else exit $$result; fi

ロックされていた場合flock -nが1を返すので、その時はエラーを出さないように0を返すようにしてみた。fooが失敗したときに1を返すようになっていると区別がつかないので、その時は、fooコマンドの実行後に終了ステータスを確認して失敗時に1以外を返すようにするといいかもしれない。