web-dev-qa-db-ja.com

makeの冗長性の制御

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

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

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

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

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

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))
_
16
Jack Kelly

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

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

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

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

8
John

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

# '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 ...
4

「@gcc」を使用してコンパイルする代わりに、その「@」を省略して、代わりに「-s」オプションをmakeコマンドに渡すことができます。 (「@echo」はそのままにしておきます。)次に、「make -s」は簡単なmakeコマンドになり、「make」は冗長になります。

「-s」または「--silent」フラグを作成すると、すべてのレシピが「@」で始まっているかのように、すべてのエコーが防止されます。

GNUマニュアルページを作成)から

(他の回答はあなたの質問によりよく答えますが、このアプローチは言及に値します。)

4
John P

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

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

3
Akeo