Add -fdefer-diagnostics to defer and group diagnostic messages in make-mode
[ghc.git] / mk / config.mk.in
index afe48ab..0119e9a 100644 (file)
@@ -48,10 +48,6 @@ NO_INCLUDE_PKGDATA = NO
 # The compiler used to build GHC is $(GHC).  To change the actual compiler
 # used, re-configure with --with-ghc=<path-to-ghc>.
 
-# Extra ways in which to build the compiler (for example, you might want to
-# build a profiled compiler so you can see where it spends its time)
-GhcCompilerWays=
-
 # Extra option flags to pass to the compiler that compiles the compiler
 # (Ones that are essential are wired into compiler/Makefile)
 # Typical options to use here:
@@ -68,26 +64,47 @@ GhcHcOpts=-Rghc-timing
 # Extra options added to specific stages of the compiler bootstrap.
 # These are placed later on the command line, and may therefore
 # override options from $(GhcHcOpts).
+#
+# See Note [Stage number in build variables].
+#
+# -haddock is needed so the GHCi :doc command can find docs
+#   in the .hi-files for the ghc library
 GhcStage1HcOpts=
-GhcStage2HcOpts=-O2
-GhcStage3HcOpts=-O2
-
-# These options modify whether or not a built compiler for a bootstrap
-# stage defaults to using the new code generation path.  The new
-# code generation path is a bit slower, so for development just
-# GhcStage2DefaultNewCodegen=YES, but it's also a good idea to try
-# building all libraries and the stage2 compiler with the
-# new code generator, which involves GhcStage1DefaultNewCodegen=YES.
-GhcStage1DefaultNewCodegen=NO
-GhcStage2DefaultNewCodegen=NO
-GhcStage3DefaultNewCodegen=NO
+GhcStage2HcOpts=-O2 -haddock
+GhcStage3HcOpts=-O2 -haddock
+
+
+# Note [Stage number in build variables].
+#
+# There are (unfortunately) two different naming schemes for build variables
+# specific to a certain stage.
+#
+# * GhcStage1HcOpts/GhcStage2HcOpts/GhcStage3HcOpts:
+#
+#   The stage number refers to the compiler stage being built (ghc library
+#   and executable).
+#
+# * SRC_HC_OPTS_STAGE$4 and SRC_HC_WARNING_OPTS_STAGE$4:
+#
+#   The stage number refers to the compiler stage the options are passed to.
 
 GhcDebugged=NO
-GhcDynamic=NO
 
 # GhcProfiled=YES means compile a profiled stage-2 compiler
 GhcProfiled=NO
 
+# WITH_TERMINFO can be used to disable terminfo support throughout the compiler
+# and its tools. This is handy in the case of cross-compilation, where we may
+# not have an ncurses build for the target.
+ifeq "$(TargetOS_CPP)" "ios"
+# iOS has no terminfo support
+WITH_TERMINFO=NO
+else ifeq "$(Windows_Target)" "YES"
+WITH_TERMINFO=NO
+else
+WITH_TERMINFO=YES
+endif
+
 ifeq "$(findstring $(TargetOS_CPP),linux freebsd dragonfly openbsd netbsd solaris2 kfreebsdgnu haiku linux-android)" ""
 TargetElf = NO
 else
@@ -95,11 +112,10 @@ TargetElf = YES
 endif
 
 # Some platforms don't support shared libraries
-NoSharedLibsPlatformList = powerpc-unknown-linux \
+NoSharedLibsPlatformList = \
+       powerpc-ibm-aix \
        x86_64-unknown-mingw32 \
-       i386-unknown-mingw32 \
-       sparc-sun-solaris2 \
-       sparc-unknown-linux
+       i386-unknown-mingw32
 
 ifeq "$(SOLARIS_BROKEN_SHLD)" "YES"
 NoSharedLibsPlatformList += i386-unknown-solaris2
@@ -161,28 +177,33 @@ GhcUnregisterised=@Unregisterised@
 # (as well as a C backend)
 #
 # Target platforms supported:
