在我的项目中,我有一组从源代码构建的程序:
SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp)
TARGETS = $(patsubst $(SRC_DIR)/%.cpp,$(BIN_DIR)/%,$(SRC_FILES))
我的构建目标很简单,并且工作正常:
all: $(TARGETS)
@echo "- Done target $@"
现在,我想要一个run
目标,以便所有这些程序都可以根据需要从外壳程序运行。说,如果我有3个文件,我想让make自动运行:
>$ ./test1
>$ ./test2
>$ ./test3
或者
>$ ./test1 && ./test2 && ./test3
我尝试了这个:
run: $(TARGETS)
$(addsuffix && ,$(TARGETS))
生成以下命令:
./test1&& ./test2&&
但由于尾随而失败 &&
(当然,我希望这些可以自动生成,因为可以有3 ...或30。)
编辑:实际上,&&
分隔符不是必需的,所以是这样的:
>$ ./test1; ./test2; ./test3;
也可以。
作为Basile Starynkevitch完全正确答案的替代方法,这里(至少)还有两个其他选择。
您可以通过手动拉出第一个条目来避免运行不必要的命令(尽管可能是内置命令)来结束列表(实际上,这可能比内置的shell代价更高)。
run: $(TARGETS)
$< $(addprefix &&,$(wordlist 2,$(words $^),$^))
我认为一个更好的选择是,假设&&
不需要与之连接,那就是使用它$(foreach)
来生成要运行的命令。
run: $(TARGETS)
$(foreach t,$^,$t;)
尾随;
之所以至关重要,是因为它的输出$(foreach)
是一行,并且您需要;
终止每个shell命令(或者将其视为带有参数的长命令)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句