ソースファイルから目的のファイルを生成する為のコマンド。
makefileというファイル名のファイルの中に ソースファイル名や目的のファイル名・その生成方法を記述しておく。
UNIXのインストールによく使われるが、UNIXに限定されているわけでもない。X68000でも使ってたし。さすがにMSXでは無さそうだけどぉ。
|
|
$ make
これにより、カレントディレクトリに置いてあるmakefileの内容に従ってコンパイル等が行われ、目的のファイルが生成される。
→makeのオプション [2006-05-29]
目的のファイル: ソースファイル群 生成方法
1行目 | 目的のファイル | : | ソースファイル群 |
---|---|---|---|
次の行 | タブ | 生成方法 |
「目的のファイル」と「ソースファイル群」のファイルの日付を比べて、「ソースファイル」の方が新しければ、「生成方法」に書かれた内容が実行される。
某antでは「makefileの文法を覚えるのが面倒」なんて言ってるけど、こっちの方がよほどすっきりしているような気がするけどなー。
a.out: test.c gcc -O test.c -o a.out
これにより、test.cがa.outより新しいか、もしくはa.outが存在しない場合に「gcc -O test.c -o a.out
」が実行されてa.outが出来る。
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は以下のように動作する。
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も条件に加えたい場合は、この様にその分だけ記述する
某antで独自コマンドを実行するのは大変そうだよね。もっとも、独自コマンドはそれこそ環境依存になっちゃうけど。