Nanashi-soft○プログラマ専用○Windows gcc SDL○
makeを実行すると、更新されたファイルだけコンパイルし直す事ができます
ソースファイルが膨大になった際に威力を発揮します
Makefileを記述する前の大前提として、1ディレクトリ(フォルダ)1ソフトです
UNIXコマンドを知らなくても、エクスプローラからフォルダを作成すれば直ちに反映されます
cdコマンドで、作成したフォルダに移動して下さい
例)testディレクトリを作る
$ mkdir test
例)testディレクトリに移動する
$ cd test
例)1つ上のディレクトリに移動する(元のディレクトリに戻る)
$ cd ..
・Makefileというファイル名にする
・先頭に#を付けるとコメントになる
・1行1意味が徹底されており、改行の際には最後に\を記述して、必ず先頭にTABを付けなければならない
・変数名=内容、で変数を宣言して、$(変数名)で使用する
・改行コードはLFのみ
よく使うgcc+SDLのビルドコマンド
gcc -msse2 -O2 -o test testsrc1.c testsrc2.c `sdl-config --cflags --libs`
をMakefileに記述してみます
このコマンドは、コンパイルとリンクを一気に行っています
これをコンパイルとリンクを順に行うように書き換えます
コンパイルコマンド
gcc -msse2 -O2 testsrc1.c `sdl-config --libs` gcc -msse2 -O2 testsrc2.c `sdl-config --libs`
リンクコマンド
gcc -o test testsrc1.o testsrc2.o `sdl-config --libs`
こうする事で、更新されたソースだけを再コンパイルして、リンクすれば良い状態になります
変数名は、原則として大英文字で、勝手に付けてよいです
=の後ろに値をそのまま書きます
数値や文字といった違いは無く、全部文字列ですので、かっこでくくるといった必要もありません
変数名 = 代入する値
と書くだけです
まずは、コマンドを変数に定義します
CC = gcc
PS3 Linuxを触っている人は良く分かると思いますが、コンパイラコマンドは環境によって異なりますので、変数にする意味があります
次に、コンパイルオプションとリンクオプションをそれぞれ変数定義します
CFLAGS = -msse2 -O2 `sdl-config --cflags` LIBS = `sdl-config --libs`
SSE2オプションは更に別変数にしても良いですね
出力プログラム名を変数定義
TARGET = test
中間ファイルであるオブジェクトファイル名を変数定義
OBJS = testsrc1.o testsrc2.o
ファイル名の間は半角スペースで区切るルールです
OBJS = testsrc1.o \ testsrc2.o
改行を行いたい時は、半角スペース¥を行末に記述して、次の行の先頭は必ず TABというルールです
上で書いた通り、1行1意味が原則のスクリプトですので、このような制約があります
コンパイル記述は、.c.o:、そして次の行にコマンドです
改行後の先頭はTABで始まります
この .c.oと言うのは、内部定義されているもので、C言語ファイルをコンパイルする時の定数だと思って下さい。故に『C言語ソースのファイル名は必ず○○.cでなければなりません』
最後の「$<」は、ディレクトリ内にある該当拡張子のファイル全てを意味します
変数を元に戻して書いてみると、コンパイルコマンドになります
リンク記述は、実行ファイル名:オブジェクトファイル名郡、次の行にリンクコマンドです
$(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) $(LIBS)
しつこいようですが、改行後の先頭はTABで始まります
これも変数を元に戻して書いてみると、リンクコマンドになります
コンパイルする為に必要なファイルを記述します
testsrc1.o: testsrc1.h testsrc2.o: testsrc2.h
このように記述しておくことで、ヘッダーを更新した際に、それを使用しているソースが再コンパイルされます
makeコマンド実行時にオプションを付けた時の動作を定義できます
例えば、全ソースをコンパイルし直す cleanオプションを定義してみます
clean: rm -f *.o
これで make cleanとコマンドを発行すると、オブジェクトファイルが全て消去されます
ソースと同一ディレクトリに Makefileを入れて、makeコマンドを実行するとビルドできます
その際にソースファイルが更新されていないものはコンパイルせずにリンクだけ行われます
全体をコンパイルし直したい場合は、定義したオプションを使用して make cleanコマンドを実行してから、makeコマンドを実行する事で可能です
CC = gcc CFLAGS = -msse2 -O2 `sdl-config --cflags` LIBS = `sdl-config --libs` TARGET = test OBJS = testsrc1.o testsrc2.o $(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) $(LIBS) clean: rm -f *.o .c.o: $(CC) $(CFLAGS) -c $< testsrc1.o: testsrc1.h testsrc2.o: testsrc2.h