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 のリスタートは起こらない。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