update reference to compiler/coq subproject
[ghc-hetmet.git] / ghc.mk
diff --git a/ghc.mk b/ghc.mk
index 75419e0..f818482 100644 (file)
--- a/ghc.mk
+++ b/ghc.mk
@@ -1,3 +1,4 @@
+
 # -----------------------------------------------------------------------------
 #
 # (c) 2009 The University of Glasgow
@@ -85,11 +86,6 @@ else
 $(error Make has restarted itself $(MAKE_RESTARTS) times; is there a makefile bug?)
 endif
 
-# Just bring makefiles up to date:
-.PHONY: just-makefiles
-just-makefiles:
-       @:
-
 ifneq "$(CLEANING)" "YES"
 CLEANING = NO
 endif
@@ -140,9 +136,14 @@ $(error $$(GhcLibWays) is empty, it must contain at least one way)
 endif
 endif
 
+ifeq "$(phase)" ""
+phase = final
+endif
+
 # -----------------------------------------------------------------------------
 # Utility definitions
 
+include rules/prof.mk
 include rules/trace.mk
 include rules/make-command.mk
 
@@ -227,6 +228,7 @@ include rules/package-config.mk
 # Building dependencies
 
 include rules/build-dependencies.mk
+include rules/include-dependencies.mk
 
 # -----------------------------------------------------------------------------
 # Build package-data.mk files
@@ -282,115 +284,6 @@ include rules/bindist.mk
        "$(MKDIRHIER)" $@
 
 # -----------------------------------------------------------------------------
-# Phase handling
-
-phase_0_or_later = YES
-ifeq "$(findstring $(phase),0)" ""
-phase_0_done = YES
-phase_1_or_later = YES
-endif
-ifeq "$(findstring $(phase),0 1)" ""
-phase_1_done = YES
-phase_2_or_later = YES
-endif
-ifeq "$(findstring $(phase),0 1 2)" ""
-phase_2_done = YES
-phase_3_or_later = YES
-endif
-ifeq "$(findstring $(phase),0 1 2 3)" ""
-phase_3_done = YES
-phase_4_or_later = YES
-endif
-ifeq "$(findstring $(phase),0 1 2 3 4)" ""
-phase_4_done = YES
-endif
-
-includes_dist-derivedconstants_CONFIGURE_PHASE = 0
-includes_dist-ghcconstants_CONFIGURE_PHASE = 0
-
-# We do these first, as making the sources for some later
-# packages needs them, and we need the sources before we can
-# work out dependencies
-utils/hsc2hs_dist_CONFIGURE_PHASE = 0
-utils/unlit_dist_CONFIGURE_PHASE = 0
-utils/genprimopcode_dist_CONFIGURE_PHASE = 0
-
-# Then the bootlibs
-libraries/hpc_dist-boot_CONFIGURE_PHASE = 1
-libraries/extensible-exceptions_dist-boot_CONFIGURE_PHASE = 1
-libraries/Cabal_dist-boot_CONFIGURE_PHASE = 1
-libraries/binary_dist-boot_CONFIGURE_PHASE = 1
-libraries/bin-package-db_dist-boot_CONFIGURE_PHASE = 1
-
-# We put the stage 1 compiler package in a later phase than the bootlibs
-# for the same reasone we have the
-#     $(compiler_stage1_depfile_haskell) : $(BOOT_LIBS)
-# dependency below
-compiler_stage1_CONFIGURE_PHASE = 2
-
-# Now we make the stage 1 compiler binary. Again, in a later phase than
-# its package for the same reason as the
-#     $(ghc_stage1_depfile_haskell) : $(compiler_stage1_v_LIB)
-# dep below
-ghc_stage1_CONFIGURE_PHASE = 3
-
-# Finally, the stage1 compiler is used to make the dependencies for
-# everything else, so we can now build the rest.
-compiler_stage2_CONFIGURE_PHASE = 4
-ghc_stage2_CONFIGURE_PHASE = 4
-
-libraries/ghc-prim_dist-install_CONFIGURE_PHASE = 4
-libraries/integer-gmp_dist-install_CONFIGURE_PHASE = 4
-libraries/base_dist-install_CONFIGURE_PHASE = 4
-libraries/filepath_dist-install_CONFIGURE_PHASE = 4
-libraries/array_dist-install_CONFIGURE_PHASE = 4
-libraries/bytestring_dist-install_CONFIGURE_PHASE = 4
-libraries/containers_dist-install_CONFIGURE_PHASE = 4
-libraries/unix_dist-install_CONFIGURE_PHASE = 4
-libraries/old-locale_dist-install_CONFIGURE_PHASE = 4
-libraries/old-time_dist-install_CONFIGURE_PHASE = 4
-libraries/time_dist-install_CONFIGURE_PHASE = 4
-libraries/directory_dist-install_CONFIGURE_PHASE = 4
-libraries/process_dist-install_CONFIGURE_PHASE = 4
-libraries/extensible-exceptions_dist-install_CONFIGURE_PHASE = 4
-libraries/hpc_dist-install_CONFIGURE_PHASE = 4
-libraries/pretty_dist-install_CONFIGURE_PHASE = 4
-libraries/template-haskell_dist-install_CONFIGURE_PHASE = 4
-libraries/Cabal_dist-install_CONFIGURE_PHASE = 4
-libraries/binary_dist-install_CONFIGURE_PHASE = 4
-libraries/bin-package-db_dist-install_CONFIGURE_PHASE = 4
-libraries/mtl_dist-install_CONFIGURE_PHASE = 4
-libraries/utf8-string_dist-install_CONFIGURE_PHASE = 4
-libraries/xhtml_dist-install_CONFIGURE_PHASE = 4
-libraries/terminfo_dist-install_CONFIGURE_PHASE = 4
-libraries/haskeline_dist-install_CONFIGURE_PHASE = 4
-libraries/random_dist-install_CONFIGURE_PHASE = 4
-libraries/haskell98_dist-install_CONFIGURE_PHASE = 4
-libraries/haskell2010_dist-install_CONFIGURE_PHASE = 4
-libraries/primitive_dist-install_CONFIGURE_PHASE = 4
-libraries/vector_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-base_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-prim-interface_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-prim-seq_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-prim-par_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-seq_dist-install_CONFIGURE_PHASE = 4
-libraries/dph/dph-par_dist-install_CONFIGURE_PHASE = 4
-
-utils/hp2ps_dist_CONFIGURE_PHASE = 4
-utils/genapply_dist_CONFIGURE_PHASE = 4
-utils/haddock_dist_CONFIGURE_PHASE = 4
-utils/hsc2hs_dist-install_CONFIGURE_PHASE = 4
-utils/ghc-pkg_dist-install_CONFIGURE_PHASE = 4
-utils/hpc_dist_CONFIGURE_PHASE = 4
-utils/runghc_dist_CONFIGURE_PHASE = 4
-utils/ghctags_dist_CONFIGURE_PHASE = 4
-utils/ghc-pwd_dist_CONFIGURE_PHASE = 4
-utils/ghc-cabal_dist-install_CONFIGURE_PHASE = 4
-utils/mkUserGuidePart_dist_CONFIGURE_PHASE = 4
-utils/compare_sizes_dist_CONFIGURE_PHASE = 4
-
-
-# -----------------------------------------------------------------------------
 # Packages
 
 # --------------------------------
