現在位置: ホーム / みらくるブログ / makeコマンドを使ってみよう #2

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
非常に簡単なルールですが、ヘッダファイルを新規に作成する度に、そのファイル名をコロンの右側に追加していかなければなりません。ヘッダファイルを作成する頻度はそれほど高くないので、意外と忘れやすく要注意です。もし追加し忘れた場合、そのヘッダファイルが変更されてもmakeでビルドが実行されません。

ソースファイル(.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のリンクが行われます。

gccに-cオプションをつけることで、コンパイルのみを行い、オブジェクト作成します。-cがない場合、コンパイルとリンクを同時に行います。
上記のMakefileで、favorite-exの作成ルールが最も上に記載されています。これを.oを作るルールの下に移動することはできません。なぜなら、Makefileの中に複数のルールがある場合、最も上に記載されているルールを実行するからです。例えば、myfood.oのルールを一番上に書いた場合、makeと入力すると、myfood.oのみが作成されます。

まとめ

複数のソースファイルからなるプロジェクトのMakefileの記述例を紹介しました。今回の記事を見て気づいた方もいるかもしれませんが、ソースファイルが増えてくると似たような記述を繰り返すようになります。makeには、このような繰り返しを削減する機能があります。次回はそれについて説明します。

参考

タグ: