GNU makeがコマンドを順次実行するように強制する

GNU makeがコマンドを順次実行するように強制する

次のMakefileを使用して、GNU makeはこれら2つのコマンドを並列に実行します。最初の操作は完了するのに時間がかかるため、rm *.logファイルが生成される前に実行され、失敗します。log

dummy.pdf: dummy.tex
    tex dummy.tex &> /dev/null;
    rm *.log

ファイルdummy.tex行:\bye(TeXの場合は短い空のファイル)。別のコマンドに置き換えると、tex dummy.tex同じ動作が表示されます。これを削除すると&> /dev/null確かに問題は解決しますが、Makefileは第三者によって提供されるので、私にとっては良い選択ではありません。

GNU makeが並行して操作を実行するのを防ぐことはできますか? (フラグは-j 1役に立ちません)。

編集:端末に出力:

bruno@bruno-laptop:~/LaTeX/make-experiment$ make
tex dummy.tex &> /dev/null;
rm *.log
rm: cannot remove `*.log': No such file or directory
make: *** [dummy.pdf] Error 1
bruno@bruno-laptop:~/LaTeX/make-experiment$ This is TeX, Version 3.1415926 (TeX Live 2009/Debian)
(./dummy.tex )
No pages of output.
Transcript written on dummy.log.

答え1

実際にはmakeには問題はありませんが、コマンドには問題があります。

tex dummy.tex &> /dev/null;

バックグラウンドで「tex」を実行します。 「>/dev/null」を削除する必要はありませんが、「&」は「tex」をバックグラウンドで送信します。

これを試してみてください。効果があるでしょう。

tex dummy.tex > /dev/null;

または、次のように同じサブシェルですべてを実行します。

(tex dummy.tex > /dev/null;rm *.log)

または、あまり賢明ではありません。

if test 1 = 1; then tex dummy.tex > /dev/null;rm *.log; fi

PD:&>は、stdoutとstderrを同じターゲットにリダイレクトするためにいくつかのシェル(bashを含む)によって提供される拡張ですが、移植性がないため、代わりに '> / dev / null 2>&1'を使用する必要があります。 (@gilsに感謝)

乾杯

答え2

よく? makeターゲットを並列化します(使用-j)。ターゲット内でコマンドの順序を変更しません。

関連情報