makefile - 在 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 带来更快的性能?那么潜在的问题呢?这些方法中的任何一种都有我没有看到的潜在缺陷吗?
解决方案
共识是,只要日落是完整的和排他的(即每个文件都在一个且只有一个子集中),选择并不重要。策略 2(使用多个通配符表达式)可能更快,但节省的空间非常小,以至于在节省变得明显之前必须拥有大量文件(即使这样,实际构建时间也会相形见绌)。因此,最好根据 makefile 的可读性和可维护性来决定这两种策略。由于我认为从较小的部分开始构建更好,因此我将采用策略 2。
推荐阅读
- php - 如何在 Codeigniter 中缓存 routes.php
- datatable - POWER BI 如何为直方图创建数据表
- python - 在 pandas 中展平键/值表
- python - 写入txt文档时的奇怪序列
- macos - 在 zsh/MacOS 中 ls 命令的输出中自定义文件、文件夹、二进制文件的不同颜色
- python - pymemcache 不支持缓存 python 对象
- php - bitrix 站点文件夹的 Linux 设置
- javascript - 混合内容 Wordpress
- android - navigator.mediaDevices.getUserMedia 不适用于 Android 7 和 Ionic 1
- java - 如何让创建的 pod 运行应用程序(命令和参数),同时拥有引用它的部署和服务?