强制 GNU make 按顺序运行命令

强制 GNU make 按顺序运行命令

通过以下 Makefile,GNU make 并行运行这两个命令。由于第一个需要时间才能完成,在创建文件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;

或者在同一个子 shell 中运行所有内容,如下所示:

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

或者不太理智的是,这个:

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

PD: &> 是某些 shell(包括 bash)提供的扩展,用于将 stdout 和 stderr 重定向到同一目的地,但它不可移植,您应该使用 '>/dev/null 2>&1' 代替。 (谢谢@吉尔斯)

干杯

答案2

呃? make并行化目标(使用-j);它从不重新排序目标内的命令。

相关内容