From 7931e2f36c4a5ed63a170af75490ee01c06fe20d Mon Sep 17 00:00:00 2001
From: Fendor <power.walross@gmail.com>
Date: Fri, 30 Jul 2021 12:35:25 +0200
Subject: [PATCH] Add build-info location to plan.json

---
 .../Distribution/Client/ProjectPlanOutput.hs  | 21 ++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs
index bf001178a2..ec0d5a676b 100644
--- a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs
+++ b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs
@@ -45,11 +45,13 @@ import           Distribution.Simple.GHC
                    , GhcEnvironmentFileEntry(..), simpleGhcEnvironmentFile
                    , writeGhcEnvironmentFile )
 import           Distribution.Simple.BuildPaths
-                   ( dllExtension, exeExtension )
+                   ( dllExtension, exeExtension, buildInfoPref )
 import qualified Distribution.Compat.Graph as Graph
 import           Distribution.Compat.Graph (Graph, Node)
 import qualified Distribution.Compat.Binary as Binary
 import           Distribution.Simple.Utils
+import           Distribution.Types.Version
+                   ( mkVersion )
 import           Distribution.Verbosity
 
 import Prelude ()
@@ -150,7 +152,7 @@ encodePlanAsJson distDirLayout elaboratedInstallPlan elaboratedSharedConfig =
         | Just hash <- [elabPkgSourceHash elab] ] ++
         (case elabBuildStyle elab of
             BuildInplaceOnly ->
-                ["dist-dir"   J..= J.String dist_dir]
+                ["dist-dir"   J..= J.String dist_dir] ++ [buildInfoFileLocation]
             BuildAndInstall ->
                 -- TODO: install dirs?
                 []
@@ -175,6 +177,20 @@ encodePlanAsJson distDirLayout elaboratedInstallPlan elaboratedSharedConfig =
             ] ++
             bin_file (compSolverName comp)
      where
+      -- | Only add build-info file location if the Setup.hs CLI
+      -- is recent enough to be able to generate build info files.
+      -- Otherwise, do not add the expected file location.
+      --
+      -- Consumers of `plan.json` can use the absence of this file location
+      -- to indicate that the given component uses `build-type: Custom`
+      -- with an old lib:Cabal version.
+      buildInfoFileLocation :: J.Pair
+      buildInfoFileLocation
+        | elabSetupScriptCliVersion elab < mkVersion [3, 7, 0, 0]
+        = ("build-info" J..= J.Null)
+        | otherwise
+        = ("build-info" J..= J.String (buildInfoPref dist_dir))
+
       packageLocationToJ :: PackageLocation (Maybe FilePath) -> J.Value
       packageLocationToJ pkgloc =
         case pkgloc of
@@ -262,7 +278,6 @@ encodePlanAsJson distDirLayout elaboratedInstallPlan elaboratedSharedConfig =
     jdisplay :: Pretty a => a -> J.Value
     jdisplay = J.String . prettyShow
 
-
 -----------------------------------------------------------------------------
 -- Project status
 --
-- 
GitLab