在makefile中,哪个更好:自上而下还是自下而上的目标分组?

问题描述 投票:0回答:1

我是第一次从头开始写一个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更快的性能? 那潜在的问题呢? 这些方法中是否有我没有看到的潜在陷阱?

makefile
1个回答
0
投票

大家的共识是,只要晒出的文件既完整又排他(即每个文件都在一个且只有一个子集),选择就无所谓了。 策略2(使用多个通配符表达式)可能更快,但节省的成本太少了,以至于在节省的成本变得明显之前,必须有一大堆文件(即使如此,也会被实际构建时间所抵消)。 因此,两种策略之间的决定最好是基于makefile的可读性和可维护性。 由于我认为从更小的部分开始构建更好,所以我选择策略2。

© www.soinside.com 2019 - 2024. All rights reserved.