-#   i386, powerpc
-#   IOS and AIX are not supported
-ArchSupportsNCG=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 powerpc sparc)))
-OsSupportsNCG=$(strip $(patsubst $(TargetOS_CPP), YES, $(patsubst ios,,$(patsubst aix,,$(TargetOS_CPP)))))
+#   i386, powerpc, powerpc64, sparc
+#   IOS is not supported
+ArchSupportsNCG=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 powerpc powerpc64 powerpc64le sparc)))
+OsSupportsNCG=$(strip $(patsubst $(TargetOS_CPP), YES, $(patsubst ios,,$(TargetOS_CPP))))
 
 GhcWithNativeCodeGen := $(strip\
     $(if $(filter YESYESNO,\
                  $(OsSupportsNCG)$(ArchSupportsNCG)$(GhcUnregisterised)),YES,NO))
 
-HaveLibDL = @HaveLibDL@
-
 # ArchSupportsSMP should be set iff there is support for that arch in
 # includes/stg/SMP.h
-ArchSupportsSMP=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 sparc powerpc arm)))
+ifeq "$(TargetArch_CPP)" "arm"
+# We don't support load/store barriers pre-ARMv7. See #10433.
+ArchSupportsSMP=$(if $(filter $(ARM_ISA),ARMv5 ARMv6),NO,YES)
+else
+ArchSupportsSMP=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 sparc powerpc powerpc64 powerpc64le aarch64)))
+endif
 
+# The THREADED_RTS requires `BaseReg` to be in a register and the
+# `GhcUnregisterised` mode doesn't allow that.
 GhcWithSMP := $(strip $(if $(filter YESNO, $(ArchSupportsSMP)$(GhcUnregisterised)),YES,NO))
 
 # Whether to include GHCi in the compiler.  Depends on whether the RTS linker
 # has support for this OS/ARCH combination.
 
-OsSupportsGHCi=$(strip $(patsubst $(TargetOS_CPP), YES, $(findstring $(TargetOS_CPP), mingw32 cygwin32 linux solaris2 freebsd dragonfly netbsd openbsd darwin kfreebsdgnu)))
-ArchSupportsGHCi=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 powerpc sparc sparc64 arm)))
+OsSupportsGHCi=$(strip $(patsubst $(TargetOS_CPP), YES, $(findstring $(TargetOS_CPP), mingw32 linux solaris2 freebsd dragonfly netbsd openbsd darwin kfreebsdgnu)))
+ArchSupportsGHCi=$(strip $(patsubst $(TargetArch_CPP), YES, $(findstring $(TargetArch_CPP), i386 x86_64 powerpc powerpc64 powerpc64le sparc sparc64 arm aarch64)))
 
 ifeq "$(OsSupportsGHCi)$(ArchSupportsGHCi)" "YESYES"
 GhcWithInterpreter=YES
@@ -195,7 +216,7 @@ endif
 # (see TABLES_NEXT_TO_CODE in the RTS).  Whether we actually compile for
 # TABLES_NEXT_TO_CODE depends on whether we're building unregisterised
 # code or not, which may be decided by options to the compiler later.
-ifneq "$(findstring $(TargetArch_CPP)X, ia64X powerpc64X)" ""
+ifneq "$(findstring $(TargetArch_CPP)X, ia64X powerpc64X powerpc64leX)" ""
 GhcEnableTablesNextToCode=NO
 else
 GhcEnableTablesNextToCode=YES
@@ -235,15 +256,20 @@ ExtraMakefileSanityChecks = NO
 INTEGER_LIBRARY=integer-gmp
 
 # We build the libraries at least the "vanilla" way (way "v")
+# Technically we don't need the v way if DYNAMIC_GHC_PROGRAMS is YES,
+# but with -dynamic-too it's cheap, and makes life easier.
 GhcLibWays = v
 
 # In addition to the normal sequential way, the default is to also build
 # profiled prelude libraries
-GhcLibWays += p
+# $(if $(filter ...)) allows controlling this expression from build.mk.
+GhcLibWays += $(if $(filter $(BUILD_PROF_LIBS),NO),,p)
 
-ifeq "$(PlatformSupportsSharedLibs)" "YES"
-GhcLibWays += dyn
-endif
+# Backward compatibility: although it would be cleaner to test for
+# PlatformSupportsSharedLibs, or perhaps a new variable BUILD_SHARED_LIBS,
+# some users currently expect that DYNAMIC_GHC_PROGRAMS=NO in build.mk implies
+# that dyn is not added to GhcLibWays.
+GhcLibWays += $(if $(filter $(DYNAMIC_GHC_PROGRAMS),NO),,dyn)
 
 # Handy way to test whether we're building shared libs or not.
 BuildSharedLibs=$(strip $(if $(findstring dyn,$(GhcLibWays)),YES,NO))
