diff --git a/hadrian/cabal.project b/hadrian/cabal.project
index d9c329141f68eca16c3a780ae147d39d6a95d1a5..0df6b15695966c4f927129745496610ccbf60a9d 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 5fcc88be1e30013c81bbe027d8d3fa3617682d6d..08200dfa5a3c31f8be213b5ccad62e290071d288 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 e062a57909d6425be08610f2b77de04c6e544357..1c03aff10b51fa08c0a24dbe7193a7f62b68ca8b 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 1c8e24f7450ecd1f983aec78313cb638a45a0fb9..2d7d3b38843cc83b50612fee44782044d1115315 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 3fd916afb0fb6b4a98b43f2afc379a5e99e45a6f..6395d2d62f187aa623f5a9b4dd7bc2c5a53caf62 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