導入
パターンルールで「作り方」は1つにまとまりました。でも app: main.o utils.o helper.o の一覧はまだ手書きです。ソースを足すたびにここを直すのは面倒。関数を使って、ソース一覧とオブジェクト一覧を自動で組み立てましょう。
説明
2つの関数と1つの書き方を使います。
$(wildcard *.c)… 実在する.cファイルを全部集める。$(SRCS:.c=.o)…SRCSの中の各.cを.oに置き換える(置換参照)。$(patsubst %.c,%.o,$(SRCS))… 上と同じことをpatsubst関数で書いた形。
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
app: $(OBJS)
cc -o $@ $^
%.o: %.c
cc -c $< -o $@
SRCS は helper.c main.c utils.c(実在する .c)に、OBJS は helper.o main.o utils.o に自動で展開されます。もうファイル名の一覧を手で書く必要がありません。新しい .c を足しても Makefile は無修正で対応できます。
やってみよう
make を実行して、wildcard が集めたソースから .o が作られ、app までリンクされるのを確認しましょう。SRCS の中身を確かめたいときは、レシピに echo $(SRCS) を入れて make してみるのも手です。
演習
$(wildcard *.c) と置換参照 $(SRCS:.c=.o) を使って OBJS を組み立て、app: $(OBJS) でビルドしましょう。make の出力に cc -o app が現れれば成功です。
ヒント1を見る
SRCS = $(wildcard *.c) と OBJS = $(SRCS:.c=.o) を書き、app: の依存を $(OBJS) にします。
ヒント2を見る
.o の作り方はパターンルール %.o: %.c に任せます。