Make とは何か? 定番の build 自動化ツールを解説
Make は定番の build 自動化ツールで、Makefile 内のルールに基づいてコマンドを実行し、依存関係が変化した target だけを再 build します。
Make は 1970 年代から build を自動化しており、今なお至るところで使われています。ファイルの生成方法(またはタスクの実行方法)とその依存関係を記述したルールを書くと、Make が何を実行すべきかを判断します。多くのプロジェクトは、単に便利で言語に依存しない task runner として Make を使っています。
Make とは
Make は Makefile によって駆動される build 自動化ツールです。各ルールは target、前提条件、そしてシェルコマンドの recipe を持ちます。Make は target と前提条件の timestamp を比較して何が古くなっているかを判断し、必要な recipe だけを依存関係の順序で実行します。
target と依存関係
target は前提条件に依存します。いずれかの前提条件が target よりも新しければ、Make は recipe を実行してそれを再 build します。この依存関係の追跡により、無駄な作業を避けられます。「phony」target("test" や "build" など)は、ファイルを生成しないタスクで、プロジェクトにシンプルな名前付きコマンドを与えるために使われます。
Makefile の例
phony target はプロジェクトに便利なコマンドを与えます。
.PHONY: build test
build:
npm run build
test:
npm testCI/CD での役割
CI では、Make は言語に依存しない薄いタスク層としてよく使われます。pipeline は "make build" と "make test" を実行するだけで、Makefile が実際のコマンドを保持します。これにより CI の設定がシンプルに保たれ、開発者はまったく同じコマンドをローカルで実行できます。Make の timestamp ベースの再 build ロジックは、ファイルを生成する build において変更のない作業をスキップすることもできます。
代替ツール
Just は、よりクリーンな構文を持ち build-graph の負担がないモダンな command runner です。Task(Taskfile)は YAML ベースの代替ツールです。大規模な build には、Bazel と CMake がはるかに強力な依存関係の処理を提供します。Make は、task runner としての普及度とシンプルさゆえに使われ続けています。
重要なポイント
- Make は target とその依存関係に基づいて recipe を実行する。
- ファイルの timestamp を使い、古くなったものだけを再 build する。
- CI ではしばしば、build と test のためのシンプルで共有された task runner として機能する。