自分用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系イキリオタク滅びろ