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

时间:2019-03-26 02:59:17

标签: makefile

给出一个Makefile:

all: build/a build/b build/c    # need to change this to    all: build/*

build/a:
   ...

build/b:
   ...

build/c:
   ...

我想更改all目标以自动构建与build/*匹配的所有目标。 This question看起来非常相似,除了它打印结果而不是对其执行操作。另外,我不确定该答案在Linux和Mac上是否都适用。

1 个答案:

答案 0 :(得分: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:
    ...

当然,如果目标在包含的文件中或包含替代项等,则此操作将失败。但是,它适用于“简单情况”。