Makefile Tips
Makefileのあるディレクトリの絶対パスを取得する
$(pwd)
や相対パスでは、make
コマンドの実行ディレクトリが基準になってしまう。Makefile
の実体があるディレクトリを基準としたいときは、以下のようにROOT_DIRを定義する。
ROOT_DIR = $(dir $(realpath $(firstword $(MAKEFILE_LIST))))
エラー時に処理を続行する
コマンドの前に-
(ハイフン)をつける。
.PHONY: cmdcmd:ls-fail_command a b cls
インデントはスペースではなくタブを使う
vimrcでset expandtab
している場合にひっかかる。
以下で一時的に解除するか、vimrcでset expandtab
するのをやめる、もしくはvimrcでファイル名による分岐で設定する。
:set noexpandtab
.vimrc
set expandtablet _filename = expand('%:r')if _filename == 'Makefile'set noexpandtabendif
ファイルの存在に関係なくターゲットを実行する
Makeは本来Cのコンパイルなどに使うとき、ターゲット名に一致するファイルが存在している場合に処理をスキップするようになっている。
一方で、build
というターゲット名を使って、呼び出しのたびにコマンドを実行したいが、build
ディレクトリが存在するような場合に困る。
スキップさせないようにするには、.PHONY: ターゲット名
を記述する。
.PHONY: cmdcmd:ls
複数のコマンドを1つのシェルで実行する
cmd:echo Hello;\VAR=World;\echo $$VAR
.ONESHELL: cmdcmd:echo "Hello"VAR=Worldecho $$VAR
途中のコマンドの終了ステータスを返す
.ONESHELL: cmd.PHONY: cmdcmd:sh -c 'exit 123'EXIT_CODE=$$?echo "Exit code: $$EXIT_CODE"exit $$EXIT_CODE