@@ -419,7 +312,7 @@ TH_PACKAGES := $(DPH_PACKAGES)
 #
 # We assume that the stage0 compiler has a suitable bytestring package,
 # so we don't have to include it below.
-STAGE0_PACKAGES = Cabal hpc extensible-exceptions binary bin-package-db
+STAGE0_PACKAGES = Cabal hpc extensible-exceptions binary bin-package-db hoopl
 
 # These packages are installed, but are installed hidden
 # Why install them at all?  Because the 'ghc' package depends on them
@@ -502,6 +395,7 @@ $(eval $(call addPackage,template-haskell))
 $(eval $(call addPackage,Cabal))
 $(eval $(call addPackage,binary))
 $(eval $(call addPackage,bin-package-db))
+$(eval $(call addPackage,hoopl))
 $(eval $(call addPackage,mtl))
 $(eval $(call addPackage,utf8-string))
 $(eval $(call addPackage,xhtml))
@@ -607,19 +501,17 @@ libraries/ghc-prim_dist-install_EXTRA_HADDOCK_SRCS = libraries/ghc-prim/dist-ins
 ifneq "$(CLEANING)" "YES"
 ifeq "$(INTEGER_LIBRARY)" "integer-gmp"
 libraries/base_dist-install_CONFIGURE_OPTS += --flags=-integer-simple
+else ifeq "$(INTEGER_LIBRARY)" "integer-simple"
+libraries/base_dist-install_CONFIGURE_OPTS += --flags=integer-simple
 else
-    ifeq "$(INTEGER_LIBRARY)" "integer-simple"
-       libraries/base_dist-install_CONFIGURE_OPTS += --flags=integer-simple
-    else
 $(error Unknown integer library: $(INTEGER_LIBRARY))
-    endif
 endif
 endif
 
 # ----------------------------------------------
 # Checking packages with 'cabal check'
 
-ifeq "$(phase)" ""
+ifeq "$(phase)" "final"
 ifeq "$(CHECK_PACKAGES)" "YES"
 all: check_packages
 endif
@@ -638,40 +530,6 @@ CHECKED_compiler = YES
 # -----------------------------------------------------------------------------
 # Include build instructions from all subdirs
 
