Makefileとは
本来「C言語のコンパイルから実行までをコマンド一つで実行しよう」というものである。
が、特徴として「長いコマンドのショートカットコマンドを作ることができる」ので
個人的にはDockerコマンドやPython(仮想環境)の実行コマンドとしてショートカットを定義している。
シェルスクリプトよりも優れていること
私の使い方であれば、シェルスクリプトを書けば事足りるが、以下のようなメリットがあるためMakefileをよく採用している。
- 書き方や実行のルールが決まっているので、他の人も読みやすい
- 実行時に必要なファイルをチェックしてくれるので、バリデーション処理を自前で書かなくて良い
- コマンド間の依存関係を定義することができる
実行方法
Makefile
という定義ファイルを作成Makefile
があるディレクトリで、「make 任意のコマンド名
」を実行する
Makefileの書き方
コマンド名: 実行に必要なファイル
実際に実行するコマンド
ポイントは3つ
- 「実行に必要なファイル」は、省略可能。ただし記載しておくことでファイルチェックをしてくれる
- 「実際に実行するコマンド」の先頭はスペースではなくtabにする必要がある
- 実行するときのコマンドは「
make コマンド名
」
実行例
Makefile
hello:
echo "hello"
実行結果
$ make hello
echo "hello"
hello
応用編
シンプルなショートカットコマンドの定義だけであれば、上記の説明で困ることはない。
ここからは少し複雑なコマンドを定義したいときに必要なことを解説する。
①makeコマンドは続けて実行可能
Makefile
hello1:
echo "hello1"
hello2:
echo "hello2"
実行結果
# 「make コマンド1 コマンド2 ...」というふうに続けて実行可能
$ make hello1 hello2
echo "hello1"
hello1
echo "hello2"
hello2
連続して実行することができるので、定義するコマンドは最小単位にしておくとスマート。
②必要なファイルはスペース区切りで複数指定できる
Makefile
build: Dockerfile test.txt
docker build -t python-sample:1.0 .
ディレクトリにDockerfile
は存在するが、test.txt
は存在しない場合、以下のようにエラーが発生する。
$ make build
make: *** No rule to make target `test.txt', needed by `build'. Stop.
③変数を使うことも可能
定義するときは「変数名 = 値」
利用するときは「$(変数名)
」で使うことができる。
Makefile
MESSAGE = "hello, world."
hello:
echo $(MESSAGE)
実行結果
$ make hello
echo "hello, world."
hello, world.
④コマンド同士の依存関係も自動で解決してくれる
先述した基本コマンドの「必要なファイル」という部分は
実はファイルに限らず、他のmakeコマンドも定義することができる。
これにより、「コマンドAを実行するためにはコマンドBを実行しておく必要がある。だからコマンドB実行→コマンドA実行という流れで実行しよう。」という定義を行うことができる。
Makefile
# 実行するためには、ビルドの手順が必要だと定義する
run: build
echo "実行します"
build:
echo "ビルドします"
実行結果
# 実行用のrunコマンドを実行する
$ make run
echo "ビルドします"
ビルドします
echo "実行します"
実行します
run
前にはbuild
が必要なため、build
を自動で実行し、その後にrun
を実行するようになる。
まとめ
- Makefileは長いコマンドをショートカットするのに便利
- 「実行前に必要なものが揃っているか?」を定義することができる