gnu make:执行配方中每个 space 分隔的单词

gnumake: Execute each space-delimited word in recipe

我有以下 Makefile。

.PHONY: run
run: bin/p1 bin/p2 bin/p3
    bin/p1
    bin/p2
    bin/p3

bin/%: %.cpp
    mkdir -p bin
    clang++ -o $@ $<

有没有办法消除 run 规则的重复? run 的先决条件将继续增长,因此我想避免指定它们两次。我想得到这样的东西。

.PHONY: run
run: bin/p1 bin/p2 bin/p3
    $(foreach p,$^,$(shell $(p)))

但是,这行不通,我实际上不确定这到底有什么用...

你可以在这里简单地使用一个循环。 make 在 shell 中调用它。 $$就是让i成为一个shell变量

run: bin/p1 bin/p2 bin/p3
    for i in $^; do \
      $$i; \
    done

我也发现这个有效。

.PHONY: run
run: bin/c1 bin/c2 bin/c3 bin/c4
    $(foreach c,$^,$(c) || exit 1;)

bin/%: %.cpp
    mkdir -p bin
    clang++ -std=c++17 -o $@ $<

foreach 最终被此文本替换。

bin/c1 || exit 1; bin/c2 || exit 1; bin/c3 || exit 1; bin/c4 || exit 1;

这将作为 1 条长线发送到 shell。

可选,如果您不想在第一次失败时退出,您可以只使用这个。

$(foreach c,$^,$(c);)