2016-09-07 45 views
0

我想創建一個makefile來編譯子目錄中的LaTeX文件。所需的目錄結構應該如下所示,除了簡單的a,b和c之外,在latex文件夾下可以有任意數量的子目錄。makefile編譯子目錄中更改的乳膠文件

├── latex 
│   ├── a 
│   │   ├── output 
│   │   │   └── stuff.pdf 
│   │   └── stuff.tex 
│   ├── b 
│   │   ├── blah.tex 
│   │   └── output 
│   │    └── blah.pdf 
│   └── c 
│    ├── asdf.tex 
│    └── output 
│     └── asdf.pdf 
└── makefile 

我想在latex目錄中只有一個makefile,它會自動編譯每個子目錄中的tex文件。 我現在的makefile文件看起來是這樣的:

TEX_COMMAND = pdflatex 

TEX_FILES = $(wildcard **/*.tex) 

OUTPUT_DIRECTORIES = $(addsuffix output/,$(wildcard */)) 
PDF_FILES = $(join $(dir $(TEX_FILES)),$(addprefix output/,$(notdir $(TEX_FILES:tex=pdf)))) 

all: mkdir $(PDF_FILES) 

mkdir: 
    @mkdir -p $(OUTPUT_DIRECTORIES) 

$(PDF_FILES): $(TEX_FILES) 
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected])) 
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected])) 

clean: 
    @rm -rf $(OUTPUT_DIRECTORIES) 

這將正確生成適當的pdfauxlogtoc等在各個子目錄中output目錄中的文件。但是,如果我更改了一個tex文件,那麼make會重新編譯所有的東西。

我已經看過很多其他類似的問題。對於其他問題,子目錄的數量是已知的,所以你可以將它們硬編碼到makefile中。對於這種情況,latex文件夾中的子目錄數量不斷變化並被添加到等等,這就是爲什麼我使用通配符來抓取所有tex文件的原因。我寧願不必爲每個子目錄創建一個makefile並使用遞歸make。

+0

使用GNU製作,你可以在每個子目錄創建一個Makefile *自動*和'include'它。你也可以使用'eval()'。 – reinierpost

回答

0

Make的一個基本缺點是它對通配符的粗處理。

在這種情況下,你可以使用secondary expansion寫一個形式規則,將你想要做什麼:

all: mkdir $(PDF_FILES) 

.SECONDEXPANSION: 
%.pdf: $$(subst /output/,/, $$(subst .pdf,.tex, [email protected])) 
    @echo buiding [email protected] from $< 
+0

我最終做的是創建一個makefile.template文件,其中latex /文件夾中的makefile將複製到每個子目錄中,然後遞歸運行。我認爲這可能會更容易,但我一定會嘗試一下你的方法。 – omgimanerd