2017-07-04 64 views
0

我是非常新的make。我有一个生成三个乳胶文件的perl脚本。我想创建一个makefile来执行perl脚本,然后在新生成的tex文件上运行lualatex。到目前为止,我有以下几点:规则运行gnumake新生成的文件上的命令

make: 
    perl diff.pl 
pdf: 
    make 
    $(eval LIST := $(shell ls *.tex)) 
    lualatex $(LIST).tex 
    make clean 

clean: 
    rm -rf *.log *.aux 

输出:

lualatex FLAT_FLAT_AVDD.tex FLAT_FLAT_VDD.tex FLAT_FLAT_VSS.tex.tex 

而且我只得到一个PDF FLAT_FLAT_AVDD.pdf。 如何在所有文件上运行lualatex? 我只能声明三个变量,然后运行make。但是,我怎样才能自动化呢? make中有循环概念吗?通过对文件名进行“硬编码”来达到这个目的更好的方法是什么?

谢谢。编辑: 我试图纳入foreach

make: 
    perl diff.pl 

list: 
    $(eval LIST := $(shell ls *.tex)) 

pdf: 
    make list 
    $(foreach tex,$(LIST),$(lualatex $(tex))) 
    make clean 

clean: 
    rm -rf *.log *.aux 

,然后我跑,make pdf 我在终端下面的输出。

dedehog01:tislam1:243 > make pdf 
make list 
make[1]: Entering directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
make[1]: `list' is up to date. 
make[1]: Leaving directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
make clean 
make[1]: Entering directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
rm -rf *.log *.aux 
make[1]: Leaving directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 

回答

0

如果你想在每次make调用时运行你的perl脚本,make并不是很有用。一个shell脚本可以做同样的事情。但如果你真的想把所有这一个makefile:

.PHONY: all clean 

all: 
    perl diff.pl && \ 
    for t in *.tex; do \ 
     lualatex $$t; \ 
    done 

clean: 
    rm -rf *.log *.aux 

否则,你必须事先知道LaTeX来源列表。你或许应该坚持使用化妆目标的先决条件的理念,那就是,表达所有的依赖和相应的食谱:

LATEXSOURCES := foo.tex bar.tex ... cuz.tex 
PDFS := $(patsubst %.tex,%.pdf,$(LATEXSOURCES)) 

all: $(PDFS) 

$(LATEXSOURCES): diff.pl 
    perl diff.pl 

$(PDFS): %.pdf: %.tex 
    lualatex $< 

clean: 
    rm -rf *.log *.aux 

但是,正如bobbogo注意到,根据该第二选项,Perl脚本将运行多次因为有LaTeX源文件。图案规则解决了这个:

LATEXSOURCES := foo.tex bar.tex ... cuz.tex 
PDFS := $(patsubst %.tex,%.pdf,$(LATEXSOURCES)) 

all: $(PDFS) 

$(LATEXSOURCES): %.tex: diff.pl 
    @echo "Rebuilding $(LATEXSOURCES)" 
    perl diff.pl 

$(PDFS): %.pdf: %.tex 
    lualatex $< 

clean: 
    rm -rf *.log *.aux 

现在我们有一个真正的解决方案是:

  • 只有一个丢失或如果perl脚本改变,因为他们是去年建重建LaTeX的源文件,
  • 只执行一次perl脚本来构建所有LaTeX源文件,
  • 表示各种文件之间的所有依赖关系。

还有然而问题:如果只有一个LaTeX的源文件丢失,其余均达到最新的,Perl脚本将运行,所有的LaTeX源文件将被重建和他们的最后修改时间将因此而改变。只有缺失的将被编译,但在下一次调用时,其他编译器也将被重新编译,这是浪费。 bobbogo的使用中间乳胶源的建议解决了这个问题。

+0

您绘制的草图将多次运行_perl_。它只需要运行一次来​​创建三个'.tex'文件。 – bobbogo

0

假设你知道这三个.tex文件事先的名字,你可以无条件运行perl的,然后更新.tex文件,只有在新的实际上是从旧的不同。制作将处理此罚款。

tex := 1.tex 2.tex 3.tex 
intermediates := ${tex:%.tex=%-new.tex}# 1-new.tex 2-new.tex 3-new.tex 
pdfs := ${intermediates:%.tex=%.pdf}# 1-new.pdf etc. 

.PHONY: perl 
perl: ; perl diff.pl 

${intermediates}: %-new.tex: %.tex | perl 
    cmp -s $< [email protected] || mv $< [email protected] 

${pdfs}: %.pdf: %.tex 
    lualatex $< 

.PHONY: all 
all: ${pdfs} 
    : [email protected] Success 

假设perl的生产1.tex2.tex3.tex

  • 我们无条件运行时产生这三个文件的新副本perl的。
  • 然后我们更新1-new.tex1.tex,但仅当两个文件不同时
  • 制作根据情况通知任何已更改的文件并运行lualatex

这是平行安全的(任何makefile的一个很好的测试)。使用-j3运行以获得3份lualatex立即运行。你有4个CPU吗?

+0

当'diff.pl'发生变化时,不会重新生成LaTeX源代码,但是每次调用时都会重新生成LaTeX源代码;-)。 –

+0

正确。它每次都重建LaTeX源代码,但它只在源文件更改时重新生成pdf。我认为运行perl比lualatex快得多。该方案涵盖了对“diff.pl”进行更改的情况。如果更改在LaTeX中不起作用,那么pdf已经是最新的。 – bobbogo