GNU Make で特定の Makefile の一部のみを処理する

2024-04-02

GNU Make の "-b" オプション

"-b" オプションは、コマンドラインで make コマンドを実行する際に指定します。オプションの後に、読み込むファイルの名前を指定します。

make -b ファイル名

例:

make -b Makefile.debug

このコマンドは、"Makefile.debug" というファイルを読み込み、その内容を Makefile として処理します。

"-b" オプションと Makefile の読み込み順序

"-b" オプションで指定されたファイルは、通常の Makefile の後に読み込まれます。つまり、"-b" オプションで指定されたファイルの内容は、通常の Makefile の内容を上書きすることができます。

"-b" オプションは、以下のような場合に役立ちます。

  • 複数の Makefile を読み込む場合
  • 特定の Makefile の一部のみを処理する場合
  • デバッグ用の Makefile を読み込む場合

"-b" オプションに関する注意事項

  • "-b" オプションで指定されたファイルが存在しない場合は、エラーが発生します。
  • "-b" オプションで指定されたファイルが正しい Makefile 形式でない場合は、エラーが発生します。

"-b" オプションは、GNU Make の便利なオプションです。このオプションを使いこなすことで、Makefile をより柔軟に使いこなすことができます。



GNU Make "-b" オプションのサンプルコード

複数の Makefile を読み込む

# Makefile

# 共通のターゲット
all:
	echo "共通のターゲット"

# 個別 Makefile を読み込む
include Makefile.debug
include Makefile.release

# 個別 Makefile のターゲット
debug:
	echo "デバッグビルド"

release:
	echo "リリースビルド"

# Makefile.debug

# デバッグビルド用のターゲット
debug:
	echo "デバッグビルド"

# デバッグビルド用のオプション
CFLAGS = -g -Wall

# Makefile.release

# リリースビルド用のターゲット
release:
	echo "リリースビルド"

# リリースビルド用のオプション
CFLAGS = -O2 -Wall
  • "Makefile" は、共通のターゲット "all" と、個別 Makefile を読み込む "include" ディレクティブを定義しています。
  • "Makefile.debug" は、デバッグビルド用のターゲット "debug" と、デバッグビルド用のオプションを定義しています。
  • "Makefile.release" は、リリースビルド用のターゲット "release" と、リリースビルド用のオプションを定義しています。

"make" コマンドを実行すると、"Makefile" が読み込まれ、"Makefile.debug" と "Makefile.release" が順に読み込まれます。そして、"all" ターゲットが実行されます。

"make debug" コマンドを実行すると、"Makefile" が読み込まれ、"Makefile.debug" が読み込まれます。そして、"debug" ターゲットが実行されます。

"make release" コマンドを実行すると、"Makefile" が読み込まれ、"Makefile.release" が読み込まれます。そして、"release" ターゲットが実行されます。

特定の Makefile の一部のみを処理する

# Makefile

# すべてのターゲット
all:
	echo "すべてのターゲット"

# 特定の Makefile の一部のみを処理する
include Makefile.sub, target=clean

# Makefile.sub

clean:
	echo "クリーンアップ"

# 他のターゲット
install:
	echo "インストール"

この例では、"Makefile" というメイン Makefile と、"Makefile.sub" という個別 Makefile を用意しています。

  • "Makefile" は、すべてのターゲット "all" と、"Makefile.sub" の "clean" ターゲットのみを処理する "include" ディレクティブを定義しています。
  • "Makefile.sub" は、"clean" ターゲットと、"install" ターゲットを定義しています。

"make" コマンドを実行すると、"Makefile" が読み込まれ、"Makefile.sub" の "clean" ターゲットのみが処理されます。

"make install" コマンドを実行すると、"Makefile" が読み込まれますが、"Makefile.sub" は読み込まれません。そのため、"install" ターゲットは実行されません。

デバッグ用の Makefile を読み込む

# Makefile

# 通常のターゲット
all:
	echo "通常のターゲット"

# デバッグ用の Makefile を読み込む
ifeq ($(DEBUG),1)
include Makefile.debug
endif

# Makefile.debug

# デバッグビルド用のターゲット
debug:
	echo "デバッグビルド"

# デバッグビルド用のオプション
CFLAGS = -g -Wall

この例では、"Makefile" というメイン Makefile と、"Makefile.debug" というデバッグ用の Makefile を用意しています。

  • "Makefile" は、通常のターゲット "all" と、環境変数 "DEBUG" が 1 に設定されている場合のみ "Makefile.debug" を読み込む "ifeq" ディレクティブを定義しています。
  • "Makefile.debug" は、デバッグビルド用のターゲット "debug" と、デバッグビルド用のオプションを定義しています。

"DEBUG" 環境変数を設定せずに "make" コマンドを実行すると、"Makefile" が読み込まれ、"all" ターゲットが実行されます。

"DEBUG=1 make" コマンドを実行すると、"Makefile" が読み込まれ、"Makefile.debug" も読み込まれます。そして、"all" ターゲットと



GNU Make "-b" オプションのその他の方法

Makefile 内で別の Makefile を呼び出す

# Makefile

# すべてのターゲット
all:
	echo "すべてのターゲット"

