在makefile

时间:2016-09-20 11:48:55

标签: makefile pdf-generation

我有一个包含许多乳胶文档的文件夹结构。我假设所有.tex文件都可以构建,除非它们位于前缀为00-的文件夹下:

./presentation/slide.tex                  → BUILD
./presentation/section/1-introduction.tex → BUILD
./presentation/00-assets/packages.tex     → DONT BUILD

我的makefile非常简单:

CC := latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make

all: makefile
    @find -L . -not -path "*/.*" -not -path "*/00-*" -name "*.tex" -execdir $(MAKE) -f $(PWD)/makefile {} \;
%.tex:
    $(CC) $@

不幸的是,它不起作用,因为我不知道如何指定产品是%.pdf%.tex是输入文件。如果.pdf文件不存在或者源文件自上次构建以来已被修改,我不知道如何指定必须构建源文件。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

latexmk 4.27a以后有一个output-directory选项。

tex := latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make

texfiles != find -L . -not -path "*/.*" -not -path "*/00-*" -name "*.tex"

.PHONY: all

all: $(texfiles:.tex=.pdf)

%.pdf: %.tex
    $(tex) -output-directory $(@D) $<

如果您使用的是较旧版本的品牌,请使用$(shell ...)代替!=

答案 1 :(得分:0)

我不确定你要做什么,但请考虑the second rule of Makefiles

  

每个非.PHONY规则都必须使用其目标的确切名称更新文件。

嗯,这不是强制性的,不遵守这些规则是一个非常糟糕的主意,如果你不知道自己在做什么,就更是如此。如果我足够了解Latex,你的.tex文件不是构建输出,它是输入,因此它不应该是目标,而应该是目标的先决条件。

我建议您删除%.tex规则并将其替换为修改您的Makefile:

%.pdf: %.tex
    $(CC) $^

现在我不确定Latex的PDF生成是如何工作的,但是有了这个,你将为所有给出的.tex文件生成一个pdf文件。您只需在all目标的先决条件中指定所有.tex文件即可。