考虑以下简单的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
实际创建了目标,我该如何调用命令?
答案 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之外的任何内容都意味着错误。这会使任何依赖于该行为的脚本混淆,并使您的代码不可移植。