@@ -251,14 +277,21 @@ BuildSharedLibs=$(strip $(if $(findstring dyn,$(GhcLibWays)),YES,NO))
 # In addition, the RTS is built in some further variations.  Ways that
 # make sense here:
 #
-#   thr         : threaded
-#   thr_p       : threaded profiled
-#   debug       : debugging (compile with -g for the C compiler, and -DDEBUG)
-#   debug_p     : debugging profiled
-#   thr_debug   : debugging threaded
-#   thr_debug_p : debugging threaded profiled
-#   l           : event logging
-#   thr_l       : threaded and event logging
+#   thr           : threaded
+#   thr_p         : threaded + profiled + eventlog
+#   debug         : debugging + eventlog
+#   thr_debug     : debugging + threaded, + eventlog
+#   l             : eventlog
+#   p             : profiled + eventlog
+#   thr_l         : threaded + eventlog
+#
+# Note how there are a few cases which are handled specially (in packageHsLibs)
+# to reduce the number of distinct ways,
+#
+#   debug     implies  eventlog
+#   profiled  implies  eventlog
+#
+# This means, for instance, that there is no debug_l way.
 #
 GhcRTSWays=l
 
@@ -270,6 +303,7 @@ GhcRTSWays += debug
 GhcRTSWays += thr thr_debug thr_l
 GhcRTSWays += $(if $(findstring p, $(GhcLibWays)),thr_p,)
 GhcRTSWays += $(if $(findstring dyn, $(GhcLibWays)),dyn debug_dyn thr_dyn thr_debug_dyn l_dyn thr_l_dyn,)
+GhcRTSWays += $(if $(findstring p, $(GhcLibWays)),thr_debug_p debug_p,)
 
 # We can only build GHCi threaded if we have a threaded RTS:
 GhcThreaded = $(if $(findstring thr,$(GhcRTSWays)),YES,NO)
@@ -281,8 +315,11 @@ GhcThreaded = $(if $(findstring thr,$(GhcRTSWays)),YES,NO)
 #
 #      -O(2) is pretty desirable, otherwise no inlining of prelude
 #              things (incl "+") happens when compiling with this compiler
+#
+#       -haddock is needed so the GHCi :doc command can find the boot
+#               library docs in the respective .hi-files
 
-GhcLibHcOpts=-O2
+GhcLibHcOpts=-O2 -haddock
 
 # Strip local symbols from libraries?  This can make the libraries smaller,
 # but makes debugging somewhat more difficult.  Doesn't work with all ld's.
@@ -298,28 +335,41 @@ StripLibraries=NO
 #              system needs to do other special magic if you are
 #              doing object-file splitting
 
-ArchSupportsSplitObjs=$(strip $(if $(filter $(TargetArch_CPP),i386 x86_64 powerpc sparc),YES,NO))
-OsSupportsSplitObjs=$(strip $(if $(filter $(TargetOS_CPP),mingw32 cygwin32 linux darwin solaris2 freebsd dragonfly netbsd openbsd),YES,NO))
+ArchSupportsSplitObjs=$(if $(filter \
+  $(TargetArch_CPP),i386 x86_64 powerpc sparc),YES,NO)#
+
+# We used to support splitting on Darwin, but there is no point, since Darwin
+# uses subsections via symbols
+OsSupportsSplitObjs=$(if $(filter $(TargetOS_CPP),\
+   mingw32 linux solaris2 freebsd dragonfly netbsd openbsd),YES,NO)
 SplitObjsBroken = @SplitObjsBroken@
 
-SupportsSplitObjs := $(strip \
-                    $(if $(and $(filter YES,$(ArchSupportsSplitObjs)),\
-                               $(filter YES,$(OsSupportsSplitObjs)),\
-                               $(filter NO,$(SplitObjsBroken)),\
-                               $(filter NO,$(GhcUnregisterised))),\
-                          YES,NO))
+SupportsSplitObjs := $(if $(and $(filter YES,$(ArchSupportsSplitObjs)),\
+                                $(filter YES,$(OsSupportsSplitObjs)),\
+                                $(filter NO,$(SplitObjsBroken)),\
+                                $(filter YES,$(GhcWithNativeCodeGen))),YES,NO)
 
