2013年7月15日月曜日

Makefileを書いてみる その1

暑いです。B4のtyadです。

今日はMakefileについて紹介します。
長くなりそうだったで今日と来週の月曜の2回に分けます。
細かい説明は2回目に回すとして、
1回目はとりあえず簡単に使ってみるところまでを紹介します。


Makefileとは

Makefileとは実行可能プログラムの生成および保守を簡単に行うためのコマンド「make」に使用されるファイルです。
簡単にいうと、コンパイルと再コンパイルを簡単にしてくれるコマンドの設定ファイルのようなものです。


実際に使ってみる

とりあえず使ってみましょう。
今回はC言語のコンパイルを例に使ってみます。
まずは「sample.c」というファイル名でC言語のソースコードを用意します。
#include<stdio.h>
int main(){
        printf("aho\n");
        return 0;
}
そして同じディレクトリに「Makefile」というで以下のコードを書いたファイルを用意します。
sample: sample.c
         gcc sample.c -o sample
今のディレクトリ内はこんな感じ



この「sample.c」をコンパイルする際には、
         $ gcc sample.c -o sample
とかやると思いますが、「make」コマンドを実行します。
         $ make
すると、

コンパイルされて実行ファイル「sample」ができました!
sample.cの内容を更新した場合でもいちいち「gcc sample.c -o sample」と入力せずに、
「make」とコマンド入力だけでコンパイルできるのです!
そして「sample.c」が変更されてない場合は、自動で判断してくれます!




Makefileの解説

使い方がなんとなくわかったところで、さっき書いたMakefileの解説をしたいと思います。
 まず、Makefileの基本文法はこんな感じになっています。
ターゲット: 依存ファイル1 依存ファイル2 依存ファイル3
              コマンド1
              コマンド2
              コマンド3
一つ一つおって説明していきます。

ターゲット

最初に「ターゲット」。さっきの使ってみた例だと「sample」がターゲット名ですね。
これは「make ***」の「***」の部分に活用します。
makeの際に「***」を省略、つまりターゲット名を省略すると、 Makefileに記述されている先頭のターゲットが実行されます。
よって、さっきは「make」だけで「make sample」と同じことが実行されていたわけです。

依存ファイル

次は「依存ファイル」。例だと「sample.c」が依存ファイル名ですね。
依存ファイルはスペース区切りで複数指定することができます。
この依存ファイルのうち、1つでも変更された場合にmakeコマンドが実行されると、コマンド行の内容が実行されます。

コマンド

最後に「コマンド」。例だと「gcc sample.c -o sample」がコマンド行ですね。
これはmakeが実行された際に実行するコマンドを指定します。複数行指定できます。
コマンド行の先頭は必ずタブ文字を入れなければなりません。タブ文字でないとmakeしたときに
エラーがでます。

「ターゲット」、「依存ファイル」、「コマンド」を記述したMakefileを元に、makeコマンドによるコンパイルができるわけです。



その1まとめ

今回使った例のプログラムの場合、コンパイルの際にコマンドを直接入力してもさほど変わりないと思います。
しかし、コンパイルオプションを指定したり、ソースコードが複数のファイルに依存しているプログラムのコンパイルでは、 コマンドが長くなってしまい入力が面倒なので、Makefileを活用したコンパイルの利点が大きくなってくると思います。
また、Makefileによるコンパイルを活用すれば、ソースコードの内容を全く知らない人でも簡単にコンパイルすることができます。
そして、コンパイルにも時間がかかってしまう大規模プログラムの場合、更新されたファイルに依存するものだけをコンパイルしてくれるので、時間の短縮にもなります。

いいことが沢山ですね。

次回その2では、Makefileの依存関係と自動変数など、もう少し詳しい部分について書きます。
お楽しみに~。


0 件のコメント:

コメントを投稿