私はMakefileが好き
(switowski.com)-
私はMakefileが好きだ。使い始めてからもう10年以上になる。当時ですら古い技術のように見えた。時が経つにつれて新しいビルドツールが現れては消えていったが、Makefileはいまでも使われ続けていた。プロジェクトに参加する中で慣れ親しみ、気づけば好きになっていた。今では新しいプロジェクトを始めるとき、最初に使う自動化ツールになっている。
-
Makefileが好きな理由は、同じコマンドセットを実装するための非公式な慣習に従っているからだ。新しいプロジェクトに触れたとき、
Makefileファイルがあればmakeまたはmake buildを実行し、その後make installを実行すれば、プロジェクトがビルドされ設定される。あるいは、追加の手順に関する情報を得ることもできる。 -
自分のプロジェクトでも同じ慣習を適用しようとしている。古いプロジェクトのフォルダを開いて
make devを実行すれば、必要なすべての手順をこなしてプロジェクトをビルドし、開発サーバーを起動してくれる。さまざまな技術を使ってきたため、技術ごとにコマンドは異なっていた。Makefileを使えば、数か月あるいは数年触っていないプロジェクトでも簡単に管理できる。 -
Makefileはシンプルだ。条件分岐、フラグ、その他の複雑な機能は使わない。ほとんどの作業は1つ以上のシェルコマンドで構成される。いくつかの関数を持つbashスクリプトを書くこともできるが、Makefileのほうが簡単かつ素早く書ける。
-
たいていの個人プロジェクトには、次のような一般的な作業が含まれる:
dev: 開発サーバーを起動build: プロジェクトをビルド(ビルド工程が必要な場合)deploy: プロジェクトをデプロイ/公開
-
このブログには、単一のターゲットを持つシンプルなMakefileがある:
dev: npm run dev -
より複雑なプロジェクトでは、次のようなMakefileを使っている:
# 開発サーバーを実行 dev: bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload # アセットをビルド build: npm run gulp build # 特定のフォルダを監視してアセットを処理 watch: npm run gulp watch -- --wip # ローカルでウェブサイトをビルドし、暗号化してNetlifyサーバーにデプロイ deploy: JEKYLL_ENV=production bundle exec jekyll build; \ make encrypt; \ netlify deploy --prod # "_site" フォルダを暗号化 encrypt: npx staticrypt _site/*.html -r -d _site -
上の例では、phonyターゲットの存在を無視している。
dev、build、watch、deploy、encryptという名前のファイルがある場合、Makefileは期待どおりに動作しない可能性がある。 -
GNU Makeは非常に広く普及している。Linuxではすでにインストールされている可能性が高い。MacBookでも明示的にインストールした記憶はない。ほかのツールと一緒にインストールされたのだろう。Makeはシンプルで、ほかのビルドツールより追加の依存関係が少ない。制約のある環境では役立つことがある。Makeはすでに存在している可能性が高い。そうでなければ、Makefileのコマンドをシェルで手動実行することもできる。
-
私は他のビルドツールに反対しているわけではない。新しいビルドツールを見つけると興味深いと思う。それでも、さまざまなツールを管理するために今なおMakeを使っている。
GN⁺の要約
- Makefileは、さまざまなプロジェクトで一貫したコマンドセットを提供し、管理を容易にする。
- シンプルな構文と少ない依存関係により、制約のある環境でも有用に使える。
- さまざまなビルドツールと組み合わせて使えるため、柔軟性が高い。
- 類似の機能を持つツールとしては、
CMake、Ninja、Gradleなどがある。
2件のコメント
依存関係を定義していない makefile は、justfile に置き換えるとより良い使い勝手が得られます。
Hacker Newsの意見
Make の使用を勧める声
Makefile の問題点
Make の利点
PHONY ターゲットの使用
mtimeベースの依存関係追跡は使わないPHONYとして定義する必要があるjustとjustfilesに移行し、よりシンプルに使っているMake をめぐる熱い議論
Make のさまざまな活用
Make の限界と代替案
mtimeを使って入力が最新かどうかを確認するが、問題が起こることがあるJustfiles への移行
Makefile のシンプルな使い方