Thursday, October 22, 2009 / Bash, Make, Ubuntu

ディレクトリが存在している場合だけ処理する方法, ifでフロー制御 ( GNU Make )

Makefile で、CSVやSubversionレポジトリからソースツリーを作業ディレクトリにエクスポートしてビルドするような場合...
たとえば、 以下のようなMakefileを書いた場合ですが、 make clean したときに、作業ディレクトリが存在しないとエラーになります。

Makefile (1)

# 作業ディレクトリ
workdir := __workdir

foo.jar    : $(workdir)
    @ant
    @cp $(workdir)/foo.jar .

$(workdir) : 
    @svn export svn://foobar.net/hogehoge/trunk $@

clean      :
    @cd $(workdir); ant clean

cleanall   :
    @$(RM) -r $(workdir)

これでは、作業ディレクトリが存在しないときに、 make clean すると、エラーになります。
これを防ぐには、if を使用して、作業ディレクトリが存在しているときだけ、処理をするように変更します。

Makefile (2) if を使用して改良

# 作業ディレクトリ
workdir := __workdir

foo.jar    : $(workdir)
    @ant
    @cp $(workdir)/foo.jar .

$(workdir) : 
    @svn export svn://foobar.net/hogehoge/trunk $@



define do-ant-clean-in-workdir
    @cd $(workdir); ant clean
endef


workdirexists := $(shell find ./ -name $(workdir))
clean :
    $(if $(workdirexists) ,$(do-ant-clean-in-workdir))
cleanall   :
    @$(RM) -r $(workdir)