Skip to content

Commit ca0a28d

Browse files
committed
feat(cabal-install): introduce ProjectConfigToolchain
1 parent dd1bd2a commit ca0a28d

File tree

17 files changed

+225
-82
lines changed

17 files changed

+225
-82
lines changed

cabal-install-solver/src/Distribution/Solver/Types/Toolchain.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ data Toolchain = Toolchain
2323
{ toolchainPlatform :: Platform
2424
, toolchainCompiler :: Compiler
2525
, toolchainProgramDb :: ProgramDb
26+
-- NOTE: actually the solver does not care about package dbs, perhaps it's better
27+
-- to have a separate Toolchain type for project planning.
28+
, toolchainPackageDBs :: PackageDBStackCWD
2629
}
2730
deriving (Show, Generic)
2831

cabal-install/cabal-install.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ library
215215
Distribution.Client.TargetProblem
216216
Distribution.Client.TargetSelector
217217
Distribution.Client.Targets
218+
Distribution.Client.Toolchain
218219
Distribution.Client.Types
219220
Distribution.Client.Types.AllowNewer
220221
Distribution.Client.Types.BuildResults

cabal-install/parser-tests/Tests/ParserTests.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ testProjectConfigShared = do
179179
assertConfigEquals expected config legacy (projectConfigShared . condTreeData)
180180
where
181181
expected = ProjectConfigShared{..}
182+
projectConfigToolchain = ProjectConfigToolchain{..}
182183
projectConfigDistDir = toFlag "something"
183184
projectConfigConfigFile = mempty -- cli only
184185
projectConfigProjectFileParser = mempty -- cli only
@@ -188,9 +189,13 @@ testProjectConfigShared = do
188189
projectConfigHcFlavor = toFlag GHCJS
189190
projectConfigHcPath = toFlag "/some/path/to/compiler"
190191
projectConfigHcPkg = toFlag "/some/path/to/ghc-pkg"
192+
projectConfigPackageDBs = [Nothing, Just (SpecificPackageDB "foo"), Nothing, Just (SpecificPackageDB "bar"), Just (SpecificPackageDB "baz")]
193+
projectConfigBuildHcFlavor = toFlag GHCJS
194+
projectConfigBuildHcPath = toFlag "/some/path/to/compiler"
195+
projectConfigBuildHcPkg = toFlag "/some/path/to/ghc-pkg"
196+
projectConfigBuildPackageDBs = [Nothing, Just (SpecificPackageDB "foo"), Nothing, Just (SpecificPackageDB "bar"), Just (SpecificPackageDB "baz")]
191197
projectConfigHaddockIndex = toFlag $ toPathTemplate "/path/to/haddock-index"
192198
projectConfigInstallDirs = mempty -- tested below in testInstallDirs
193-
projectConfigPackageDBs = [Nothing, Just (SpecificPackageDB "foo"), Nothing, Just (SpecificPackageDB "bar"), Just (SpecificPackageDB "baz")]
194199
projectConfigRemoteRepos = mempty -- tested below in testRemoteRepos
195200
projectConfigLocalNoIndexRepos = mempty -- tested below in testLocalNoIndexRepos
196201
projectConfigActiveRepos = Flag (ActiveRepos [ActiveRepo (RepoName "hackage.haskell.org") CombineStrategyMerge, ActiveRepo (RepoName "my-repository") CombineStrategyOverride])

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ import Distribution.Client.NixStyleOptions
6868
, nixStyleOptions
6969
)
7070
import Distribution.Client.ProjectConfig
71-
( ProjectPackageLocation (..)
71+
( ProjectConfigToolchain (..)
72+
, ProjectPackageLocation (..)
7273
, fetchAndReadSourcePackages
7374
, projectConfigWithBuilderRepoContext
7475
, resolveBuildTimeSettings
@@ -413,12 +414,15 @@ installAction flags@NixStyleFlags{extraFlags, configFlags, installFlags, project
413414
}
414415
, projectConfigShared =
415416
ProjectConfigShared
416-
{ projectConfigHcFlavor
417-
, projectConfigHcPath
418-
, projectConfigHcPkg
417+
{ projectConfigToolchain =
418+
ProjectConfigToolchain
419+
{ projectConfigHcFlavor
420+
, projectConfigHcPath
421+
, projectConfigHcPkg
422+
, projectConfigPackageDBs
423+
}
419424
, projectConfigStoreDir
420425
, projectConfigProgPathExtra
421-
, projectConfigPackageDBs
422426
}
423427
, projectConfigLocalPackages =
424428
PackageConfig

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ import Distribution.Client.ScriptUtils
4646
import Distribution.Client.Setup
4747
( yesNoOpt
4848
)
49+
import Distribution.Client.Toolchain
50+
( Toolchain (..)
51+
)
4952
import Distribution.Client.Utils.Json
5053
( (.=)
5154
)
@@ -244,10 +247,10 @@ pathAction flags@NixStyleFlags{extraFlags = pathFlags'} cliTargetStrings globalF
244247
if not $ fromFlagOrDefault False (pathCompiler pathFlags)
245248
then pure Nothing
246249
else do
247-
(compiler, _, progDb) <- runRebuild (distProjectRootDirectory . distDirLayout $ baseCtx) $ configureCompiler verbosity (distDirLayout baseCtx) (projectConfig baseCtx)
248-
compilerProg <- requireCompilerProg verbosity compiler
249-
(configuredCompilerProg, _) <- requireProgram verbosity compilerProg progDb
250-
pure $ Just $ mkCompilerInfo configuredCompilerProg compiler
250+
toolchain <- runRebuild (distProjectRootDirectory . distDirLayout $ baseCtx) $ configureCompiler verbosity (distDirLayout baseCtx) (projectConfig baseCtx)
251+
compilerProg <- requireCompilerProg verbosity (toolchainCompiler toolchain)
252+
(configuredCompilerProg, _) <- requireProgram verbosity compilerProg (toolchainProgramDb toolchain)
253+
pure $ Just $ mkCompilerInfo configuredCompilerProg (toolchainCompiler toolchain)
251254

252255
paths <- for (fromFlagOrDefault [] $ pathDirectories pathFlags) $ \p -> do
253256
t <- getPathLocation baseCtx p

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module Distribution.Client.ProjectConfig
1414
, ProjectConfigBuildOnly (..)
1515
, ProjectConfigShared (..)
1616
, ProjectConfigSkeleton
17+
, ProjectConfigToolchain (..)
1718
, ProjectConfigProvenance (..)
1819
, PackageConfig (..)
1920
, MapLast (..)

cabal-install/src/Distribution/Client/ProjectConfig/FieldGrammar.hs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ import qualified Data.Set as Set
1212
import Distribution.CabalSpecVersion (CabalSpecVersion (..))
1313
import Distribution.Client.CmdInstall.ClientInstallFlags (clientInstallFlagsGrammar)
1414
import qualified Distribution.Client.ProjectConfig.Lens as L
15-
import Distribution.Client.ProjectConfig.Types (PackageConfig (..), ProjectConfig (..), ProjectConfigBuildOnly (..), ProjectConfigProvenance (..), ProjectConfigShared (..))
15+
import Distribution.Client.ProjectConfig.Types
16+
( PackageConfig (..)
17+
, ProjectConfig (..)
18+
, ProjectConfigBuildOnly (..)
19+
, ProjectConfigProvenance (..)
20+
, ProjectConfigShared (..)
21+
, ProjectConfigToolchain (..)
22+
)
1623
import Distribution.Client.Utils.Parsec
1724
import Distribution.Compat.Prelude
1825
import Distribution.FieldGrammar
@@ -76,12 +83,9 @@ projectConfigSharedFieldGrammar source =
7683
<*> optionalFieldDefAla "project-file" (alaFlag FilePathNT) L.projectConfigProjectFile mempty
7784
<*> pure mempty -- You can't set the parser type in the project file.
7885
<*> optionalFieldDef "ignore-project" L.projectConfigIgnoreProject mempty
79-
<*> optionalFieldDef "compiler" L.projectConfigHcFlavor mempty
80-
<*> optionalFieldDefAla "with-compiler" (alaFlag FilePathNT) L.projectConfigHcPath mempty
81-
<*> optionalFieldDefAla "with-hc-pkg" (alaFlag FilePathNT) L.projectConfigHcPkg mempty
86+
<*> blurFieldGrammar L.projectConfigToolchain projectConfigToolchainFieldGrammar
8287
<*> optionalFieldDef "doc-index-file" L.projectConfigHaddockIndex mempty
8388
<*> blurFieldGrammar L.projectConfigInstallDirs installDirsGrammar
84-
<*> monoidalFieldAla "package-dbs" (alaList' CommaFSep PackageDBNT) L.projectConfigPackageDBs
8589
<*> pure mempty -- repository stanza for projectConfigRemoteRepos
8690
<*> pure mempty -- repository stanza for projectConfigLocalNoIndexRepos
8791
<*> monoidalField "active-repositories" L.projectConfigActiveRepos
@@ -108,6 +112,14 @@ projectConfigSharedFieldGrammar source =
108112
<*> monoidalFieldAla "extra-prog-path-shared-only" (alaNubList' FSep FilePathNT) L.projectConfigProgPathExtra
109113
<*> optionalFieldDef "multi-repl" L.projectConfigMultiRepl mempty
110114

115+
projectConfigToolchainFieldGrammar :: ParsecFieldGrammar' ProjectConfigToolchain
116+
projectConfigToolchainFieldGrammar =
117+
ProjectConfigToolchain
118+
<$> optionalFieldDef "compiler" L.projectConfigHcFlavor mempty
119+
<*> optionalFieldDefAla "with-compiler" (alaFlag FilePathNT) L.projectConfigHcPath mempty
120+
<*> optionalFieldDefAla "with-hc-pkg" (alaFlag FilePathNT) L.projectConfigHcPkg mempty
121+
<*> monoidalFieldAla "package-dbs" (alaList' CommaFSep PackageDBNT) L.projectConfigPackageDBs
122+
111123
packageConfigFieldGrammar :: [String] -> ParsecFieldGrammar' PackageConfig
112124
packageConfigFieldGrammar knownPrograms =
113125
mkPackageConfig

cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project
385385
modifiesCompiler :: ProjectConfig -> Bool
386386
modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg
387387
where
388-
isSet f = f (projectConfigShared pc) /= NoFlag
388+
isSet f = f (projectConfigToolchain $ projectConfigShared pc) /= NoFlag
389389

390390
sanityWalkPCS :: Bool -> ProjectConfigSkeleton -> ProjectParseResult ProjectConfigSkeleton
391391
sanityWalkPCS underConditional t@(CondNode d (listToMaybe -> c) comps)
@@ -716,17 +716,16 @@ convertLegacyAllPackageFlags globalFlags configFlags configExFlags installFlags
716716
, globalStoreDir = projectConfigStoreDir
717717
} = globalFlags
718718

719+
projectConfigToolchain = ProjectConfigToolchain{..}
719720
projectConfigPackageDBs = (fmap . fmap) (interpretPackageDB Nothing) projectConfigPackageDBs_
720721

721722
ConfigFlags
722723
{ configCommonFlags = commonFlags
723724
, configHcFlavor = projectConfigHcFlavor
724725
, configHcPath = projectConfigHcPath
725726
, configHcPkg = projectConfigHcPkg
726-
, -- configProgramPathExtra = projectConfigProgPathExtra DELETE ME
727-
configInstallDirs = projectConfigInstallDirs
728-
, -- configUserInstall = projectConfigUserInstall,
729-
configPackageDBs = projectConfigPackageDBs_
727+
, configInstallDirs = projectConfigInstallDirs
728+
, configPackageDBs = projectConfigPackageDBs_
730729
} = configFlags
731730

732731
CommonSetupFlags
@@ -965,10 +964,7 @@ convertToLegacySharedConfig
965964
ProjectConfig
966965
{ projectConfigBuildOnly = ProjectConfigBuildOnly{..}
967966
, projectConfigShared = ProjectConfigShared{..}
968-
, projectConfigAllPackages =
969-
PackageConfig
970-
{ packageConfigDocumentation
971-
}
967+
, projectConfigAllPackages = PackageConfig{..}
972968
} =
973969
LegacySharedConfig
974970
{ legacyGlobalFlags = globalFlags
@@ -980,6 +976,7 @@ convertToLegacySharedConfig
980976
, legacyMultiRepl = projectConfigMultiRepl
981977
}
982978
where
979+
ProjectConfigToolchain{..} = projectConfigToolchain
983980
globalFlags =
984981
GlobalFlags
985982
{ globalVersion = mempty
@@ -1085,6 +1082,8 @@ convertToLegacyAllPackageConfig
10851082
, legacyBenchmarkFlags = mempty
10861083
}
10871084
where
1085+
ProjectConfigToolchain{..} = projectConfigToolchain
1086+
10881087
commonFlags =
10891088
mempty
10901089

cabal-install/src/Distribution/Client/ProjectConfig/Lens.hs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,16 @@ import Distribution.Client.IndexUtils.ActiveRepos
77
( ActiveRepos
88
)
99
import Distribution.Client.IndexUtils.IndexState (TotalIndexState)
10-
import Distribution.Client.ProjectConfig.Types (MapLast, MapMappend, PackageConfig, ProjectConfig (..), ProjectConfigBuildOnly (..), ProjectConfigProvenance, ProjectConfigShared)
10+
import Distribution.Client.ProjectConfig.Types
11+
( MapLast
12+
, MapMappend
13+
, PackageConfig
14+
, ProjectConfig (..)
15+
, ProjectConfigBuildOnly (..)
16+
, ProjectConfigProvenance
17+
, ProjectConfigShared
18+
, ProjectConfigToolchain (..)
19+
)
1120
import qualified Distribution.Client.ProjectConfig.Types as T
1221
import Distribution.Client.Targets (UserConstraint)
1322
import Distribution.Client.Types.AllowNewer (AllowNewer, AllowOlder)
@@ -187,18 +196,26 @@ projectConfigIgnoreProject :: Lens' ProjectConfigShared (Flag Bool)
187196
projectConfigIgnoreProject f s = fmap (\x -> s{T.projectConfigIgnoreProject = x}) (f (T.projectConfigIgnoreProject s))
188197
{-# INLINEABLE projectConfigIgnoreProject #-}
189198

190-
projectConfigHcFlavor :: Lens' ProjectConfigShared (Flag CompilerFlavor)
199+
projectConfigToolchain :: Lens' ProjectConfigShared ProjectConfigToolchain
200+
projectConfigToolchain f s = fmap (\x -> s{T.projectConfigToolchain = x}) (f (T.projectConfigToolchain s))
201+
{-# INLINEABLE projectConfigToolchain #-}
202+
203+
projectConfigHcFlavor :: Lens' ProjectConfigToolchain (Flag CompilerFlavor)
191204
projectConfigHcFlavor f s = fmap (\x -> s{T.projectConfigHcFlavor = x}) (f (T.projectConfigHcFlavor s))
192205
{-# INLINEABLE projectConfigHcFlavor #-}
193206

194-
projectConfigHcPath :: Lens' ProjectConfigShared (Flag FilePath)
207+
projectConfigHcPath :: Lens' ProjectConfigToolchain (Flag FilePath)
195208
projectConfigHcPath f s = fmap (\x -> s{T.projectConfigHcPath = x}) (f (T.projectConfigHcPath s))
196209
{-# INLINEABLE projectConfigHcPath #-}
197210

198-
projectConfigHcPkg :: Lens' ProjectConfigShared (Flag FilePath)
211+
projectConfigHcPkg :: Lens' ProjectConfigToolchain (Flag FilePath)
199212
projectConfigHcPkg f s = fmap (\x -> s{T.projectConfigHcPkg = x}) (f (T.projectConfigHcPkg s))
200213
{-# INLINEABLE projectConfigHcPkg #-}
201214

215+
projectConfigPackageDBs :: Lens' ProjectConfigToolchain [Maybe PackageDBCWD]
216+
projectConfigPackageDBs f s = fmap (\x -> s{T.projectConfigPackageDBs = x}) (f (T.projectConfigPackageDBs s))
217+
{-# INLINEABLE projectConfigPackageDBs #-}
218+
202219
projectConfigHaddockIndex :: Lens' ProjectConfigShared (Flag PathTemplate)
203220
projectConfigHaddockIndex f s = fmap (\x -> s{T.projectConfigHaddockIndex = x}) (f (T.projectConfigHaddockIndex s))
204221
{-# INLINEABLE projectConfigHaddockIndex #-}
@@ -207,10 +224,6 @@ projectConfigInstallDirs :: Lens' ProjectConfigShared (InstallDirs (Flag PathTem
207224
projectConfigInstallDirs f s = fmap (\x -> s{T.projectConfigInstallDirs = x}) (f (T.projectConfigInstallDirs s))
208225
{-# INLINEABLE projectConfigInstallDirs #-}
209226

210-
projectConfigPackageDBs :: Lens' ProjectConfigShared [Maybe PackageDBCWD]
211-
projectConfigPackageDBs f s = fmap (\x -> s{T.projectConfigPackageDBs = x}) (f (T.projectConfigPackageDBs s))
212-
{-# INLINEABLE projectConfigPackageDBs #-}
213-
214227
projectConfigLocalNoIndexRepos :: Lens' ProjectConfigShared (NubList LocalRepo)
215228
projectConfigLocalNoIndexRepos f s = fmap (\x -> s{T.projectConfigLocalNoIndexRepos = x}) (f (T.projectConfigLocalNoIndexRepos s))
216229
{-# INLINEABLE projectConfigLocalNoIndexRepos #-}

cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project
209209
modifiesCompiler :: ProjectConfig -> Bool
210210
modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg
211211
where
212-
isSet f = f (projectConfigShared pc) /= NoFlag
212+
isSet f = f (projectConfigToolchain (projectConfigShared pc)) /= NoFlag
213213

214214
sanityWalkPCS :: Bool -> ProjectConfigSkeleton -> ParseResult ProjectFileSource ProjectConfigSkeleton
215215
sanityWalkPCS underConditional t@(CondNode d _c comps)

0 commit comments

Comments
 (0)