Skip to content

Commit 37bb792

Browse files
committed
propagate stage trough elaborateProjectPlanning
available targets are only host
1 parent adee800 commit 37bb792

File tree

18 files changed

+579
-418
lines changed

18 files changed

+579
-418
lines changed

cabal-install/src/Distribution/Client/CmdGenBounds.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import Distribution.Client.TargetProblem
4242
import Distribution.Simple.Command
4343
import Distribution.Types.Component
4444
import Distribution.Verbosity
45+
import qualified Distribution.Compat.Graph as Graph
4546

4647
-- | The data type for gen-bounds command flags
4748
data GenBoundsFlags = GenBoundsFlags {}
@@ -130,16 +131,16 @@ genBoundsAction flags targetStrings globalFlags =
130131
pkgVersionMap :: Map.Map ComponentId PackageIdentifier
131132
pkgVersionMap = Map.fromList (map (InstallPlan.foldPlanPackage externalVersion localVersion) (InstallPlan.toList elaboratedPlan'))
132133

133-
externalVersion :: InstalledPackageInfo -> (ComponentId, PackageIdentifier)
134-
externalVersion pkg = (installedComponentId pkg, packageId pkg)
134+
externalVersion :: WithStage InstalledPackageInfo -> (ComponentId, PackageIdentifier)
135+
externalVersion (WithStage _stage pkg) = (installedComponentId pkg, packageId pkg)
135136

136137
localVersion :: ElaboratedConfiguredPackage -> (ComponentId, PackageIdentifier)
137138
localVersion pkg = (elabComponentId pkg, packageId pkg)
138139

139140
let genBoundsActionForPkg :: ElaboratedConfiguredPackage -> [GenBoundsResult]
140141
genBoundsActionForPkg pkg =
141142
-- Step 5: Match up the user specified targets with the local packages.
142-
case Map.lookup (installedUnitId pkg) targets of
143+
case Map.lookup (Graph.nodeKey pkg) targets of
143144
Nothing -> []
144145
Just tgts ->
145146
map (\(tgt, _) -> getBoundsForComponent tgt pkg pkgVersionMap) tgts
@@ -188,7 +189,8 @@ getBoundsForComponent tgt pkg pkgVersionMap =
188189
let componentDeps = elabLibDependencies pkg
189190
-- Match these up to package names, this is a list of Package name to versions.
190191
-- Now just match that up with what the user wrote in the build-depends section.
191-
depsWithVersions = mapMaybe (\cid -> Map.lookup (confInstId $ fst cid) pkgVersionMap) componentDeps
192+
-- FIXME: I am not quite sure how this is supposed to work
193+
depsWithVersions = mapMaybe (\(WithStage _stage cid, _) -> Map.lookup (confInstId cid) pkgVersionMap) componentDeps
192194
isNeeded = hasElem needBounds . packageName
193195
in boundsResult (Just (filter isNeeded depsWithVersions))
194196
where

cabal-install/src/Distribution/Client/CmdHaddockProject.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ import Distribution.Client.ProjectOrchestration
3535
import Distribution.Client.ProjectPlanning
3636
( ElaboratedConfiguredPackage (..)
3737
, ElaboratedInstallPlan
38+
, ElaboratedInstalledPackageInfo
3839
, ElaboratedSharedConfig (..)
3940
, TargetAction (..)
40-
)
41-
import Distribution.Client.ProjectPlanning.Types
42-
( Toolchain (..)
41+
, Toolchain (..)
42+
, WithStage(..)
4343
, elabDistDirParams
4444
, getStage
4545
)
@@ -159,7 +159,7 @@ haddockProjectAction flags _extraArgs globalFlags = do
159159
sharedConfig :: ElaboratedSharedConfig
160160
sharedConfig = elaboratedShared buildCtx
161161

162-
pkgs :: [Either InstalledPackageInfo ElaboratedConfiguredPackage]
162+
pkgs :: [Either ElaboratedInstalledPackageInfo ElaboratedConfiguredPackage]
163163
pkgs = matchingPackages elaboratedPlan
164164

165165
-- TODO
@@ -209,7 +209,7 @@ haddockProjectAction flags _extraArgs globalFlags = do
209209

210210
packageInfos <- fmap (nub . concat) $ for pkgs $ \pkg ->
211211
case pkg of
212-
Left package | localStyle -> do
212+
Left (WithStage _ package) | localStyle -> do
213213
let packageName = unPackageName (pkgName $ sourcePackageId package)
214214
destDir = outputDir </> packageName
215215
fmap catMaybes $ for (haddockInterfaces package) $ \interfacePath -> do
@@ -441,7 +441,7 @@ haddockProjectAction flags _extraArgs globalFlags = do
441441

442442
matchingPackages
443443
:: ElaboratedInstallPlan
444-
-> [Either InstalledPackageInfo ElaboratedConfiguredPackage]
444+
-> [Either ElaboratedInstalledPackageInfo ElaboratedConfiguredPackage]
445445
matchingPackages =
446446
fmap (foldPlanPackage Left Right)
447447
. InstallPlan.toList

cabal-install/src/Distribution/Client/CmdInstall.hs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ import Distribution.Client.ProjectConfig.Types
9292
import Distribution.Client.ProjectFlags (ProjectFlags (..))
9393
import Distribution.Client.ProjectPlanning
9494
( storePackageInstallDirs'
95-
)
96-
import Distribution.Client.ProjectPlanning.Types
97-
( ElaboratedInstallPlan
95+
, ElaboratedInstallPlan
96+
, ElaboratedPlanPackage
97+
, Stage (..)
9898
)
9999
import Distribution.Client.RebuildMonad
100100
( runRebuild
@@ -115,6 +115,7 @@ import Distribution.Client.Types
115115
import Distribution.Client.Types.OverwritePolicy
116116
( OverwritePolicy (..)
117117
)
118+
import qualified Distribution.Compat.Graph as Graph
118119
import Distribution.Package
119120
( Package (..)
120121
, PackageName
@@ -565,7 +566,7 @@ installAction flags@NixStyleFlags{extraFlags, configFlags, installFlags, project
565566
traverseInstall action cfg@InstallCfg{verbosity = v, buildCtx, installClientFlags} = do
566567
let overwritePolicy = fromFlagOrDefault NeverOverwrite $ cinstOverwritePolicy installClientFlags
567568
actionOnExe <- action v overwritePolicy <$> prepareExeInstall cfg
568-
traverse_ actionOnExe . Map.toList $ targetsMap buildCtx
569+
traverse_ actionOnExe . Map.toList $ filterTargetsWithStage Host $ targetsMap buildCtx
569570

570571
withProject
571572
:: Verbosity
@@ -784,7 +785,7 @@ getSpecsAndTargetSelectors verbosity reducedVerbosity sourcePkgDb targetSelector
784785

785786
localPkgs = sdistize <$> localPackages baseCtx
786787

787-
gatherTargets :: UnitId -> TargetSelector
788+
gatherTargets :: Graph.Key ElaboratedPlanPackage -> TargetSelector
788789
gatherTargets targetId = TargetPackageNamed pkgName targetFilter
789790
where
790791
targetUnit = Map.findWithDefault (error "cannot find target unit") targetId planMap
@@ -829,7 +830,7 @@ partitionToKnownTargetsAndHackagePackages
829830
-> SourcePackageDb
830831
-> ElaboratedInstallPlan
831832
-> [TargetSelector]
832-
-> IO (TargetsMap, [PackageName])
833+
-> IO (TargetsMapS, [PackageName])
833834
partitionToKnownTargetsAndHackagePackages verbosity pkgDb elaboratedPlan targetSelectors = do
834835
let mTargets =
835836
resolveTargetsFromSolver
@@ -1005,7 +1006,7 @@ installLibraries
10051006
ordNub $
10061007
globalEntries
10071008
++ envEntries
1008-
++ entriesForLibraryComponents (targetsMap buildCtx)
1009+
++ entriesForLibraryComponents (filterTargetsWithStage Host $ targetsMap buildCtx)
10091010
contents' = renderGhcEnvironmentFile (baseEntries ++ pkgEntries)
10101011
createDirectoryIfMissing True (takeDirectory envFile)
10111012
writeFileAtomic envFile (BS.pack contents')

cabal-install/src/Distribution/Client/CmdListBin.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ listbinAction flags args globalFlags = do
224224
-- Target Problem: the very similar to CmdRun
225225
-------------------------------------------------------------------------------
226226

227-
singleComponentOrElse :: IO (UnitId, UnqualComponentName) -> TargetsMap -> IO (UnitId, UnqualComponentName)
227+
singleComponentOrElse :: IO (WithStage UnitId, UnqualComponentName) -> TargetsMapS -> IO (WithStage UnitId, UnqualComponentName)
228228
singleComponentOrElse action targetsMap =
229229
case Set.toList . distinctTargetComponents $ targetsMap of
230230
[(unitId, CExeName component)] -> return (unitId, component)
@@ -316,7 +316,7 @@ data ListBinProblem
316316
| -- | A single 'TargetSelector' matches multiple targets
317317
TargetProblemMatchesMultiple TargetSelector [AvailableTarget ()]
318318
| -- | Multiple 'TargetSelector's match multiple targets
319-
TargetProblemMultipleTargets TargetsMap
319+
TargetProblemMultipleTargets TargetsMapS
320320
| -- | The 'TargetSelector' refers to a component that is not an executable
321321
TargetProblemComponentNotRightKind PackageId ComponentName
322322
| -- | Asking to run an individual file or module is not supported
@@ -333,7 +333,7 @@ matchesMultipleProblem selector targets =
333333
CustomTargetProblem $
334334
TargetProblemMatchesMultiple selector targets
335335

336-
multipleTargetsProblem :: TargetsMap -> TargetProblem ListBinProblem
336+
multipleTargetsProblem :: TargetsMapS -> TargetProblem ListBinProblem
337337
multipleTargetsProblem = CustomTargetProblem . TargetProblemMultipleTargets
338338

339339
componentNotRightKindProblem :: PackageId -> ComponentName -> TargetProblem ListBinProblem

cabal-install/src/Distribution/Client/CmdPath.hs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import Distribution.Client.ProjectConfig.Types
4242
)
4343
import Distribution.Client.ProjectOrchestration
4444
import Distribution.Client.ProjectPlanning
45-
import Distribution.Client.ProjectPlanning.Types (Toolchain (..))
4645
import Distribution.Client.RebuildMonad (runRebuild)
4746
import Distribution.Client.ScriptUtils
4847
import Distribution.Client.Setup
@@ -55,7 +54,6 @@ import qualified Distribution.Client.Utils.Json as Json
5554
import Distribution.Client.Version
5655
( cabalInstallVersion
5756
)
58-
import Distribution.Solver.Types.Stage
5957
import Distribution.ReadE
6058
( ReadE (ReadE)
6159
)

cabal-install/src/Distribution/Client/CmdRepl.hs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ import Distribution.Client.ProjectOrchestration
5555
import Distribution.Client.ProjectPlanning
5656
( ElaboratedInstallPlan
5757
, ElaboratedSharedConfig (..)
58+
, WithStage
59+
, Stage (..)
60+
, getStage
5861
)
5962
import Distribution.Client.ProjectPlanning.Types
6063
( Toolchain (..)
@@ -92,7 +95,6 @@ import Distribution.Compiler
9295
import Distribution.Package
9396
( Package (..)
9497
, UnitId
95-
, installedUnitId
9698
, mkPackageName
9799
, packageName
98100
)
@@ -181,6 +183,7 @@ import Distribution.Client.ReplFlags
181183
, topReplOptions
182184
)
183185
import Distribution.Compat.Binary (decode)
186+
import qualified Distribution.Compat.Graph as Graph
184187
import Distribution.Simple.Flag (flagToMaybe, fromFlagOrDefault, pattern Flag)
185188
import Distribution.Simple.Program.Builtin (ghcProgram)
186189
import Distribution.Simple.Program.Db (requireProgram)
@@ -196,7 +199,6 @@ import System.FilePath
196199
, splitSearchPath
197200
, (</>)
198201
)
199-
import Distribution.Solver.Types.Stage
200202

201203
replCommand :: CommandUI (NixStyleFlags ReplFlags)
202204
replCommand =
@@ -362,15 +364,14 @@ replAction flags@NixStyleFlags{extraFlags = r@ReplFlags{..}, ..} targetStrings g
362364
-- especially in the no-project case.
363365
withInstallPlan (lessVerbose verbosity) baseCtx' $ \elaboratedPlan sharedConfig -> do
364366
-- targets should be non-empty map, but there's no NonEmptyMap yet.
365-
-- TODO: This only makes sense for the build stage
366367
let Toolchain { toolchainCompiler = compiler } = getStage (pkgConfigToolchains sharedConfig) Build
368+
-- FIXME there is total confusion here about who is filtering for the stage
367369
targets <- validatedTargets (projectConfigShared (projectConfig ctx)) compiler elaboratedPlan targetSelectors
368-
369370
let
370-
(unitId, _) = fromMaybe (error "panic: targets should be non-empty") $ safeHead $ Map.toList targets
371-
originalDeps = installedUnitId <$> InstallPlan.directDeps elaboratedPlan unitId
372-
oci = OriginalComponentInfo unitId originalDeps
373-
pkgId = fromMaybe (error $ "cannot find " ++ prettyShow unitId) $ packageId <$> InstallPlan.lookup elaboratedPlan unitId
371+
(key, _uid) = fromMaybe (error "panic: targets should be non-empty") $ safeHead $ Map.toList targets
372+
originalDeps = Graph.nodeKey <$> InstallPlan.directDeps elaboratedPlan key
373+
oci = OriginalComponentInfo key originalDeps
374+
pkgId = fromMaybe (error $ "cannot find " ++ prettyShow key) $ packageId <$> InstallPlan.lookup elaboratedPlan key
374375
baseCtx'' = addDepsToProjectTarget (envPackages replEnvFlags) pkgId baseCtx'
375376

376377
return (Just oci, baseCtx'')
@@ -524,6 +525,7 @@ replAction flags@NixStyleFlags{extraFlags = r@ReplFlags{..}, ..} targetStrings g
524525
verbosity = cfgVerbosity normal flags
525526
tempFileOptions = commonSetupTempFileOptions $ configCommonFlags configFlags
526527

528+
-- FIXME: the compiler depends on the stage!!
527529
validatedTargets ctx compiler elaboratedPlan targetSelectors = do
528530
let multi_repl_enabled = multiReplDecision ctx compiler r
529531
-- Interpret the targets on the command line as repl targets
@@ -563,8 +565,8 @@ minMultipleHomeUnitsVersion :: Version
563565
minMultipleHomeUnitsVersion = mkVersion [9, 4]
564566

565567
data OriginalComponentInfo = OriginalComponentInfo
566-
{ ociUnitId :: UnitId
567-
, ociOriginalDeps :: [UnitId]
568+
{ ociUnitId :: WithStage UnitId
569+
, ociOriginalDeps :: [WithStage UnitId]
568570
}
569571
deriving (Show)
570572

@@ -599,18 +601,25 @@ addDepsToProjectTarget deps pkgId ctx =
599601
generateReplFlags :: Bool -> ElaboratedInstallPlan -> OriginalComponentInfo -> [String]
600602
generateReplFlags includeTransitive elaboratedPlan OriginalComponentInfo{..} = flags
601603
where
602-
exeDeps :: [UnitId]
604+
exeDeps :: [WithStage UnitId]
603605
exeDeps =
604606
foldMap
605607
(InstallPlan.foldPlanPackage (const []) elabOrderExeDependencies)
606608
(InstallPlan.dependencyClosure elaboratedPlan [ociUnitId])
607609

608-
deps, deps', trans, trans' :: [UnitId]
609-
flags :: [String]
610-
deps = installedUnitId <$> InstallPlan.directDeps elaboratedPlan ociUnitId
610+
deps :: [WithStage UnitId]
611+
deps = Graph.nodeKey <$> InstallPlan.directDeps elaboratedPlan ociUnitId
612+
613+
deps' :: [WithStage UnitId]
611614
deps' = deps \\ ociOriginalDeps
612-
trans = installedUnitId <$> InstallPlan.dependencyClosure elaboratedPlan deps'
615+
616+
trans :: [WithStage UnitId]
617+
trans = Graph.nodeKey <$> InstallPlan.dependencyClosure elaboratedPlan deps'
618+
619+
trans' :: [WithStage UnitId]
613620
trans' = trans \\ ociOriginalDeps
621+
622+
flags :: [String]
614623
flags =
615624
fmap (("-package-id " ++) . prettyShow) . (\\ exeDeps) $
616625
if includeTransitive then trans' else deps'
@@ -762,7 +771,7 @@ selectComponentTarget = selectComponentTargetBasic
762771
data ReplProblem
763772
= TargetProblemMatchesMultiple MultiReplDecision TargetSelector [AvailableTarget ()]
764773
| -- | Multiple 'TargetSelector's match multiple targets
765-
TargetProblemMultipleTargets MultiReplDecision TargetsMap
774+
TargetProblemMultipleTargets MultiReplDecision TargetsMapS
766775
deriving (Eq, Show)
767776

768777
-- | The various error conditions that can occur when matching a
@@ -779,7 +788,7 @@ matchesMultipleProblem decision targetSelector targetsExesBuildable =
779788

780789
multipleTargetsProblem
781790
:: MultiReplDecision
782-
-> TargetsMap
791+
-> TargetsMapS
783792
-> ReplTargetProblem
784793
multipleTargetsProblem decision = CustomTargetProblem . TargetProblemMultipleTargets decision
785794

cabal-install/src/Distribution/Client/CmdRun.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import qualified Distribution.Client.ProjectOrchestration as Orchestration (targ
5555
import Distribution.Client.ProjectPlanning
5656
( ElaboratedConfiguredPackage (..)
5757
, ElaboratedInstallPlan
58+
, WithStage (..)
5859
, binDirectoryFor
5960
)
6061
import Distribution.Client.ProjectPlanning.Types
@@ -384,7 +385,7 @@ handleShebang :: FilePath -> [String] -> IO ()
384385
handleShebang script args =
385386
runAction (commandDefaultFlags runCommand) (script : args) defaultGlobalFlags
386387

387-
singleExeOrElse :: IO (UnitId, UnqualComponentName) -> TargetsMap -> IO (UnitId, UnqualComponentName)
388+
singleExeOrElse :: IO (WithStage UnitId, UnqualComponentName) -> TargetsMapS -> IO (WithStage UnitId, UnqualComponentName)
388389
singleExeOrElse action targetsMap =
389390
case Set.toList . distinctTargetComponents $ targetsMap of
390391
[(unitId, CExeName component)] -> return (unitId, component)
@@ -396,16 +397,16 @@ singleExeOrElse action targetsMap =
396397
-- 'ElaboratedConfiguredPackage's that match the specified
397398
-- 'UnitId'.
398399
matchingPackagesByUnitId
399-
:: UnitId
400+
:: WithStage UnitId
400401
-> ElaboratedInstallPlan
401402
-> [ElaboratedConfiguredPackage]
402-
matchingPackagesByUnitId uid =
403+
matchingPackagesByUnitId (WithStage s uid) =
403404
catMaybes
404405
. fmap
405406
( foldPlanPackage
406407
(const Nothing)
407408
( \x ->
408-
if elabUnitId x == uid
409+
if elabUnitId x == uid && elabStage x == s
409410
then Just x
410411
else Nothing
411412
)
@@ -494,7 +495,7 @@ data RunProblem
494495
| -- | A single 'TargetSelector' matches multiple targets
495496
TargetProblemMatchesMultiple TargetSelector [AvailableTarget ()]
496497
| -- | Multiple 'TargetSelector's match multiple targets
497-
TargetProblemMultipleTargets TargetsMap
498+
TargetProblemMultipleTargets TargetsMapS
498499
| -- | The 'TargetSelector' refers to a component that is not an executable
499500
TargetProblemComponentNotExe PackageId ComponentName
500501
| -- | Asking to run an individual file or module is not supported
@@ -511,7 +512,7 @@ matchesMultipleProblem selector targets =
511512
CustomTargetProblem $
512513
TargetProblemMatchesMultiple selector targets
513514

514-
multipleTargetsProblem :: TargetsMap -> TargetProblem RunProblem
515+
multipleTargetsProblem :: TargetsMapS -> TargetProblem RunProblem
515516
multipleTargetsProblem = CustomTargetProblem . TargetProblemMultipleTargets
516517

517518
componentNotExeProblem :: PackageId -> ComponentName -> TargetProblem RunProblem

cabal-install/src/Distribution/Client/CmdTarget.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ targetAction flags@NixStyleFlags{..} ts globalFlags = do
170170
either (reportTargetSelectorProblems verbosity) return
171171
=<< readTargetSelectors localPackages Nothing targetStrings
172172

173-
targets :: TargetsMap <-
173+
targets <-
174174
either (reportBuildTargetProblems verbosity) return $
175175
resolveTargetsFromSolver
176176
selectPackageTargets
@@ -192,7 +192,7 @@ targetAction flags@NixStyleFlags{..} ts globalFlags = do
192192
reportBuildTargetProblems :: Verbosity -> [TargetProblem'] -> IO a
193193
reportBuildTargetProblems verbosity = reportTargetProblems verbosity "target"
194194

195-
printTargetForms :: Verbosity -> [String] -> TargetsMap -> ElaboratedInstallPlan -> IO ()
195+
printTargetForms :: Verbosity -> [String] -> TargetsMapS -> ElaboratedInstallPlan -> IO ()
196196
printTargetForms verbosity targetStrings targets elaboratedPlan =
197197
noticeDoc verbosity $
198198
vcat
@@ -218,7 +218,7 @@ printTargetForms verbosity targetStrings targets elaboratedPlan =
218218
sort $
219219
catMaybes
220220
[ targetForm ct <$> pkg
221-
| (u :: UnitId, xs) <- Map.toAscList targets
221+
| (WithStage _ u, xs) <- Map.toAscList targets
222222
, let pkg = safeHead $ filter ((== u) . elabUnitId) localPkgs
223223
, (ct :: ComponentTarget, _) <- xs
224224
]

0 commit comments

Comments
 (0)