-# For the rationale behind the build phases, see
-#   http://hackage.haskell.org/trac/ghc/wiki/Building/Architecture/Idiom/PhaseOrdering
-
-# Setting foo_dist_DISABLE=YES means "in directory foo, for build
-# "dist", just read the package-data.mk file, do not build anything".
-
-# We carefully engineer things so that we can build the
-# package-data.mk files early on: they depend only on a few tools also
-# built early.  Having got the package-data.mk files built, we can
-# restart make with up-to-date information about all the packages
-# (this is phase 0).  The remaining problem is the .depend files:
-#
-#   - .depend files in libraries need the stage 1 compiler to build
-#   - ghc/stage1/.depend needs compiler/stage1 built
-#   - compiler/stage1/.depend needs the bootstrap libs built
-#
-# GHC 6.11+ can build a .depend file without having built the
-# dependencies of the package, but we can't rely on the bootstrapping
-# compiler being able to do this, which is why we have to separate the
-# three phases above.
-
-# So this is the final ordering:
-
-# Phase 0 : all package-data.mk files
-#           (requires ghc-cabal, ghc-pkg, mkdirhier etc.)
-# Phase 1 : .depend files for bootstrap libs
-#           (requires hsc2hs)
-# Phase 2 : compiler/stage1/.depend
-#           (requires bootstrap libs and genprimopcode)
-# Phase 3 : ghc/stage1/.depend
-#           (requires compiler/stage1)
-#
-# The rest : libraries/*/dist-install, compiler/stage2, ghc/stage2
-
 ifneq "$(BINDIST)" "YES"
 BUILD_DIRS += \
    $(GHC_MKDIRHIER_DIR)
@@ -717,6 +575,8 @@ endif
 
 ifeq "$(INTEGER_LIBRARY)" "integer-gmp"
 BUILD_DIRS += libraries/integer-gmp/gmp
+else ifneq "$(findstring clean,$(MAKECMDGOALS))" ""
+BUILD_DIRS += libraries/integer-gmp/gmp
 endif
 
 BUILD_DIRS += \
@@ -751,42 +611,8 @@ BUILD_DIRS += \
    $(patsubst %, libraries/%, $(PACKAGES_STAGE2))
 endif
 
-# XXX libraries/% must come before any programs built with stage1, see
-# Note [lib-depends].
-
-ifeq "$(phase)" "0"
-$(foreach lib,$(STAGE0_PACKAGES),$(eval \
-  libraries/$(lib)_dist-boot_DISABLE = YES))
-endif
-
-ifneq "$(findstring $(phase),0 1)" ""
-# We can build deps for compiler/stage1 in phase 2
-compiler_stage1_DISABLE = YES
-endif
-
-ifneq "$(findstring $(phase),0 1 2)" ""
-ghc_stage1_DISABLE = YES
-endif
-
-ifneq "$(findstring $(phase),0 1 2 3)" ""
-# In phases 0-3, we disable stage2-3, the full libraries and haddock
-utils/haddock_dist_DISABLE = YES
-utils/runghc_dist_DISABLE = YES
-utils/ghctags_dist_DISABLE = YES
-utils/hpc_dist_DISABLE = YES
-utils/hsc2hs_dist-install_DISABLE = YES
-utils/ghc-cabal_dist-install_DISABLE = YES
-utils/ghc-pkg_dist-install_DISABLE = YES
-utils/ghc-pwd_dist_DISABLE = YES
-utils/mkUserGuidePart_dist_DISABLE = YES
-utils/compare_sizes_dist_DISABLE = YES
-compiler_stage2_DISABLE = YES
-compiler_stage3_DISABLE = YES
-ghc_stage2_DISABLE = YES
-ghc_stage3_DISABLE = YES
-$(foreach lib,$(PACKAGES) $(PACKAGES_STAGE2),$(eval \
-  libraries/$(lib)_dist-install_DISABLE = YES))
-endif
+# ----------------------------------------------
+# Actually include all the sub-ghc.mk's
 
 include $(patsubst %, %/ghc.mk, $(BUILD_DIRS))
 
@@ -820,9 +646,9 @@ $(foreach p,$(STAGE0_PACKAGES),$(eval libraries/$p_dist-boot_DO_HADDOCK = NO))
 
 # Build the Haddock contents and index
 ifeq "$(HADDOCK_DOCS)" "YES"
-libraries/index.html: inplace/bin/haddock $(ALL_HADDOCK_FILES)
+libraries/index.html: inplace/bin/haddock$(exeext) $(ALL_HADDOCK_FILES)
        cd libraries && sh gen_contents_index --inplace
