Makfile基本的書き方まとめ
Makfile基本的書き方まとめ
数年ぶりにMakefileを書くことになったので以前にあったメモのまとめ.
自動変数
変数名 役割 $@ ターゲット名 $% ターゲットメンバー名 $< 最初の必須項目 $? ターゲットよりも新しい必須項目全て $^ 全ての必須項目 項目は重複しない $+ 全ての必須項目 項目は重複する $* ターゲット名 ただし、suffixがない
パターンルール
make -p で一覧が見れる
- e.g.,
%.o: %.c $(COMPILE.c) $(OUTPUT_OPTION) $<
静的パターンルール
$(TARGETS): target-pattern: dependency-pattern
$(TARGETS)のターゲットリストに対して、%.o: %.cというパターンルールを適用
Phonyターゲット
- タスクターゲットを宣言するためのターゲット
- phonyターゲットを書かなくてもタスクは定義できる
clean: some commands
コマンド
- $(shell shell_command)
- makefileのコマンド行以外でshell commandを使用したいときに使う
アクション
- ハイフン(-): ハイフンがついたコマンドは、そのコマンドがエラーであっても、続く処理を継続
- アットマーク(@): アットマークがついたコマンドは、make 実行時にコマンド名を表示しない
関数
ubst : 置換動作 patsubst : 置換動作,ワイルドカードあり strip : 空白文字の削除 findstring : 文字列を探す filter : 一致する単語の削除 filter-out : 一致しない単語の削除 sort : ソートする dir : ディレクトリ部分の抽出 nodir : ファイル部分の抽出 suffix : サフィックス(拡張子)部分 basename : サフィックス以外 addsuffix : サフィックスを加える addprefix : プレフィックスを加える join : 単語の連結 word : n番目の単語を返す worldlist : 単語のリストを返す words : 単語数を返す firstword : 最初の名前を返す wildcard : ワイルドカードによりファイル名リストを返す foreach : 引数を複数回展開する
階層的なディレクトリの場合
direstoryのprefixを入れたりして工夫する
Error関連
name mangling problem
Cファイルをコンパルしたファイルに対応するヘッダーをインクルードするとき,
exern "C" {}で囲む
参考URLs
- http://www.ie.u-ryukyu.ac.jp/~e085739/c.makefile.tuts.html
- http://d.hatena.ne.jp/cou929_la/20090929/1254243607
- http://www.creatology.jp/unix/make.html
- http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/
- http://te2u.hatenablog.jp/entry/2013/11/09/132529
- http://exlight.net/devel/make/basics.html
- http://ycos.sakura.ne.jp/Startup/Programmers/prgAdv/Body316.html
- http://d-rissoku.net/2013/06/makefile-%E5%88%A5%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E4%B8%AD%E9%96%93%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E8%87%AA%E5%8B%95%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82/
- http://www.ecoop.net/coop/translated/GNUMake3.77/make_8.jp.html
- http://www.ecoop.net/coop/translated/GNUMake3.77/make_8.jp.html