S-JIS[2003-10-12/2012-11-18] 変更履歴

make

ソースファイルから目的のファイルを生成する為のコマンド。
makefileというファイル名のファイルの中に ソースファイル名や目的のファイル名・その生成方法を記述しておく。

UNIXのインストールによく使われるが、UNIXに限定されているわけでもない。X68000でも使ってたし。さすがにMSXでは無さそうだけどぉ。


makeの実行方法

$ make

これにより、カレントディレクトリに置いてあるmakefileの内容に従ってコンパイル等が行われ、目的のファイルが生成される。

makeのオプション [2006-05-29]


makefileの基本的な文法

目的のファイル: ソースファイル群
	生成方法
基本的な文法
1行目 目的のファイル ソースファイル群
次の行 タブ 生成方法

「目的のファイル」と「ソースファイル群」のファイルの日付を比べて、「ソースファイル」の方が新しければ、「生成方法」に書かれた内容が実行される。

某antでは「makefileの文法を覚えるのが面倒」なんて言ってるけど、こっちの方がよほどすっきりしているような気がするけどなー。


1つのファイルから1つのファイルを生成する例

makefile:
a.out: test.c
        gcc -O test.c -o a.out

これにより、test.ca.outより新しいか、もしくはa.outが存在しない場合に「gcc -O test.c -o a.out」が実行されてa.outが出来る。


2つのファイルから1つのファイルを生成する例

makefile:

all: a.out			←最終的に生成したいファイル

a.out: main.o sub.o		←a.outを作るのに直接必要なファイル
	gcc main.o sub.o -o a.out

#object				←「#」から始まる行は、コメント
main.o: main.c
        gcc -O -c main.c -o main.o
sub.o: sub.c
        gcc -O -c sub.c -o sub.o

main.c・sub.cという2つのファイルから、a.outを生成する。

all:」は、最終的に作りたいファイルを示すのに使う。allの行は省略可能だが、付けておいた方が分かりやすいと思う。

a.outのソースとしてmain.o・sub.oの2ファイルが指定されている(スペース区切りで並べる)。
そして、main.oの作り方sub.oの作り方が別の行に書かれている。

この場合、makeは以下のように動作する。

  1. allがあるからそこを見ると、a.outと書いてある。 a.outを作るんだな。
  2. a.outを作るには、main.oとsub.oが必要なんだな。
    1. main.oを作るにはmain.cが必要。(main.oとmain.cの日付を比べて、main.cの方が新しければコンパイルを実行する)
    2. sub.oを作るにはsub.cが必要。(sub.oとsub.cの日付を比べて、sub.cの方が新しければコンパイルを実行する)
  3. a.outとmain.o・sub.oの日付を比べて、main.oかsub.oの日付がa.outより新しければコンパイル(リンク)を実行してa.outが出来る。

複数ファイルの指定を変数にまとめる例

makefile:

OFILES = main.o sub.o

all: a.out

a.out: $(OFILES)
        gcc $(OFILES) -o a.out

main.o: main.c
        gcc -O -c main.c -o main.o
sub.o: sub.c
        gcc -O -c sub.c -o sub.o

2つのファイルから1つのファイルを生成する例を書き直したもの。

何箇所かで使用するファイル群は、変数に入れておいて それを使うことが出来る。

変数のルール 備考
変数名は1文字以上。 大文字小文字は区別される。[2012-11-18]
変数への代入は「=」を使う。 変数名 =
使うときは「$(変数名)」とする。 変数が1文字だけの時は「$A」の様に丸括弧を省くことも可能。
あるいは「${変数名}」の様に波括弧で書くことも出来る。[2012-11-18]
末尾に「\」を置くと、次の行へ続けられる。 例:
OFILES = main.o\
         sub.o

変数の加工

参考: ecoop.netの変数の利用方法 [2012-11-18]


生成方法をまとめる例

makefile:

OFILES = main.o sub.o

all: a.out

a.out: $(OFILES)
        gcc $(OFILES) -o a.out

main.o: main.c		←生成に使用するファイルは指定するが、生成方法は書かない
sub.o: sub.c

%.o: %.c
        gcc -O -c $< -o $@

複数ファイルの指定を変数にまとめる例を書き直したもの。

同じ拡張子なら同じコマンドで生成できる場合がほとんどなので、その部分だけ分離できる。

記号 説明
% 「:」の両側でファイル名の一致する部分になる。
$< 上の行の「:」の右側のファイル名を表す、特殊な変数。
$@ 上の行の「:」の左側のファイル名を表す、特殊な変数。

動的マクロ [2006-05-29]


特殊な変数

特殊な変数を使って、生成方法を省略することが出来る。

変数 説明
CC Cコンパイラのコマンド名。
CFLAGS Cコンパイラに与えるオプション。

makefile:

CC = gcc
CFLAGS = -O -c

OFILES = main.o sub.o

all: a.out

a.out: $(OFILES)
        gcc $(OFILES) -o a.out

main.o: main.c
sub.o: sub.c

デフォルトのコンパイル方法 [2006-05-29]


独自コマンドを実行する方法

カレントディレクトリにあるコマンドを実行したい場合、「./hoge」という形で生成方法を書いておけば実行できる。

makefile:

all: a.out

L = main.o sub.o hogeout.o

a.out: $L
	gcc $L -o a.out

hogeout.c: hoge
        ./hoge $@               ←「hoge hogeout.c」で「hogeout.c」が生成されるものとする
hoge: hoge.c                    ←「hoge」の生成もこのmakefileで指定しちゃう
        gcc -O $< -o $@

%.o: %.c                        ←実は「sub.o: sub.c」等とわざわざ書かなくても、「%.o: %.c」に該当しさえすればよい
        gcc -O -c $<

main.o: main.c var.h            ←「%.o: %.c」に該当しているがvar.hも条件に加えたい場合は、この様にその分だけ記述する
  1. hoge.cとhogeを比較し、hoge.cの方が新しければhogeを作り直す。
  2. hogeとhogeout.cを比較し、hogeの方が新しければhogeout.cを作り直す。
  3. hogeout.oとhogeout.cを比較し、hogeout.cの方が新しければhogeout.oを作り直す。
  4. a.outとhogeout.oを比較し、hogeout.oの方が新しければa.outを作り直す。

某antで独自コマンドを実行するのは大変そうだよね。もっとも、独自コマンドはそれこそ環境依存になっちゃうけど。


中級向けmakeへ行く / UNIXコマンドへ戻る / 技術メモへ戻る
メールの送信先:ひしだま