From c602b666a7bd66fb7608ff46ae6507fd6ec09c62 Mon Sep 17 00:00:00 2001
From: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Date: Sun, 17 Jul 2022 21:59:30 -0400
Subject: [PATCH] print out dependency build failure during cabal build (fix
 #5974 #7727)

---
 cabal-install/src/Distribution/Client/CmdBuild.hs          | 2 +-
 cabal-install/src/Distribution/Client/CmdHaddockProject.hs | 3 ++-
 cabal-install/src/Distribution/Client/CmdListBin.hs        | 2 +-
 cabal-install/src/Distribution/Client/CmdRepl.hs           | 2 +-
 cabal-install/src/Distribution/Client/CmdRun.hs            | 2 +-
 .../src/Distribution/Client/ProjectOrchestration.hs        | 4 ++--
 cabal-install/src/Distribution/Client/ScriptUtils.hs       | 7 ++++---
 cabal-testsuite/PackageTests/CustomWithoutCabal/cabal.out  | 1 +
 .../PackageTests/CustomWithoutCabalDefaultMain/cabal.out   | 1 +
 .../PackageTests/NewBuild/MonitorCabalFiles/cabal.out      | 1 +
 cabal-testsuite/PackageTests/NewHaddock/Fails/cabal.out    | 1 +
 .../ShowBuildInfo/CompileFail/compile-fail.out             | 1 +
 12 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/cabal-install/src/Distribution/Client/CmdBuild.hs b/cabal-install/src/Distribution/Client/CmdBuild.hs
index 3f2c7589c9..9c8943d939 100644
--- a/cabal-install/src/Distribution/Client/CmdBuild.hs
+++ b/cabal-install/src/Distribution/Client/CmdBuild.hs
@@ -101,7 +101,7 @@ defaultBuildFlags = BuildFlags
 --
 buildAction :: NixStyleFlags BuildFlags -> [String] -> GlobalFlags -> IO ()
 buildAction flags@NixStyleFlags { extraFlags = buildFlags, ..} targetStrings globalFlags
-  = withContextAndSelectors RejectNoTargets Nothing flags targetStrings globalFlags $ \targetCtx ctx targetSelectors -> do
+  = withContextAndSelectors RejectNoTargets Nothing flags targetStrings globalFlags BuildCommand $ \targetCtx ctx targetSelectors -> do
     -- TODO: This flags defaults business is ugly
     let onlyConfigure = fromFlag (buildOnlyConfigure defaultBuildFlags
                                  <> buildOnlyConfigure buildFlags)
diff --git a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
index b4cd4fa272..c9e160ca52 100644
--- a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
+++ b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs
@@ -19,6 +19,7 @@ import qualified Distribution.Client.NixStyleOptions as NixStyleOptions
 import Distribution.Client.ProjectOrchestration
                                               (AvailableTarget(..)
                                               ,AvailableTargetStatus(..)
+                                              ,CurrentCommand(..)
                                               ,ProjectBaseContext(..)
                                               ,ProjectBuildContext(..)
                                               ,TargetSelector(..)
@@ -141,7 +142,7 @@ haddockProjectAction flags _extraArgs globalFlags = do
     -- we need.
     --
 
-    withContextAndSelectors RejectNoTargets Nothing nixFlags ["all"] globalFlags $ \targetCtx ctx targetSelectors -> do
+    withContextAndSelectors RejectNoTargets Nothing nixFlags ["all"] globalFlags HaddockCommand $ \targetCtx ctx targetSelectors -> do
       baseCtx <- case targetCtx of
         ProjectContext             -> return ctx
         GlobalContext              -> return ctx
diff --git a/cabal-install/src/Distribution/Client/CmdListBin.hs b/cabal-install/src/Distribution/Client/CmdListBin.hs
index accf241700..cde9c86051 100644
--- a/cabal-install/src/Distribution/Client/CmdListBin.hs
+++ b/cabal-install/src/Distribution/Client/CmdListBin.hs
@@ -78,7 +78,7 @@ listbinAction flags@NixStyleFlags{..} args globalFlags = do
       _   -> die' verbosity "One target is required, given multiple"
 
   -- configure and elaborate target selectors
-  withContextAndSelectors RejectNoTargets (Just ExeKind) flags [target] globalFlags $ \targetCtx ctx targetSelectors -> do
+  withContextAndSelectors RejectNoTargets (Just ExeKind) flags [target] globalFlags OtherCommand $ \targetCtx ctx targetSelectors -> do
     baseCtx <- case targetCtx of
       ProjectContext             -> return ctx
       GlobalContext              -> return ctx
diff --git a/cabal-install/src/Distribution/Client/CmdRepl.hs b/cabal-install/src/Distribution/Client/CmdRepl.hs
index bf89e7b10d..be129b042f 100644
--- a/cabal-install/src/Distribution/Client/CmdRepl.hs
+++ b/cabal-install/src/Distribution/Client/CmdRepl.hs
@@ -187,7 +187,7 @@ replCommand = Client.installCommand {
 --
 replAction :: NixStyleFlags (ReplOptions, EnvFlags) -> [String] -> GlobalFlags -> IO ()
 replAction flags@NixStyleFlags { extraFlags = (replOpts, envFlags), ..} targetStrings globalFlags
-  = withContextAndSelectors AcceptNoTargets (Just LibKind) flags targetStrings globalFlags $ \targetCtx ctx targetSelectors -> do
+  = withContextAndSelectors AcceptNoTargets (Just LibKind) flags targetStrings globalFlags ReplCommand $ \targetCtx ctx targetSelectors -> do
     when (buildSettingOnlyDeps (buildSettings ctx)) $
       die' verbosity $ "The repl command does not support '--only-dependencies'. "
           ++ "You may wish to use 'build --only-dependencies' and then "
diff --git a/cabal-install/src/Distribution/Client/CmdRun.hs b/cabal-install/src/Distribution/Client/CmdRun.hs
index 9bb34b2bfd..64241fd8bb 100644
--- a/cabal-install/src/Distribution/Client/CmdRun.hs
+++ b/cabal-install/src/Distribution/Client/CmdRun.hs
@@ -122,7 +122,7 @@ runCommand = CommandUI
 --
 runAction :: NixStyleFlags () -> [String] -> GlobalFlags -> IO ()
 runAction flags@NixStyleFlags {..} targetAndArgs globalFlags
-  = withContextAndSelectors RejectNoTargets (Just ExeKind) flags targetStr globalFlags $ \targetCtx ctx targetSelectors -> do
+  = withContextAndSelectors RejectNoTargets (Just ExeKind) flags targetStr globalFlags OtherCommand $ \targetCtx ctx targetSelectors -> do
     (baseCtx, defaultVerbosity) <- case targetCtx of
       ProjectContext             -> return (ctx, normal)
       GlobalContext              -> return (ctx, normal)
diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs
index 0060894b94..3d93b0db11 100644
--- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs
+++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs
@@ -186,7 +186,7 @@ import           System.Posix.Signals (sigKILL, sigSEGV)
 
 -- | Tracks what command is being executed, because we need to hide this somewhere
 -- for cases that need special handling (usually for error reporting).
-data CurrentCommand = InstallCommand | HaddockCommand | OtherCommand
+data CurrentCommand = InstallCommand | HaddockCommand | BuildCommand | ReplCommand | OtherCommand
                     deriving (Show, Eq)
 
 -- | This holds the context of a project prior to solving: the content of the
@@ -1152,7 +1152,7 @@ dieOnBuildFailures verbosity currentCommand plan buildOutcomes
       , [pkg]              <- rootpkgs
       , installedUnitId pkg == pkgid
       , isFailureSelfExplanatory (buildFailureReason failure)
-      , currentCommand /= InstallCommand
+      , currentCommand `notElem` [InstallCommand, BuildCommand, ReplCommand]
       = True
       | otherwise
       = False
diff --git a/cabal-install/src/Distribution/Client/ScriptUtils.hs b/cabal-install/src/Distribution/Client/ScriptUtils.hs
index c8372aed26..db377c8f10 100644
--- a/cabal-install/src/Distribution/Client/ScriptUtils.hs
+++ b/cabal-install/src/Distribution/Client/ScriptUtils.hs
@@ -171,10 +171,11 @@ withContextAndSelectors
   -> NixStyleFlags a     -- ^ Command line flags
   -> [String]            -- ^ Target strings or a script and args.
   -> GlobalFlags         -- ^ Global flags.
+  -> CurrentCommand      -- ^ Current Command (usually for error reporting).
   -> (TargetContext -> ProjectBaseContext -> [TargetSelector] -> IO b)
   -- ^ The body of your command action.
   -> IO b
-withContextAndSelectors noTargets kind flags@NixStyleFlags {..} targetStrings globalFlags act
+withContextAndSelectors noTargets kind flags@NixStyleFlags {..} targetStrings globalFlags cmd act
   = withTemporaryTempDirectory $ \mkTmpDir -> do
     (tc, ctx) <- withProjectOrGlobalConfig verbosity ignoreProject globalConfigFlag with (without mkTmpDir)
 
@@ -209,11 +210,11 @@ withContextAndSelectors noTargets kind flags@NixStyleFlags {..} targetStrings gl
     defaultTarget = [TargetPackage TargetExplicitNamed [fakePackageId] Nothing]
 
     with = do
-      ctx <- establishProjectBaseContext verbosity cliConfig OtherCommand
+      ctx <- establishProjectBaseContext verbosity cliConfig cmd
       return (ProjectContext, ctx)
     without mkDir globalConfig = do
       distDirLayout <- establishDummyDistDirLayout verbosity (globalConfig <> cliConfig) =<< mkDir
-      ctx <- establishDummyProjectBaseContext verbosity (globalConfig <> cliConfig) distDirLayout [] OtherCommand
+      ctx <- establishDummyProjectBaseContext verbosity (globalConfig <> cliConfig) distDirLayout [] cmd
       return (GlobalContext, ctx)
     scriptOrError script err = do
       exists <- doesFileExist script
diff --git a/cabal-testsuite/PackageTests/CustomWithoutCabal/cabal.out b/cabal-testsuite/PackageTests/CustomWithoutCabal/cabal.out
index 84f0d9bf31..76b53a8605 100644
--- a/cabal-testsuite/PackageTests/CustomWithoutCabal/cabal.out
+++ b/cabal-testsuite/PackageTests/CustomWithoutCabal/cabal.out
@@ -3,3 +3,4 @@ Resolving dependencies...
 Build profile: -w ghc-<GHCVER> -O1
 In order, the following will be built:
  - custom-setup-without-cabal-1.0 (lib:custom-setup-without-cabal) (first run)
+Error: cabal: Failed to build custom-setup-without-cabal-1.0-inplace. The failure occurred during the configure step.
diff --git a/cabal-testsuite/PackageTests/CustomWithoutCabalDefaultMain/cabal.out b/cabal-testsuite/PackageTests/CustomWithoutCabalDefaultMain/cabal.out
index da780d2008..047919ab3c 100644
--- a/cabal-testsuite/PackageTests/CustomWithoutCabalDefaultMain/cabal.out
+++ b/cabal-testsuite/PackageTests/CustomWithoutCabalDefaultMain/cabal.out
@@ -3,3 +3,4 @@ Resolving dependencies...
 Build profile: -w ghc-<GHCVER> -O1
 In order, the following will be built:
  - custom-setup-without-cabal-defaultMain-1.0 (lib:custom-setup-without-cabal-defaultMain) (first run)
+Error: cabal: Failed to build custom-setup-without-cabal-defaultMain-1.0-inplace. The failure occurred during the configure step.
diff --git a/cabal-testsuite/PackageTests/NewBuild/MonitorCabalFiles/cabal.out b/cabal-testsuite/PackageTests/NewBuild/MonitorCabalFiles/cabal.out
index 8822537f79..9ca34b2924 100644
--- a/cabal-testsuite/PackageTests/NewBuild/MonitorCabalFiles/cabal.out
+++ b/cabal-testsuite/PackageTests/NewBuild/MonitorCabalFiles/cabal.out
@@ -6,6 +6,7 @@ In order, the following will be built:
 Configuring executable 'q' for q-0.1.0.0..
 Preprocessing executable 'q' for q-0.1.0.0..
 Building executable 'q' for q-0.1.0.0..
+Error: cabal: Failed to build q-0.1.0.0-inplace-q.
 # cabal v2-build
 Resolving dependencies...
 Build profile: -w ghc-<GHCVER> -O1
diff --git a/cabal-testsuite/PackageTests/NewHaddock/Fails/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/Fails/cabal.out
index 306afff155..e02fc11e31 100644
--- a/cabal-testsuite/PackageTests/NewHaddock/Fails/cabal.out
+++ b/cabal-testsuite/PackageTests/NewHaddock/Fails/cabal.out
@@ -6,6 +6,7 @@ In order, the following will be built:
 Configuring library for example-1.0..
 Preprocessing library for example-1.0..
 Building library for example-1.0..
+Error: cabal: Failed to build example-1.0-inplace.
 # cabal v2-haddock
 Build profile: -w ghc-<GHCVER> -O1
 In order, the following will be built:
diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/CompileFail/compile-fail.out b/cabal-testsuite/PackageTests/ShowBuildInfo/CompileFail/compile-fail.out
index 444a64e195..4c07cde5ed 100644
--- a/cabal-testsuite/PackageTests/ShowBuildInfo/CompileFail/compile-fail.out
+++ b/cabal-testsuite/PackageTests/ShowBuildInfo/CompileFail/compile-fail.out
@@ -10,6 +10,7 @@ Building library for CompileFail-0.1.0.0..
 Configuring test suite 'CompileFail-test' for CompileFail-0.1.0.0..
 Preprocessing test suite 'CompileFail-test' for CompileFail-0.1.0.0..
 Building test suite 'CompileFail-test' for CompileFail-0.1.0.0..
+Error: cabal: Failed to build CompileFail-0.1.0.0-inplace-CompileFail-test.
 # cabal build
 Build profile: -w ghc-<GHCVER> -O1
 In order, the following will be built:
-- 
GitLab