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