或阿呆のブログ

巷では、武器商人@ダーツで通っています。Python好き好きプログラマーです。芥川龍之介、太宰治が好きです。

Hello,World!よりも重要なこと〜2 Makefile

お勉強しているうちは、コンパイラを直に叩いてもいいんだろうけど、どうせmake使うんでしょ?!といつも思っている。

だったら、最初からMakefile使ってコンパイルするべきだと思う。

google:Makefile
細かなルールとかチュートリアルはぐぐってみると詳しいサイトがたくさんある。

Makefileって掴みにくいところがあるから、コマンド叩きながらやってみるのが一番。

Makefile無いところでmakeコマンド打ってみる。

$ls
$make
make: *** No targets specified and no makefile found.  Stop.

ターゲットもmakefileも無いよと言われている。ここではmakefileって小文字なんだね・・・。

空のMakefile作ってmakeコマンド打ってみる。

$ls
Makefile
$cat Makefile 
$make
make: *** No targets.  Stop.

ターゲットがないぞと言われている。でも、makefileはあるから、makefileは無いぞと言われない。

簡単なターゲットと、ファイルを記載したMakefileを作ってmakeコマンド打ってみる。

$ls
Makefile  main.c
$cat Makefile 
main.o:main.c
$cat main.c 
#include <stdio.h>
int main(void)
{
	printf("Hello,World!\n");
	return 0;
}
$make
cc    -c -o main.o main.c
$ls
Makefile  main.c  main.o
$file main.o
main.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Makefileには、

main.o:main.c

これしか書いていない・・・。
main.cはお決まりのHello,World!そのもの。
makeコマンドを打つと、

cc -c -o main.o main.c

って出てきた。main.cをコンパイルして、main.oを作るっていうコマンドを打ったのと同義。
main.oは実行形式のファイルではない。ccコマンドってそういう仕様っぽい。

ただ、コンパイラを指定したり、コマンドを明示的に指定したいよねという話。

簡単なターゲットと、ファイル、コマンドを記載したMakefileを作ってmakeコマンド打ってみる。

こうやってしまわないように注意
$cat Makefile 
main.o:main.c
gcc -o main.o main.c
$make
Makefile:2: *** missing separator.  Stop.

コマンドの前にはタブを入れないとセパレータエラーとなる。
出来れば、タブを可視化してエラーを見やすくするようにエディタの設定をしたほうがいい。

LinuxMint14のデフォルトのvimだとシンタックスハイライトがあって便利。こういうところで作業能率が上がる。


違いは、一目瞭然でしょう?!

正しくは、

$cat Makefile 
main.o:main.c
	gcc -o main.o main.c
$make
gcc -o main.o main.c
$file main.o
main.o: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xdd7551ed9d13824e68f26f9c75222efb975a4d5c, not stripped

コマンドを指定したことにより、

gcc -o main.o main.c

指定したコマンドが打たれている。

main.oのfileも実行形式のファイルになっている。

動作確認
$./main.o 
Hello,World!

まとめ

以上、Hello,World!よりも重要なこと〜2 Makefileでした。

makeは非常に重要なツールであるに関わらず、書籍が充実していないのが痛い。

GNU Make 第3版

GNU Make 第3版

まともなのはこの書籍くらいかな?手元に置いても損は無いと思う。