Makefileとmakeコマンドについて説明します。
概要
Makefileは一連のコマンドをまとめて実行するためのものです。
Makefileという名前のファイルがあるディレクトリでmakeコマンドを実行すると、Makefileに書かれたコマンドが実行されます。
ファイル名はMakefileでもmakefileでも良いです。
また、makeコマンドとgmakeコマンドは全く一緒のものらしいです。
Makefileの書き方
基本的な書き方
(ターゲット): (依存するファイル) (コマンド)
依存するファイルがなかったり、更新されていたりしたら、コマンドが実行されるという感じです。
ちなみに、コマンドの前の空白はタブです。
スペースにすると以下のようなエラーが出力されます。
makefile:(エラーになった行数): *** missing separator. Stop.
複数のターゲットを扱う
Makefileには複数のターゲットを並べて書くことが多いと思います。
この時、makeコマンドで実行されるのは最初のターゲットのみですが、依存ファイル名にターゲット名を書くことで、複数のターゲットを同時に実行することができます。
たとえばMakefileの内容を
all: command1 command2 command1: echo "aaa" command2: echo "bbb"
とすると出力は
echo "aaa" aaa echo "bbb" bbb
となります。
これは、依存するファイルがない場合、依存するファイルと同名のターゲットが存在すれば、それが実行されるからです。
allというターゲットの実行にはcommand1とcommand2の依存ファイルが必要です。
しかし、このファイルが存在していないため、command1というターゲットとcommand2というターゲットが実行されます。
しかし、たとえばcommand1というファイルがそのディレクトリに存在していれば、出力は
echo "bbb" bbb
となります。
command1という依存ファイルが存在しているので、command1ターゲットが実行されないからです。
コマンドの出力をさせない方法
Makefileに書かれたコマンドが実行されると、そのコマンド自体も出力されます。コマンドを出力しないためには、コマンドの先頭に@をつけます。
target: @echo "aaa"
こうすると出力は
echo aaa aaa
ではなく
aaa
のみとなります。
特定のターゲットを実行する方法
Makefileの内容が
all: command1 command2 command1: echo "aaa" command2: echo "bbb"
のとき、command2だけを実行したければ、ターミナルで
make command2
と打ちます。