makeは何をしているのか?|依存関係とターゲット設計を理解する

こんにちは、さるまりんです 🐒🔧

これまでに、makeを使って

といったことをやってきました。

とても便利ですよね。

使いながら、こんなことを思いました。

makeって、結局何をしているの?」

なんとなくコマンドをまとめるツールとして使っているけれど、
その仕組みまではあまり意識していない。

遠い昔、C言語で開発していた頃も、Makefileのちょっとした編集はしていましたが、
元は誰かが書いてくれたものを使っていました。

やっていることを知らないまま使うのは、少し怖いですよね。

ということで今回は、

makeの「中身」に少し踏み込んで、

依存関係とターゲット設計

という観点から整理してみます。

理解が少しでも進むといいなと思っています。

makeは「コマンド実行ツール」ではない

まず大事なことから。

makeは単なるコマンド実行ツールではありません

本来の役割は、

依存関係をもとに処理の順序を決めること

です。

ターゲットと依存関係

Makefileの基本はこの形です。

build: main.o util.o
	gcc -o app main.o util.o

ここでの意味はこうです👇

  • build → 最終的に作りたいもの(ターゲット)
  • main.o util.o → それを作るために必要なもの(依存関係)

「これを作るには、これが必要」

という関係を定義しています。

makeは順番ではなく「関係」で動く

例えば、こんなMakefileがあったとします。

app: build test
	echo "app done"

build:
	echo "build"

test:
	echo "test"

これを実行すると👇

make app

実行順はこうなります。

build
test
app done

これは、

「順番を書いたわけではなく」

「依存関係を解決した結果、この順番になる」

ということです。

これがmakeの動きです。

.PHONYとは?

ここ、かなりハマりやすいポイントです。

run:
	echo "run"

一見問題なさそうですが、
もし同じディレクトリに run というファイルが存在すると、

makeは実行しなくなります

なぜかというと、

「すでにターゲットが存在している」 と判断するからです。

解決方法

.PHONY: run

run:
	echo "run"

.PHONY をつけることで、

「これはファイルではなく、実行したい処理だよ」

と伝えることができます。

ちなみに phony は「見せかけの」「実体のない」といった意味があります。

ファイルではないものをターゲットとして扱うための仕組み、と考えると分かりやすいですね。

よくあるハマりポイント

使っている中でハマりやすいポイントを、いくつか整理しておきます。

① ターゲットが実行されない

原因👇

  • 同名のファイルが存在している
  • .PHONY が付いていない

② 順番通りに動かない

原因👇

  • 依存関係が正しく書かれていない

makeは「上から順番」ではなく
「関係」で動く

③ とりあえず並べてしまう

deploy:
	build
	push
	restart

❌ これは単なるコマンドの列です。

改善例

deploy: build push restart

build:
	echo "build"

push:
	echo "push"

restart:
	echo "restart"

⭕️ このように分割して関係を定義すると、

  • 読みやすい
  • 修正しやすい
  • 再利用しやすい

といったメリットがあります。

AIが書いたMakefileを理解する

最近は、AIにMakefileを書いてもらうことも増えてきました。

とても便利です。

ただ、

意味が分からないと詰まってしまいます

例えば👇

deploy: build push restart

これを見て、

  • どの順番で動くのか
  • なぜその順番なのか
  • どこを修正すればいいのか

分かるかどうかが重要です

「なぜこうなっているのか?」とAIに聞いてみるのも一つの手です。

この疑問を持つこと自体が、とても大切だと感じています。

makeを理解すると何が変わる?

makeを理解すると、

  • 処理を分解して考えられる
  • 再利用しやすくなる
  • 意図が伝わりやすくなる

ただの便利ツールから、設計ツールに変わる感覚があります

まとめ

makeは、

  • コマンドをまとめるものではなく
  • 依存関係を解決するツール

です。

そして、

ターゲットと依存関係をどう設計するか

が、とても大切になります。

なんとなく使うのも便利ですが、
少し理解するだけで、使い方の幅は大きく広がります。

AIがコードを書いてくれる時代だからこそ、

「何をしているのかを理解する」

この価値は、ますます高くなっていると感じています。

読んでくださってありがとうございました。
それではまた!