Make入門
まず、makeについて。
例えばprogram.cppがカレントディレクトリに有った場合、makeは十分に賢いので次の様にコマンド実行すればMakefileが無くてもコンパイル・リンクして実行ファイルを吐いてくれます。
$ make program
g++ program.cpp -o program
$ ls
program program.c
でもこれだとオプションが指定できないしmake cleanもできません。
「Makefile作るの面倒だけどmakeとmake clean一発で済ませたい」という時のためにmake暗黙のルールを使って、柔軟かつ最低限の記述で済むMakefileを以下に。ライブラリもインクルードパスも不要ならBINARY変数書き換えるだけで一発。
BINARY := program
OBJECT := $(BINARY).o
SOURCE := $(BINARY).cpp
CXXFLAGS := -Wall
LDLIBS :=
.PHONY: clean
$(BYNARY): $(SOURCE)
clean:
$(RM) $(BYNARY) $(OBJCTS)
以下詳細
"make -p"を実行すると以下が表示されます。
CXX = g++
:
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
:
LINK.cpp = $(LINK.cc)
:
%: %.cpp
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
ここでサフィックスルールを軸に変数を展開していくと、
%: %.cpp
g++ $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@
となるので、先程のMakefileは最終的に以下の様に展開されます。
program: program.cpp
g++ $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) program.cpp $(LOADLIBES) $(LDLIBS) -o program
残りの変数についてはユーザーがMakefileで設定出来る様に定義だけされていて、以下の様な役割になってます。
- CXXFLAGS: C++のコンパイルオプションを指定する。-Wとか-Oとか-stdとか。
- CPPFLAGS: Cプリプロセッサのオプションを指定する。C言語で書いたプログラムにも適用されるため注意。
CXXFLAGSとCPPFLAGSの違い – かひわし4v1.memo - LDFLAGS: リンクオプション、-Lとか。
- TARGET_ARCH: マシン依存なオプションを指定する、-marchとか、クロスコンパイルかCPU最適化するなら必要。
- LDLIBS: リンクするライブラリを指定する、-lboost_regexとか。
- LOADLIBS: LDLIBSと一緒だが互換性のために残ってる。
Re: "LOADLIBES" versus "LDLIBS"?
これを活用すればわざわざ各ルールにレシピを書かなくてもmakeがよしなにやってくれます。
$ make
g++ -Wall text.cpp -o text
全部のルールにレシピを書くとMakefileが膨れ上がるので共通のレシピで済む場合は暗黙のルールを活用しましょう。
またLDLIBS等の暗黙のルールを避けて独自変数を設定するとレシピがこんがらがるのでなるべく避けましょう。
よく見るのはCPPFLAGSをC++のコンパイルオプションと勘違いしてC言語にまで波及させるパターンです。気をつけて。
困ったらmake -pを実行して暗黙のルールを確認しましょう。makeは多くのルールを予め定義してくれています。