GMake サバイバルガイド 便利そうな関数編

make は前回の記事で十分使えるようになったんじゃないかと思います*1
私も険しいまけふぁいるの坂を駆け上がっている途中なので、ここで紹介できる関数は 2 つしかないのですが、
ええい、たらーん!!! という方もおられると思います。
そのような方はGNU make: Functionsをご覧ください。

notdir 関数

notdir 関数は実際 basename コマンドと一緒です。

# makefile
ref0 = ./packages/FParsec.1.0.2/lib/net40-client/FParsec.dll
ref1 = ./packages/FParsec.1.0.2/lib/net40-client/FParsecCS.dll

target-dir = ./bin/Debug

all:
    echo $(target-dir)/$(notdir $(ref0))

以上のファイルを makefileMakefile という名前でどこか空のディレクトリに保存し、make と打ってみてください。
以下のように表示されるはずです:

% make
echo ./bin/Debug/FParsec.dll
./bin/Debug/FParsec.dll

shell 関数

shell 関数はバッククォーテーション文字列で括ったコマンドっぽいことをするようなやつです。

shell 関数を知る前はこのように書いていましたが:

SDL2_INCLUDES  = `pkg-config --cflags-only-I sdl2`
SDL2_DEFINES   = `pkg-config --cflags-only-other sdl2`
SDL2_LIBS      = `pkg-config --libs sdl2)

SDL2GFX_LIBS   = `pkg-config --libs SDL2_gfx`

shell 関数を使うとこのように書けます:

SDL2_INCLUDES  = $(shell pkg-config --cflags-only-I sdl2)
SDL2_DEFINES   = $(shell pkg-config --cflags-only-other sdl2)
SDL2_LIBS      = $(shell pkg-config --libs sdl2)

SDL2GFX_LIBS   = $(shell pkg-config --libs SDL2_gfx)

バッククォーテーションで括ったところはコマンドは無くなって、例えば pkg-config --cflags-only-I sdl2 の結果が SDL2_INCLUDES にそのまま設定されます。 ビルドしてみると、このように出力されます:

% make -B
gcc -W -Wall -O2 -D_REENTRANT -I/usr/include/SDL2 -c main.c -o main.o
main.c: 関数 ‘main’ 内:
main.c:12:14: 警告: unused parameter ‘argc’ [-Wunused-parameter]
 int main(int argc, char ** argv) {
              ^~~~
main.c:12:28: 警告: unused parameter ‘argv’ [-Wunused-parameter]
 int main(int argc, char ** argv) {
                            ^~~~
gcc -lSDL2_gfx -lSDL2 -lSDL2 main.o -o demo-sdl2-gfx

実際にやってみたい方は ( ノ╹◡◡╹)ノ SDL2_gfx を使ったデモっぽいやつ をご覧ください。

参考

*1:多分、きっと、おそらく