| ホーム >> | プログラミング >> | make |
makeコマンドはシステムによって微妙に使い方が違うことがあります。 ここではGNU make 3.81を用いた場合の使い方を説明します。
makefileのサンプルを示します。
# makefileのサンプル
program : main.o hoge.o fuga.o
cc -o program main.o hoge.o fuga.o -lm
main.o : main.c
cc -c main.c
hoge.o : hoge.c hoge.h
cc -c hoge.c
fuga.o : fuga.c \
fuga.h # 長い行はバックスラッシュ(または円マーク)で分割できる
cc -c fuga.c
program部分はターゲット,コロンで区切った右側はコンポーネントと呼ばれます。そして,この行を依存関係行といいます。 2行目はコマンド行で,先頭には必ずTABによる字下げが必要です。同様に3行目以降もターゲット,コンポーネント,コマンド行が並びます。
ターゲットを作るための材料がコンポーネントで,ターゲットの作成方法がコマンド行に書かれているということになります。
makeはコンポーネントのリストを見て,それらの作成方法があるかどうか探します。上記例の場合,main.oの作成方法について3-4行目に書かれています。main.oのコンポーネントであるmain.cの作成方法はありません。
次に,ターゲットとコンポーネントの作成時刻を比較します。ターゲットの方が新しければ,コマンド行は実行しません。コンポーネントの方が新しければ,コマンド行を実行してターゲットを作成し直します。これらの作業を繰り返して,必要なコンパイルだけを行い最新のターゲットを作成します。
makeはデフォルトでは makefile または Makefile を読み込みます。それ以外のファイルを指定したい時には、オプション -f を用います。
$ make -f filename
オプション -n を付けると実行するコマンドを表示するだけで実際には実行しないので、コンパイルの確認ができます。
$ make -n
ソースファイルの依存性を調べるには、オプション-Mを用います。
$ cc -M main.c#include" " で読まれているヘッダファイルを自動的に調べてくれます。
変数には大文字を使うことが多いようです。大文字小文字は区別されます。
LM = program SOURCES = main.c hoge.c fuga.c変数を参照する時には$マークと小括弧または中括弧を用います。
ABC = hoge
DEF = hoge
GGG = $(ABC)
EEE = ${DEF}
FFF = ${GGG}.txt
${CC}はmakefileの中で定義しなくても,あらかじめCコンパイラとして定義されています。明示的に置き換えることもできます。
makeを実行する時に変数を定義することが出来ます。空白を含むときにはダブルクオーテーションで囲みます。
$ make program ABC=test $ make program "SOURCES=main.c hoge.c fuga.c"シェルの環境変数が定義されていれば,それを変数として利用することができます。
$ ABC=test; export ABC $ make program
SOURCES = main.c hoge.c fuga.cファイル名の.c部分を.oに置換したものをOBJECTSに入れるには次のように書きます。
OBJECTS = ${SOURCES:.c=.o}
下記の変数には自動的に値が入ります。
| マクロ | 意味 |
|---|---|
| $@ | 現在処理中のターゲット |
| $> | コンポーネントリストのうち最初のもの |
| $? | コンポーネントリストのうちターゲットより新しいもの。サフィックスルールでは使えない |
| $< | $?と同じ意味だが,サフィックスルールでしか使えない |
| $* | コンポーネントのサフィックスを除いたファイル名。サフィックスルールでしか使えない |
| $^ | コンポーネントリストすべて。ただし重複しているものは1つだけにする。 |
| $+ | コンポーネントリストすべて。重複しているものもそのまますべて。 |
例えば、PCとスパコンの両方でコンパイルする場合にはコンパイル環境によって変数 CC の値を変えたことがあります。この場合には再帰makeを使います。makefileに、
CC=cc
OPT=-Wall
sc:
${MAKE} "CC=sxc++" "OPT=-Xa"
...
のように書いておき、スパコン用にコンパイルする時には、
$ make sc
とします。
例えばソースコードmain.cのなかで
#ifdef DEBUG debugfunc(); #endifと書いてあるとします。この DEBUG をmake時に定義、未定義を決めたいとします。この場合,あらかじめ CFLAGS をコンパイルオプションとして含めておきます。つまり、
main.o : main.c
${CC} ${OPT} ${CFLAGS} -c $(@:.o=.c)
とします。そして、make時に
$ make "CFLAGS=-DDEBUG"とすることで DEBUGを定義することができます。mekeのターゲットによって切り替えたいなら、再帰makeを使い
debug:
${MAKE} "CFLAGS=-DDEBUG"
とします。
makefileでは,自動的に設定されている変数や,あらかじめ決められているサフィックスルールなどが数多くあり,入力を省略するのに利用できます。 これらの設定を確認するには,オプション-pを使います。
$ make -p