-# By default, enable SplitObjs for the libraries if this build supports it
-SplitObjs=$(SupportsSplitObjs)
+# By default, enable SplitObjs for the libraries if this build supports it.
+# Unless SplitSections is enabled - then let that take precedence.
+SplitObjs = $(if $(and $(filter YES,$(SupportsSplitObjs)),\
+                       $(filter NO,$(SplitSections))),YES,NO)
 
 # ----------------------------------------------------------------------------
-# Package-related things
-
-# Whether to install the extra packages
-InstallExtraPackages = NO
-
-# Run "ghc-pkg check" on each package
-CHECK_PACKAGES = NO
+# Section splitting
+#
+# Similar to -ffunction-sections -fdata-sections in GCC. Provides space saving
+# like SplitObjs, but doesn't require post-processing and splitting of object
+# files.
+#
+# Set SplitSections=YES or NO in your build.mk to override the default.
+#
+# This is not supported on Darwin (where you can use subsections-via-symbols
+# instead) and Windows is disabled until we figure the linking performance
+# issues related to BFD out. (See #11445, #12913 and related tickets.)
+OsSupportsSplitSections=$(if $(filter $(TargetOS_CPP),darwin),NO,YES)
+SupportsSplitSections=$(if $(and $(filter YES,$(OsSupportsSplitSections)),\
+                                   $(filter YES,$(LdIsGNULd))),YES,NO)
+SplitSections ?= $(SupportsSplitSections)
 
 # ----------------------------------------------------------------------------
 
@@ -346,13 +396,7 @@ LAX_DEPENDENCIES = NO
 # the debugging RTS flavour, rts/ghc.mk overrides these to turn off
 # optimisation.
 GhcRtsHcOpts=-O2
-GhcRtsCcOpts=-O2 -fomit-frame-pointer
-
-# Include support for CPU performance counters via the PAPI library in the RTS?
-# (PAPI: http://icl.cs.utk.edu/papi/)
-GhcRtsWithPapi = NO
-PapiLibDir=
-PapiIncludeDir=
+GhcRtsCcOpts=-O2 -fomit-frame-pointer -g
 
 # Configuration for libffi
 UseSystemLibFFI=@UseSystemLibFFI@
@@ -360,6 +404,9 @@ UseSystemLibFFI=@UseSystemLibFFI@
 FFILibDir=@FFILibDir@
 FFIIncludeDir=@FFIIncludeDir@
 
+# GHC needs arch-specific tweak at least in
+#     rts/Libdw.c:set_initial_registers()
+GhcRtsWithLibdw=$(strip $(if $(filter $(TargetArch_CPP),i386 x86_64),@UseLibdw@,NO))
 
 ################################################################################
 #
@@ -367,24 +414,7 @@ FFIIncludeDir=@FFIIncludeDir@
 #
 ################################################################################
 
-# Directory used by GHC (and possibly other tools) for storing
-# temporary files.  If your TMPDIR isn't big enough, either override
-# this in build.mk or set your environment variable "TMPDIR" to point
-# to somewhere with more space.  (TMPDIR=. is a good choice).
-
-# DEFAULT_TMPDIR isn't called TMPDIR because GNU make tends to
-# override an environment variable with the value of the make variable
-# of the same name (if it exists) when executing sub-processes, so
-# setting the TMPDIR env var would have no effect in the build tree.
-
-DEFAULT_TMPDIR         = /tmp
-ifeq "$(TARGETPLATFORM)" "i386-unknown-cygwin32"
-DEFAULT_TMPDIR         = /C/TEMP
-endif
-ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
-DEFAULT_TMPDIR         = /C/TEMP
-endif
-
+BINDIST               = NO
 BIN_DIST_NAME         = ghc-$(ProjectVersion)
 BIN_DIST_PREP_DIR     = bindistprep/$(BIN_DIST_NAME)
 BIN_DIST_PREP_TAR     = bindistprep/$(BIN_DIST_NAME)-$(TARGETPLATFORM).tar
@@ -423,15 +453,20 @@ BIN_DIST_TAR_COMP     = $(BIN_DIST_NAME)-$(TARGETPLATFORM).tar.$(TAR_COMP_EXT)
 #
 SRC_HC_OPTS += -H32m -O
 
