理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> make

GNU makeの利用法

更新日:2010.5.13

makeコマンドはシステムによって微妙に使い方が違うことがあります。 ここではGNU make 3.81を用いた場合の使い方を説明します。

makefikeのサンプル

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

とします。

#ifdef命令による条件付きコンパイル

例えばソースコード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

参考文献