[GHC] #9709: Make restarts itself sometimes, and that's OK

GHC ghc-devs at haskell.org
Sun May 24 15:31:06 UTC 2015


#9709: Make restarts itself sometimes, and that's OK
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Build System      |                 Version:  7.9
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
 Type of failure:  None/Unknown      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by thomie):

 I can reproduce this by running the following with recent HEAD
 (25d1a716395e349736994759d1fcbb3721f3ee9f):
 {{{
 ./boot
 ./configure
 make
 touch -r inplace/bin/ghc-cabal -d '-1 day' compiler/stage1/package-data.mk
 make -j2
 }}}


 Below are my notes.
 {{{
 # Don't put stage=2 in your build.mk file.

 cd ghc-build

 # Make sure compiler/stage1/package-data.mk is out of date, so that
 # `inplace/stage1/ghc-cabal configure ...` is run, which updates
 # compiler/stage1/inplace-pkg-config, which *should* trigger `make` to
 update
 # compiler/stage1/inplace-pkg-config-munged.

 touch -r inplace/bin/ghc-cabal -d '-1 day' compiler/stage1/package-data.mk
 make -j2

 # This fails with:
 #
 # "Make has restarted itself 2 times; is there a makefile bug? ..."
 #
 # Analysis:
 # For some reason, make *does* update inplace-pkg-config-munged before
 # restarting itself when running with `-j1`, but it *doesn't* when running
 # with `-j2`.
 # This can be seen more clearly when deleting the following line from the
 # toplevel ghc.mk:
 #
 # else ifeq "$(MAKE_RESTARTS)" "1"
 #
 # Make will fail with both `-j1` as with `-j2`, but in the former case
 # inplace-pkg-config-munged is updated (you'll see the sed command in the
 # output), whereas in the latter it isn't. Using `-j2 -d` does seem to
 work,
 # which is very confusing.


 # In build-package-data.mk, we have the following two (expanded) rules.
 #
 # compiler/stage1/package-data.mk : inplace/bin/ghc-cabal
 #         # inplace/bin/ghc-cabal configure ... (which is effectively):
 #         touch compiler/stage1/inplace-pkg-config
 #         touch "$@"
 #
 # compiler/stage1/inplace-pkg-config : compiler/stage1/package-data.mk
 #
 # And in compiler/ghc.mk:
 #
 # compiler/stage1/inplace-pkg-config-munged: compiler/stage1/inplace-pkg-
 config
 #         sed ... "$@"
 #
 # What seems to work as a fix is changing the rule for inplace-pkg-config
 to:
 #
 # compiler/stage1/inplace-pkg-config : compiler/stage1/package-data.mk ;
 #
 # Note the semicolon, which turns this into an empty recipe [1]. No recipe
 is
 # not the same as an empty recipe. I don't quite understand why this works
 # though, or how robust this fix is.
 # See also [2] for why the original rule might be flawed (it should have
 # failed for `-j1` as well). It doesn't follow best practice number 2 from
 # [3], from the GNU make maintainer's blog:
 #
 # "Every non-.PHONY rule *must* update a file with the exact name of its
 target."
 #
 # TODO: can we find all such flawed rules in the ghc build system?
 # (using some sort of makelint).
 #
 # References:
 # [1] https://www.gnu.org/software/make/manual/html_node/Empty-
 Recipes.html
 # [2] https://stackoverflow.com/questions/12724137/why-does-make-not-
 consider-a-target-without-recipe-out-of-date-when-updated-by-a
 # [3] http://make.mad-scientist.net/papers/rules-of-makefiles/
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9709#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list