Makefileは、料理で言うところのレシピのようなものです。必要な素材を手順に沿って組み合わせていき、料理を完成させるイメージです。これがC言語ならば、素材にあたるのはソースファイルやライブラリであり、それらを手順に従い組み合わせていき、実行ファイルを作成します。
この記事では、GNU make と gcc を使用した分割コンパイルの基本的なMakefileの書き方について紹介します。
サンプルコード
以下は、main.c と sub.c の2つのソースファイルを持つプロジェクトのMakefileの例です。
# コンパイラの指定
CC=gcc
# コンパイル時のオプション
CFLAGS=-I. -Wall
# 最終的な実行ファイル名
TARGET=myapp.exe
# 最終ターゲット
$(TARGET): main.o sub.o
$(CC) -o $(TARGET) main.o sub.o
# main.cからmain.oを生成
main.o: main.c
$(CC) -c main.c $(CFLAGS)
# sub.cからsub.oを生成
sub.o: sub.c
$(CC) -c sub.c $(CFLAGS)
# 'make clean' を実行した時に実行ファイルとオブジェクトファイルを削除
clean:
rm -f $(TARGET) main.o sub.o
- CC は、使用するコンパイラを指定する変数です。
- CFLAGS は、コンパイル時のオプションを指定する変数です。
- 同じ設定を複数の場所で再利用したい場合、上記のように変数としておきます。
- TARGET 変数は最終的に生成される実行ファイルの名前を指定します。
- 〇〇: と書かれているのがルールです。コロン(:)の後ろに必要な材料を列挙できます。
- 最初のルールでは、変数 $(TARGET) で指定されている myapp.exe を作成するために main.o と sub.o が必要であること、そしてこれらをリンクして myapp.exe を生成するコマンドを指定しています。
- 続く2つのルールでは、ソースファイル (main.c と sub.c) からオブジェクトファイル (main.o と sub.o) を生成する方法を定義しています。
- clean ルールは、生成された実行ファイルとオブジェクトファイルを削除するためのものです。これは、プロジェクトをクリーンな状態に戻すのに便利です。
実行の準備
以下のようにファイルを準備します。
ファイルの中身は、簡単なものを用意しました。
main.c
#include "header.h"
int main( void )
{
print_hello();
return 0;
}
sub.c
#include <stdio.h>
void print_hello( void )
{
printf("Hello Makefile!\n");
}
header.h
extern void print_hello( void );
実行
Makefileが格納されているディレクトリでmakeコマンドを実行します。makeコマンドは、デフォルト名のMakefileというファイル名を探して、存在する場合はそのファイルを入力として使用します。
上記のようにコンパイルとリンクが行われ、mayapp.exeが出来れば、makeの実行は成功しています。
作成したアプリを実行して動作を確認しましょう。
まとめ
Makefileは、ソフトの開発現場では良く使われていますが、Makefileを得意とする技術者は意外と多くはいません。ぜひこの機会にMakefileの書き方を理解して、開発環境を作れる技術者を目指しましょう。