効果的なクリーンターゲットパターン

Makefileにおける異なるクリーンターゲットパターンを学びます:basic clean、distclean、mostlyclean、maintainer-cleanのGNU規約に従った実装。

Build Patterns

詳細な説明

正しいクリーンターゲット

良いcleanターゲットは不可欠です。GNUコーディング標準では4段階のクリーニングを定義しており、段階的により多くのファイルを削除します。

4つのクリーンレベル

.PHONY: mostlyclean clean distclean maintainer-clean

mostlyclean:
	rm -f $(OBJS) $(DEPS)

clean: mostlyclean
	rm -f $(TARGET)

distclean: clean
	rm -f config.mk .config
	rm -rf build/

maintainer-clean: distclean
	rm -f configure aclocal.m4
	rm -rf autom4te.cache/
	@echo "This command is intended for maintainers only."
  • mostlyclean: 中間ファイル(オブジェクトファイル、依存関係ファイル)を削除しますが、最終バイナリは保持します。部分的な再ビルドが必要な開発中に便利です。
  • clean: makeがビルドしたすべてを削除します。最終バイナリも含みます。
  • distclean: ソースディストリビューションに含まれないすべてを削除します。設定ファイル、ビルドディレクトリなど。
  • maintainer-clean: 再生成可能なすべてを削除します。autoconf生成ファイルも含みます。パッケージメンテナのみが使用します。

段階的クリーニング

各レベルは前のレベルに依存し、チェーンを形成します:maintainer-clean -> distclean -> clean -> mostlyclean。これによりrmコマンドの重複を避けます。

言語固有のクリーンパターン

C/C++:

clean:
	rm -f $(OBJS) $(DEPS) $(TARGET)
	rm -rf *.dSYM

Python:

clean:
	rm -rf __pycache__ .pytest_cache .mypy_cache htmlcov *.egg-info dist build
	find . -name '*.pyc' -delete
	find . -type d -name '__pycache__' -exec rm -rf {} +

Node.js:

clean:
	rm -rf node_modules dist .next .cache .parcel-cache coverage

安全性のヒント

  • rm -rf /rm -rf *は絶対に使用しない。常に具体的なパスを使用する
  • ディレクトリ名には変数を使用し、ビルドターゲットと一致させる
  • 破壊的操作の前に@echoで警告を追加する
  • 実際に削除せずに削除対象を一覧表示するclean-dryターゲットを検討する

ユースケース

複数のビルド成果物、生成ファイル、キャッシュデータがあり、異なるレベルのクリーニングが必要なプロジェクトに徹底的で安全なクリーンアップシステムを実装する場合に使用します。

試してみる — Makefile Generator

フルツールを開く