给定一个Makefile:
all: build/a build/b build/c # need to change this to all: build/*
build/a:
...
build/b:
...
build/c:
...
我想把
all
目标更改为自动构建与build/*
匹配的所有目标。 这个问题看起来非常相似,只是它打印结果而不是执行它。同时,我不确定那个答案是否适用于Linux和Mac。Make没有内置此功能。实际上,手动更新目标列表比任何替代方案都更加清晰和容易。个人而言,我可能会从以下内容开始:
# second expansion is needed to get the value of
# $(targets) after the whole file was preprocessed
.SECONDEXPANSION:
all: $$(targets)
targets += build/a
build/a:
...
targets += build/b
build/b:
...
targets += build/c
build/c:
...
我不相信对于你来说,为每个目标添加一行代码(targets+=xxx
)会如此令人烦恼。
然而,这就是我们可以“预处理”Makefile的方法:
# assume all targets are explicitly defined in Makefile
targets != grep -o '^ *build/\w* *:' Makefile | sed 's/^ *//;s/ *:$$//'
all: $(targets)
build/a:
...
build/b:
...
build/c:
...
make
的输出转换为目标列表?例如,我看到过可以这样做:all: $(targets)
- 那么我要如何创建$targets呢?谢谢! - Yuri Astrakhanmake all
确实会构建所有目标,即使有人编辑它并添加了一些build/...
条目。如果可能的话,如果您能稍微修改一下您的答案以最跨平台的方式解决这个问题,那就太好了。谢谢! - Yuri Astrakhanall: $(targets)
,没有其他内容。$targets应该以某种方式被赋值,而无需我列出"build/prog1 build/prog2...",也不需要复制下面列出的名称。我希望避免出现这样的情况,即有人添加新目标,但忘记在"all:"中更新列表。我也不想使用任何CLI参数-只需简单的make all
即可。 - Yuri Astrakhanall: ;@$(MAKE) $$(grep -o ^build/[^:]* $(lastword $(MAKEFILE_LIST)))
分成两行吗?一行生成 $(target) 变量,另一行使用它。谢谢! - Yuri Astrakhan
make $(grep -o ^build/[^:]* Makefile)
这样做是否符合你的要求? - Mattmake
,但不幸的是,它使用的是较旧的版本(例如,在 macOS 10.14.4 上使用 v3.81,而在 Ubuntu 18.04 上使用 v4.1)。 - mklement0