複雑なプロジェクトもラクラク! GNU Make の `-C dir` オプションでディレクトリを超えてMakefileを読み込む
-C dir
オプションは、GNU Make において、makefile を指定するディレクトリを変更するためのものです。デフォルトでは、make は現在のワーキングディレクトリにある makefile を読み込みます。しかし、-C dir
オプションを使用すると、make は指定された dir
ディレクトリにある makefile を読み込むようになります。
使用方法
-C dir
オプションは、make コマンドラインで以下のように使用します。
make -C dir [target]
ここで、
target
は、ビルドしたいターゲットの名前です。省略した場合、make はデフォルトのターゲットをビルドします。dir
は、makefile が存在するディレクトリへのパスです。
例
以下の例では、/path/to/project
ディレクトリにある makefile
を読み込み、app
ターゲットをビルドします。
make -C /path/to/project app
利点
-C dir
オプションを使用すると、以下の利点が得られます。
- 複雑なプロジェクトを整理できる: 複雑なプロジェクトでは、複数のサブディレクトリに makefile を分散させることができます。
-C dir
オプションを使用することで、各サブディレクトリから個別に makefile を読み込むことができます。 - makefile の場所を意識せずにビルドできる: makefile の場所を意識せずに、プロジェクトディレクトリから直接 make コマンドを実行することができます。
- 複数のプロジェクトを簡単にビルドできる: それぞれのプロジェクトに個別の makefile を用意し、
-C dir
オプションを使用して個別にビルドすることができます。
-C dir
オプションは、make コマンドラインの 最初のオプションとして指定する必要があります。-C dir
オプションを使用する場合は、絶対パスを使用する必要があります。相対パスを使用すると、予期しない動作になる可能性があります。
プロジェクト 1
/path/to/project1
├── Makefile
├── src
│ └── app.c
└── bin
Makefile (project1)
# プロジェクト 1 の Makefile
app: src/app.c
$(CC) $(CFLAGS) -o bin/app src/app.c
clean:
rm -f bin/app
プロジェクト 2
/path/to/project2
├── Makefile
├── src
│ └── lib.c
└── bin
└── prog.o
Makefile (project2)
# プロジェクト 2 の Makefile
prog: bin/prog.o src/lib.c
$(CC) $(CFLAGS) -o bin/prog bin/prog.o src/lib.c
prog.o: src/lib.c
$(CC) $(CFLAGS) -c src/lib.c
ビルド手順
- 以下のコマンドを実行して、プロジェクト 1 をビルドします。
make -C /path/to/project1
- 以下のコマンドを実行して、プロジェクト 2 をビルドします。
make -C /path/to/project2
説明
上記の例では、以下の操作が行われます。
make -C /path/to/project1
コマンドは、/path/to/project1
ディレクトリにあるMakefile
を読み込みます。Makefile
(project1) は、app
というターゲットを定義します。このターゲットは、src/app.c
ファイルをコンパイルしてbin/app
という実行ファイルを作成します。make
コマンドは、app
ターゲットをビルドし、bin/app
という実行ファイルを作成します。make -C /path/to/project2
コマンドは、/path/to/project2
ディレクトリにあるMakefile
を読み込みます。Makefile
(project2) は、prog
というターゲットを定義します。このターゲットは、bin/prog.o
というオブジェクトファイルとsrc/lib.c
ファイルをリンクしてbin/prog
という実行ファイルを作成します。make
コマンドは、prog
ターゲットをビルドし、bin/prog
という実行ファイルを作成します。
この例は、-C dir
オプションを使用して、複数のプロジェクトを簡単にビルドする方法を示しています。
上記の例は、あくまでも一例です。実際のプロジェクトでは、より複雑な Makefile が必要になる場合があります。
環境変数 MAKEFILE を使用する
MAKEFILE
環境変数に、makefile のパスを設定することで、-C dir
オプションを使用せずに makefile を指定することができます。この方法は、以下のコマンドで実行できます。
MAKEFILE=/path/to/makefile make
ここで、/path/to/makefile
は、makefile の絶対パスです。
ワーキングディレクトリを変更する
make コマンドを実行する前に、ワーキングディレクトリを makefile が存在するディレクトリに変更することができます。この方法は、以下のコマンドで実行できます。
cd /path/to/project
make
ここで、/path/to/project
は、makefile が存在するプロジェクトディレクトリのパスです。
make -f オプションを使用する
make -f
オプションを使用して、makefile のパスを明示的に指定することができます。この方法は、以下のコマンドで実行できます。
make -f /path/to/makefile
サブスクリプトを使用する
複雑なプロジェクトの場合、サブスクリプトを使用して、makefile の場所を指定することができます。この方法は、以下の手順で実行できます。
- サブスクリプトファイルを作成します。
- サブスクリプトファイル内で、
cd
コマンドを使用してワーキングディレクトリを makefile が存在するディレクトリに変更します。 - サブスクリプトファイル内で、
make
コマンドを使用して make を実行します。 - メインの makefile から、サブスクリプトファイルを呼び出します。
例
以下の例は、サブスクリプトを使用して makefile の場所を指定する方法を示しています。
build.sh
#!/bin/bash
cd /path/to/project
make
Makefile
include build.sh
この例では、build.sh
というサブスクリプトファイルを作成し、その中で cd
コマンドを使用してワーキングディレクトリを /path/to/project
に変更し、make
コマンドを使用して make を実行しています。
メインの Makefile
では、include build.sh
というコマンドを使用して、build.sh
サブスクリプトファイルを呼び出しています。