X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=Makefile;h=0929f284ca20b903733b7d9eca5756caf91af4c1;hp=726801db0286ad4017e68823392c27919cc0a4b9;hb=e5c3b478b3cd1707cf122833822f44b2ac09b8e9;hpb=34cc75e1a62638f2833815746ebce0a9114dc26b diff --git a/Makefile b/Makefile index 726801d..0929f28 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/)" "" @@ -8,136 +19,100 @@ default: @echo 'Run "make install" to install' @false -.PHONY: install -install: - $(MAKE) -r --no-print-directory -f ghc.mk install BINDIST=YES NO_INCLUDE_DEPS=YES - -.PHONY: show -show: - $(MAKE) -r --no-print-directory -f ghc.mk $@ +.PHONY: install show +install show: + $(MAKE) -r --no-print-directory -f ghc.mk $@ BINDIST=YES NO_INCLUDE_DEPS=YES 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 @: +# For help, type 'make help' +.PHONY: help +help : + @cat MAKEHELP + +ifneq "$(findstring clean,$(MAKECMDGOALS))" "" +-include mk/config.mk +else +include mk/config.mk +ifeq "$(ProjectVersion)" "" +$(error Please run ./configure first) +endif +endif + +include mk/custom-settings.mk + # No need to update makefiles for these targets: -REALGOALS=$(filter-out clean clean_% distclean maintainer-clean show,$(MAKECMDGOALS)) +REALGOALS=$(filter-out binary-dist binary-dist-prep bootstrapping-files framework-pkg clean clean_% distclean maintainer-clean show help test fulltest,$(MAKECMDGOALS)) + +# configure touches certain files even if they haven't changed. This +# can mean a lot of unnecessary recompilation after a re-configure, so +# here we cache the old versions of these files so we can restore the +# timestamps. +%.old: % + @set -x && test -f $@ && cmp -s $< $@ || cp -p $< $@ + touch -r $@ $< + # NB. not the same as saying '%: ...', which doesn't do the right thing: # it does nothing if we specify a target that already exists. .PHONY: $(REALGOALS) -$(REALGOALS) all: - @echo "===--- updating makefiles phase 0" - $(MAKE) -r --no-print-directory -f ghc.mk phase=0 just-makefiles - @echo "===--- updating makefiles phase 1" - $(MAKE) -r --no-print-directory -f ghc.mk phase=1 just-makefiles - @echo "===--- updating makefiles phase 2" - $(MAKE) -r --no-print-directory -f ghc.mk phase=2 just-makefiles - @echo "===--- updating makefiles phase 3" - $(MAKE) -r --no-print-directory -f ghc.mk phase=3 just-makefiles - @echo "===--- finished updating makefiles" - $(MAKE) -r --no-print-directory -f ghc.mk $@ +$(REALGOALS) all: mk/config.mk.old mk/project.mk.old compiler/ghc.cabal.old +ifneq "$(OMIT_PHASE_0)" "YES" + @echo "===--- building phase 0" + $(MAKE) -r --no-print-directory -f ghc.mk phase=0 phase_0_builds +endif +ifneq "$(OMIT_PHASE_1)" "YES" + @echo "===--- building phase 1" + $(MAKE) -r --no-print-directory -f ghc.mk phase=1 phase_1_builds +endif + @echo "===--- building final phase" + $(MAKE) -r --no-print-directory -f ghc.mk phase=final $@ + +binary-dist: binary-dist-prep +ifeq "$(mingw32_TARGET_OS)" "1" + mv bindistprep/*.exe . +endif + mv bindistprep/*.tar.bz2 . -binary-dist: +binary-dist-prep: +ifeq "$(mingw32_TARGET_OS)" "1" + $(MAKE) -r --no-print-directory -f ghc.mk windows-binary-dist-prep + $(MAKE) -r --no-print-directory -f ghc.mk windows-installer +else rm -f bindist-list $(MAKE) -r --no-print-directory -f ghc.mk bindist BINDIST=YES - $(MAKE) -r --no-print-directory -f ghc.mk binary-dist + $(MAKE) -r --no-print-directory -f ghc.mk unix-binary-dist-prep +endif clean distclean maintainer-clean: - $(MAKE) -r --no-print-directory -f ghc.mk $@ + $(MAKE) -r --no-print-directory -f ghc.mk $@ CLEANING=YES test ! -d testsuite || $(MAKE) -C testsuite $@ $(filter clean_%, $(MAKECMDGOALS)) : clean_% : - $(MAKE) -r --no-print-directory -f ghc.mk $@ + $(MAKE) -r --no-print-directory -f ghc.mk $@ CLEANING=YES -show: +bootstrapping-files show: $(MAKE) -r --no-print-directory -f ghc.mk $@ +ifeq "$(darwin_TARGET_OS)" "1" +framework-pkg: + $(MAKE) -C distrib/MacOS $@ +endif + # If the user says 'make A B', then we don't want to invoke two # instances of the rule above in parallel: .NOTPARALLEL: endif +.PHONY: test +test: + $(MAKE) -C testsuite/tests/ghc-regress CLEANUP=1 OUTPUT_SUMMARY=../../../testsuite_summary.txt fast + +.PHONY: fulltest +fulltest: + $(MAKE) -C testsuite/tests/ghc-regress CLEANUP=1 OUTPUT_SUMMARY=../../../testsuite_summary.txt +