Makefileの書き方について調べていたら、なにやら便利そうな関数があったので覚え書き。
Makefileでコンパイル対象のソースファイルを指定するときに、私はshellのlsコマンドを使ってこんな風にC言語ソースだけ抜き出していました。
SRC=$(shell ls *.c) test:$(SRC) gcc $(SRC) -o test
ただ、これだとターゲットによってコンパイルしたいソースファイルを切り替えるなんてことがしにくくなります。そんなとき、filter-out関数を使えば変数から指定したワードを除外できるので、コンパイル対象を絞れて便利。
例えば、ターゲット1にはmain1.c、ターゲット2にはmain2.cを使い、その他のソースは共通というケースがあったとき、Makefileをこう書けばOKです。
SRC=$(shell ls *.c) target1:$(SRC) # main2.cを除外する gcc $(filter-out main2.c, $(SRC)) -o target1 target2:$(SRC) # main1.cを除外する gcc $(filter-out main1.c, $(SRC)) -o target2 all: make target1 make target2
こうすれば、そのターゲットに不必要なファイルだけ指定すればよいので、少しはMakefileの手入れが楽になりますね。大半のソースが共通で数ファイルだけ対象から外したいというときには有用だと思います。
また、コンパイルオプションもこの方法で除外できたりするので、特定のターゲットだけオプションを削りたいというケースにも応用できます。むしろ、普通はこっちの方がケースとして多いかもしれませんね。