Makefile の補足

make は実行プログラムの作り方を知っている

make コマンドは, 実は C や C++ のソースプログラムから実行プログラムを作製する方法を最初から知っています. このため, 一つのソースプログラムから一つの実行プログラムを作成するような場合は, Makefile において手続き(コマンド)の記述を省略することができます.

CFLAGS = -I/usr/X11R6/include
LIBS = -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread
all: prog1 prog2
prog1: prog1.c
--Tab-->$(CC) $(CFLAGS) prog1.c -o prog1 $(LIBS)
prog2: prog2.c
--Tab-->$(CC) $(CFLAGS) prog2.c -o prog2 $(LIBS)

すなわち, 上のような Makefile は下のように書くこともできます.

IRIX オリジナルの make を使う場合

CFLAGS = -I/usr/X11R6/include
LDFLAGS = -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread
all: prog1 prog2
prog1: prog1.c
prog2: prog2.c

GNU make (gmake) を使う場合

CFLAGS = -I/usr/X11R6/include
LDLIBS = -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread
all: prog1 prog2
prog1: prog1.c
prog2: prog2.c

make は簡単な依存関係なら知っている

さらに, 実行プログラムのファイル名がソースプログラムのファイル名から拡張子 (.c) を取り除いたものであれば(prog1.c から prog1 を生成する場合など), それらの依存関係も省略することができます.

IRIX オリジナルの make を使う場合

CFLAGS = -I/usr/X11R6/include
LDFLAGS = -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread
all: prog1 prog2

GNU make (gmake) を使う場合

CFLAGS = -I/usr/X11R6/include
LDLIBS = -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread
all: prog1 prog2

マクロは環境変数でも指定できる

また, 上の CFLAGSLDFLAGS あるいは LDLIBS のような「マクロ」は, 環境変数で与えることもできます.

IRIX オリジナルの make を使う場合

% setenv CFLAGS -I/usr/X11R6/include
% setenv LDFLAGS '-lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread'

あるいは,

GNU make (gmake) を使う場合

% setenv CFLAGS -I/usr/X11R6/include
% setenv LDLIBS '-L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthrad'

というコマンドをシェル(この場合は csh/tcsh)であらかじめ実行しておけば (もちろん, これは .cshrc に入れておくことができます), Makefile は次のような依存関係だけになります.

all: prog1 prog2

もし, 生成する実行プログラムを make コマンドの引数に指定するなら, 上の Makefile すら不要です.

% make prog1 prog2

カレントディレクトリに prog1.c と prog2.c というソースプログラムがあれば, Makefile を作成しなくても, 上のコマンド一発で prog1 と prog2 が作成されます.

Makefile を使った演習