Makefile
ビルドツールになる、しかしよく使用されるタスクランナーとしても使用される場合がある
JSを使用する場合はpackage.jsonを使う npm run
LinuxカーネルのMakefileで多用されている
make ファイル コマンド解析
Makefileの場合、個々のコマンド列は直接シェルによって実行されるのではなく、いったんmakeによって解釈されるという点に気をつけなくてはいけません。makefile中のコマンドはほかのシェルを指定しない限り、つねに /bin/sh
によって解釈されます
makeコマンド種類
Microsoft nmake (Windows) Borland make (Windows) GNU make(windows, UNIX系) Solaris make (Solaris)
makeコマンド種類
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
前提
Makeを理解するにはコンパイルへの理解が重要。
Makefile 基本
主にMakefileはmakeにプログラムのコンパイルおよびリンク方法を指示する。 Makefileに含まれる情報は主に3つ。
- 変数の定義(変数、自動変数、暗黙の変数、特殊変数)
- ルール
- その他(他のMakefileをoverrideするときの情報やデバッグ情報など)
makeはどんな時に使うのか
makeはCのプログラムを生成するのに使われている。
makeはそもそも複数のファイルが色々と依存して構成されているものをコンパイルするときに作業を軽減されるものとして開発された。
あるファイルが別のファイルに依存し、 そのファイルがまた別のファイルに依存しているような場合は、 正しい順番でそれらをコンパイルしなければならない。 また、元となるファイルのどれかひとつを修正したあとも、 コンパイルの順番を考えなくてはならない。makeはこのような作業を軽減する。
makeは、ファイルの生成規則さえ正しく書いてあれば、 コンパイルの順番を自動的に決定する。
makeは依存ファイルの更新日付を調べ、ある依存ファイルを修正したときのコンパイル回数を必要最小限抑えるようにする。
makeはこれらの動作を行う際に、 生成規則を記した “Makefile”という名前のファイルを参照する。
makeが生成するのはふつうCのプログラムだが、べつにCのプログ ラムに限らず、Makefileに書く生成コマンドの書きようによってはTeXのファイルだろうが、Javaのプログラムだろうが何でもmakeを利用して作業を軽減できる。
makeとは
makeはプログラムのビルド作業を自動化するツール コンパイル・リンク・インストールなどのルールを記述したテキストファイル(Makefile)にしたがって、これらの作業を自動的に行う。 複雑に関連し合ったファイルの依存関係を解決するのがmakeの長所。
makeを利用する意味
初期のホストサーバには何も入っていない。
しかしパッケージ管理ツールではmakeなど必然的に入れる必要がある(パッケージをダウンロードした際に、C言語やPythonを使用していたりなどコンパイルが必要になるため)
そのため比較的makeコマンドが入っている確率が上がる。そのためタスクランナーを環境差異がないようにするためMakefileの導入は十分検討できる。
また長いコマンドなど package.json
などに書くと可読性が下がるためMakefileのがいい
基本的なMakefileのフォーマット
ターゲット(作りたいファイル名): 依存ファイル, 依存ファイル...
コマンド # タブでスペースは4
コマンド
...
make実行
make [ターゲット名]
※make
とだけ実行すると、Makefile内の一番最初のターゲットを実行する
clean:
-rm a.out *.o # 失敗しても make は中断しない
clean:
@rm a.out *.o # このコマンドを表示せずに実行
疑似ターゲット
参考URL ターゲットは基本的にターゲット名と同名のファイルを生成する処理 そのためmakeはターゲットと同名のファイルがすでにあると(依存関係がある時以外は)処理を行なわない。
PHONYターゲット
.PHONY ${ターゲット名}
という記載で、そのターゲットは、ファイルは生成しないという事をmakeに知らせることができる
- ターゲットの概念が必要
ターゲットは、基本的にターゲット名と同名のファイルを生成する処理 なので、makeは、ターゲットと同名のファイルがすでにあると(依存関係がある時以外は)処理を行わない
$ touch clean
$ make clean
make: `clean' is up to date.
Makefile条件文
make データ型
Make言語のデータは基本的にテキスト文字列(ストリング)です。 しかし、文脈により文字列がワード、リスト、またはブール値(boolean)として解釈される。
Makefileでの変数展開
= の場合は都度参照(つまりnew Dateすると時間が都度更新される) := の場合は1回のみの参照
# コマンド実行を変数に格納したい場合
FROM_DEPLOY_BRANCH := $$(git branch | head -n 1)
Makefile変数参照
$(name)
または ${name}
objects = program.o foo.o utils.o # => program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
Makefile env
Makefile 内のコマンドに .env file の環境変数を渡す
Makefile デバッグ方法
GNU Makeの -n
オプションは、Makefileのコマンドを実行せずに出力します。