-# Disable -O2 optimization. Otherwise amount of generated C code
-# makes things very slow to compile (~5 minutes on core-i7 for 'compiler/hsSyn/HsExpr.lhs')
-# and sometimes not compile at all (powerpc64 overflows something
-# on 'compiler/hsSyn/HsExpr.lhs').
-ifeq "$(GhcUnregisterised)" "YES"
-GhcStage1HcOpts=
-GhcStage2HcOpts=
-GhcStage3HcOpts=
-endif
+
+# See Note [Stage number in build variables].
+SRC_HC_OPTS_STAGE0 =
+SRC_HC_OPTS_STAGE1 =
+SRC_HC_OPTS_STAGE2 =
+
+# Warning suppression flags. See mk/warnings.mk.
+SRC_CC_WARNING_OPTS =
+SRC_HC_WARNING_OPTS =
+
+# See Note [Stage number in build variables].
+SRC_HC_WARNING_OPTS_STAGE0 =
+SRC_HC_WARNING_OPTS_STAGE1 =
+SRC_HC_WARNING_OPTS_STAGE2 =
 
 # -----------------------------------------------------------------------------
 # Names of programs in the GHC tree
@@ -482,60 +517,108 @@ endif
 
 GHC_PACKAGE_DB_FLAG = @GHC_PACKAGE_DB_FLAG@
 
-CMM_SINK_BOOTSTRAP_IS_NEEDED = @CMM_SINK_BOOTSTRAP_IS_NEEDED@
-
 #-----------------------------------------------------------------------------
 # C compiler
 #
-# NB. Don't override $(WhatGccIsCalled) using build.mk,  re-configure using
-# the flag --with-gcc=<blah> instead.  The reason is that the configure script
+# NB. Don't override $(CC) using build.mk,  re-configure using
+# the flag CC=<blah> instead.  The reason is that the configure script
 # needs to know which gcc you're using in order to perform its tests.
 
-WhatGccIsCalled       = @WhatGccIsCalled@
 GccVersion            = @GccVersion@
-ifeq "$(phase)" "0"
-CrossCompilePrefix    =
-else
-CrossCompilePrefix    = @CrossCompilePrefix@
-endif
+
 # TargetPlatformFull retains the string passed to configure so we have it in
 # the necessary format to pass to libffi's configure.
 TargetPlatformFull    = @TargetPlatformFull@
-GccLT34         = @GccLT34@
 GccLT46         = @GccLT46@
 GccIsClang      = @GccIsClang@
 
-CC              = $(WhatGccIsCalled)
+CC              = @CC@
 CC_STAGE0       = @CC_STAGE0@
 CC_STAGE1       = $(CC)
 CC_STAGE2       = $(CC)
 CC_STAGE3       = $(CC)
 
-AS              = $(WhatGccIsCalled)
+AS              = @CC@
 AS_STAGE0       = @CC_STAGE0@
 AS_STAGE1       = $(AS)
 AS_STAGE2       = $(AS)
 AS_STAGE3       = $(AS)
 
-# We don't have an LD_STAGE0.  CC_STAGE0 is determined by asking "ghc
-# --info", and it doesn't report an LD.
-LD_STAGE0       = error-no-ld-stage0
+# why no LD=@LD@ ?
+LD_STAGE0       = @LD_STAGE0@
 LD_STAGE1       = $(LD)
 LD_STAGE2       = $(LD)
 LD_STAGE3       = $(LD)
 
 # Cross-compiling options
-#
+# See Note [CrossCompiling vs Stage1Only]
 CrossCompiling        = @CrossCompiling@
 
 # Change this to YES if you're building a cross-compiler and don't
 # want to build stage 2.
+# See Note [CrossCompiling vs Stage1Only]
+# See Note [Stage1Only vs stage=1]
 Stage1Only = NO
 
+# Installed tools prefix:
+#    we add prefix to crosscompiler GHC only (ghc-stage1),
+#    not cross-built GHC (not ghc-stage2).
+CrossCompilePrefix    = $(if $(filter YES,$(Stage1Only)),@CrossCompilePrefix@,)
+
 # Install stage 2 by default, or stage 1 in the cross compiler
 # case. Can be changed to 3
 INSTALL_GHC_STAGE= $(if $(filter YES,$(Stage1Only)),1,2)
 
