给出一个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上是否都适用。
答案 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:
...
当然,如果目标在包含的文件中或包含替代项等,则此操作将失败。但是,它适用于“简单情况”。