2016-09-23 5 views
0

ファイルが存在する場合は、ビルドするターゲットを追加します。ファイルが存在しない場合は、ターゲットをスキップする必要があります。ターゲットのリストを動的に生成

例:

FILENAME = f 

TARGETS := normal 
ifneq($(shell stat test_$(FILENAME).c), "") 
    TARGETS += test 
endif 

all: $(TARGETS) 

normal: 
    @echo normal 

test: 
    @echo test 

私は$(shell stat ...)一部でも働くわからないんだけど、大きな問題は、現在のフォルダ内のファイルtest_f.cmakeが与えられるということです。

Makefile:4: *** multiple target patterns. Stop. 

の削除しますifneq ... endifブロックはターゲットをnormalにします。 test_f.cが存在する場合、ターゲットを実行するにはどうすればよいですか?test

+0

でターゲットを反復処理することができます。 'ifneq($(shell stat test _ $(FILENAME).c)、)'(引用符は文字通り一致している)でなければなりません。 –

+0

@AndreaBiondoああ、うわー... – cat

答えて

1

あなたができることは、 'test_f.c'が存在するときに文字列変数(OPTIONALと呼ぶ)を生成することです。OPTIONAL=test;それ以外の場合はOPTIONAL=_nothing_です。そしてallの前提条件としてOPTIONALを追加します。例えば:

FILENAME = f 

TARGETS = normal 
OPTIONAL = $(if $(wildcard test_f.c), test,) 
all: $(TARGETS) $(OPTIONAL) 

normal: 
    @echo normal 

test: 
    @echo test 
+0

ありがとう!好奇心の中で、質問のMakefileの構文に何が間違っているかを知っていますか? 1つのターゲットが2つに拡張されただけですか? – cat

+1

申し訳ありません私のマシン上で同じ問題を再現できないため、この問題がなぜ起こるのか分かりません。しかし、エラーメッセージは、通常、同じ行の複数のコロンによって引き起こされます。メイクファイルの不正なコロンを確認することができます。ワイルドな考え: 'stat'によって返された結果は、" Sep 23 16:52:12 ... "のような文字列を含んでいます。この文字列のコロンは、どうにかしてメイクファイルを汚染する可能性があります(今のところ正確にはわかりませんが) –

+1

デバッグを助けるために、この行に '。%:; @echo $ * = $($ *) 'をあなたのmakefileに追加して、' TARGET'の値をチェックするために 'make .TARGET'か何か変数名を使用してください。 'TARGET'でコロンを見ることができれば、それが問題になります。 –

0

また、あなたがifneq` `の後にスペースを忘れてしまったforループ

.PHONY: all 

RECIPES = one 

all: RECIPES += $(if $(wildcard test_f.c), two,) 
all: 
     for RECIPE in ${RECIPES} ; do \ 
       $(MAKE) $${RECIPE} ; \ 
     done 
one: 
     $(warning "One") 

two: 
     $(warning "Two") 

> make 
for RECIPE in one ; do \ 
     /Applications/Xcode.app/Contents/Developer/usr/bin/make ${RECIPE} ; \ 
    done 
makefile:11: "One" 
make[1]: `one' is up to date. 

> touch test_f.c 

> make 
for RECIPE in one two ; do \ 
     /Applications/Xcode.app/Contents/Developer/usr/bin/make ${RECIPE} ; \ 
    done 
makefile:11: "One" 
make[1]: `one' is up to date. 
makefile:14: "Two" 
make[1]: `two' is up to date. 
+0

可能であれば、makefileでシェルループではなく依存関係を使用することをお勧めします。それはあなたのビルドを並列に安全にし、再帰的なmakeを必要としません。あなたのループには、_make_のリターンコードを無視するという問題もあります。 – bobbogo

関連する問題