本文へスキップ
BecomeCoder

Makefile / makeコース · 第3章 パターンとテクニック · レッスン10

関数 ― wildcard と patsubst でファイルを自動収集

ブラウザで完結

導入

パターンルールで「作り方」は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 $@

SRCShelper.c main.c utils.c(実在する .c)に、OBJShelper.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 に任せます。

実際に動かしてみよう

上のエディタが Makefile、下が端末です。Makefile を確かめたら端末に `make` と打って Enter を押すと、どのレシピがどの順で走るかが表示されます。`ls` で作業中のファイル(main.c などが最初から置いてあります)、`touch main.c` のあと `make` で差分ビルドの様子、`make -n` で「実行せず何が走るか」を確かめられます。各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」でいつでも戻せます。

Makefile + make(シミュレート)

Makefile を書いて make を試せる学習用環境を読み込みます(本物のGNU Makeではなく、依存解決とタイムスタンプ再ビルドを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。