makeコマンドを使ってみよう #2
ヘッダファイルを使用する場合
以下の1つのソースファイル(favorite.c)と1つのヘッダファイル(favorite.h)を使用するプロジェクトを例に説明します。
[favorite.c]
#include <stdio.h>
#include "favorite.h"
int main(void)
{
printf("My favorite food is %s\n", FAVORITE_FOOD);
}
[cat favorite.h]
#define FAVORITE_FOOD "cake"
この例のためのMakefileには、以下のように1行目の右側に依存するすべてのファイルを記述します。この場合、favorite.cとfavorite.hのうち、少なくともひとつが変更されると、ビルドが実行されます。
favorite: favorite.c favorite.h
gcc favorite.c -o favorite
ソースファイル(.c)が複数ある場合
今度はソースファイルが複数ある場合の例です。一般にソースファイルが複数ある場合、次の図のように一旦、オブジェクトファイル(.o)をソースファイル(.c)ごとに作成し、最後にそれらをリンクします。
ここでは、以下の2つのソースファイル(.c)と1つのヘッダファイルを使用します。
[myfood.c]
const char *my_favorite_food(void)
{
return "curry and rice.";
}
[myfood.h]
const char *my_favorite_food(void);
[favorite-ex.c]
#include <stdio.h>
#include "myfood.h"
int main(void)
{
printf("My favorite food is %s\n", my_favorite_food());
}
これらをビルドするMakefileは次のようになります。
favorite-ex: favorite-ex.o myfood.o
gcc favorite-ex.o myfood.o -o favrote-ex
favorite-ex.o: favorite-ex.c
gcc favorite-ex.c -c -o favorite-ex.o
myfood.o: myfood.c myfood.h
gcc myfood.c -c -o myfood.o
この例では、favorite-exは、2つのオブジェクトファイルfavorite-ex.oとmyfood.oから作成されますので、1行目には、その2つを依存ファイルとして記述します。その後ろに、それぞれのオブジェクトファイルを作成するルールを記述しています。これはこれまで見てきた例と同じです。
makeは、依存ファイルの作成方法をMakefile内から探して再帰的に必要なファイルを作成していきます。例えば、myfood.cが変更されていると、myfood.cがコンパイルされ、myfood.oが作成され、次いで、それに依存しているfavorite-exのリンクが行われます。
まとめ
複数のソースファイルからなるプロジェクトのMakefileの記述例を紹介しました。今回の記事を見て気づいた方もいるかもしれませんが、ソースファイルが増えてくると似たような記述を繰り返すようになります。makeには、このような繰り返しを削減する機能があります。次回はそれについて説明します。