我正在尝试创建一个makefile来编译子目录中的LaTeX文件。所需的目录结构应该如下所示,除了简单的a,b和c之外,latex文件夹下可以有任意数量的子目录。
├── 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 $@) -aux_directory=$(dir $@) $(subst output/,$(notdir $(@:pdf=tex)),$(dir $@))
@$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir $@) -aux_directory=$(dir $@) $(subst output/,$(notdir $(@:pdf=tex)),$(dir $@))
clean:
@rm -rf $(OUTPUT_DIRECTORIES)
这将在每个子目录的pdf
目录中正确生成正确的aux
,log
,toc
,output
等文件。但是,如果我更改了一个tex文件,那么make将导致所有内容都被重新编译。
我已经看过很多其他类似的问题了。对于其他问题,子目录的数量是已知的,因此您可以将它们硬编码到makefile中。对于这种情况,latex文件夹中的子目录数量不断变化并被添加到等,这就是为什么我使用通配符来获取所有tex文件。我不想为每个子目录创建一个makefile并使用递归make。
答案 0 :(得分:1)
Make的一个根本缺点是它对通配符的粗略处理。
在这种情况下,您可以使用secondary expansion编写可以执行所需操作的模式规则:
all: mkdir $(PDF_FILES)
.SECONDEXPANSION:
%.pdf: $$(subst /output/,/, $$(subst .pdf,.tex, $$@))
@echo buiding $@ from $<