🐰
makeに引数が正しく渡されているか確認する
よくある引数確認方法と問題点
Makefileで引数が確認されてるか確認する方法として擬似ターゲット(.PHONY
)とifdef
やifeq
を組み合わせる方法がよく紹介されています。
Makefile
PARAM :=
.PHONY: main
main: base-program
some-command
.PHONY: base-program
base-program: __require_PARAM
some-command ${PARAM}
.PHONY: __require_PARAM
__require_PARAM:
ifndef PARAM
$(error PARAM is not defined; you must specify PARAM like $$ make PARAM=xxx task)
endif
$ make PARAM=xxx main
makeをタスクランナーとして使う場合はこれでも良いですが、ビルドツールとして使うときは依存ターゲットに擬似ターゲットが含まれているとビルドキャッシュが効かなくなるのでとても不便です(特にビルド時間が長いとき)。
解決法
define
とbashの組み合わせで解決できます。
この場合、擬似ターゲットを使わないので、ビルドキャッシュを利用することができます。
Makefile
PARAM :=
.PHONY: main
main: base-program
some-command
.PHONY: base-program
base-program:
$(call __require_PARAM)
some-command ${PARAM}
define __require_PARAM
@bash -c "if [ '${PARAM}' = '' ]; then echo 'PARAM is not defined; you must specify PARAM like $$ make PARAM=xxx task'; exit 1; fi"
endef
Discussion