# 別の Makefile を呼び出す
$(MAKE) -f Makefile.sub

# Makefile.sub

# 特定のターゲット
clean:
	echo "クリーンアップ"

この例では、"Makefile" というメイン Makefile と、"Makefile.sub" という個別 Makefile を用意しています。

  • "Makefile" は、すべてのターゲット "all" と、"(MAKE)"コマンドを使って"Makefile.sub"を呼び出す記述を定義しています。"Makefile.sub"は、"clean"ターゲットを定義しています。"make"コマンドを実行すると、"Makefile"が読み込まれ、"(MAKE)" コマンドを使って "Makefile.sub" が呼び出されます。そして、"all" ターゲットと "clean" ターゲットが実行されます。

Makefile の読み込み順序を変更する

# Makefile

# すべてのターゲット
all:
	echo "すべてのターゲット"

# Makefile の読み込み順序を変更する
MAKEFLAGS += -r

include Makefile.sub
# Makefile.sub

# 特定のターゲット
clean:
	echo "クリーンアップ"

この例では、"Makefile" というメイン Makefile と、"Makefile.sub" という個別 Makefile を用意しています。

  • "Makefile" は、すべてのターゲット "all" と、"MAKEFLAGS" 環境変数に "-r" オプションを追加して "Makefile.sub" を読み込む記述を定義しています。
  • "Makefile.sub" は、"clean" ターゲットを定義しています。

"-r" オプションは、Makefile の読み込み順序を逆順にするオプションです。

"make" コマンドを実行すると、"Makefile" が読み込まれ、まず "Makefile.sub" が読み込まれます。そして、"all" ターゲットと "clean" ターゲットが実行されます。

.PHONY ターゲットを使う

# Makefile

# すべてのターゲット
all:
	echo "すべてのターゲット"

.PHONY: clean

clean:
	echo "クリーンアップ"

この例では、"clean" ターゲットを .PHONY ターゲットとして定義しています。

.PHONY ターゲットは、実際には存在しないターゲットとして扱われます。

"make clean" コマンドを実行すると、"clean" ターゲットが実行されます。

"-b" オプション以外にも、GNU Make で複数の Makefile を読み込んだり、特定の Makefile の一部のみを処理したりする方法はいくつかあります。

それぞれの方法にはメリットとデメリットがあるので、状況に合わせて使い分けることが重要です。




include ディレクティブを使用して作業ディレクトリを指定する

以下の例では、-C オプションを使用して、subdir ディレクトリにある Makefile を実行します。このコマンドは、現在のディレクトリではなく、subdir ディレクトリに移動し、そのディレクトリにある Makefile を実行します。



"-w" オプションと Makefile の .SILENT ディレクティブ:徹底比較

-w オプションは、GNU Make における重要なコマンドラインオプションの一つです。このオプションは、警告メッセージの表示を制御するために使用されます。機能-w オプションには、以下の 3 つの機能があります。警告メッセージの抑制特定の警告メッセージの抑制


あなたは使いこなせる?GNU Make の "-k" オプションとその他方法

上記のコマンドは、Makefile に記述されたすべてのターゲットを、エラーが発生しても すべて実行しようとします。-k オプションには、以下の 2 つの動作モードがあります。エラーがあっても処理を継続する エラーが発生しても、Make は処理を継続し、残りのターゲットを実行しようとします。 エラーが発生したターゲットは、$? 変数に格納されます。 詳細なエラー情報は、make -r コマンドで確認できます。



GNU Make の --no-print-directory オプション: ディレクトリ名の出力を抑制する

--no-print-directory オプションは、make が処理する各ディレクトリの名前を出力することを抑制します。これは、大量のディレクトリを処理する場合、出力を簡潔にするために役立ちます。オプションの詳細デフォルトの動作: make は、処理する各ディレクトリの名前を出力します。


GNU Make の include ディレクティブの詳細

--include-dir=dir オプションは、GNU Make に .mk ファイルの検索パスを追加するために使用されます。このオプションは、include ディレクティブで指定されたファイルが見つからない場合に役立ちます。オプションの詳細:


include ディレクティブを使用して作業ディレクトリを指定する

以下の例では、-C オプションを使用して、subdir ディレクトリにある Makefile を実行します。このコマンドは、現在のディレクトリではなく、subdir ディレクトリに移動し、そのディレクトリにある Makefile を実行します。


GNU Make の --quiet オプションでメッセージ出力を抑制

--quiet オプションは、以下の動作を引き起こします。ヘッダーとフッターメッセージの抑制ターゲットの更新に関する情報の抑制レシピの実行に関する情報の抑制エラーメッセージの表示--quiet オプションは、単独で使用したり、他のオプションと組み合わせて使用したりできます。たとえば、-v オプションと組み合わせて使用すると、レシピの実行に関する詳細情報のみを表示できます。


GNU Make の --version オプションの詳細解説

コマンドラインから --version オプションを実行すると、次の情報が表示されます。Make ユーティリティのバージョン番号メジャーバージョン番号マイナーバージョン番号パッチレベルリリース候補番号 (存在する場合)ビルドホストビルド日時