2017-07-04 49 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