特定のパターン(ルール)ですべてのファイルを make する

Published at: 2023/1/24


背景

Makefile では、 % によるパターン記述で、例えば拡張子に対するルールを定めることができる。 例えば、下記のように拡張子の変換ルールを記述することにより、そのフォルダ中で .o ファイルを make する際に、もし他に詳細度の高い rule がない場合、デフォルトで適用されるような .c からの生成ロジックを記述できる。

%.o: %.c    gcc -o $@ $<

ただ、これをやるだけだと実際に make を実行するためには、どの .o ファイルを生成したいのかをコマンド引数に指定しなければならない。 (例: make hoge.o)

生成対象のファイルのリストを手動で管理し、 PHONY なタスクの依存としてそのリストを指定することも可能ではあるが、一々そのリストを管理するのは面倒だし、ディレクトリの中のすべての該当する拡張子のファイル(上記例だと .c ファイル)を対象に make できるような記述をできれば行いたい。

それについて調べた際の備忘録。

回答: wildcard 関数

Wildcard Function (GNU make)

Wildcard Function (GNU make)

www.gnu.org

上記ページにある通り、 wildcard 関数と patsubst 関数 が利用できる、と案内されていることが分かる。

wildcard 関数は、シェル的な、アスタリスクによるファイル名展開のようなことを実行する文字列関数。 これによって展開された、スペース区切りのファイル名たちに対して、すべての .c.o に置換するように patsubst を呼び出すことによって、これは実現される。

まとめ

objs := $(patsubst %.c,%.o,$(wildcard *.c)).PHONY: allall: $(objs)%.o: %.c    gcc -o $@ $<

上記のような Makefile を記述することにより、その Makefile が置かれたディレクトリの .c ファイルすべてを .o へコンパイルするような rule (all) が記述できる。


Tags: makefile