12

.c多くのファイルで構成されるプログラムをコンパイルするためにメイクファイルを使用していますmakeが、呼び出されるたびに、最後の実行後に変更されたファイルのみがコンパイルされます (ここまで特別なことはありません)。

画面が乱雑になるのを避けるために@、各$(CC)呼び出しの先頭に追加し、その前にカスタマイズされたechoメッセージを出力します。例えば:

%.o: %.c $(h1) $(h3) %.h
    @echo -e "\tCompiling <" $< 
    @$(CC) $(CFLAGS) -c $< -o $(libDir)$@$(MATHOPTS)

私の質問は、次のmakeことを可能にするために、より「動的な方法」で冗長性を制御するにはどうすればよいかです。

  1. 通常の動作: 実行されるすべてのメイクファイル ルールに対して、カスタマイズされたメッセージのみが出力されます。
  2. Verbose behavior : すべての makefile ルールによって実際に実行されたコマンドを出力します (あたかも@がまったく使用されていないかのように)。
4

5 に答える 5

16

私は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))
于 2012-02-16T20:29:20.490 に答える
9

別の解決策(柔軟性があるので私が好きなもの)

ifeq ("$(BUILD_VERBOSE)","1")
Q :=
vecho = @echo
else
Q := @
vecho = @true
endif

%.o: %.c
    $(vecho) "-> Compiling $@"
    $(Q)$(CC) $(CFLAGS) -c $< -o $@

vecho はスキップできますが、便利な場合もあります。

于 2012-03-07T22:02:16.580 に答える
4

実行するコマンドを受け取り、それをエコーするかどうかを決定する関数を作成します。

# '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 ...
于 2012-02-16T16:19:37.020 に答える
3

この提案についてコメントすることはできないので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

これは非常に便利で、独自のマクロを定義する必要がなくなります。

于 2014-11-12T19:24:37.257 に答える