From d7ee12ead407718ae757d6ff4eeaabbe41aa29ad Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Wed, 7 Feb 2024 14:20:49 -0500
Subject: [PATCH] hadrian: Set -this-package-name

When constructing the GHC flags for a package Hadrian must take care to
set `-this-package-name` in addition to `-this-unit-id`. This hasn't
broken until now as we have not had any uses of qualified package
imports. However, this will change with `filepath-1.5` and the
corresponding `unix` bump, breaking `hadrian/multi-ghci`.
---
 hadrian/src/Hadrian/Haskell/Cabal.hs | 14 +++++++++++---
 hadrian/src/Settings/Builders/Ghc.hs |  6 +++++-
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/hadrian/src/Hadrian/Haskell/Cabal.hs b/hadrian/src/Hadrian/Haskell/Cabal.hs
index db20e470076..17249efd79f 100644
--- a/hadrian/src/Hadrian/Haskell/Cabal.hs
+++ b/hadrian/src/Hadrian/Haskell/Cabal.hs
@@ -10,18 +10,25 @@
 -- Cabal files.
 -----------------------------------------------------------------------------
 module Hadrian.Haskell.Cabal (
-    pkgVersion, pkgUnitId, pkgSynopsis, pkgDescription, pkgSimpleIdentifier,
+    pkgPackageName, pkgVersion, pkgUnitId,
+    pkgSynopsis, pkgDescription, pkgSimpleIdentifier,
     pkgDependencies, pkgGenericDescription, cabalArchString, cabalOsString
     ) where
 
 import Development.Shake
-import Distribution.PackageDescription (GenericPackageDescription)
+import Distribution.PackageDescription (GenericPackageDescription, unPackageName, PackageDescription (package))
+import qualified Distribution.Types.PackageId as Cabal
+import qualified Distribution.Types.GenericPackageDescription as Cabal
 
 import Hadrian.Haskell.Cabal.Type
 import Hadrian.Oracles.Cabal
 import Hadrian.Package
 import {-# SOURCE #-} Hadrian.Haskell.Hash (pkgUnitId)
 
+-- | The name of the package as written in the package's cabal file.
+pkgPackageName :: Package -> Action String
+pkgPackageName =
+    fmap (unPackageName . Cabal.pkgName . package . Cabal.packageDescription) . pkgGenericDescription
 
 -- | Read a Cabal file and return the package version. The Cabal file is tracked.
 pkgVersion :: Package -> Action String
@@ -52,7 +59,8 @@ pkgDescription = fmap description . readPackageData
 -- returns a crude overapproximation of actual dependencies. The Cabal file is
 -- tracked.
 pkgDependencies :: Package -> Action [PackageName]
-pkgDependencies = fmap (map pkgName . packageDependencies) . readPackageData
+pkgDependencies =
+    fmap (map Hadrian.Package.pkgName . packageDependencies) . readPackageData
 
 -- | Read a Cabal file and return the 'GenericPackageDescription'. The Cabal
 -- file is tracked.
diff --git a/hadrian/src/Settings/Builders/Ghc.hs b/hadrian/src/Settings/Builders/Ghc.hs
index 77d99bf30e2..9e49961db7c 100644
--- a/hadrian/src/Settings/Builders/Ghc.hs
+++ b/hadrian/src/Settings/Builders/Ghc.hs
@@ -254,13 +254,17 @@ packageGhcArgs = do
     -- sets `-this-unit-id ghc` when hadrian is building stage0, which will
     -- overwrite this one.
     pkgId   <- expr $ pkgUnitId stage package
+    pkgName <- expr $ pkgPackageName package
     mconcat [ arg "-hide-all-packages"
             , arg "-no-user-package-db"
             , arg "-package-env -"
             , packageDatabaseArgs
             -- We want to pass -this-unit-id for executables as well for multi-repl to
             -- work with executable packages but this is buggy on GHC-9.0.2
-            , (isLibrary package || (ghc_ver >= makeVersion [9,2,1])) ?  arg ("-this-unit-id " ++ pkgId)
+            , (isLibrary package || (ghc_ver >= makeVersion [9,2,1])) ? mconcat
+                [ arg ("-this-unit-id " ++ pkgId)
+                , arg ("-this-package-name " ++ pkgName)
+                ]
             , map ("-package-id " ++) <$> getContextData depIds ]
 
 includeGhcArgs :: Args
-- 
GitLab