2012年7月14日土曜日

make のリスタートあり/なし その2


今回も make がリスタートする条件をもう少し調査してみる。
前回見たように、基本的にインクルードファイルが更新されればmakeは最初からやり直します。
(ただしインクルードファイルが.PHONY指定されている場合は除く。)

ちょっと面白い実験。次の Makefile を用意。


$(warning restart)
include foo.mk


all:
@echo $@


foo.mk: FORCE
touch -t 07010000 $@


.PHONY: FORCE
FORCE:



$ touch foo.mk 
$ ls -l
合計 4
-rw-rw-r-- 1 hoge hoge 109  7月 14 18:45 Makefile
-rw-rw-r-- 1 hoge hoge   0  7月 14 18:46 foo.mk
$ make
Makefile:1: restart
touch -t 07010000 foo.mk
Makefile:1: restart
touch -t 07010000 foo.mk
all
$ ls -l
合計 4
-rw-rw-r-- 1 hoge hoge 109  7月 14 18:45 Makefile
-rw-rw-r-- 1 hoge hoge   0  7月  1 00:00 foo.mk
$ make
Makefile:1: restart
touch -t 07010000 foo.mk
all


インクルードファイルの日付が変化すれば、たとえ古くなっていても make はリスタートするようだ。



では、日付が変化しさえすれば、make はリスタートするのかというと、必ずしもそうでもない。

次のような Makefile を用意。


$(warning restart)
include foo.mk


all:
@echo $@


foo.mk: bar
:


bar: baz
touch foo.mk



$ touch bar 
$ touch baz
$ make
Makefile:1: restart
touch foo.mk
:
Makefile:1: restart
touch foo.mk
all
$ make
Makefile:1: restart
touch foo.mk
all


bar, baz の順にtouch してから make すると、 bar の構築ルールのところで、 foo.mk  が更新される。
続いて、 foo.mk の構築ルール : が実行されたあと、make がリスタートする。
(このとき、 : が実行される理由は以前「make の動きを解剖する」参照)

さらにもう一回、makeを実行するときは : は実行されず、make のリスタートもない。
make がリスタートするためにはインクルードファイルの日付が変更され、かつそのインクルードファイルの構築ルールが実行される必要があるようだ。

だから、Makefile 中で foo.mk の構築ルールの : を削除した場合も make のリスタートは起こらない。

0 件のコメント:

コメントを投稿