我是第一次从头开始写一个makefile,正在玩弄创建一些 .PHONY
目标,它构建了我的项目的一个方便的子集。
例如,假设我有6个源文件,每一个都可以被编译(通过LuaLaTeX)成一个pdf文件。
file1a.tex
file2a.tex
file3a.tex
file1b.tex
file2b.tex
file3b.tex
每一个都可以被编译(通过LuaLaTeX)成一个pdf文件 我有一个规则来告诉我如何做。
%.pdf : %.tex
lualatex %<
现在,我想创建3个 .PHONY
为方便起见,目标。 一个人将编译所有的 *a.tex
文件,第二个是 *b.tex
文件,三是 all
. 此外,由于我将继续为这个项目添加文件,我希望文件集能尽可能地自动建立。 现在,在我看来,我面前有两种可能的策略。
策略1(用通配符创建主集,然后用过滤器创建子集)。
sources := $(wildcard *.tex)
a_sources := $(filter %a.tex,$(sources))
b_sources := $(filter %b.tex,$(sources))
策略2(用通配符创建子集,然后合并成主集)。
a_sources := $(wildcard *a.tex)
b_sources := $(wildcard *b.tex)
sources := $(a_sources) $(b_sources)
一旦这些集合都建立起来,就可以用替换引用创建目标。
.PHONY : target_a target_b all
target_a : $(a_sources:.tex=.pdf)
target_b : $(b_sources:.tex=.pdf)
all : target_a target_b
我的问题是,从长远来看,哪种策略更有效? 也就是说,随着我添加越来越多的文件(可能还想创建其他理想的子集目标),这些策略中的哪种策略会导致make更快的性能? 那潜在的问题呢? 这些方法中是否有我没有看到的潜在陷阱?
大家的共识是,只要晒出的文件既完整又排他(即每个文件都在一个且只有一个子集),选择就无所谓了。 策略2(使用多个通配符表达式)可能更快,但节省的成本太少了,以至于在节省的成本变得明显之前,必须有一大堆文件(即使如此,也会被实际构建时间所抵消)。 因此,两种策略之间的决定最好是基于makefile的可读性和可维护性。 由于我认为从更小的部分开始构建更好,所以我选择策略2。