2016-09-07 90 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