@@ -1705,21 +1705,33 @@ elaborateInstallPlan
17051705 => (SolverId -> [ElaboratedPlanPackage ])
17061706 -> SolverPackage UnresolvedPkgLoc
17071707 -> LogProgress [ElaboratedConfiguredPackage ]
1708- elaborateSolverToComponents mapDep spkg@ SolverPackage {solverPkgStage, solverPkgLibDeps, solverPkgExeDeps} =
1708+ elaborateSolverToComponents
1709+ mapDep
1710+ solverPkg@ SolverPackage {solverPkgStage, solverPkgLibDeps, solverPkgExeDeps} =
17091711 case mkComponentsGraph (elabEnabledSpec elab0) pd of
1712+ Left cns ->
1713+ dieProgress $
1714+ hang
1715+ (text " Dependency cycle between the following components:" )
1716+ 4
1717+ (vcat (map (text . componentNameStanza) cns))
17101718 Right g -> do
17111719 let src_comps = componentsGraphToList g
1720+
17121721 infoProgress $
17131722 hang
1714- (text " Component graph for" <+> pretty (solverId (ResolverPackage. Configured spkg )))
1723+ (text " Component graph for" <+> pretty (solverId (ResolverPackage. Configured solverPkg )))
17151724 4
17161725 (dispComponentsWithDeps src_comps)
1726+
17171727 (_, comps) <-
17181728 mapAccumM
17191729 buildComponent
17201730 (Map. empty, Map. empty, Map. empty)
17211731 (map fst src_comps)
1732+
17221733 let whyNotPerComp = why_not_per_component src_comps
1734+
17231735 case NE. nonEmpty whyNotPerComp of
17241736 Nothing ->
17251737 return comps
@@ -1728,18 +1740,13 @@ elaborateInstallPlan
17281740 pkgComp <-
17291741 elaborateSolverToPackage
17301742 notPerCompReasons
1731- spkg
1743+ solverPkg
17321744 g
17331745 (comps ++ maybeToList setupComponent)
17341746 return [pkgComp]
1735- Left cns ->
1736- dieProgress $
1737- hang
1738- (text " Dependency cycle between the following components:" )
1739- 4
1740- (vcat (map (text . componentNameStanza) cns))
17411747 where
17421748 bt = PD. buildType (elabPkgDescription elab0)
1749+
17431750 -- You are eligible to per-component build if this list is empty
17441751 why_not_per_component g =
17451752 cuz_buildtype ++ cuz_spec ++ cuz_length ++ cuz_flag
@@ -1792,7 +1799,7 @@ elaborateInstallPlan
17921799 <+> fsep (punctuate comma $ map (text . whyNotPerComponent) $ toList reasons)
17931800 -- TODO: Maybe exclude Backpack too
17941801
1795- elab0 = elaborateSolverToCommon spkg
1802+ elab0 = elaborateSolverToCommon solverPkg
17961803 pkgid = elabPkgSourceId elab0
17971804 pd = elabPkgDescription elab0
17981805
@@ -1865,6 +1872,7 @@ elaborateInstallPlan
18651872 [ text " lib_dep_map:" <+> Disp. hsep (punctuate comma $ map pretty (Map. keys lib_dep_map))
18661873 , text " exe_dep_map:" <+> Disp. hsep (punctuate comma $ map pretty (Map. keys exe_dep_map))
18671874 ]
1875+
18681876 cc0 <-
18691877 toConfiguredComponent
18701878 pd
@@ -1999,14 +2007,16 @@ elaborateInstallPlan
19992007 , elabPkgOrComp =
20002008 ElabComponent $
20012009 elab_comp
2002- { compLinkedLibDependencies = ordNub (map ci_id (lc_includes lc))
2010+ { compLinkedLibDependencies =
2011+ ordNub (map ci_id (lc_includes lc))
20032012 , compOrderLibDependencies =
20042013 ordNub
20052014 ( map
20062015 (abstractUnitId . ci_id)
20072016 (lc_includes lc ++ lc_sig_includes lc)
20082017 )
2009- , compLinkedInstantiatedWith = Map. fromList (lc_insts lc)
2018+ , compLinkedInstantiatedWith =
2019+ Map. fromList (lc_insts lc)
20102020 }
20112021 }
20122022 elab =
@@ -2040,14 +2050,17 @@ elaborateInstallPlan
20402050 [ (getComponentId pkg, planPackageExePaths pkg)
20412051 | pkg <- external_exe_dep_pkgs
20422052 ]
2053+
20432054 exe_map1 = Map. union external_exe_map $ fmap (\ x -> [x]) exe_map
20442055
20452056 external_lib_cc_map =
20462057 Map. fromListWith Map. union $
20472058 map mkCCMapping external_lib_dep_pkgs
2059+
20482060 external_exe_cc_map =
20492061 Map. fromListWith Map. union $
20502062 map mkCCMapping external_exe_dep_pkgs
2063+
20512064 external_lc_map =
20522065 Map. fromList $
20532066 map mkShapeMapping $
@@ -2126,7 +2139,7 @@ elaborateInstallPlan
21262139 -> LogProgress ElaboratedConfiguredPackage
21272140 elaborateSolverToPackage
21282141 pkgWhyNotPerComponent
2129- pkg @ SolverPackage {solverPkgSource = SourcePackage {srcpkgPackageId}}
2142+ solverPkg @ SolverPackage {solverPkgSource = SourcePackage {srcpkgPackageId}}
21302143 compGraph
21312144 comps = do
21322145 -- Knot tying: the final elab includes the
@@ -2138,23 +2151,13 @@ elaborateInstallPlan
21382151 { elabPkgSourceHash
21392152 , elabStanzasRequested
21402153 , elabStage
2141- } = elaborateSolverToCommon pkg
2154+ } = elaborateSolverToCommon solverPkg
21422155
21432156 elab1 =
21442157 elab0
21452158 { elabUnitId = newSimpleUnitId pkgInstalledId
21462159 , elabComponentId = pkgInstalledId
2147- , elabPkgOrComp = ElabPackage $ ElaboratedPackage
2148- { pkgStage = elabStage
2149- , pkgInstalledId
2150- , pkgLibDependencies
2151- , pkgDependsOnSelfLib
2152- , pkgExeDependencies
2153- , pkgExeDependencyPaths
2154- , pkgPkgConfigDependencies
2155- , pkgStanzasEnabled
2156- , pkgWhyNotPerComponent
2157- }
2160+ , elabPkgOrComp = ElabPackage elabPkg
21582161 , elabModuleShape = modShape
21592162 }
21602163
@@ -2173,7 +2176,7 @@ elaborateInstallPlan
21732176 Just e -> Ty. elabModuleShape e
21742177
21752178 pkgInstalledId
2176- | shouldBuildInplaceOnly pkg =
2179+ | shouldBuildInplaceOnly solverPkg =
21772180 mkComponentId (prettyShow srcpkgPackageId)
21782181 | otherwise =
21792182 assert (isJust elabPkgSourceHash) $
@@ -2188,19 +2191,31 @@ elaborateInstallPlan
21882191 isExternal confid = confSrcId confid /= srcpkgPackageId
21892192 isExternal' (WithStage stage confId) = stage /= elabStage || isExternal confId
21902193
2191- pkgLibDependencies =
2192- buildComponentDeps (filter (isExternal . fst ) . compLibDependencies)
2193-
2194- pkgExeDependencies =
2195- buildComponentDeps (filter isExternal' . compExeDependencies)
2196-
2197- pkgExeDependencyPaths =
2198- buildComponentDeps (filter (isExternal' . fst ) . compExeDependencyPaths)
2199-
2200- -- TODO: Why is this flat?
2201- pkgPkgConfigDependencies =
2202- CD. flatDeps $ buildComponentDeps compPkgConfigDependencies
2194+ elabPkg = ElaboratedPackage
2195+ { pkgStage = elabStage
2196+ , pkgInstalledId
2197+ , pkgLibDependencies = buildComponentDeps (filter (isExternal . fst ) . compLibDependencies)
2198+ , pkgDependsOnSelfLib
2199+ , pkgExeDependencies = buildComponentDeps (filter isExternal' . compExeDependencies)
2200+ , pkgExeDependencyPaths = buildComponentDeps (filter (isExternal' . fst ) . compExeDependencyPaths)
2201+ -- Why is this flat?
2202+ , pkgPkgConfigDependencies = CD. flatDeps $ buildComponentDeps compPkgConfigDependencies
2203+ , -- NB: This is not the final setting of 'pkgStanzasEnabled'.
2204+ -- See [Sticky enabled testsuites]; we may enable some extra
2205+ -- stanzas opportunistically when it is cheap to do so.
2206+ --
2207+ -- However, we start off by enabling everything that was
2208+ -- requested, so that we can maintain an invariant that
2209+ -- pkgStanzasEnabled is a superset of elabStanzasRequested
2210+ pkgStanzasEnabled = optStanzaKeysFilteredByValue (fromMaybe False ) elabStanzasRequested
2211+ , pkgWhyNotPerComponent
2212+ }
22032213
2214+ -- This tells us which components depend on the main library of this package.
2215+ -- Note: the sublib case should not occur, because sub-libraries are not
2216+ -- supported without per-component builds.
2217+ -- TODO: Add a check somewhere that this is the case.
2218+ pkgDependsOnSelfLib :: CD. ComponentDeps [() ]
22042219 pkgDependsOnSelfLib =
22052220 CD. fromList
22062221 [ (CD. componentNameToComponent cn, [() ])
@@ -2220,20 +2235,11 @@ elaborateInstallPlan
22202235 | ElaboratedConfiguredPackage {elabPkgOrComp = ElabComponent comp} <- comps
22212236 ]
22222237
2223- -- NB: This is not the final setting of 'pkgStanzasEnabled'.
2224- -- See [Sticky enabled testsuites]; we may enable some extra
2225- -- stanzas opportunistically when it is cheap to do so.
2226- --
2227- -- However, we start off by enabling everything that was
2228- -- requested, so that we can maintain an invariant that
2229- -- pkgStanzasEnabled is a superset of elabStanzasRequested
2230- pkgStanzasEnabled = optStanzaKeysFilteredByValue (fromMaybe False ) elabStanzasRequested
2231-
22322238 elaborateSolverToCommon
22332239 :: SolverPackage UnresolvedPkgLoc
22342240 -> ElaboratedConfiguredPackage
22352241 elaborateSolverToCommon
2236- pkg @ SolverPackage {
2242+ solverPkg @ SolverPackage {
22372243 solverPkgStage,
22382244 solverPkgSource = SourcePackage
22392245 { srcpkgPackageId
@@ -2269,17 +2275,20 @@ elaborateInstallPlan
22692275 elabPlatform = getStage platforms elabStage
22702276 elabProgramDb = getStage programDbs elabStage
22712277
2272- elabPkgDescription = case PD. finalizePD
2273- solverPkgFlags
2274- elabEnabledSpec
2275- (const Satisfied )
2276- elabPlatform
2277- (compilerInfo elabCompiler)
2278- []
2279- srcpkgDescription of
2278+ elabPkgDescription =
2279+ case PD. finalizePD
2280+ solverPkgFlags
2281+ elabEnabledSpec
2282+ (const Satisfied )
2283+ elabPlatform
2284+ (compilerInfo elabCompiler)
2285+ []
2286+ srcpkgDescription of
22802287 Right (desc, _) -> desc
22812288 Left _ -> error " Failed to finalizePD in elaborateSolverToCommon"
2289+
22822290 elabFlagAssignment = solverPkgFlags
2291+
22832292 elabFlagDefaults =
22842293 PD. mkFlagAssignment
22852294 [ (PD. flagName flag, PD. flagDefault flag)
@@ -2328,12 +2337,15 @@ elaborateInstallPlan
23282337 if programId == " ghc" && elabBuildHaddocks
23292338 then cp{programOverrideArgs = " -haddock" : programOverrideArgs}
23302339 else cp
2331-
2340+
23322341 elabPkgSourceLocation = srcpkgSource
2342+
23332343 elabPkgSourceHash = Map. lookup srcpkgPackageId sourcePackageHashes
2334- elabLocalToProject = isLocalToProject pkg
2344+
2345+ elabLocalToProject = isLocalToProject solverPkg
2346+
23352347 elabBuildStyle =
2336- if shouldBuildInplaceOnly pkg
2348+ if shouldBuildInplaceOnly solverPkg
23372349 then BuildInplaceOnly OnDisk
23382350 else BuildAndInstall
23392351
@@ -2342,12 +2354,14 @@ elaborateInstallPlan
23422354 elabRegisterPackageDBStack = buildAndRegisterDbs elabStage
23432355
23442356 elabSetupScriptStyle = packageSetupScriptStyle elabPkgDescription
2357+
23452358 elabSetupScriptCliVersion =
23462359 packageSetupScriptSpecVersion
23472360 elabSetupScriptStyle
23482361 elabPkgDescription
23492362 libDepGraph
23502363 solverPkgLibDeps
2364+
23512365 elabSetupPackageDBStack = buildAndRegisterDbs (prevStage elabStage)
23522366
23532367 -- Same as corePackageDbs but with the addition of the in-place packagedb.
@@ -2361,7 +2375,7 @@ elaborateInstallPlan
23612375 elabInplaceSetupPackageDBStack = inplacePackageDbs (prevStage elabStage)
23622376
23632377 buildAndRegisterDbs stage
2364- | shouldBuildInplaceOnly pkg = inplacePackageDbs stage
2378+ | shouldBuildInplaceOnly solverPkg = inplacePackageDbs stage
23652379 | otherwise = corePackageDbs stage
23662380
23672381 elabPkgDescriptionOverride = srcpkgDescrOverride
@@ -2419,6 +2433,7 @@ elaborateInstallPlan
24192433 | prog <- configuredPrograms elabProgramDb
24202434 ]
24212435 <> perPkgOptionMapLast srcpkgPackageId packageConfigProgramPaths
2436+
24222437 elabProgramArgs =
24232438 Map. unionWith
24242439 (++)
@@ -2430,13 +2445,16 @@ elaborateInstallPlan
24302445 ]
24312446 )
24322447 (perPkgOptionMapMappend srcpkgPackageId packageConfigProgramArgs)
2448+
24332449 elabProgramPathExtra = perPkgOptionNubList srcpkgPackageId packageConfigProgramPathExtra
24342450 elabConfiguredPrograms = configuredPrograms elabProgramDb
24352451 elabConfigureScriptArgs = perPkgOptionList srcpkgPackageId packageConfigConfigureArgs
2452+
24362453 elabExtraLibDirs = perPkgOptionList srcpkgPackageId packageConfigExtraLibDirs
24372454 elabExtraLibDirsStatic = perPkgOptionList srcpkgPackageId packageConfigExtraLibDirsStatic
24382455 elabExtraFrameworkDirs = perPkgOptionList srcpkgPackageId packageConfigExtraFrameworkDirs
24392456 elabExtraIncludeDirs = perPkgOptionList srcpkgPackageId packageConfigExtraIncludeDirs
2457+
24402458 elabProgPrefix = perPkgOptionMaybe srcpkgPackageId packageConfigProgPrefix
24412459 elabProgSuffix = perPkgOptionMaybe srcpkgPackageId packageConfigProgSuffix
24422460
@@ -2485,7 +2503,6 @@ elaborateInstallPlan
24852503 where
24862504 exe = fromFlagOrDefault def bothflag
24872505 lib = fromFlagOrDefault def (bothflag <> libflag)
2488-
24892506 bothflag = lookupPerPkgOption pkgid fboth
24902507 libflag = lookupPerPkgOption pkgid flib
24912508
@@ -2620,6 +2637,7 @@ elaborateInstallPlan
26202637 NonSetupLibDepSolverPlanPackage
26212638 (SolverInstallPlan. toList solverPlan)
26222639
2640+ packagesWithLibDepsDownwardClosedProperty :: (PackageIdentifier -> Bool ) -> Set PackageIdentifier
26232641 packagesWithLibDepsDownwardClosedProperty property =
26242642 Set. fromList
26252643 . map packageId
@@ -2644,12 +2662,15 @@ elaborateInstallPlan
26442662-- TODO: Drop matchPlanPkg/matchElabPkg in favor of mkCCMapping
26452663
26462664shouldBeLocal :: PackageSpecifier (SourcePackage (PackageLocation loc )) -> Maybe PackageId
2647- shouldBeLocal NamedPackage {} = Nothing
2648- shouldBeLocal (SpecificSourcePackage pkg) = case srcpkgSource pkg of
2649- LocalUnpackedPackage _ -> Just (packageId pkg)
2650- _ -> Nothing
2665+ shouldBeLocal (NamedPackage _ _) =
2666+ Nothing
2667+ shouldBeLocal (SpecificSourcePackage pkg) =
2668+ case srcpkgSource pkg of
2669+ LocalUnpackedPackage _ -> Just (packageId pkg)
2670+ _ -> Nothing
26512671
26522672-- | Given a 'ElaboratedPlanPackage', report if it matches a 'ComponentName'.
2673+ -- TODO: check the role of stage here.
26532674matchPlanPkg :: (ComponentName -> Bool ) -> ElaboratedPlanPackage -> Bool
26542675matchPlanPkg p = InstallPlan. foldPlanPackage (\ (WithStage _stage ipkg) -> p (ipiComponentName ipkg)) (matchElabPkg p)
26552676
0 commit comments