こんにちは、さるまりんです 🐒🔧
これまでに、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がコードを書いてくれる時代だからこそ、
「何をしているのかを理解する」
この価値は、ますます高くなっていると感じています。
読んでくださってありがとうございました。
それではまた!