私はmakefileを使用して、多くの_.c
_ファイルで構成されるプログラムをコンパイルしています。make
が呼び出されると、最後の実行後に変更されたファイルのみがコンパイルされます(ここまで特別なことはありません)。
画面が乱雑にならないように、各$(CC)
呼び出しの先頭に_@
_を付加し、その前にカスタマイズされたecho
メッセージを出力します。例えば:
_%.o: %.c $(h1) $(h3) %.h
@echo -e "\tCompiling <" $<
@$(CC) $(CFLAGS) -c $< -o $(libDir)$@$(MATHOPTS)
_
私の質問は、次のことができるようにするために、make
の冗長性をより「動的な方法」で制御するにはどうすればよいかということです。
@
_がまったく使用されなかったかのように)。Automakeと同じように行います。
_V = 0
ACTUAL_CC := $(CC)
CC_0 = @echo "Compiling $<..."; $(ACTUAL_CC)
CC_1 = $(ACTUAL_CC)
CC = $(CC_$(V))
%.o: %.c $(h1) $(h3) %.h
$(CC) $(CFLAGS) -c $< -o $(libDir)$@$(MATHOPTS)
_
ルールで他のコマンドを実行する必要がある場合は、次のスニペットが好きです。 _@
_の代わりに$(AT)
と書くと、_V=0
_のときは無音になりますが、_V=1
_のときは出力されます。
_AT_0 := @
AT_1 :=
AT = $(AT_$(V))
_
別の解決策(柔軟性があるので私が好きなもの)
ifeq ("$(BUILD_VERBOSE)","1")
Q :=
vecho = @echo
else
Q := @
vecho = @true
endif
%.o: %.c
$(vecho) "-> Compiling $@"
$(Q)$(CC) $(CFLAGS) -c $< -o $@
Vechoのものはスキップできますが、便利な場合もあります。
実行するコマンドを受け取り、それをエコーするかどうかを決定する関数を作成します。
# 'cmd' takes two arguments:
# 1. The actual command to execute.
# 2. Optional message to print instead of echoing the command
# if executing without 'V' flag.
ifdef V
cmd = $1
else
cmd = @$(if $(value 2),echo -e "$2";)$1
endif
%.o: %.c $(h1) $(h3) %.h
$(call cmd, \
$(CC) $(CFLAGS) -c $< -o $(libDir)$@$(MATHOPTS), \
Compiling $<)
すると、プレーンなmake
呼び出しの結果は次のようになります。
Compiling foo.c
一方、make V=1
あげる:
gcc -Wall -c foo.c -o foo.o ...
「@gcc」を使用してコンパイルする代わりに、その「@」を省略して、代わりに「-s」オプションをmakeコマンドに渡すことができます。 (「@echo」はそのままにしておきます。)次に、「make -s」は簡単なmakeコマンドになり、「make」は冗長になります。
「-s」または「--silent」フラグを作成すると、すべてのレシピが「@」で始まっているかのように、すべてのエコーが防止されます。
(他の回答はあなたの質問によりよく答えますが、このアプローチは言及に値します。)
AT = $(AT_$(V))
の提案についてコメントすることはできないので、AutomakeはAT
と同じことを行う標準マクロを提供することに注意してください。これはAM_V_at
と呼ばれます。
また、冗長性に応じて、ゼロまたはAM_V_GEN
のいずれかに解決される別の非常に便利な@echo " GEN " $@;
変数があることもわかります。
これにより、次のようなコーディングが可能になります。
grldr.mbr: mbrstart
$(AM_V_GEN)
$(AM_V_at)-rm -f grldr.mbr
$(AM_V_at)cat mbrstart > grldr.mbr
その出力は次のいずれかになります(冗長性が無効になります)。
GEN grldr.mbr
または(冗長性が有効):
rm -f grldr.mbr
cat mbrstart > grldr.mbr
非常に便利で、これにより独自のマクロを定義する必要がなくなります。