次の 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)')
しかし、それは間違っているようです。それは間違っているだけでなく、ばかげた再帰を引き起こします。
したがって、このソリューションは、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
それをメイクターゲットとして作成することは不可能であるか、またはこれに対するROIが非常に低いようです...