Makefileでサブディレクトリを処理する場合のエラー処理

2008-10-01

サブディレクトリも make する

Makefile
SUBDIRS = sub1 sub2
build:
@( for d in $(SUBDIRS) ; do \
$(MAKE) -C $$d build; \
done );

という Makefile を動かしてたが、中でエラーが起きても make が中断されない。 なんでかなーと思って Makefile の文法をあれこれ調べてたんだけどなかなかわからなかった。

でようやくわかったのは、for は Makefile の構文じゃなくて、単なるシェルの呼び出しだった!あまりに基本的なことすぎてどこにも書いてなかった。 だから複数行にわたる場合は行末に「\」を書いたり、「$」を2つ重ねたりする必要があるのか。 シェルの文法もまた好きじゃないんだよな~醜いしさ…。

サブディレクトリの make に失敗したら止めたい場合は、シェルのひとつ前の値 $? を調べて:

Makefile
build:
@( for d in $(SUBDIRS) ; do \
$(MAKE) -C $$d build; \
if [ ! $$? = 0 ]; then exit 1; fi; \
done );