ビルドログをすっきりさせる: GNU Make の -s オプション
このオプションの利点
- スクリプト内でのMake呼び出し時に、不要な出力を抑制したい場合に有効
- 複数のMakeコマンドをパイプラインで実行する場合に役立つ
- ビルドログが簡潔になり、重要な情報が読みやすくなる
オプションの使用方法
make -s [オプション] [ターゲット]
例
make -s clean all
このコマンドは、clean
とall
というターゲットをサイレントモードでビルドします。
- 完全なサイレンスが必要な場合は、
-q
オプションと併用することをおすすめします。 -s
オプションは、他のオプションと組み合わせて使用できます。
- デバッグ
Makeのデバッグには、-d
オプションなど、専用のオプションが用意されています。これらのオプションを使用すると、Makeが実行中に生成する詳細な情報を出力できます。 - ジョブサーバー
Makeは、ジョブサーバーを使用して並列にタスクを実行できます。-sオプションは、ジョブサーバーが生成するメッセージも抑制します。 - Makefile内の変数
Makeには、ビルドプロセスを制御するために使用できるさまざまな変数が用意されています。これらの変数を使用して、-sオプションの動作をさらにカスタマイズできます。
例1:単純なMakefile
# ターゲット: all
all: main.o other.o
gcc main.o other.o -o myapp
# ターゲット: clean
clean:
rm -f *.o myapp
このMakefileをmake
コマンドで実行すると、次のような出力が生成されます。
gcc main.o other.o -o myapp
例2:-s
オプションの使用
このMakefileをmake -s
コマンドで実行すると、出力は次のようになります。
myapp
ご覧のとおり、-s
オプションを使用すると、コンパイルコマンドに関する情報のみが表示され、ビルドログが簡潔になります。
make -s -j2 clean all
このコマンドは、clean
とall
というターゲットを2つのジョブで並列にビルドし、出力を抑制します。
例4:-s
オプションと変数の使用
# ビルドメッセージを抑制する
SILENT = -s
# ターゲット: all
all: main.o other.o
gcc main.o other.o -o myapp $(SILENT)
# ターゲット: clean
clean:
rm -f *.o myapp
このMakefileでは、SILENT
変数を使用して-s
オプションを定義しています。これにより、all
ターゲットをビルドする際に、常にサイレントモードが有効になります。
出力レベルの設定
Makeには、-O
オプションを使用して、ビルドログの出力レベルを制御する機能があります。このオプションを使用すると、以下のレベルを設定できます。
- 4
デバッグ情報を出力 - 3
コマンドの詳細を出力 - 2
ルールとターゲットの情報を出力 (デフォルト) - 1
エラーと警告を出力 - 0
エラーのみを出力
例:
make -O 0 clean all
このコマンドは、clean
とall
というターゲットをビルドし、エラーのみを出力します。
特定のメッセージの抑制
Makeには、特定のタイプのメッセージを抑制するためのオプションが用意されています。例えば、以下のようなオプションがあります。
-n
:コマンドの実行前に確認メッセージを表示しない-m
:古いターゲットに関するメッセージを抑制-Q
:依存関係に関するメッセージを抑制
make -Q clean all
このコマンドは、clean
とall
というターゲットをビルドし、依存関係に関するメッセージを抑制します。
サードパーティ製ツールの使用
Make以外にも、ビルドプロセスを自動化するためのツールは数多く存在します。これらのツールの中には、-sオプションと同様の機能を提供するものがあります。例えば、以下のようなツールがあります。
- Meson
シンプルで使いやすいビルドシステム - CMake
クロスプラットフォームのビルドシステム - Ninja
高速で効率的なビルドシステム
これらのツールは、Makeとは異なる構文や機能を持つ場合がありますので、使用前にドキュメントを参照する必要があります。
-sオプションは、Makeのビルド出力を抑制する簡単な方法ですが、状況によっては代替手段の方が適切な場合があります。上記で紹介した代替方法を検討し、自分のニーズに合ったものを選択してください。
- サードパーティ製ツールのドキュメントは、ツールのウェブサイトで確認できます。