+# Note [CrossCompiling vs Stage1Only]
+#
+# There are 4 possible settings:
+#
+# 1 CrossCompiling=NO Stage1Only=NO
+#   The default.
+#
+# 2 CrossCompiling=NO Stage1Only=YES
+#   Don't build ghc-stage2. See Note [Stage1Only vs stage=1].
+#
+# 3 CrossCompiling=YES Stage1Only=YES
+#   Building a cross-compiler (ghc-stage1). See [1] and
+#   Note [Stage1Only vs stage=1].
+#
+# 4 CrossCompiling=YES Stage1Only=NO
+#   Cross-compiling GHC itself. See [1].
+#
+# [1] https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling
+
+# Note [Stage1Only vs stage=1]
+#
+# Stage1Only=YES means:
+#   - don't build ghc-stage2 (the executable)
+#   - don't build utils that rely on ghc-stage2
+#     See Note [No stage2 packages when CrossCompiling or Stage1Only] in
+#     ./ghc.mk.
+#   - install ghc-stage1 instead of ghc-stage2
+#   - install the ghc-pkg that was built with the stage0 compiler
+#   - (*do* still build compiler/stage2 (i.e. the ghc library))
+#   - (*do* still build all other libraries)
+#
+# stage=1 means:
+#   - don't build compiler/stage2 (i.e. the ghc library)
+#   - don't build ghc-stage2 (the executable)
+#   Note: these are the only two things it does. If you want to exclude more
+#   stuff, combine it with Stage1Only=YES, or run make in the ghc or compiler
+#   directory.
+#
+# running make in the ghc or compiler directory means:
+#   - don't build any packages in the libraries/ directory, except the ones
+#     listed in PACKAGES_STAGE0 (i.e. the boot libraries)
+#
+# You may wonder why Stage1Only=YES still builds compiler/stage2. Quoting
+# simonmar in #7639:
+#
+#     "strictly speaking building compiler/stage2 is correct, because it is
+#     the ghc package that can be used with [ghc-stage1]. If you don't
+#     want to build it, then setting stage=1 in your mk/build.mk should
+#     disable it."
+
 # C compiler and linker flags from configure (e.g. -m<blah> to select
 # correct C compiler backend). The stage number is the stage of GHC
 # that is being used to compile with.
@@ -551,10 +634,9 @@ CONF_LD_LINKER_OPTS_STAGE2 = @CONF_LD_LINKER_OPTS_STAGE2@
 CONF_CPP_OPTS_STAGE0 = @CONF_CPP_OPTS_STAGE0@
 CONF_CPP_OPTS_STAGE1 = @CONF_CPP_OPTS_STAGE1@
 CONF_CPP_OPTS_STAGE2 = @CONF_CPP_OPTS_STAGE2@
-
-ifeq "$(TARGETPLATFORM)" "ia64-unknown-linux"
-CONF_CC_OPTS += -G0
-endif
+CONF_HC_OPTS_STAGE0 = @CONF_HC_OPTS_STAGE0@
+CONF_HC_OPTS_STAGE1 = @CONF_HC_OPTS_STAGE1@
+CONF_HC_OPTS_STAGE2 = @CONF_HC_OPTS_STAGE2@
 
 # The .hsc files aren't currently safe for cross-compilation on Windows:
 #     libraries\haskeline\.\System\Console\Haskeline\Backend\Win32.hsc:160
@@ -576,10 +658,18 @@ $(eval $(call set_stage_HSC2HS_OPTS,2))
 ifeq "$(CrossCompiling)" "YES"
 SRC_HSC2HS_OPTS_STAGE1 += --cross-compile
 SRC_HSC2HS_OPTS_STAGE2 += --cross-compile
+ifeq "$(Windows_Target)" "YES"
+# We'll assume we compile with gcc or clang, and both support `-S` and can as such use the
+# --via-asm pass, which should be faster and is required for cross compiling to windows, as
+# the c compiler complains about non-constant expressions even though they are constant and
+# end up as constants in the assembly.
+SRC_HSC2HS_OPTS_STAGE1 += --via-asm
+SRC_HSC2HS_OPTS_STAGE2 += --via-asm
+endif
 endif
