makeはファイルの依存関係を記述したmakefileを使って、ターゲットとなるファイルを生成するコマンドです。おもにC言語のソースファイルをコンパイルおよびリンクするときに使います。makeの使い方をご紹介します。
makeコマンドは存在しないファイルを作成したり、古いファイルを更新することができる。
ファイルを作成・更新するためのルールを記述したファイルをMakefileといい、makeコマンドが参照する。
makeコマンドの構文は次のとおり。
make [option...] [target...] [macro=value...]
makeコマンドの引数にはターゲットを指定する。
たとえば、次の内容のMakefileを作成する。
build:
cc example.c
clean:
rm example.o
ソースファイルをコンパイルするときには、makeコマンドの引数にターゲット「build」を指定して実行する。
$ make build
オブジェクトファイルを削除するときには、makeコマンドの引数にターゲット「clean」を指定して実行する。
$ make clean
makeコマンドの引数を省略した場合は、Makefile中で最初のターゲットが実行される。
前述のMakefileの場合は、ターゲット「build」が実行される。
$ make
makeコマンドには次のオプションを指定できる。
$ make -f example
$ make clean
Makeファイルは、ファイルの依存関係を記述したファイルである。ファイル名は任意でよいが、Makefileまたはmakefileという名前にしておくと、makeコマンドを実行するときにMakeファイル名の指定を省略できる。
Makeファイルはターゲットの依存関係を以下の構造で記述します。
target : depend
command
生成するファイルのパスを ターゲット に指定します。ターゲットを生成するのに必要なファイルのパスを 依存ファイル に記述します。依存ファイルからターゲットを生成するために実行するコマンドを コマンド に記述します。
makeはターゲットと依存ファイルのタイムスタンプを調べて、以下の場合にターゲットを生成するコマンドを実行します。
makeはコマンドを実行するたびにシェルを起動する。たとえば次のMakefileではcdコマンドとccコマンドはそれぞれ別のシェルが起動される。
a.out: $(SRCS)
cd dist
cc $(SRCS)
したがって、ccが実行される際のカレントワーキングディレクトリはdistではない。同じシェルで複数のコマンドを実行したい場合は、セミコロンで区切る。
a.out: $(SRCS)
cd dist; cc $(SRCS)
Makeファイルの中では、次に示す動的マクロを使用することができます。
$*
$<
$@
$?
拡張子からサフィックスルールを定義することもできる。.cから.oを作成するサンプルを以下に示す。
# サフィックスルール (.c -> .o)
.c.o :
cc -c $<
makeの定義済み変数を次に示す。
変数 | 説明 | デフォルト値 |
---|---|---|
AR | アーカイブするプログラム | ar |
CC | Cプログラムをコンパイルするプログラム | cc |
CXX | C++プログラムをコンパイルするプログラム | g++ |
RM | ファイルを削除するコマンド | rm -f |
ARFLAGS | アーカイブするプログラムに与えるフラグ | |
CFLAGS | Cコンパイラに与える追加フラグ | |
CXXFLAGS | C++コンパイラに与える追加フラグ | |
LDFLAGS | ldに与える追加フラグ |
makeのshell関数は、シェルコマンドを呼び出すことができる。
basedir = $(shell pwd)
all:
echo $(basedir)
makeコマンドがOSにプリインストールされていなければ、自分でインストールする必要がある。
GNU/LinuxディストリビューションのひとつであるUbuntuにmakeコマンドをインストールするには、aptコマンドを使用する。 インストールにはスーパーユーザ権限が必要なので、sudoコマンドも併用する。
$ sudo apt install make
GNU makeをインストールすることで、Microsoft Windowsにおいてもmakeコマンドを利用できる。
Make for Windowsの公式サイトからインストーラ等をダウンロードできる。
コマンドプロンプトやPowerShellからmakeコマンドを使用できるようにするためには、実行ファイルが存在するフォルダのパス( C:\Program Files (x86)\GnuWin32\bin)を環境変数 Path に追加する必要がある。