make入門 #1 makeとは

概要

Linuxにはmakeというコマンドがあります。もともとはC言語などで作られたプログラムをコンパイルやリンクするために開発されました。そして、今もその用途が中心です。 大規模なプログラムでは、ソースコードファイルが数千や数万以上になります。いくつかのソースコードファイルを変更するたびに、全てをコンパイルしなおすと膨大な時間がかかります。そのため、makeは、変更があったソースコードのみを抽出してコンパイルする手段を提供します。

では、どうやって変更があったソースコードを検出しているのでしょうか?実は、その仕組みはとても単純です。ソースコードのタイムスタンプ(変更日時)とそれをコンパイルして生成されるバイナリファイルのタイムスタンプを比較するだけです。このため、何かのファイルから別のファイルを生成するような用途には、プログラムに限らずに利用できます。例えば、数値データのCSVファイルからグラフファイルを作成するような場合です。

Makefileの書式

makeを使用するには、makeに以下の3つの情報を与える必要があります。
  • 入力ファイル (Input File)
  • 出力ファイル (Output File)
  • 処理方法 (Command)
これを図示すると次のようなイメージです。
この情報を記載したファイルをMakefileといいます。ファイル名はMakefile以外を使用することもできますが、makeコマンドはカレントディレクトリにMakefileがあると、明示的に指定しなくともそれを使用します。 Makefileの書式は次のとおりです。 赤字で[TAB]と記載してしているように、処理方法の前はスペースでなくタブ1つでなければなりません。
出力ファイル: 入力ファイル
[TAB]処理方法
また、出力ファイルと入力ファイルは、より抽象的に、それぞれ、ターゲットと依存ファイルと呼ばれることもあります。

C言語のプログラムをコンパイルする例

以下のソースコードprog.cをコンパイルして、実行ファイルprogを作成してみます。
#include <stdio.h>

int main() {
    printf("Happiness depends upon ourselves.\n");
    return 0;
}
コマンドラインからビルドするには以下のように入力します。
gcc -o prog prog.c
つまり、先に述べた3つの情報は次のようになります。
  • 入力ファイル: prog.c
  • 出力ファイル: prog
  • 処理方法: 上記のgccのコマンドライン
つまりMakfileとしては次のようになります。再度の注意ですが、2行目gccの前はTABが1つです。
prog: prog.c
        gcc -o prog prog.c
Makefileがあるディレクトリでmakeと入力すると以下のようにコンパイルが実行され、progが作成されていることが分かります。 また、makeの副次的な利点として、gccのコマンドラインオプションすべてを入力しなくても良い点があります。
$ make
gcc -o prog prog.c
$ ls -l
total 28
-rw-r--r-- 1 foo foo    33 Mar 21 09:01 Makefile
-rwxr-xr-x 1 foo foo 16608 Mar 21 10:44 prog
-rw-r--r-- 1 foo foo   100 Mar 21 09:01 prog.c

入力ファイルと出力ファイルのタイムスタンプによるmakeの振る舞い

一度コンパイルした状態で、再度makeを実行しても、make: 'prog' is up to date(progは最新です)と表示され、コンパイルは行われません。
$ make
make: 'prog' is up to date.
冒頭で説明したように、出力ファイルのタイムスタンプが、入力ファイルのタイムスタンプより新しいため、makeは何も処理を実行しなかったのです。ここで、以下のようにtouchコマンドを実行して、入力ファイルのタイムスタンプを更新します。
$ touch prog.c 
$ ls -l
total 28
-rw-r--r-- 1 kyamato kyamato    33 Mar 21 09:01 Makefile
-rwxr-xr-x 1 kyamato kyamato 16608 Mar 21 10:44 prog
-rw-r--r-- 1 kyamato kyamato   100 Mar 21 11:01 prog.c
この状態でmakeを実行すると、コンパイルが行われます。
$ make
gcc -o prog prog.c

まとめ

本記事では、make概要とMakefileの基本的な記述方法について説明しました。次回は、Makefileに複数のルールを記載する方法を説明します。

以下には、make入門の全記事がリストアップされています。

0 件のコメント: