Webエンジニアのメモ帳

技術的な話を中心に書いています。

【Linux】Makefileとmakeコマンドについて

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

と打ちます。