anatsuk1のウェブログ

ブログを書いてみたい!

GNU Make メモ

ディレクトリの扱い

ディレクトリはターゲットにも依存ファイルにもなれる。
ただし、ディレクトリ自体をターゲットや依存ファイルにする意味があるのは再帰Makeぐらい
SUBDIRS = src1 src2

.PHONY: all
all: $(SUBDIRS)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@

PHONYターゲット

PHONYターゲットは常に最新と判定される。
そのために、ターゲットの依存ファイルにPHONYターゲットが含まれると、
ターゲットが常に更新されてしまう

SUBDIRS = src1 src2
EXEFILE = a.out

.PHONY: all
all: $(EXEFILE)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@

$(EXEFILE): $(SUBDIRS)
# このコマンドが常に実行されてしまう。

ルールの連鎖

ルールの依存ファイルが実際に新しくないとコマンドが実行されない。
例えば、
a.out、xxx.o、xxx.cが存在し、xxx.cは一番新しいファイルとする。

SOURCES = xxx.c
OBJECTS = xxx.o
EXEFILE = a.out

.PHONY: all
all: $(EXEFILE)

$(EXEFILE): $(OBJECTS)
# oからcを作成するコマンド。
# このコマンドは実行されない。

$(OBJECTS): $(SOURCES)
# xxx.oを更新しないコマンド

依存ファイルがないターゲット

依存ファイルが書かれていない場合は、ターゲットファイルがなければコマンド実行。
ターゲットファイルがあれば何もしない。
EXEFILE = a.out

.PHONY: all
all: $(EXEFILE)

$(EXEFILE):
# $(EXEFILE)が存在しないときのみコマンドは実行される。

型ルール

ダブルコロンの型ルールは終端として扱われ、
それ以上の依存関係は無視される。
%.o :: %.c
# cからoを作成するコマンド。
# 何かからcを作る型ルールは調査せず、無視される。