Index > ファイルが存在している場合だけ処理する方法, ifでフロー制御 ( GNU Make )
Thu, November 19, 2009

ファイルが存在している場合だけ処理する方法, ifでフロー制御 ( GNU Make )

たとえば、

そんな作業をするMakefileを書くには if を使えばよい。

Makefile

patch            := patch.txt
patch_txt_exists := $(shell find -name $(patch))

define message
    @echo "message: patch.txt does not exist"
endef

define doPatch
    patch < patch.txt
endef

.PHONY : chkPatch
chkPatch:
    @echo $(path_txt_exists)
    $(if $(patch_txt_exists) ,$(doPatch),$(message))

補足その1

patch_txt_exists := $(shell find -name $(patch))

の代わりに

patch_txt_exists := $(shell ls | grep $(patch))

のようにした方がロバストな気がします。

find を使うとサブディレクトリも検索してしまうため、もしサブディレクトリに patch.txt が存在した場合、 意図しない振る舞いになります。

補足その2

ポイントは if の以下の部分

$(if $(patch_txt_exists) ,$(doPatch),$(message))

Make の if は $(if 条件,実行1,実行2) のようになっていて、 条件部分の結果により、実行1 または 2が実行される...そんな振る舞い。

$(patch_txt_exists) には、find -name patch.txt した結果が入っているので、 存在していれば空ではないため、$(doPatch)が実行される。

 Twitter
follow me on Twitter
 Categories