make・Makefile - 関数 $(関数)

クラウディア 
1. 概要
2. 置換 $(subst)
3. ワイルドカード $(wildcard)
4. ディレクトリ以外を取り出し $(notdir)
5. 例外を設定 $(filter-out)

1. 概要

 どうやらこれ、関数らしいのだ。

$(関数 引数)
 の形式で処理後のシンボルを返すものである・・・と。  この項「GNU make 日本語訳(Coop編) - テキスト変形関数」を参考にさせていただきました。

2. 置換 $(subst)


$(subst  from, to, text)
 文字列 text 内の from 文字列を to 文字列に置換します。

3. ワイルドカード $(wildcard)

 $(wildcard) を使用してワイルドカードを使うことができます。

変数	= $(wildcard ワイルドカードを使用したファイル名)
 すなわち、下記のような環境で

> ls cpp/*.c
cpp/curses.c  cpp/IsBigOrLittle.c  cpp/t01.c  cpp/test01.c  cpp/test02.c  cpp/test03.c  cpp/wol.c
 下記の Makefile を書いて

.PHONY  : dummy

SOURCE  = $(wildcard cpp/*.c)

dummy   :
        @echo  $(SOURCE)
 make すると以下のようなことになります。

> make
cpp/t01.c cpp/curses.c cpp/wol.c cpp/test02.c cpp/IsBigOrLittle.c cpp/test03.c cpp/test01.c

4. ディレクトリ以外を取り出し $(notdir)


$(dir    name...)	←	ディレクトリの取り出し
$(notdir name...)	←	ディレクトリ以外を取り出し
$(suffix name...)	←	サフィックスを取り出し
 だそうな。  「ディレクトリ以外を取り出し」しか使用しそうにないが・・・。  前項と同様の状況で、下記の Makefile を書いて make します。

.PHONY  : dummy

SOURCE  = $(wildcard cpp/*.c)

dummy   :
        @echo  $(SOURCE)
        @echo  $(dir $(SOURCE))
        @echo  $(notdir $(SOURCE))
        @echo  $(suffix $(SOURCE))

> make
cpp/t01.c cpp/curses.c cpp/wol.c cpp/test02.c cpp/IsBigOrLittle.c cpp/test03.c cpp/test01.c
cpp/ cpp/ cpp/ cpp/ cpp/ cpp/ cpp/
t01.c curses.c wol.c test02.c IsBigOrLittle.c test03.c test01.c
.c .c .c .c .c .c .c

5. 例外を設定 $(filter-out)

 本当は $(filter) を先に述べるべきなんでしょうが、$(filter) はまだ使ったことがないのだ。  $(filter-out) を使用することでリストの中の例外を除外することができます。

変数	= $(filter-out 除外するファイル名, リストしたファイル名)
 すなわち前項までと同様の環境で下記の Makefile を書いて make すると

.PHONY  : dummy

SOURCE  = $(notdir $(wildcard cpp/*.c))

dummy   :
        @echo  $(SOURCE)
        @echo  $(filter-out t01.c wol.c, $(SOURCE))

> make
t01.c curses.c wol.c test02.c IsBigOrLittle.c test03.c test01.c
curses.c test02.c IsBigOrLittle.c test03.c test01.c
 おわかりかと思いますが、除外するファイル名は、空白で区切って複数指定することができます。