makeを使ってビルドを楽に♪

UNIXにプログラムを追加するときに、ソースコードからコンパイルすることが多々あります。
今回は、ソースコードからインストールするときに用いるmakeコマンドについて勉強しました。

まず、hello, worldを普通にコンパイルしてみます。
-cオプションを付けてオブジェクトファイルを一度生成しているところに注意します。

$ ls
hello.c
$ cat hello.c
#include
int main(void)
{
printf("Hello, world!!\n");
return 0;
}

$ gcc -c hello.c
$ ls
hello.c hello.o
$ gcc -o hello hello.o
$ ls
hello hello.c hello.o
$ ./hello
Hello, world!!





次に上の手続きを一つのファイル(Makefile)に記述して、makeコマンドにより同様の処理を行ってみます。
$ ls
Makefile hello.c
$ cat Makefile
#Makefile

#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -c hello.c

$ make
gcc -c hello.c
gcc -o hello hello.o
$ ls
Makefile hello hello.c hello.o
$ ./hello
Hello, world!!




次に、make実行中にコメントを表示させてみます。
一般的なプログラムをコンパイルしているときにもコメントが出ますよね。
$ cat Makefile
#Makefile

#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
hello : hello.o
@echo "*** Making hello ****"
gcc -o hello hello.o
hello.o : hello.c
@echo "*** Making hello.o ****"
gcc -c hello.c

$ make
*** Making hello.o ****
gcc -c hello.c
*** Making hello ****
gcc -o hello hello.o
$ ls
Makefile hello hello.c hello.o
$ ./hello
Hello, world!!






次に、メイクファイルにマクロを定義してみます。
マクロを定義することで、処理系の異なる環境でも、makeファイルの変更点を最小限に止めることができます。

$ cat Makefile
#Makefile

#マクロを定義します
TARGET = hello
OBJECT = hello.o
SRC = hello.c
CC = gcc
CFLAGS = -g -Wall

#コマンド行
#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
$(TARGET) : $(OBJECT)
@echo "*** Making $(TARGET) ****" #make実行中にコメントを表示
$(CC) -o $(TARGET) $(OBJECT)
$(OBJECT) : $(SRC)
@echo "*** Making $(OBJECT) ****" #make実行中にコメントを表示
$(CC) -c $(SRC)
$ make
*** Making hello.o ****
gcc -c hello.c
*** Making hello ****
gcc -o hello hello.o
$ ls
Makefile hello hello.c hello.o
$ ./hello
Hello, world!!




最後に、作成したオブジェクトファイルや実行ファイルを清掃(削除)するためのルールを追記します。
cleanとclobberです。
cleanは、オブジェクトファイルの削除。
clobberは、cleanの手続きに加えて、指定したファイルの削除を行います。ここでは、実行ファイル(hello)削除しています。
$ cat Makefile
#Makefile

#マクロを定義します
TARGET = hello
OBJECT = hello.o
SRC = hello.c
CC = gcc
CFLAGS = -g -Wall

#コマンド行
#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
$(TARGET) : $(OBJECT)
@echo "*** Making $(TARGET) ****" #make実行中にコメントを表示
$(CC) -o $(TARGET) $(OBJECT)
$(OBJECT) : $(SRC)
@echo "*** Making $(OBJECT) ****" #make実行中にコメントを表示
$(CC) -c $(SRC)
clean:
@echo "*** Deleting $(OBJECT) ***"
rm -f $(OBJECT)
clobber: clean
@echo "*** Clobbering all produced files : $(OBJECT),$(TARGET)"
-rm -f $(TARGET)

$ ls
Makefile hello.c
$ make
*** Making hello.o ****
gcc -c hello.c
*** Making hello ****
gcc -o hello hello.o
$ ls
Makefile hello hello.c hello.o
$ ./hello
Hello, world!!
$ make clean
*** Deleting hello.o ***
rm -f hello.o
$ ls
Makefile hello hello.c
$ make
*** Making hello.o ****
gcc -c hello.c
*** Making hello ****
gcc -o hello hello.o
$ ls
Makefile hello hello.c hello.o
$ make clobber
*** Deleting hello.o ***
rm -f hello.o
*** Clobbering all produced files : hello.o,hello
rm -f hello
$ ls
Makefile hello.c




今回のMakefileには、Linuxコマンドはgccとrmしか登場してきていません。
しかし、Makefileには好きなコマンドを書けば、勝手に実行してくれます。
makeの最後にRを実行するMakefileを作成して実行してみます。



$ cat Makefile
#Makefile

#以下の二行の繰り返し
#1.ターゲット: 依存するファイルの形式で記述する
#2.(Tabの後) コマンド
#一番最後にRの実行をしているところに注意してください。
hello : hello.o
gcc -o hello hello.o
hello.o : hello.c
gcc -c hello.c
R

$ make
gcc -c hello.c
R

R version 2.11.1 (2010-05-31)
Copyright (C) 2010 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

Rは、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()'あるいは'licence()'と入力してください。

Rは多くの貢献者による共同プロジェクトです。
詳しくは'contributors()'と入力してください。
また、RやRのパッケージを出版物で引用する際の形式については
'citation()'と入力してください。

'demo()'と入力すればデモをみることができます。
'help()'とすればオンラインヘルプが出ます。
'help.start()'でHTMLブラウザによるヘルプがみられます。
'q()'と入力すればRを終了します。

> q()
Save workspace image? [y/n/c]: n
gcc -o hello hello.c
$ ls
Makefile hello hello.c hello.o


オブジェクトファイルが作られてから、Rが実行され、Rを抜けてから、実行ファイルが生成されていることがわかります。