Makefile書き方

Makefileとは

本来「C言語のコンパイルから実行までをコマンド一つで実行しよう」というものである。

が、特徴として「長いコマンドのショートカットコマンドを作ることができる」ので
個人的にはDockerコマンドやPython(仮想環境)の実行コマンドとしてショートカットを定義している。

シェルスクリプトよりも優れていること

私の使い方であれば、シェルスクリプトを書けば事足りるが、以下のようなメリットがあるためMakefileをよく採用している。

  • 書き方や実行のルールが決まっているので、他の人も読みやすい
  • 実行時に必要なファイルをチェックしてくれるので、バリデーション処理を自前で書かなくて良い
  • コマンド間の依存関係を定義することができる

実行方法

  1. Makefileという定義ファイルを作成
  2. Makefileがあるディレクトリで、「make 任意のコマンド名」を実行する

Makefileの書き方

コマンド名: 実行に必要なファイル
	実際に実行するコマンド

ポイントは3つ

  1. 「実行に必要なファイル」は、省略可能。ただし記載しておくことでファイルチェックをしてくれる
  2. 「実際に実行するコマンド」の先頭はスペースではなくtabにする必要がある
  3. 実行するときのコマンドは「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は長いコマンドをショートカットするのに便利
  • 「実行前に必要なものが揃っているか?」を定義することができる
タイトルとURLをコピーしました