如何执行与通配符匹配的所有Makefile目标

4

给定一个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 $(grep -o ^build/[^:]* Makefile) 这样做是否符合你的要求? - Matt
这样做会感觉很粗糙,而且可能随时会出现问题,包括潜在的无限循环...我希望有一个更“正式”的解决方案 :) - Yuri Astrakhan
不确定这如何会导致无限循环(请参阅通过设计使其免受循环依赖影响的Make),但是正如您所见,任何解决方案都将由一些正则表达式匹配/替换组成。因此,除非您重写Makefile本身,否则它不能完美无缺。 - Matt
你能依赖GNUmake吗?还是需要一个可移植的解决方案? - Vroomfondel
很遗憾,是的,它应该是可移植的 :( - Yuri Astrakhan
请注意,macOS 也使用 GNU make,但不幸的是,它使用的是较旧的版本(例如,在 macOS 10.14.4 上使用 v3.81,而在 Ubuntu 18.04 上使用 v4.1)。 - mklement0
1个回答

1

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:
    ...

当然,如果目标在包含的文件中或包含替换等情况,则此方法会失败。但是,对于“简单情况”它是有效的。

你能否在makefile中说明如何将make的输出转换为目标列表?例如,我看到过可以这样做:all: $(targets) - 那么我要如何创建$targets呢?谢谢! - Yuri Astrakhan
这正是我需要的 - 纯粹在Makefile内部,但我尝试过了,却在$$s中迷失了 :) 我的目标只是修改上面的Makefile,以便运行make all确实会构建所有目标,即使有人编辑它并添加了一些build/...条目。如果可能的话,如果您能稍微修改一下您的答案以最跨平台的方式解决这个问题,那就太好了。谢谢! - Yuri Astrakhan
我希望$targets自动获取匹配某个模式的Makefile目标列表,而不是手动添加它们。我的问题示例- 我想要第一行为all: $(targets),没有其他内容。$targets应该以某种方式被赋值,而无需我列出"build/prog1 build/prog2...",也不需要复制下面列出的名称。我希望避免出现这样的情况,即有人添加新目标,但忘记在"all:"中更新列表。我也不想使用任何CLI参数-只需简单的make all即可。 - Yuri Astrakhan
1
Matt,你能否更新主答案,使其更符合问题?我不想接受那些用户需要通过评论才能获得结果的答案。感谢你的好建议。此外,你能把 all: ;@$(MAKE) $$(grep -o ^build/[^:]* $(lastword $(MAKEFILE_LIST))) 分成两行吗?一行生成 $(target) 变量,另一行使用它。谢谢! - Yuri Astrakhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接