Makefile

書き方

http://minus9d.hatenablog.com/entry/20140203/1391436293

特殊変数の取り扱い

$@ : ターゲットファイル名

$% : ターゲットがアーカイブメンバだったときのターゲットメンバ名

$< : 最初の依存するファイルの名前

$? : ターゲットより新しいすべての依存するファイル名

$^ : すべての依存するファイルの名前

$+ : Makefileと同じ順番の依存するファイルの名前

$* : サフィックスを除いたターゲットの名前

http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/

イコールの違い

記号

意味

=

右辺の内容を憶えておき実際に使う時に展開される。代入には「=」を使う

:=

代入行がMakefileから読みこまれるとすぐに右辺を評価する。

?=

値がセットされていないときのみ変数に値を代入

+=

変数の最後にテキストを追加する

http://minus9d.hatenablog.com/entry/20140204/1391527870

すべてのC,C++をコンパイル

$(patsubst %.cpp,%.o,$(wildcard .cpp)) $(patsubst %.c,%.o,$(wildcard .c))

使い方

LIBSやCFLAGSなどのシンボル

シンボル

説明

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

http://yut.hatenablog.com/entry/20120702/1341185909

CFLAGS,LDFLAGSのオプションがどれか調べる

gccのリンカはldを呼んでいるだけなので、ldのオプションがLDFLAGSになる。

http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html

セキュアなCFLAGS,LDFLAGS

ライブラリ

CFLAGS=-fstack-protector-all -O2 -fno-strict-aliasing -D_FORTIFY_SOURCE=2

LDFLAGS=-Wl,-z,now,-z,relro

実行ファイルは追加で

CFLAGS=-fPIE

LDFLAGS=-pie

多段Make

http://exlight.net/devel/make/child_process.html

べからず集

suffix ruleについて

suffix ruleは古い書き方で、見た目にも分かりにくい(依存関係の順番がpattern ruleと逆になっている)。GNU makeを使う限りにおいては、suffix ruleではなくpattern ruleを使う方がよいらしい。

PHONY

.PHONY: all

.PHONY: clean

は必ず書くこと。

targetがallやcleanでも誤動作しないようにするため

イコールの使い方

=は動作が直感的でないため:=を使用すること

ヘッダファイルの依存関係を解決すること

http://d.hatena.ne.jp/wagavulin/20120405/1333629926

FAQ

make で同じターゲット名を定義

二重コロンでターゲットを定義すると重複を許容できる

http://uyota.asablo.jp/blog/2010/09/04/5329742

includeするときの ディレクトリの場所が移動できない

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/

Last updated