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

使用方法

  1. main.cMakefile を同じディレクトリに保存します。
  2. 以下のコマンドを実行してプログラムをコンパイルします。
make
  1. 以下のコマンドを実行してプログラムを実行します。
./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 を実行する場合は、適切に動作しない可能性がある