7

次の 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が非常に低いようです...

4

2 に答える 2

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

ジョブを実行する必要があります (これは、スペースを含むターゲット名がないことを前提としています)。

于 2015-07-02T20:54:07.060 に答える