複雑なプロジェクトもラクラク! 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. 以下のコマンドを実行して、プロジェクト 1 をビルドします。
make -C /path/to/project1
  1. 以下のコマンドを実行して、プロジェクト 2 をビルドします。
make -C /path/to/project2

説明

上記の例では、以下の操作が行われます。

  1. make -C /path/to/project1 コマンドは、/path/to/project1 ディレクトリにある Makefile を読み込みます。
  2. Makefile (project1) は、app というターゲットを定義します。このターゲットは、src/app.c ファイルをコンパイルして bin/app という実行ファイルを作成します。
  3. make コマンドは、app ターゲットをビルドし、bin/app という実行ファイルを作成します。
  4. make -C /path/to/project2 コマンドは、/path/to/project2 ディレクトリにある Makefile を読み込みます。
  5. Makefile (project2) は、prog というターゲットを定義します。このターゲットは、bin/prog.o というオブジェクトファイルと src/lib.c ファイルをリンクして bin/prog という実行ファイルを作成します。
  6. 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 の場所を指定することができます。この方法は、以下の手順で実行できます。

  1. サブスクリプトファイルを作成します。
  2. サブスクリプトファイル内で、cd コマンドを使用してワーキングディレクトリを makefile が存在するディレクトリに変更します。
  3. サブスクリプトファイル内で、make コマンドを使用して make を実行します。
  4. メインの 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 サブスクリプトファイルを呼び出しています。