Afraid of Makefiles? Don't be!

Matthias Endler

Makefileが怖い?心配いりません!

原文は Matthias Endler により に公開されました。 このブログを購読する

服がMakefileと何の関係があるの?この記事で解説します!
服がMakefileと何の関係があるの?この記事で解説します!
出典: Illustration by Anindyanfitri - Freepik.com

ここ数年、たくさんの優秀なソフトウェアエンジニアと一緒に仕事をする機会に恵まれました。そこで気づいたことのひとつは、多くの人がMakefilesについての実践的な知識や、なぜそれが役立つのかを知らないということでした。

ビルドプロセスを自動化する場面では、彼らは自作のシェルスクリプトを用意することがよくあります。プロジェクトフォルダの中にあるbuild.shrun.shdoall.shといったファイルがその典型です。

そうしたスクリプトでは、毎回同じような基本的な機能が実装されています。

  • 入力パラメータや環境変数の解析。
  • ビルドステップ間の依存関係の手動管理。
  • エラー処理(……一応)。

そして、その過程で同じような基本的なミスが繰り返されています。

これらはまさに、Makefileが解決するために作られた問題です。

Makefileは怖い!

もしmakeが怖いと思っているなら、きっと大規模なソフトウェアプロジェクト向けの複雑なビルド機構を思い浮かべているのでしょう。でも、本来はそうである必要はありません。makeの作者であるStuart Feldman本人の言葉を聞いてみましょう。

それは依存関係を解析する精巧なアイデアから始まり、ずっとシンプルなものへと削ぎ落とされ、その週末にMakeになった。まだ乾ききっていないツールを使うのは当時の文化だった。Makefileは魔法のようにエンコードされたバイナリではなくテキストファイルだった。なぜならそれがUnixの精神だったからだ。印字でき、デバッグでき、理解できるもの。

The Art of Unix Programming (2003)

Makeは、繰り返し発生する問題をシンプルに解決するために、たった一つの週末で作られたのです。

Makefileはシンプル!

家を出る前には、服を着る必要があります。私はいつも同じシンプルな手順で着替えます。下着、ズボン、シャツ、プルオーバー、靴下、靴、ジャケットの順です。あなたにもきっと、たとえ順番は違っても、同じような習慣があるはずです。

これらのステップの中には、互いに依存しているものがあります。
Makeは依存関係の処理に役立ちます。
私の着替えの手順をMakefileで表現してみましょう。

dress: trousers shoes jacket
	@echo "All done. Let's go outside!"

jacket: pullover
	@echo "Putting on jacket."

pullover: shirt
	@echo "Putting on pullover."

shirt:
	@echo "Putting on shirt."

trousers: underpants
	@echo "Putting on trousers."

underpants:
	@echo "Putting on underpants."

shoes: socks
	@echo "Putting on shoes."

socks: pullover
	@echo "Putting on socks."

このMakefileを実行すると、次のような出力が得られます。

$ make dress
Putting on underpants.
Putting on trousers.
Putting on shirt.
Putting on pullover.
Putting on socks.
Putting on shoes.
Putting on jacket.
All done. Let's go outside!

何が起きた?

ステップが正しい順序で実行されたことに気づきましたか?ステップ間の依存関係を素直に書き下すだけで、makeが正しく実行してくれるのです。

各ビルドステップは次のような構造になっています。

target: [dependencies]
	<shell command to execute>
	<shell command to execute>
	...
  • Makefileの最初のターゲットは、makeを実行したときにデフォルトで実行されます。

  • ターゲットの記述順は関係ありません。

  • シェルコマンドはタブでインデントしなければなりません。

  • 実行されるコマンドの出力を抑制したい場合は、@を付けます。

  • targetがビルドしたいファイルではない場合は、ビルドステップの末尾に.PHONY <target>を追加してください。よくあるPHONYターゲットはclean、install、runなどです。そうしないと、誰かがinstallというディレクトリを作ったときに、ビルド対象がすでに存在するものとしてmakeが何もせずに失敗してしまいます。

    .PHONY: install
    install:
    	npm install

おめでとうございます!これでmakeについて知っておくべきことの90%は学びました。

次のステップ

実際のMakefilesはもっと多くのことができます。全体を再ビルドするのではなく、変更されたファイルだけをビルドしたり、できる限り並列に実行したりしてくれます。ただ、どうかシンプルに保つことを心がけてください。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント