Makefile:仅在目标更新时运行连续脚本

时间:2017-03-19 12:28:26

标签: macos makefile return-value zsh

考虑以下简单的Makefile

clean:
    rm *.log *.aux *.log *.pdf *.toc *.script *.dat

summary.pdf: summary.tex
    /Library/TeX/texbin/pdflatex --shell-escape -interaction=errorstopmode summary.tex

如果summary.tex未更改,则运行make summary.pdf会返回:

make: `summary.pdf' is up to date.

错误代码为0。

但是,我想仅在创建时显示创建的PDF。显而易见的选择是make summary.pdf && open summary.pdf;但是,由于make返回0(这意味着成功),PDF查看器将打开现有PDF,即使它尚未更改。

有许多丑陋的方法来编写这个,但我想知道我是否缺少任何明显的选择。

如果make实际创建了目标,我该如何调用命令?

2 个答案:

答案 0 :(得分:2)

显而易见的方法是将 view 命令添加到recipe:

clean:
    rm *.log *.aux *.log *.pdf *.toc *.script *.dat

summary.pdf: summary.tex
    /Library/TeX/texbin/pdflatex --shell-escape -interaction=errorstopmode summary.tex
    open $@

答案 1 :(得分:0)

假设你不想像@Alex建议那样将视图命令添加到makefile中,你可以决定在make之外打开文件,如下所示:

summary.pdf: summary.tex
    /Library/TeX/texbin/pdflatex --shell-escape -interaction=errorstopmode summary.tex
    @echo "UPDATED PDF FILE: $@"

然后使用以下脚本调用makefile:

make | grep -q "^UPDATED PDF FILE: " && open file

for file in `make | sed -n "s/^UPDATED PDF FILE: \(.*\)$/\1/p"`; do
     open $file; 
done

更强大的东西。 (对不起,不熟悉OSx,但我假设你可以从那里做类似的事情。)

作为一般规则,您不希望更改make的返回值,因为已经详细记录了返回除0之外的任何内容都意味着错误。这会使任何依赖于该行为的脚本混淆,并使您的代码不可移植。