おことわり
ここではMakefileをコマンドのショートカット置き場のような使い方をしている場合を想定しています。
はじめに
Makefileについてのちょっとした小ネタです。例えばこんなMakefileがあったとします。
target_a:
echo aaaa
.PHONY: target_a
target_b:
echo bbbb
.PHONY: target_b
makeコマンドを引数なしで実行すると、最初に指定したターゲットが実行されます。
$ make
echo aaaa
aaaa
このサンプルでは例示用ということもあって echo
しているだけなので、誤って引数なしでmakeコマンドを実行されても大して問題はありませんが、これが例えば rm -rf *
のような実行されたら大規模な影響がある内容 であったりしたら取り返しがつきません。実際にMakefileにそんなコマンド書くことはないですがあくまで例ということで。
ではどうするのがよいか
ということで、不幸な事故を避ける方法としては、一番上には何度実行されても問題のない無害なターゲットを置くようにする ことが簡単かつ安全かなとおもいます。
※もっと良い方法を教えていただきました。詳細は次項にて。
安全弁付Makefileサンプル
筆者は警告を出すだけのターゲットを置いておく方法をおすすめします。以下はサンプルです。ここでは警告がわかりやすく表示されるように出力に色をつけてますが、事故防止目的なら別にechoしておくだけでもいいと思います。
@yoshi389111 さんが .DEFAULT_GOAL
をつかったもっと良い方法をコメントで教えてくださいましたので差し替えました。ありがとうございます。
コマンド先頭の @
はコマンド自体を出力結果に表示させないようにするためにつけています。
.DEFAULT_GOAL = help
help: ## helpを表示
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
.PHONY: help
target_a: ## aaaaを出力
echo aaaa
.PHONY: target_a
target_b: ## bbbbを出力
echo bbbb
.PHONY: target_b
引数なしで make を実行すると .DEFAULT_GOAL に指定した help
を実行します。
参考
標準出力に色を付ける記述はこちらを参考にしました。
https://misc.flogisoft.com/bash/tip_colors_and_formatting
helpを表示させる案は @yoshi389111 さんのコメント、リンク先の方法をそのまま使わせていただきました。ありがとうございます。
https://postd.cc/auto-documented-makefile/