Makefile を使って C 言語プログラムをビルドする方法 --makefile=file オプション付き
--makefile=file
オプションは、GNU Make ユーティリティに使用する Makefile ファイルを指定するために使用されます。デフォルトでは、Make は "Makefile" または "makefile" という名前のファイルを現在のディレクトリ内を探します。このオプションを使用すると、別の名前または別の場所にある Makefile ファイルを指定することができます。
構文
--makefile=<ファイル名>
オプションの説明
<ファイル名>
: 使用する Makefile ファイルのパスと名前
例
make --makefile=myMakefile.mk
このコマンドは、"myMakefile.mk" という名前の Makefile ファイルを使用して、Make ユーティリティを実行します。
- Makefile ファイルが見つからない場合、Make はエラーメッセージを表示して終了します。
- 複数の Makefile ファイルを指定するには、
--makefile
オプションを複数回使用します。 --makefile
オプションは、他の Make コマンドラインオプションと同様に使用できます。
プログラミングにおける利点
- Make コマンドラインを簡潔にすることができます。
- Makefile ファイルをプロジェクト ディレクトリ以外の場所に配置する場合に便利です。
- 複数のプロジェクトで異なる Makefile を使用する場合に便利です。
例
以下は、--makefile
オプションを使用するプログラミングの例です。
# プロジェクト ディレクトリ
project_dir/
├── Makefile
├── src/
│ ├── main.c
│ └── Makefile
└── tests/
├── Makefile
└── test.c
# プロジェクト ディレクトリ内の Makefile で "all" ターゲットを実行する
make
# "src" ディレクトリ内の Makefile で "build" ターゲットを実行する
make --makefile=src/Makefile build
# "tests" ディレクトリ内の Makefile で "test" ターゲットを実行する
make --makefile=tests/Makefile test
この例では、プロジェクトには 3 つの Makefile ファイルがあります。1 つはプロジェクト ディレクトリにあり、他の 2 つは "src" ディレクトリと "tests" ディレクトリにあります。
プロジェクト ディレクトリ内の Makefile は、"all" ターゲットを定義します。このターゲットは、"src/Makefile" と "tests/Makefile" の "build" ターゲットを順番に実行します。
"src/Makefile" は、"build" ターゲットを定義します。このターゲットは、"main.c" ファイルをコンパイルして実行可能ファイルを作成します。
"tests/Makefile" は、"test" ターゲットを定義します。このターゲットは、"test.c" ファイルをコンパイルして実行可能ファイルを作成し、その実行可能ファイルを使用して単体テストを実行します。
--makefile
オプションを使用すると、各 Makefile ファイルを個別に実行して、特定のタスクを実行することができます。
ソースコード
// main.c
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Makefile
# Makefile
# ターゲット: プログラムの名前
all: main
# 依存関係: オブジェクトファイル
main: main.o
# ルール: オブジェクトファイルを生成する方法
main.o: main.c
gcc -c main.c -o main.o
# ルール: プログラムを生成する方法
main: main.o
gcc main.o -o main
# ルール: クリーンアップ
clean:
rm -f main main.o
使用方法
main.c
とMakefile
を同じディレクトリに保存します。- 以下のコマンドを実行してプログラムをコンパイルします。
make
- 以下のコマンドを実行してプログラムを実行します。
./main
出力
Hello, world!
説明
make
コマンドは、Makefile
を読み込み、依存関係に基づいて必要なルールを順番に実行します。- 上記の例では、
all
ターゲットはmain
プログラムを生成します。main
ターゲットはmain.o
オブジェクトファイルに依存します。main.o
オブジェクトファイルはmain.c
ソースファイルから生成されます。 - ルールには、ターゲットを作成する方法を記述するコマンドが含まれています。
- 依存関係は、ターゲットを作成するために必要なファイルまたはコマンドです。
- ターゲットは、生成するファイルまたは実行するコマンドです。
- ルールは、ターゲットと依存関係で構成されています。
Makefile
には、プログラムをコンパイルおよび実行する方法を記述するルールが含まれています。
- Makefile を使用すると、異なるプラットフォーム間でプログラムを簡単に移植できます。
- Makefile を使用すると、プログラムの依存関係を明確に定義できます。
- Makefile を使用すると、プログラムをコンパイルおよび実行する手順を自動化できます。
- ドキュメントを生成する
- テストを実行する
- デバッガフラグを指定してプログラムをコンパイルする
環境変数 MAKEFILE を使用する
MAKEFILE
環境変数に Makefile ファイルのパスを設定することで、--makefile
オプションを指定せずに Make を実行できます。
# シェルスクリプトの場合
MAKEFILE=myMakefile.mk make
# Windows コマンドプロンプトの場合
set MAKEFILE=myMakefile.mk
make
-f オプションを使用する
-f
オプションを使用して、Makefile ファイルのパスを Make コマンドラインに直接指定できます。
make -f myMakefile.mk
デフォルトの Makefile ファイル名を変更する
Makefile
または makefile
という名前以外の Makefile ファイルを使用する場合は、Make のデフォルトの Makefile ファイル名を変更することができます。
# ~/.bashrc または ~/.zshrc ファイルに追加
MAKEFLAGS=-Makefile=myMakefile.mk
ワーキングディレクトリを変更する
Makefile ファイルが現在のワーキングディレクトリにある場合は、そのファイルを明示的に指定する必要はありません。Make は、現在のワーキングディレクトリにある Makefile
または makefile
ファイルを自動的に検索します。
利点と欠点
各方法には、それぞれ利点と欠点があります。
方法 | 利点 | 欠点 |
---|---|---|
MAKEFILE 環境変数 | 設定が簡単 | 複数のプロジェクトで同じ環境変数を使用する場合は、混乱する可能性がある |
-f オプション | シンプルでわかりやすい | 毎回コマンドラインにオプションを指定する必要がある |
デフォルトの Makefile ファイル名の変更 | すべてのプロジェクトで Makefile ファイルの名前を統一できる | 設定がやや複雑 |
ワーキングディレクトリの変更 | シンプルでわかりやすい | プロジェクトディレクトリ外から Make を実行する場合は、適切に動作しない可能性がある |