-ifeq "$(phase)" ""
+ifeq "$(phase)" "final"
 $(eval $(call all-target,library_doc_index,libraries/index.html))
 endif
 INSTALL_LIBRARY_DOCS += libraries/*.html libraries/*.gif libraries/*.css libraries/*.js
@@ -854,6 +680,7 @@ $(eval $(call build-package,libraries/extensible-exceptions,dist-boot,0))
 $(eval $(call build-package,libraries/Cabal,dist-boot,0))
 $(eval $(call build-package,libraries/binary,dist-boot,0))
 $(eval $(call build-package,libraries/bin-package-db,dist-boot,0))
+$(eval $(call build-package,libraries/hoopl,dist-boot,0))
 
 # register the boot packages in strict sequence, because running
 # multiple ghc-pkgs in parallel doesn't work (registrations may get
@@ -861,25 +688,7 @@ $(eval $(call build-package,libraries/bin-package-db,dist-boot,0))
 fixed_pkg_prev=
 $(foreach pkg,$(STAGE0_PACKAGES),$(eval $(call fixed_pkg_dep,$(pkg),dist-boot)))
 
-compiler/stage1/package-data.mk : \
-    libraries/Cabal/dist-boot/package-data.mk \
-    libraries/hpc/dist-boot/package-data.mk \
-    libraries/extensible-exceptions/dist-boot/package-data.mk \
-    libraries/bin-package-db/dist-boot/package-data.mk
-
-# These are necessary because the bootstrapping compiler may not know
-# about cross-package dependencies:
-$(compiler_stage1_depfile_haskell) : $(BOOT_LIBS)
-$(ghc_stage1_depfile_haskell) : $(compiler_stage1_v_LIB)
-
-# A few careful dependencies between bootstrapping packages.  When we
-# can rely on the stage 0 compiler being able to generate
-# cross-package dependencies with -M (fixed in GHC 6.12.1) we can drop
-# these, and also some of the phases.
-#
-# If you miss any out here, then 'make -j8' will probably tell you.
-#
-libraries/bin-package-db/dist-boot/build/Distribution/InstalledPackageInfo/Binary.$(v_osuf) : libraries/binary/dist-boot/build/Data/Binary.$(v_hisuf) libraries/Cabal/dist-boot/build/Distribution/InstalledPackageInfo.$(v_hisuf)
+compiler/stage1/package-data.mk : $(fixed_pkg_prev)
 
 # Make sure we have all the GHCi libs by the time we've built
 # ghc-stage2.  DPH includes a bit of Template Haskell which needs the
@@ -1326,17 +1135,6 @@ clean : clean_files clean_libraries
 clean_files :
        "$(RM)" $(RM_OPTS) $(CLEAN_FILES)
 
-ifneq "$(NO_CLEAN_GMP)" "YES"
-CLEAN_FILES += libraries/integer-gmp/gmp/gmp.h
-CLEAN_FILES += libraries/integer-gmp/gmp/libgmp.a
-
-clean : clean_gmp
-.PHONY: clean_gmp
-clean_gmp:
-       "$(RM)" $(RM_OPTS_REC) libraries/integer-gmp/gmp/objs
-       "$(RM)" $(RM_OPTS_REC) libraries/integer-gmp/gmp/gmpbuild
-endif
-
 .PHONY: clean_libraries
 clean_libraries: $(patsubst %,clean_libraries/%_dist-install,$(PACKAGES) $(PACKAGES_STAGE2))
 clean_libraries: $(patsubst %,clean_libraries/%_dist-boot,$(STAGE0_PACKAGES))
@@ -1402,3 +1200,27 @@ bootstrapping-files: includes/GHCConstants.h
 
 .DELETE_ON_ERROR:
 
+# -----------------------------------------------------------------------------
+# Numbered phase targets
+
+.PHONY: phase_0_builds
+phase_0_builds: $(utils/hsc2hs_dist_depfile_haskell)
+phase_0_builds: $(utils/hsc2hs_dist_depfile_c_asm)
+phase_0_builds: $(utils/genprimopcode_dist_depfile_haskell)
+phase_0_builds: $(utils/genprimopcode_dist_depfile_c_asm)
+
+.PHONY: phase_1_builds
+phase_1_builds: $(PACKAGE_DATA_MKS)
+
+# -----------------------------------------------------------------------------
+# Support for writing GHC passes in Coq
+
+compiler/coq/Makefile:
+       git submodule update --init compiler/coq
+       cd compiler/coq/; git checkout master
+compiler/coq/build/CoqPass.hs: compiler/coq/Makefile $(wildcard compiler/coq/src/*.v) $(wildcard compiler/coq/src/*.hs)
+       cd compiler/coq; make
+compiler/stage1/build/CoqPass.hs: compiler/coq/build/CoqPass.hs
+       cp compiler/coq/build/CoqPass.hs $@
+compiler/stage2/build/CoqPass.hs: compiler/coq/build/CoqPass.hs
+       cp compiler/coq/build/CoqPass.hs $@