最終更新:2021-01-24 (日) 02:28:27 (1414d)
Makefile
Top / Makefile
makeはMakefileに記された依存関係に基づいて更新されたファイルの内関連のあるものだけを更新することで、コンパイル時間を短くします。
http://www.gnu.org/software/make/manual/make.html
日本語 - GNU make Version 3.7
- http://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html
- http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_toc.html
基本
- 再構築を最小限の処理で行うために依存関係を記述する
- ソースコード
- 中間ファイル (オブジェクトファイル)
- 実行ファイル
文法
- 依存関係は必ず行頭から書かねばならない。
Makefile/ルール
- ターゲット
- 必須項目 (依存ファイル)
- 実行コマンド
- の3つからなる
ターゲット:必須項目1 必須項目2 実行コマンド
Makefile/ターゲット
- 指定しなかった場合は,一番最初に書かれたルールが実行されます
- 生成コマンドは必ず行頭にタブ文字 (ASCII コードで 9番の文字。 スペースではダメ) を入れなければならない。
ターゲット名: 依存ファイル名1 依存ファイル名2 依存ファイル名3 # 依存関係 コマンド行1 # 生成コマンド1 コマンド行2 # 生成コマンド2
- 依存ファイルの更新をチェックしてからターゲットについて検討する
- 更新されていればコマンド行を利用して更新する
- コマンド行はそれぞれ別のシェルで実行される
メモ
- makeは基本的に行指向
- #から行末までがコメント
- 見やすくするために改行したい場合はバックスラッシュ\を使って改行を無視させることができる
例
# Makefile all:test ./test test: test.c gcc -o test test.c .PHONY: clean clean: rm -f test
.PHONY (フォニーターゲット)
- .PHONYという特別なターゲットの依存関係は偽のターゲット(Phony Target)になります。
- フォニーターゲットは処理する時に同名のファイルの存在や最終修正時刻を気にしません。つまり、makeは無条件にコマンドを実行します。
- make all?
- make clean
サフィックスルール
.c.o: cc -c $<
- .cに対しては、"cc -c そのファイル" という生成コマンドを使って サフィックス .oを生成せよ
Makefile/自動変数
GNU Make/暗黙のルール
Makefile/関数
- 書き方
$(関数 引数)
- または
${関数 引数}
make
Automake
- Makefile.am?を書くとMakefile.inを生成してくれて、configureするとMakefileになる
演算子
- = - Assign the value to the variable. Any previous value is overridden.
- +=? - Append the value to the current value of the variable.
- ?= - Assign the value to the variable if it is not already defined.
- := - Assign with expansion, i.e., expand the value before assigning it to the variable. Normally, expansion is not done until the variable is referenced.
- !=? - Expand the value and pass it to the shell for execution and assign the result to the variable. Any newlines in the result are replaced with spaces.