-SRC_HSC2HS_OPTS_STAGE0 += --cflag=-D$(HostArch_CPP)_HOST_ARCH=1 --cflag=-D$(HostOS_CPP)_HOST_OS=1
-SRC_HSC2HS_OPTS_STAGE1 += --cflag=-D$(TargetArch_CPP)_HOST_ARCH=1 --cflag=-D$(TargetOS_CPP)_HOST_OS=1
-SRC_HSC2HS_OPTS_STAGE2 += --cflag=-D$(TargetArch_CPP)_HOST_ARCH=1 --cflag=-D$(TargetOS_CPP)_HOST_OS=1
+SRC_HSC2HS_OPTS_STAGE0 += --cflag=-D$(HostArch_CPP)_HOST_ARCH --cflag=-D$(HostOS_CPP)_HOST_OS
+SRC_HSC2HS_OPTS_STAGE1 += --cflag=-D$(TargetArch_CPP)_HOST_ARCH --cflag=-D$(TargetOS_CPP)_HOST_OS
+SRC_HSC2HS_OPTS_STAGE2 += --cflag=-D$(TargetArch_CPP)_HOST_ARCH --cflag=-D$(TargetOS_CPP)_HOST_OS
 
 ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
 WINDRES = $(INPLACE_MINGW)/bin/windres
@@ -623,18 +713,11 @@ ArSupportsAtFile_STAGE3 = $(ArSupportsAtFile)
 
 CONTEXT_DIFF           = @ContextDiffCmd@
 CP                     = cp
+
 # It's not easy to separate the CPP program from its flags, as
 # AC_PROG_CPP defines CPP as "/usr/bin/gcc -E"
 CPP                    = @CPP@ @CPPFLAGS@
-#
-# RAWCPP_FLAGS are the flags to give to cpp (viz, gcc -E) to persuade it to
-# behave plausibly on Haskell sources.
-#
-# Clang in particular is a bit more annoying, so we suppress some warnings.
-RAWCPP_FLAGS            = -undef -traditional
-ifeq "$(CC_CLANG_BACKEND)" "1"
-RAWCPP_FLAGS           += -Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs
-endif
+HS_CPP                 = @HaskellCPPCmd@ @HaskellCPPArgs@
 
 FIND                   = @FindCmd@
 
@@ -659,11 +742,13 @@ HaveDtrace                = @HaveDtrace@
 USE_DTRACE = $(HaveDtrace)
 DTRACE                 = @DtraceCmd@
 
+LD_NO_GOLD = @LdNoGoldCmd@
 LD = @LdCmd@
 NM = @NmCmd@
 AR = @ArCmd@
 OBJDUMP = @ObjdumpCmd@
 
+CLANG = @ClangCmd@
 LLC = @LlcCmd@
 OPT = @OptCmd@
 
@@ -692,27 +777,38 @@ endif
 
 ifeq "$(TARGETPLATFORM)" "x86_64-unknown-mingw32"
 STRIP_CMD      = $(TOP)/inplace/mingw/bin/strip.exe
+else ifeq "$(TARGETPLATFORM)" "arm-unknown-linux"
+# The Cortex A8 hardware apparently has a bug which ld.gold will check for;
+# however in order to do so it must have unstripped executables lest we
+# see warnings of the form (see #10376, #10464),
+#
+#     /usr/bin/ld.gold: warning: cannot scan executable section 1 of ... for
+#     Cortex-A8 erratum because it has no mapping symbols.
+#
+# Consequently we disabling stripping by default on this architecture.
+# The hack of using `:` to disable stripping is implemented by ghc-cabal.
+STRIP_CMD      = :
 else
-STRIP_CMD      = strip
+STRIP_CMD      = @StripCmd@
 endif
 PATCH_CMD      = @PatchCmd@
 TAR_CMD        = @TarCmd@
-BZIP2_CMD      = bzip2
-GZIP_CMD       = gzip
-XZ_CMD         = xz -9e
+BZIP2_CMD      = @Bzip2Cmd@
+GZIP_CMD       = @GzipCmd@
+XZ_CMD         = @XzCmd@
 
-# bzip2 is default compression
-TAR_COMP      = bzip2
+# xz is default compression
+TAR_COMP      ?= xz
 
 # select compression command and .tar extension based on TAR_COMP value
 ifeq "$(TAR_COMP)" "bzip2"
-TAR_COMP_CMD  = $(BZIP2_CMD)
+TAR_COMP_CMD  = $(BZIP2_CMD) $(TAR_COMP_OPTS)
 TAR_COMP_EXT  = bz2
 else ifeq "$(TAR_COMP)" "gzip"
-TAR_COMP_CMD  = $(GZIP_CMD)
+TAR_COMP_CMD  = $(GZIP_CMD) $(TAR_COMP_OPTS)
 TAR_COMP_EXT  = gz
 else ifeq "$(TAR_COMP)" "xz"
