假设我有以下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能够检测到所有目标 目标并排除某个列表。
我发现了以下可能的提示:
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
似乎无法将其创建为制作目标,或者此处的投资回报率非常低......
答案 0 :(得分:1)
我使用for循环尝试了这个。检查这个简单的示例是否适合您。从this发布命令。
RM = rm -f
FLAGS = -Cr -O1 -gv -gw -g -vw
builddir = ./build/
TD = ./tasks/
SHELL := /bin/bash
targets=$(shell for file in `find . -name '*.pas' -type f -printf "%f\n" | sed 's/\..*/\.out/'`; do echo "$$file "; done;)
all: $(targets)
%.out:%.pas
fpc $< $(FLAGS) -o (builddir)$@
clean:
$(RM) $(builddir)*
答案 1 :(得分:0)
我一直在使用
make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}'
(保存为make-t
)列出所有目标。
如果您想构建所有真实目标,那么请列出所有不虚假的目标:
make -qp | grep -P '^[.a-zA-Z0-9][^$#\/\t=]*:([^=]|$)' |
tee >(cut -d: -f1 ) >(grep '^\s*\.PHONY\s*:' |cut -d: -f2) >/dev/null|
tr ' ' '\n' | sed '/^\s*\./ d; /^\s*$/ d' |sort |uniq -u
应该完成这项工作(假设没有目标名称,其中包含空格)。