Friday, October 16, 2009 / Bash, Make, Ubuntu

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

たとえば、 patch.txt が存在していた場合だけ、patchを適用したい。存在していなければ何もしない そんな作業をする 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))

補足

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

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

Make の if は $(if 条件,実行1,実行2) のようになっていて、条件部分の結果により、実行1 または 2が実行される...そんな振る舞い。 $(patch_txt_exists) には、find -name patch.txt した結果が入っているので、存在していれば空ではないため、$(doPatch)が実行される。