make

作成日 : 2015-08-29
最終更新日 :

役に立つ make

make は規則に基づくファイル生成ツールである。

UNIX と Windows

UNIX は make という名前である。Linux などでは GNU による gmake のことがある。 Windows では、GNU の gmake を make として使う場合や、Microsoft による nmake を使うことがある。 nmake であれば Microsoft の Visual Studio 環境にあることが多い。 以前の私の環境では、
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
にあった。その後は、
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx86\x64
などにある。 nmake と gmake では構文に多少違うところがある。

簡単な Makefile

CC=gcc 
CFLAGS = -Wall -Wextra -pedantic -Wstrict-overflow -fno-strict-aliasing
LDLIBS = -lm
TARGETS = chap01-01 chap01-02 chap02-01
all: $(TARGETS)

これは、各ファイルの連関をまったく考える必要がない場合の Makefile である。 書籍などの学習用のコードがファイル単位で完結している場合は、 ファイルの名前から .c を省いた名前を TARGETS のところに書き並べればよい。 コンパイルが成功すると、 TARGETS に書かれている個別の名前がそのまま実行ファイルの名前で生成される。 具体的には、chap02-01.c のファイルを更新したあと make コマンドを実行すると、 chap02-01.c だけがコンパイルの対象となる。

$ make
gcc -Wall -Wextra -pedantic -Wstrict-overflow -fno-strict-aliasing chap02-01.c -o chap02-01-01

ライブラリ

C 言語のコンパイルで、数値計算をする関数を使う場合はリンク時にオプション -lm をつけなければならない。 このオプションは、オブジェクトファイル(*.o)を作らない場合は、実行ファイル名の後につける。
$ gcc chap02-01.c -o chap02-01 -lm
しかし暗黙のルールでは、この -lm をこの位置につける方法がわからない。

GNU make であれば、オプションを利用して、 暗黙のルールがどのように定義されているかわかる。

$ make --print-data-base
(前略)
# 暗黙ルール
%: %.c
#  実行するレシピ (ビルトイン)
        $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@	
(後略)

だから、ルールをこう作ればいい。

CC=gcc 
CFLAGS = -Wall -Wextra -pedantic -Wstrict-overflow -fno-strict-aliasing
LIBS = -l math 
TARGETS = chap01-01 chap01-02 chap02-01
all: $(TARGETS)

%: %.c
        $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ -lm

もっとスマートな方法があるかもしれないが、私にできるのはこれぐらいだ。

まりんきょ学問所UNIX 手習い > make


MARUYAMA Satosi