【发布时间】:2013-10-05 06:27:46
【问题描述】:
假设我有以下 Makefile:
RM = rm -f
FLAGS = -Cr -O1 -gv -gw -g -vw
builddir = ./build/
TD = ./tasks/
all: example1 example3 example5
example1:
fpc 01_Kreisumfang.pas $(FLAGS) -o$(builddir)01_Kreisumfang
example3:
fpc 03_EuroBetrag3.pas $(FLAGS) -o$(builddir)03_EuroBetrag3
example5:
fpc 05_Dreiecke.pas $(FLAGS) -o$(builddir)05_Dreieck
clean:
$(RM) $(builddir)*
在某个时刻,我的 Makefile 增长到 example112 ...,
有没有一种方法可以自动定义所有而不需要输入所有
目标?我不想这样做:
all: example1 example3 example5 ... example112
我可以这样做吗?
all: (MAGIC to Exclude clean)?
因此,我不想输入所有目标,而是想检测所有 目标并排除某个列表。
更新:
我发现了以下可能的提示:
make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)'
我不知道如何将其作为目标,我尝试过:
TARGETS =: $(shell make -rpn | sed -n -e '/^$$/ { n ; /^[^ ]*:/p }' |egrep -v -E '(all|clean)')
但这似乎是错误的。不仅是错误的,还会导致愚蠢的递归。
所以这个解决方案只能作为一个 shell 命令使用,而不是在 Makefile 本身中。
嗯,make 在这里似乎很神秘。我发现最合理的解决方案是创建一个脚本并使用它:
$ cat doall.sh
#!/bin/bash
for i in `make -rpn | sed -n -e '/^$/ { n ; /^[^ ]*:/p }' | sed -e 's/://' | egrep -v -E '(all|clean)'`;
do make $i;
done
似乎不可能将其创建为制造目标,或者这方面的投资回报率非常低......
【问题讨论】:
-
您需要在 Makefile 中复制任何文字美元符号。
-
@tripleee,即使我改变了它,仍然没有办法让它成为自我......你会怎么做?
标签: makefile