自分用Makefileのメモ書き
基本構文
<target>: <files> <commands>
<target>: <commands>
実行
makeとやると、Makefileに定義された最初のターゲットが実行される。他のターゲットを実行するにはmake clean, make installなど臨機応変にターゲット名を入力。
特別なターゲット名
.PHONY
.PHONY test
とかよくみる。コマンド名とファイル名が重複するとき通常ファイルが優先されて実行されないが.PHONYを書いておくと実行ルーチンが作られるっぽい。
.PRECIOUS
このターゲットは処理が中断してもファイル等が削除されない。
他
ここが詳しい。 www.ecoop.net
特殊変数
詳しくはhttps://www.gnu.org/software/make/manual/make.html#Automatic-Variables
$@
targetを返す
$<
filesの最初の要素を返す
$^
filesのすべての要素を返す
まだまだあるので適宜上のを見ること
変数・関数
こんなん
cpp_files = $(shell $(FIND) src/ -name "*.cpp" -printf "%P\n") cxx_obj_files = $(subst .cpp,.o,$(cpp_files)) obj_build_root = $(build_root)/objs objs = $(addprefix $(obj_build_root)/cxx/,$(cxx_obj_files))
みたいにするだけ。substとかaddprefixとかは後述する特殊関数
特殊関数
多すぎ。ここが天才 qiita.com
自分で使うならともかく読む分には比較的読める
ワイルドカードとしての%
suffixの置換
SRC = main.cpp hello.cpp OBJ = $(SRC:%.cpp=%.o)
targetとかにも使えるっぽい
$(obj_build_root)/cxx/%.o: src/%.cpp $(CXX) $(CXXFLAGS) -MMD -c -o $@ $(filter %.cpp, $^)
など。
リンク
この記事よりもうちょい詳しめ www.jsk.t.u-tokyo.ac.jp
まとめ
Makefile系イキリオタク滅びろ