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