add test: KEEP_STATE vs. include generation issue
This commit is contained in:
parent
77f083298a
commit
e52b61f121
|
@ -249,7 +249,8 @@ generation in GNU make prints misleading messages (cf. e.g. bug
|
||||||
102). Sun make's `.make.state` file (that is used for hidden
|
102). Sun make's `.make.state` file (that is used for hidden
|
||||||
dependency and command dependency tracking) sometimes causes more
|
dependency and command dependency tracking) sometimes causes more
|
||||||
harm than good - e.g. when outdated dependencies aren't removed
|
harm than good - e.g. when outdated dependencies aren't removed
|
||||||
(e.g. when one converts a target group into a target list).
|
(e.g. when one converts a target group into a target list). Or when
|
||||||
|
include files are regenerated unconditionally (cf. `test/empty_cmd.mf`).
|
||||||
|
|
||||||
The distributed make that comes with OpenOffice is [also named
|
The distributed make that comes with OpenOffice is [also named
|
||||||
DMake][oodmake]. It seems that it was independently developed of Sun's
|
DMake][oodmake]. It seems that it was independently developed of Sun's
|
||||||
|
|
103
test/empty_cmd.mf
Normal file
103
test/empty_cmd.mf
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
# (A)
|
||||||
|
.KEEP_STATE:
|
||||||
|
|
||||||
|
all: hello
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm foo.x foo.y
|
||||||
|
|
||||||
|
foo.x:
|
||||||
|
touch foo.x
|
||||||
|
|
||||||
|
# <- workaround: disable command dependencies
|
||||||
|
# ?touch foo.x
|
||||||
|
|
||||||
|
foo.y: foo.x
|
||||||
|
cat foo.x foo.x > foo.y
|
||||||
|
|
||||||
|
# <- workaround: disable command dependencies
|
||||||
|
# ?cat foo.x foo.x > foo.y
|
||||||
|
|
||||||
|
# (B)
|
||||||
|
include foo.y
|
||||||
|
|
||||||
|
|
||||||
|
hello:
|
||||||
|
echo hello
|
||||||
|
|
||||||
|
# The perhaps unintuitive effect of `.KEEP_STATE`
|
||||||
|
# on the generation of include files.
|
||||||
|
#
|
||||||
|
# Effects:
|
||||||
|
#
|
||||||
|
# 1) comment out the line after (A)
|
||||||
|
#
|
||||||
|
# $ somake -f empty_cmd.mf clean
|
||||||
|
# rm foo.x foo.y
|
||||||
|
# $ rm .make.state
|
||||||
|
# $ somake -f empty_cmd.mf
|
||||||
|
# touch foo.x
|
||||||
|
# cat foo.x foo.x > foo.y
|
||||||
|
# echo hello
|
||||||
|
# hello
|
||||||
|
# $ somake -f empty_cmd.mf
|
||||||
|
# echo hello
|
||||||
|
# hello
|
||||||
|
#
|
||||||
|
# -> meaning that the include file foo.y is only updated
|
||||||
|
# if it doesn't exist or foo.x is newer. This is
|
||||||
|
# the expected behavior.
|
||||||
|
#
|
||||||
|
# 2) comment in (A) and comment out (B)
|
||||||
|
#
|
||||||
|
# $ somake -f empty_cmd.mf clean
|
||||||
|
# rm foo.x foo.y
|
||||||
|
# $ rm .make.state
|
||||||
|
# $ somake -f empty_cmd.mf foo.y
|
||||||
|
# touch foo.x
|
||||||
|
# cat foo.x foo.x > foo.y
|
||||||
|
# $ somake -f empty_cmd.mf foo.y
|
||||||
|
# `foo.y' is up to date.
|
||||||
|
#
|
||||||
|
# -> again, as expected the foo.y action is only executed once.
|
||||||
|
#
|
||||||
|
# 3) comment in (A) and (B)
|
||||||
|
#
|
||||||
|
# $ somake -f empty_cmd.mf clean
|
||||||
|
# touch foo.x
|
||||||
|
# cat foo.x foo.x > foo.y
|
||||||
|
# rm foo.x foo.y
|
||||||
|
# $ rm .make.state
|
||||||
|
# $ somake -f empty_cmd.mf
|
||||||
|
# touch foo.x
|
||||||
|
# cat foo.x foo.x > foo.y
|
||||||
|
# echo hello
|
||||||
|
# hello
|
||||||
|
# $ somake -f empty_cmd.mf
|
||||||
|
# touch foo.x
|
||||||
|
# cat foo.x foo.x > foo.y
|
||||||
|
# echo hello
|
||||||
|
# hello
|
||||||
|
#
|
||||||
|
# -> this is unexpected because foo.y is generated each time.
|
||||||
|
# This is caused by an interaction between KEEP_STATE and
|
||||||
|
# include. Make reads in the `.make.state` file after
|
||||||
|
# include directives are being processed. But, as part of the
|
||||||
|
# dependency checking of the include files the usual KEEP_STATE
|
||||||
|
# logic is applied such that make assumes that the foo.y action
|
||||||
|
# command changed from '' (empty) to 'cat foo.x foo.x > foo.y'.
|
||||||
|
#
|
||||||
|
# (make basically looks up the 'old' command in an empty database)
|
||||||
|
#
|
||||||
|
# When calling make with `-d` the log contains messages like:
|
||||||
|
#
|
||||||
|
# different from empty old command
|
||||||
|
# Building foo.x because new command longer than old
|
||||||
|
# Building foo.y because new command longer than old
|
||||||
|
#
|
||||||
|
# A workaround is to disable command dependencies for the involved
|
||||||
|
# actions, i.e. `?touch foo` and `?cat foo.x foo.x > foo.y`
|
||||||
|
#
|
||||||
|
# This is a bug.
|
||||||
|
#
|
||||||
|
|
Loading…
Reference in a new issue