Makefile
Last updated
Last updated
http://minus9d.hatenablog.com/entry/20140203/1391436293
$@ : ターゲットファイル名
$% : ターゲットがアーカイブメンバだったときのターゲットメンバ名
$< : 最初の依存するファイルの名前
$? : ターゲットより新しいすべての依存するファイル名
$^ : すべての依存するファイルの名前
$+ : Makefileと同じ順番の依存するファイルの名前
$* : サフィックスを除いたターゲットの名前
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/
http://minus9d.hatenablog.com/entry/20140204/1391527870
$(patsubst %.cpp,%.o,$(wildcard .cpp)) $(patsubst %.c,%.o,$(wildcard .c))
http://yut.hatenablog.com/entry/20120702/1341185909
gccのリンカはldを呼んでいるだけなので、ldのオプションがLDFLAGSになる。
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html
ライブラリ
CFLAGS=-fstack-protector-all -O2 -fno-strict-aliasing -D_FORTIFY_SOURCE=2
LDFLAGS=-Wl,-z,now,-z,relro
実行ファイルは追加で
CFLAGS=-fPIE
LDFLAGS=-pie
http://exlight.net/devel/make/child_process.html
suffix ruleは古い書き方で、見た目にも分かりにくい(依存関係の順番がpattern ruleと逆になっている)。GNU makeを使う限りにおいては、suffix ruleではなくpattern ruleを使う方がよいらしい。
.PHONY: all
.PHONY: clean
は必ず書くこと。
targetがallやcleanでも誤動作しないようにするため
=は動作が直感的でないため:=を使用すること
http://d.hatena.ne.jp/wagavulin/20120405/1333629926
二重コロンでターゲットを定義すると重複を許容できる
http://uyota.asablo.jp/blog/2010/09/04/5329742
Makefileから別のMakefileを呼ぶ場合、カレントディレクトリから移動できない
次の変数を定義して使用すればよい。
http://stackoverflow.com/questions/18136918/how-to-get-current-directory-of-your-makefile
http://stackoverflow.com/questions/322936/common-gnu-makefile-directory-path
override CFLAGS +=
とする
http://stackoverflow.com/questions/2129391/append-to-gnu-make-variables-via-command-line
コマンドの先頭に-をつければよい。
http://nu-pan.hatenablog.com/entry/20121205/1354693969
にやり方が書いてある
gcc -MMDを使う方法と-include を使う方法
http://postd.cc/7-things-you-should-know-about-make/
これがなかなかいいサンプル
http://urin.github.io/posts/2013/simple-makefile-for-clang/
こっちもいい
http://postd.cc/makefile-c-projects/
記号
意味
=
右辺の内容を憶えておき実際に使う時に展開される。代入には「=」を使う
:=
代入行がMakefileから読みこまれるとすぐに右辺を評価する。
?=
値がセットされていないときのみ変数に値を代入
+=
変数の最後にテキストを追加する
シンボル
説明
default
CC
Cコンパイルコマンド
cc
CC
Cコンパイルコマンド
cc
CXX
C++コンパイルコマンド
g++
CFLAGS
Cコンパイルオプション
無し
CXXFLAGS
C++コンパイルオプション
無し
CPPFLAGS
C++プリプロセッサ用オプション
無し
LDFLAGS
ldというリンクを呼び出すコマンドのリンクオプション
無し
INCLUDES
includeするheaderのディレクトリを指定する
無し
LIBS
利用するライブラリを指定する
無し
TARGET
生成するターゲットファイル名
無し
SRCS
ターゲットファイルを生成するために利用するソースコード
無し
OBJS
ターゲットファイルを生成するために利用するオブジェクトファイル
無し
RM
ファイル削除コマンド
rm -f