web-dev-qa-db-ja.com

強制GNU makeコマンドを順番に実行する

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

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

ファイルdummy.tex 1行:\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.
6
Bruno Le Floch

実際には、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'を使用する必要があります。 (@Gillesに感謝)

乾杯

11
D4RIO

え? makeはターゲットを並列化します(-j);ターゲット内のコマンドを並べ替えることはありません。

1
geekosaur