2017-11-13 9 views
0

私は、特定のターゲットに対してmakefileでforeachを使用しています。makefileターゲットのforeach&silencer

my_Target: 
    $(foreach x,$(MY_TARGET_DIRS), @echo " BUILD $(x)";$(Q)$(MAKE) --directory=$(x) LIB_DIR=$(MY_LIB_DIR) $(MY_TARGET_RULES);) 

これが意図され、文字列が進行中であるビルド伝えるために印刷された後のmakefileは、MY_TARGET_DIRSのすべての指定されたディレクトリが含まれて呼び出します。

Q変数は、以下のように定義されます。

# Silent per default, 'make V=1' shows all compiler calls. 
ifneq ($(V),1) 
    Q := @ 
endif 

だから、V = 1が定義されている場合は、makeコマンドが冗長であること。

V = 1の場合は、出力ログは次のとおりです。

make my_Target V=1 
BUILD /dir1 
make[1]: Entering directory `/dir1' 
make[1]: Nothing to be done for `elf'. 
make[1]: Nothing to be done for `bin'. 
make[1]: Leaving directory `/dir1' 
/bin/sh: @echo: command not found 
make[1]: Entering directory `/dir2' 
make[1]: Nothing to be done for `elf'. 
make[1]: Nothing to be done for `bin'. 
make[1]: Leaving directory `/dir2' 

私はV = 1を定義しない場合は、出力ログですが:

make my_Target 
BUILD /dir1 
/bin/sh: @make: command not found 
/bin/sh: @echo: command not found 
/bin/sh: @make: command not found 
make: *** [my_Target] Error 127 

どのように私は私が望む動作を得ることができます正しく?

Bye!

+0

'かなりMakefileの構築物(ないbashの1)である、とのこと_mustのための' @レシピの開始_。 Bashは認識されないシンボルで窒息しています。 – HardcoreHenry

+0

また、エコーを処理する代わりに/より良い(?)方法については、http://make.mad-scientist.net/managing-recipe-echoing/を参照してください。 – MadScientist

答えて

1

はレシピの初めに@$(Q)を)入れ:foreachは、単一のレシピ行をouptutし、@はそれのすべてに適用されます

my_Target: 
    $(Q)$(foreach x,$(MY_TARGET_DIRS), echo " BUILD $(x)";$(MAKE) --directory=$(x) LIB_DIR=$(MY_LIB_DIR) $(MY_TARGET_RULES);) 

ていることに注意してください。あなたはより多くの空想を取得したい場合の選択肢は、ターゲットのdirsのそれぞれのルールを作成することです:

MY_TARGET_DIRS_TARGS=$(MY_TARGET_DIRS:%=%/.phony) 

my_Target: $(MY_TARGET_DIRS_TARG) 

$(MY_TARGET_DIRS_TARGS): 
    @echo " BUILD $(x)" 
    $(Q)(MAKE) --directory=$(x) LIB_DIR=$(MY_LIB_DIR) $(MY_TARGET_RULES); 

.PHONY: $(MY_TARGET_DIRS_TARGS) 
+0

あなたの最初の例で '$(Q)'を 'foreach'ループから外していませんでした。 – MadScientist

+0

おっと - それを逃した。ありがとう。 – HardcoreHenry

+0

ありがとう、私はまた、すべてのディレクトリのルールを作成するが、別の前提条件を持つ他のターゲットを使用して、私はforeachを使用してみたかった。 –

関連する問題