X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=Makefile;h=bca8e86432c37987666149a5586415eef0fbeb48;hp=726801db0286ad4017e68823392c27919cc0a4b9;hb=442f06cc8f9f729d33a8de3aa14cdaf80545808e;hpb=34cc75e1a62638f2833815746ebce0a9114dc26b diff --git a/Makefile b/Makefile index 726801d..bca8e86 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,14 @@ +# ----------------------------------------------------------------------------- +# +# (c) 2009 The University of Glasgow +# +# This file is part of the GHC build system. +# +# To understand how the build system works and how to modify it, see +# http://hackage.haskell.org/trac/ghc/wiki/Building/Architecture +# http://hackage.haskell.org/trac/ghc/wiki/Building/Modifying +# +# ----------------------------------------------------------------------------- ifeq "$(wildcard distrib/)" "" @@ -18,87 +29,6 @@ show: else -# The problem we need to solve is as follows. -# -# GNU make supports included Makefiles, and it is clever enough to try -# to update those Makefiles when they are out-of-date or missing. It -# first reads all the Makefiles, and then tries to build each one if -# it is out-of-date, using the rules in the Makefiles themselves. -# When it has brought all the Makefiles up-to-date, it restarts itself -# to read the newly-generated Makefiles. -# -# This works fine, unless there are dependencies *between* the -# Makefiles. For example in the GHC build, for each package we have a -# package-data.mk file which is generated by the ghc-cabal program, -# and we have a .depend file. The .depend file cannot be generated -# until package-data.mk has been generated and make has been restarted -# to read in its contents, because it is the package-data.mk file that -# tells us which modules are in the package. But make always makes -# all the Makefiles before restarting - it doesn't take into account a -# dependency between Makefiles and restart itself earlier. - -# Consider the following makefile: - -# -------------------- -# all : -# -# include inc1.mk -# -# inc1.mk : Makefile -# echo "X = C" >$@ -# -# include inc2.mk -# -# inc2.mk : inc1.mk -# echo "Y = $(X)" >$@ -# -------------------- - -# Now try it: -# -# $ make -f fail.mk -# fail.mk:3: inc1.mk: No such file or directory -# fail.mk:8: inc2.mk: No such file or directory -# echo "X = C" >inc1.mk -# echo "Y = " >inc2.mk -# make: Nothing to be done for `all'. - -# make built both inc1.mk and inc2.mk without restarting itself -# between the two (even though we added a dependency on inc1.mk from -# inc2.mk). -# -# The solution we adopt in the GHC build system is essentially this: - -# -------------------- -# PHASE = 0 -# -# ifeq "$(PHASE)" "0" -# all : -# $(MAKE) PHASE=1 -# else -# all : -# endif -# -# -include inc1.mk -# -# inc1.mk : Makefile -# echo "X = C" >$@ -# -# ifneq "$(PHASE)" "0" -# include inc2.mk -# -# inc2.mk : inc1.mk -# echo "Y = $(X)" >$@ -# endif -# -# clean : -# rm -f inc1.mk inc2.mk -# -------------------- - -# That is, every time make is invoked, we force it to update inc1.mk -# and then restart. In the GHC build system we need to divide the -# build into 4 phases in fact, with a restart between each phase. See -# ghc.mk for the details on what happens in each phase and why. - default : all @: