1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

makeコマンド事故防止

Last updated at Posted at 2023-01-22

おことわり

ここではMakefileをコマンドのショートカット置き場のような使い方をしている場合を想定しています。

はじめに

Makefileについてのちょっとした小ネタです。例えばこんなMakefileがあったとします。

Makefile
target_a:
	echo aaaa
.PHONY: target_a

target_b:
	echo bbbb
.PHONY: target_b

makeコマンドを引数なしで実行すると、最初に指定したターゲットが実行されます。

引数なしでmakeコマンド実行
$ make
echo aaaa
aaaa

このサンプルでは例示用ということもあって echo しているだけなので、誤って引数なしでmakeコマンドを実行されても大して問題はありませんが、これが例えば rm -rf * のような実行されたら大規模な影響がある内容 であったりしたら取り返しがつきません。実際にMakefileにそんなコマンド書くことはないですがあくまで例ということで。

ではどうするのがよいか

ということで、不幸な事故を避ける方法としては、一番上には何度実行されても問題のない無害なターゲットを置くようにする ことが簡単かつ安全かなとおもいます。

※もっと良い方法を教えていただきました。詳細は次項にて。

安全弁付Makefileサンプル

筆者は警告を出すだけのターゲットを置いておく方法をおすすめします。以下はサンプルです。ここでは警告がわかりやすく表示されるように出力に色をつけてますが、事故防止目的なら別にechoしておくだけでもいいと思います。

@yoshi389111 さんが .DEFAULT_GOAL をつかったもっと良い方法をコメントで教えてくださいましたので差し替えました。ありがとうございます。
コマンド先頭の @ はコマンド自体を出力結果に表示させないようにするためにつけています。

Makefile
.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 を実行します。

defaultgoal.png

 参考

標準出力に色を付ける記述はこちらを参考にしました。
https://misc.flogisoft.com/bash/tip_colors_and_formatting

helpを表示させる案は @yoshi389111 さんのコメント、リンク先の方法をそのまま使わせていただきました。ありがとうございます。
https://postd.cc/auto-documented-makefile/

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?