From 76b7f619385ac5d126dd186ff3bfe4cdad9349e7 Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Thu, 13 Jun 2019 16:24:10 -0400
Subject: [PATCH] Disable optimisation when building Cabal in development
 flavours

This updates the make and Hadrian build flavours targetting developers
to disable optimisation when building the Cabal library. Cabal tends to
tickle some very bad compiler performance cases (e.g. #16577) so
disabling optimisation here makes a sizeable impact on overall build
time.

See #16817.
---
 hadrian/cabal.project                        | 4 ++--
 hadrian/src/Settings/Flavours/Development.hs | 6 +++++-
 mk/flavours/devel1.mk                        | 4 ++++
 mk/flavours/devel2.mk                        | 4 ++++
 mk/flavours/validate.mk                      | 5 +++++
 5 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/hadrian/cabal.project b/hadrian/cabal.project
index d9c329141f68..0df6b1569596 100644
--- a/hadrian/cabal.project
+++ b/hadrian/cabal.project
@@ -1,8 +1,8 @@
 packages: ./
           ../libraries/Cabal/Cabal/
 
-# N.B. Compile with -O0 since this is not a performance-critical executable
-# and the Cabal takes nearly twice as long to build with -O1. See #16817.
+-- N.B. Compile with -O0 since this is not a performance-critical executable
+-- and the Cabal takes nearly twice as long to build with -O1. See #16817.
 package Cabal
   optimization: False
 
diff --git a/hadrian/src/Settings/Flavours/Development.hs b/hadrian/src/Settings/Flavours/Development.hs
index 5fcc88be1e30..08200dfa5a3c 100644
--- a/hadrian/src/Settings/Flavours/Development.hs
+++ b/hadrian/src/Settings/Flavours/Development.hs
@@ -2,6 +2,7 @@ module Settings.Flavours.Development (developmentFlavour) where
 
 import Expression
 import Flavour
+import Packages
 import {-# SOURCE #-} Settings.Default
 
 -- Please update doc/flavours.md when changing this file.
@@ -17,7 +18,10 @@ developmentArgs :: Stage -> Args
 developmentArgs ghcStage = do
     stage <- getStage
     sourceArgs SourceArgs
-        { hsDefault  = pure ["-O", "-H64m"]
+        { hsDefault  = mconcat [ pure ["-O", "-H64m"],
+                                 -- Disable optimization when building Cabal;
+                                 -- this saves many minutes of build time.
+                                 package cabal ? pure ["-O0"]]
         , hsLibrary  = notStage0 ? arg "-dcore-lint"
         , hsCompiler = mconcat [stage0 ? arg "-O2",
                                 succ stage == ghcStage ? pure ["-O0", "-DDEBUG"]]
diff --git a/mk/flavours/devel1.mk b/mk/flavours/devel1.mk
index e062a57909d6..1c03aff10b51 100644
--- a/mk/flavours/devel1.mk
+++ b/mk/flavours/devel1.mk
@@ -10,3 +10,7 @@ BUILD_SPHINX_PDF   = NO
 BUILD_MAN          = NO
 
 LAX_DEPENDENCIES   = YES
+
+# Reduce optimisation when building Cabal; this makes a significant difference
+# in overall build time. See #16817.
+libraries/Cabal_dist-install_HC_OPTS += -O0
diff --git a/mk/flavours/devel2.mk b/mk/flavours/devel2.mk
index 1c8e24f7450e..2d7d3b38843c 100644
--- a/mk/flavours/devel2.mk
+++ b/mk/flavours/devel2.mk
@@ -10,3 +10,7 @@ BUILD_SPHINX_PDF   = NO
 BUILD_MAN          = NO
 
 LAX_DEPENDENCIES   = YES
+
+# Reduce optimisation when building Cabal; this makes a significant difference
+# in overall build time. See #16817.
+libraries/Cabal_dist-install_HC_OPTS += -O0
diff --git a/mk/flavours/validate.mk b/mk/flavours/validate.mk
index 3fd916afb0fb..6395d2d62f18 100644
--- a/mk/flavours/validate.mk
+++ b/mk/flavours/validate.mk
@@ -27,6 +27,10 @@ endif
 
 WERROR             = -Werror
 
+# Reduce optimisation when building Cabal; this makes a significant difference
+# in overall build time. See #16817.
+libraries/Cabal_dist-install_HC_OPTS += -O0
+
 # DO NOT EDIT THIS FILE! Instead, create a file mk/validate.mk, whose settings
 # will override these. See also mk/custom-settings.mk.
 #
@@ -36,6 +40,7 @@ WERROR             = -Werror
 #
 #
 # Note [validate build settings]
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #
 # Using GhcStage2HcOpts=-O (rather than -O0) here bringes my validate down from
 # 22mins to 16 mins. Compiling stage2 takes longer, but we gain a faster
-- 
GitLab