首页 > 解决方案 > 在 makefile 中哪个更好:自上而下或自下而上的目标分组?

问题描述

我第一次从头开始编写一个makefile,并且正在尝试创建一些.PHONY目标,这些目标构建了我项目的一个方便的子集。

例如,假设我有 6 个源文件:

file1a.tex
file2a.tex
file3a.tex
file1b.tex
file2b.tex
file3b.tex

每个都可以(通过 LuaLaTeX)编译成一个 pdf 文件,我有一个规则告诉 make 如何做到这一点:

%.pdf : %.tex
        lualatex %<

.PHONY现在,为了方便起见,我想创建 3 个目标。一个会编译所有*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 带来更快的性能?那么潜在的问题呢?这些方法中的任何一种都有我没有看到的潜在缺陷吗?

标签: makefile

解决方案


共识是,只要日落是完整的和排他的(即每个文件都在一个且只有一个子集中),选择并不重要。策略 2(使用多个通配符表达式)可能更快,但节省的空间非常小,以至于在节省变得明显之前必须拥有大量文件(即使这样,实际构建时间也会相形见绌)。因此,最好根据 makefile 的可读性和可维护性来决定这两种策略。由于我认为从较小的部分开始构建更好,因此我将采用策略 2。


推荐阅读