1. 概要
Make は、 Makefile に存在する各コマンドを実行前に出力するため、不要な出力が発生する可能性があります。 このチュートリアルでは、Makefileでコマンド呼び出しのエコーを抑制する方法を学習します。
2. Makefileでのコマンド呼び出しのエコー
小さなMakefileを作成して、makeがどのように実行するかを見てみましょう。
$ cat Makefile
all: foo bar
foo:
printf "%s\n" "Target foo executing..."
printf "%s\n" "Hello from foo!"
bar:
printf "%s\n" "Target bar executing..."
printf "%s\n" "Hello from bar!"
ここでは、 fooとbar、の2つのターゲットがあり、printfコマンドでテキストを出力します。
$ make
printf "%s\n" "Target foo executing..."
Target foo executing...
printf "%s\n" "Hello from foo!"
Hello from foo!
printf "%s\n" "Target bar executing..."
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!
ご覧のとおり、printfコマンドの呼び出しとprintfコマンドの出力の両方が出力されます。 ここで、 printf“ %s \ n”を含む行はコマンド呼び出しです。
3. コマンド呼び出しのエコーの抑制
煩雑さを減らすために、実行されたコマンド自体ではなく、実際のコマンド出力のみを出力する必要があります。 それでは、そのためのさまざまな方法を見ていきましょう。
3.1. コマンドごと
コマンドの前に@記号を付けることで、コマンドごとにエコーを抑制できます。両方のターゲットに対する最初のprintf呼び出しを抑制しましょう。
$ cat Makefile
all: foo bar
foo:
@printf "%s\n" "Target foo executing..."
printf "%s\n" "Hello from foo!"
bar:
@printf "%s\n" "Target bar executing..."
printf "%s\n" "Hello from bar!"
ご覧のとおり、「ターゲット…実行中…」という最初のprintfコマンドの呼び出しは表示されなくなりました。
$ make
Target foo executing...
printf "%s\n" "Hello from foo!"
Hello from foo!
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!
3.2. ターゲットごと
ターゲットを特別な.SILENTターゲットの依存関係としてマークすることにより、ターゲットに対するすべてのコマンド呼び出しを抑制することができます。
fooターゲットを沈黙させましょう。
$ cat Makefile
.SILENT: foo
all: foo bar
foo:
printf "%s\n" "Target foo executing..."
...
これで、コマンド呼び出しがbarターゲットからのみ出力されることがわかります。
$ make
Target foo executing...
Hello from foo!
printf "%s\n" "Target bar executing..."
Target bar executing...
printf "%s\n" "Hello from bar!"
Hello from bar!
3.3. グローバルに
最後に、-sフラグを渡して、すべてのターゲットのコマンド呼び出しを無音にすることができます。 この方法には、変更を必要としないという利点もあります。 Makefile :
$ make -s
Target foo executing...
Hello from foo!
Target bar executing...
Hello from bar!
このメソッドは、Makefileの準備ができたら混乱を減らし、開発中に通常どおりmakeの実行にフォールバックできるため、非常に便利です。追加の出力は、デバッグに役立つため、開発中に役立ちます。
4. 結論
この記事では、 Makefile でのコマンド呼び出しのエコーと、それを抑制して不要な出力を減らす方法について学習しました。