make は規則に基づくファイル生成ツールである。
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 では構文に多少違うところがある。
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
もっとスマートな方法があるかもしれないが、私にできるのはこれぐらいだ。