-TAR_COMP_CMD  = $(XZ_CMD)
+TAR_COMP_CMD  = $(XZ_CMD) $(TAR_COMP_OPTS)
 TAR_COMP_EXT  = xz
 else
 $(error $$(TAR_COMP) set to unknown value "$(TAR_COMP)" (supported: "bzip2", "gzip", "xz"))
@@ -731,21 +827,14 @@ HSCOLOUR_CMD   = @HSCOLOUR@
 TIME_CMD       = @TimeCmd@
 
 #-----------------------------------------------------------------------------
-# DocBook XML stuff
-
-BUILD_DOCBOOK_HTML       = @BUILD_DOCBOOK_HTML@
-BUILD_DOCBOOK_PS         = @BUILD_DOCBOOK_PS@
-BUILD_DOCBOOK_PDF        = @BUILD_DOCBOOK_PDF@
-DBLATEX                  = @DblatexCmd@
-# filename.as.url=0 is needed with dblatex 0.3.4 (#7486)
-DBLATEX_OPTS             = -P 'filename.as.url=0'
-XSLTPROC                 = @XsltprocCmd@
-XMLLINT                  = @XmllintCmd@
-HAVE_DOCBOOK_XSL        = @HAVE_DOCBOOK_XSL@
-XSLTPROC_HTML_STYLESHEET = http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl
-XSLTPROC_LABEL_OPTS     = --stringparam toc.section.depth 3 \
-                          --stringparam section.autolabel 1 \
-                          --stringparam section.label.includes.component.label 1
+# Sphinx stuff
+
+SPHINXBUILD              = @SPHINXBUILD@
+BUILD_MAN                = @BUILD_MAN@
+BUILD_SPHINX_HTML        = @BUILD_SPHINX_HTML@
+BUILD_SPHINX_PDF         = @BUILD_SPHINX_PDF@
+SPHINXOPTS               = -D latex_paper_size=letter
+XELATEX                  = @XELATEX@
 
 #-----------------------------------------------------------------------------
 #              FPtools support software
@@ -770,16 +859,13 @@ SRC_HAPPY_OPTS            = -agc --strict
 #
 ALEX                   = @AlexCmd@
 ALEX_VERSION           = @AlexVersion@
-Alex3                  = @Alex3@
 #
 # Options to pass to Alex when we're going to compile the output with GHC
 #
 SRC_ALEX_OPTS = -g
-ifeq "$(Alex3)" "YES"
 # The compiler isn't using the Unicode support in Alex 3.0 yet, in fact we do our own
 # Unicode handling, so diable Alex's.
 compiler_ALEX_OPTS = --latin1
-endif
 
 # Should we build haddock docs?
 HADDOCK_DOCS = YES
@@ -790,6 +876,9 @@ else
 HSCOLOUR_SRCS = YES
 endif
 
+# Build and install the "extra" packages (see ./packages)?
+BUILD_EXTRA_PKGS = NO
+
 ################################################################################
 #
 #    Library configure arguments
@@ -809,3 +898,24 @@ ICONV_LIB_DIRS = @ICONV_LIB_DIRS@
 
 GMP_INCLUDE_DIRS = @GMP_INCLUDE_DIRS@
 GMP_LIB_DIRS = @GMP_LIB_DIRS@
+GMP_PREFER_FRAMEWORK = @GMP_PREFER_FRAMEWORK@
+GMP_FORCE_INTREE = @GMP_FORCE_INTREE@
+
+CURSES_LIB_DIRS = @CURSES_LIB_DIRS@
+
+# See Note [Disable -O2 in unregisterised mode]
+# Be careful: 'GhcUnregisterised' should be defined earlier in this file.
+ifeq "$(GhcUnregisterised)" "YES"
+GhcStage1HcOpts=
+GhcStage2HcOpts=
+GhcStage3HcOpts=
+
+GhcLibHcOpts=
+endif
+
+# Note [Disable -O2 in unregisterised mode]
+# Disable -O2 optimization in unregisterised mode. Otherwise amount
+# of generated C code # makes things very slow to compile (~5 minutes
+# on core-i7 for 'compiler/hsSyn/HsExpr.hs') and sometimes not compile
+# at all: powerpc64 overflows TOC section on 'compiler/hsSyn/HsExpr.hs'
+#         ia64 overflows short data section on 'compiler/main/DynFlags.hs'