KZKY memo

自分用メモ.

Makfile基本的書き方まとめ

Makfile基本的書き方まとめ

数年ぶりにMakefileを書くことになったので以前にあったメモのまとめ.

基本文法

ターゲット:依存するファイル
    コマンド (複数行可)

%はワイルドカード

自動変数

変数名 	役割
$@ 	ターゲット名
$% 	ターゲットメンバー名
$< 	最初の必須項目
$? 	ターゲットよりも新しい必須項目全て
$^ 	全ての必須項目 項目は重複しない
$+ 	全ての必須項目 項目は重複する
$* 	ターゲット名 ただし、suffixがない

パターンルール

make -p で一覧が見れる

  • e.g.,
%.o: %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

静的パターンルール

$(TARGETS): target-pattern: dependency-pattern
$(TARGETS)のターゲットリストに対して、%.o: %.cというパターンルールを適用

サフィックスルール

古いルールで互換性のために残されている

.SUFFIXES: .foo .bar
.foo.bar: // .fooから.barを生成する
command

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" {}で囲む