GNU Makeの基本的な使い方は知っている前提です。
知っておくと便利な内容のまとめです。
なお、オライリー社の GNU Make が無料公開されているので詳細はそちらを見ましょう。
テキスト出力/表示: ($info ...), $(warning ...), $(error ...)
変数などをデバッグ用に出力したい場合によく使う。$(error ...)
は評価された時点でMakeが終了するので注意。
1 | HOGE = hoge |
変数定義: =, :=
:=
の方は、その変数定義式が評価された時点の右辺値が左辺値に入る。=
は左辺値を右辺値に紐付けるだけなので、左辺値が呼び出された時によって値が変化する可能性がある。
1 | NAME = Taro |
シェルコマンドの実行: $(shell ...)
そのまんまです。
1 | DIRS := $(shell find . -type d) # . ./inc ./src ./src/package2 ./src/package1 |
ディレクトリ名/ファイル名/ファイル名(拡張子抜き)の取得: $(dir ...), $(notdir ...), $(basename ...)
1 | FILEPATH = ./src/hoge.cpp ./src/foo.cpp |
テキスト置換: $(patsubst PATTERN, REPLACE, TARGET)
TARGET
内のPATTERN
に該当する箇所をREPLACE
に置換する。
名前が覚えづらいがPATternSUBSTituion
だと勝手に思っている(合っているかは不明です)。
1 | FILEPATH = ./src/hoge.cpp ./src/foo.cpp |
ワイルドカード: $(wildcard ...)
ワイルドカードは*
であって%
ではないので注意。
1 | $(wildcard ./src/package1/*.cpp)) # ./src/package1/src1.cpp |
マクロとforeach
1 | PERSONS := Taro Hanako |
foreach
の構文はPython風に書けば以下のようなもの。1
2for p in PERSONS:
call MACRO p
マクロ内部では引数を$(1), $(2) ...
などと受け取れる。
マクロは単純な文字列展開なので、コマンドとしてマクロを使うならマクロ内部で直接コマンド(シェルコマンド)を書ける(上記例ではtouch
.)
PHONYターゲット
Makeは基本的にはターゲットを生成するためのツールなのでターゲットが存在し、依存ファイルにも更新がない場合は何もしない。
以下のケースではもしtest
ディレクトリが存在していると実行されない(make: 'test' is up to date
と言われる)。
1 | test: |
Makeをタスクランナーとして使う場合はそれらに関わらず必ず実行してほしい。
そういう時はPHONYターゲットとする。phonyは偽物という意味。
1 | .PHONY: test |
生成コマンドのオプション
処理が失敗しても次を引き続き実行する
例が適当だが、mkdir hoge
が失敗してもtouch hoge/foo.txt
を実行したい場合、mkdir hoge
に-
を付ける。
1 |
|
処理を標準出力に表示しない
Makeはデフォルトでは実行する内容(ここではrm *.o
)を標準出力に表示する。表示させない場合は@
を付ける。ちなみに@
と-
は併用可能(-@
でも@-
でもOK)。
1 |
|
Makefileの自己文書化
Makeに与える引数にどんなものがあるかをMake自身に語らせたい場合がある。make install
やmake clean
は慣習となっているが自分が定義した(主にタスクランナーとしての)ターゲット名はヘルプ表示しないとわかりづらい。
イメージ的には以下のようにmake
(引数なし)で実行時に引数一覧が表示されるもの。
1 | $ make |
詳細は以下のリンクを参照ください。