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 を実行します。



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

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


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

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



GNU Make の --jobs オプションを使った実際のプロジェクトの例

--jobs[=jobs] オプションは、GNU Make で同時に実行されるジョブ(コマンド)の数を指定します。これは、複数のターゲットを並行してビルドしたり、依存関係のないレシピを同時に実行したりする場合に便利です。構文オプションjobs: ジョブ数の指定。省略すると、デフォルトのジョブ数が使用されます。


GNU Make の "--dry-run" オプション:ビルド前にコマンドを確認する方法

--dry-run オプションは、GNU Make に実際の処理を実行せずに、ターゲットのビルドに必要なコマンドを表示させるためのオプションです。ビルド前にコマンドを確認したい場合や、トラブルシューティングに役立ちます。使用方法--dry-run オプションは、make コマンドラインで以下のいずれかの方法で指定できます。


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

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


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

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


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

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