cabal-install 3.12.1.0 → 3.14.1.0
raw patch · 91 files changed
+2484/−1619 lines, 91 filesdep −hashabledep ~Cabaldep ~Cabal-syntaxdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies removed: hashable
Dependency ranges changed: Cabal, Cabal-syntax, base, cabal-install-solver, hackage-security, network-uri, open-browser, process, tasty-quickcheck
API changes (from Hackage documentation)
- Distribution.Client.Configure: cabalConfigFlagsFile :: FilePath -> FilePath
- Distribution.Client.FileMonitor: DirExists :: MonitorKindDir
- Distribution.Client.FileMonitor: DirModTime :: MonitorKindDir
- Distribution.Client.FileMonitor: DirNotExists :: MonitorKindDir
- Distribution.Client.FileMonitor: FileExists :: MonitorKindFile
- Distribution.Client.FileMonitor: FileHashed :: MonitorKindFile
- Distribution.Client.FileMonitor: FileModTime :: MonitorKindFile
- Distribution.Client.FileMonitor: FileNotExists :: MonitorKindFile
- Distribution.Client.FileMonitor: MonitorFile :: !MonitorKindFile -> !MonitorKindDir -> !FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: MonitorFileGlob :: !MonitorKindFile -> !MonitorKindDir -> !RootedGlob -> MonitorFilePath
- Distribution.Client.FileMonitor: RootedGlob :: FilePathRoot -> Glob -> RootedGlob
- Distribution.Client.FileMonitor: [monitorKindDir] :: MonitorFilePath -> !MonitorKindDir
- Distribution.Client.FileMonitor: [monitorKindFile] :: MonitorFilePath -> !MonitorKindFile
- Distribution.Client.FileMonitor: [monitorPathGlob] :: MonitorFilePath -> !RootedGlob
- Distribution.Client.FileMonitor: [monitorPath] :: MonitorFilePath -> !FilePath
- Distribution.Client.FileMonitor: data MonitorFilePath
- Distribution.Client.FileMonitor: data MonitorKindDir
- Distribution.Client.FileMonitor: data MonitorKindFile
- Distribution.Client.FileMonitor: data RootedGlob
- Distribution.Client.FileMonitor: instance Data.Binary.Class.Binary Distribution.Client.FileMonitor.MonitorFilePath
- Distribution.Client.FileMonitor: instance Data.Binary.Class.Binary Distribution.Client.FileMonitor.MonitorKindDir
- Distribution.Client.FileMonitor: instance Data.Binary.Class.Binary Distribution.Client.FileMonitor.MonitorKindFile
- Distribution.Client.FileMonitor: instance Distribution.Utils.Structured.Structured Distribution.Client.FileMonitor.MonitorFilePath
- Distribution.Client.FileMonitor: instance Distribution.Utils.Structured.Structured Distribution.Client.FileMonitor.MonitorKindDir
- Distribution.Client.FileMonitor: instance Distribution.Utils.Structured.Structured Distribution.Client.FileMonitor.MonitorKindFile
- Distribution.Client.FileMonitor: instance GHC.Classes.Eq Distribution.Client.FileMonitor.MonitorFilePath
- Distribution.Client.FileMonitor: instance GHC.Classes.Eq Distribution.Client.FileMonitor.MonitorKindDir
- Distribution.Client.FileMonitor: instance GHC.Classes.Eq Distribution.Client.FileMonitor.MonitorKindFile
- Distribution.Client.FileMonitor: instance GHC.Generics.Generic Distribution.Client.FileMonitor.MonitorFilePath
- Distribution.Client.FileMonitor: instance GHC.Generics.Generic Distribution.Client.FileMonitor.MonitorKindDir
- Distribution.Client.FileMonitor: instance GHC.Generics.Generic Distribution.Client.FileMonitor.MonitorKindFile
- Distribution.Client.FileMonitor: instance GHC.Show.Show Distribution.Client.FileMonitor.MonitorFilePath
- Distribution.Client.FileMonitor: instance GHC.Show.Show Distribution.Client.FileMonitor.MonitorKindDir
- Distribution.Client.FileMonitor: instance GHC.Show.Show Distribution.Client.FileMonitor.MonitorKindFile
- Distribution.Client.FileMonitor: monitorDirectory :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorDirectoryExistence :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFile :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileExistence :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileGlob :: RootedGlob -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileGlobExistence :: RootedGlob -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileHashed :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileHashedSearchPath :: [FilePath] -> FilePath -> [MonitorFilePath]
- Distribution.Client.FileMonitor: monitorFileOrDirectory :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorFileSearchPath :: [FilePath] -> FilePath -> [MonitorFilePath]
- Distribution.Client.FileMonitor: monitorNonExistentDirectory :: FilePath -> MonitorFilePath
- Distribution.Client.FileMonitor: monitorNonExistentFile :: FilePath -> MonitorFilePath
- Distribution.Client.Glob: instance Data.Binary.Class.Binary Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance Data.Binary.Class.Binary Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance Distribution.Parsec.Parsec Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance Distribution.Parsec.Parsec Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance Distribution.Pretty.Pretty Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance Distribution.Pretty.Pretty Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance Distribution.Utils.Structured.Structured Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance Distribution.Utils.Structured.Structured Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance GHC.Classes.Eq Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance GHC.Classes.Eq Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance GHC.Generics.Generic Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance GHC.Generics.Generic Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: instance GHC.Show.Show Distribution.Client.Glob.FilePathRoot
- Distribution.Client.Glob: instance GHC.Show.Show Distribution.Client.Glob.RootedGlob
- Distribution.Client.Glob: matchGlob :: FilePath -> Glob -> IO [FilePath]
- Distribution.Client.Glob: matchGlobPieces :: GlobPieces -> String -> Bool
- Distribution.Client.Init.Types: PurePrompt :: (NonEmpty String -> Either BreakException (a, NonEmpty String)) -> PurePrompt a
- Distribution.Client.Init.Types: [_runPrompt] :: PurePrompt a -> NonEmpty String -> Either BreakException (a, NonEmpty String)
- Distribution.Client.Init.Types: instance Distribution.Client.Init.Types.Interactive GHC.Types.IO
- Distribution.Client.Init.Types: newtype PurePrompt a
- Distribution.Client.PackageHash: [pkgHashHaddockLib] :: PackageHashConfigInputs -> Maybe String
- Distribution.Client.ProjectConfig: [packageConfigHaddockLib] :: PackageConfig -> Flag String
- Distribution.Client.ProjectConfig.Types: [packageConfigHaddockLib] :: PackageConfig -> Flag String
- Distribution.Client.ProjectPlanning: [elabHaddockLib] :: ElaboratedConfiguredPackage -> Maybe String
- Distribution.Client.ProjectPlanning.Types: [elabHaddockLib] :: ElaboratedConfiguredPackage -> Maybe String
- Distribution.Client.Setup: [buildArgs] :: BuildFlags -> [String]
- Distribution.Client.Setup: [buildCabalFilePath] :: BuildFlags -> Flag FilePath
- Distribution.Client.Setup: [buildDistPref] :: BuildFlags -> Flag FilePath
- Distribution.Client.Setup: [buildVerbosity] :: BuildFlags -> Flag Verbosity
- Distribution.Client.Setup: [configArgs] :: ConfigFlags -> [String]
- Distribution.Client.Setup: [configCabalFilePath] :: ConfigFlags -> Flag FilePath
- Distribution.Client.Setup: [configDistPref] :: ConfigFlags -> Flag FilePath
- Distribution.Client.Setup: [configVerbosity] :: ConfigFlags -> Flag Verbosity
- Distribution.Client.Utils: inDir :: Maybe FilePath -> IO a -> IO a
- Distribution.Client.Utils: tryFindAddSourcePackageDesc :: Verbosity -> FilePath -> String -> IO FilePath
- Distribution.Client.Utils: tryFindPackageDesc :: Verbosity -> FilePath -> String -> IO FilePath
+ Distribution.Client.Dependency: addSetupCabalProfiledDynamic :: DepResolverParams -> DepResolverParams
+ Distribution.Client.Init.Types: data PromptIO a
+ Distribution.Client.Init.Types: data PurePrompt a
+ Distribution.Client.Init.Types: getLastChosenLanguage :: Interactive m => m (Maybe String)
+ Distribution.Client.Init.Types: instance Control.Monad.IO.Class.MonadIO Distribution.Client.Init.Types.PromptIO
+ Distribution.Client.Init.Types: instance Distribution.Client.Init.Types.Interactive Distribution.Client.Init.Types.PromptIO
+ Distribution.Client.Init.Types: instance GHC.Base.Applicative Distribution.Client.Init.Types.PromptIO
+ Distribution.Client.Init.Types: instance GHC.Base.Functor Distribution.Client.Init.Types.PromptIO
+ Distribution.Client.Init.Types: instance GHC.Base.Monad Distribution.Client.Init.Types.PromptIO
+ Distribution.Client.Init.Types: maybeReadProcessWithExitCode :: Interactive m => FilePath -> [String] -> String -> m (Maybe (ExitCode, String, String))
+ Distribution.Client.Init.Types: runPrompt :: PurePrompt a -> Inputs -> Either BreakException (a, Inputs)
+ Distribution.Client.Init.Types: runPromptIO :: PromptIO a -> IO a
+ Distribution.Client.Init.Types: setLastChosenLanguage :: Interactive m => Maybe String -> m ()
+ Distribution.Client.Init.Types: type Inputs = NonEmpty String
+ Distribution.Client.NixStyleOptions: updNixStyleCommonSetupFlags :: (CommonSetupFlags -> CommonSetupFlags) -> NixStyleFlags a -> NixStyleFlags a
+ Distribution.Client.PackageHash: [pkgHashHaddockResourcesDir] :: PackageHashConfigInputs -> Maybe String
+ Distribution.Client.PackageHash: [pkgHashHaddockUseUnicode] :: PackageHashConfigInputs -> Bool
+ Distribution.Client.ProjectConfig: BadProjectRootAbsoluteFileNotFound :: FilePath -> BadProjectRoot
+ Distribution.Client.ProjectConfig: BadProjectRootDirFileNotFound :: FilePath -> FilePath -> BadProjectRoot
+ Distribution.Client.ProjectConfig: BadProjectRootDirNotFound :: FilePath -> BadProjectRoot
+ Distribution.Client.ProjectConfig: BadProjectRootExplicitFileNotFound :: FilePath -> BadProjectRoot
+ Distribution.Client.ProjectConfig: BadProjectRootFileBroken :: FilePath -> BadProjectRoot
+ Distribution.Client.ProjectConfig: ProjectRootUsabilityNotPresent :: ProjectRootUsability
+ Distribution.Client.ProjectConfig: ProjectRootUsabilityPresentAndUnusable :: ProjectRootUsability
+ Distribution.Client.ProjectConfig: ProjectRootUsabilityPresentAndUsable :: ProjectRootUsability
+ Distribution.Client.ProjectConfig: [packageConfigHaddockResourcesDir] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig: [packageConfigHaddockUseUnicode] :: PackageConfig -> Flag Bool
+ Distribution.Client.ProjectConfig: [packageConfigProfShared] :: PackageConfig -> Flag Bool
+ Distribution.Client.ProjectConfig: data ProjectRootUsability
+ Distribution.Client.ProjectConfig: getProjectRootUsability :: FilePath -> IO ProjectRootUsability
+ Distribution.Client.ProjectConfig: instance GHC.Classes.Eq Distribution.Client.ProjectConfig.BadProjectRoot
+ Distribution.Client.ProjectConfig: instance GHC.Classes.Eq Distribution.Client.ProjectConfig.ProjectRootUsability
+ Distribution.Client.ProjectConfig: instance GHC.Show.Show Distribution.Client.ProjectConfig.ProjectRootUsability
+ Distribution.Client.ProjectConfig: onlyTopLevelProvenance :: Set ProjectConfigProvenance -> Set ProjectConfigProvenance
+ Distribution.Client.ProjectConfig.Types: [packageConfigHaddockResourcesDir] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig.Types: [packageConfigHaddockUseUnicode] :: PackageConfig -> Flag Bool
+ Distribution.Client.ProjectConfig.Types: [packageConfigProfShared] :: PackageConfig -> Flag Bool
+ Distribution.Client.ProjectPlanning: [elabHaddockResourcesDir] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.ProjectPlanning: [elabHaddockUseUnicode] :: ElaboratedConfiguredPackage -> Bool
+ Distribution.Client.ProjectPlanning: setupHsCommonFlags :: Verbosity -> Maybe (SymbolicPath CWD (Dir Pkg)) -> SymbolicPath Pkg (Dir Dist) -> CommonSetupFlags
+ Distribution.Client.ProjectPlanning.Types: CuzHooksBuildType :: NotPerComponentBuildType
+ Distribution.Client.ProjectPlanning.Types: [elabHaddockResourcesDir] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.ProjectPlanning.Types: [elabHaddockUseUnicode] :: ElaboratedConfiguredPackage -> Bool
+ Distribution.Client.Setup: CommonSetupFlags :: !Flag Verbosity -> !Flag (SymbolicPath CWD ('Dir Pkg)) -> !Flag (SymbolicPath Pkg ('Dir Dist)) -> !Flag (SymbolicPath Pkg 'File) -> [String] -> CommonSetupFlags
+ Distribution.Client.Setup: [buildCommonFlags] :: BuildFlags -> !CommonSetupFlags
+ Distribution.Client.Setup: [configCommonFlags] :: ConfigFlags -> !CommonSetupFlags
+ Distribution.Client.Setup: [configIgnoreBuildTools] :: ConfigFlags -> Flag Bool
+ Distribution.Client.Setup: [configProfShared] :: ConfigFlags -> Flag Bool
+ Distribution.Client.Setup: [setupCabalFilePath] :: CommonSetupFlags -> !Flag (SymbolicPath Pkg 'File)
+ Distribution.Client.Setup: [setupDistPref] :: CommonSetupFlags -> !Flag (SymbolicPath Pkg ('Dir Dist))
+ Distribution.Client.Setup: [setupTargets] :: CommonSetupFlags -> [String]
+ Distribution.Client.Setup: [setupVerbosity] :: CommonSetupFlags -> !Flag Verbosity
+ Distribution.Client.Setup: [setupWorkingDir] :: CommonSetupFlags -> !Flag (SymbolicPath CWD ('Dir Pkg))
+ Distribution.Client.Setup: data () => CommonSetupFlags
+ Distribution.Client.Setup: filterCommonFlags :: CommonSetupFlags -> Version -> CommonSetupFlags
+ Distribution.Client.Setup: pattern BuildCommonFlags :: Flag Verbosity -> Flag (SymbolicPath Pkg ('Dir Dist)) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Flag (SymbolicPath Pkg 'File) -> [String] -> BuildFlags
+ Distribution.Client.Setup: pattern ConfigCommonFlags :: Flag Verbosity -> Flag (SymbolicPath Pkg ('Dir Dist)) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Flag (SymbolicPath Pkg 'File) -> [String] -> ConfigFlags
+ Distribution.Client.Utils: makeRelativeToDirS :: Maybe (SymbolicPath CWD (Dir dir)) -> SymbolicPath CWD to -> IO (SymbolicPath dir to)
+ Distribution.Client.Utils: tryReadAddSourcePackageDesc :: Verbosity -> FilePath -> String -> IO GenericPackageDescription
+ Distribution.Client.Utils: tryReadGenericPackageDesc :: Verbosity -> SymbolicPath CWD (Dir Pkg) -> String -> IO GenericPackageDescription
- Distribution.Client.CmdLegacy: legacyWrapperCmd :: Monoid flags => CommandUI flags -> (flags -> Flag Verbosity) -> (flags -> Flag String) -> [CommandSpec (GlobalFlags -> IO ())]
+ Distribution.Client.CmdLegacy: legacyWrapperCmd :: Monoid flags => CommandUI flags -> (flags -> CommonSetupFlags) -> [CommandSpec (GlobalFlags -> IO ())]
- Distribution.Client.Configure: configure :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> ConfigFlags -> ConfigExFlags -> [String] -> IO ()
+ Distribution.Client.Configure: configure :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> ConfigFlags -> ConfigExFlags -> [String] -> IO ()
- Distribution.Client.Configure: configureSetupScript :: PackageDBStack -> Compiler -> Platform -> ProgramDb -> FilePath -> VersionRange -> Maybe Lock -> Bool -> InstalledPackageIndex -> Maybe ReadyPackage -> SetupScriptOptions
+ Distribution.Client.Configure: configureSetupScript :: PackageDBStackCWD -> Compiler -> Platform -> ProgramDb -> SymbolicPath Pkg (Dir Dist) -> VersionRange -> Maybe Lock -> Bool -> InstalledPackageIndex -> Maybe ReadyPackage -> SetupScriptOptions
- Distribution.Client.Configure: writeConfigFlagsTo :: FilePath -> Verbosity -> (ConfigFlags, ConfigExFlags) -> IO ()
+ Distribution.Client.Configure: writeConfigFlagsTo :: Verbosity -> FilePath -> (ConfigFlags, ConfigExFlags) -> IO ()
- Distribution.Client.Dependency: resolveDependencies :: Platform -> CompilerInfo -> PkgConfigDb -> DepResolverParams -> Progress String String SolverInstallPlan
+ Distribution.Client.Dependency: resolveDependencies :: Platform -> CompilerInfo -> Maybe PkgConfigDb -> DepResolverParams -> Progress String String SolverInstallPlan
- Distribution.Client.DistDirLayout: DistDirLayout :: FilePath -> (String -> FilePath) -> FilePath -> (DistDirParams -> FilePath) -> FilePath -> FilePath -> (PackageId -> FilePath) -> FilePath -> (String -> FilePath) -> FilePath -> (DistDirParams -> String -> FilePath) -> (DistDirParams -> FilePath) -> (PackageId -> FilePath) -> FilePath -> FilePath -> FilePath -> (CompilerId -> PackageDB) -> Maybe FilePath -> DistDirLayout
+ Distribution.Client.DistDirLayout: DistDirLayout :: FilePath -> (String -> FilePath) -> FilePath -> (DistDirParams -> FilePath) -> FilePath -> FilePath -> (PackageId -> FilePath) -> FilePath -> (String -> FilePath) -> FilePath -> (DistDirParams -> String -> FilePath) -> (DistDirParams -> FilePath) -> (PackageId -> FilePath) -> FilePath -> FilePath -> FilePath -> (CompilerId -> PackageDBCWD) -> Maybe FilePath -> DistDirLayout
- Distribution.Client.DistDirLayout: StoreDirLayout :: (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> (Compiler -> FilePath) -> (Compiler -> PackageDB) -> (Compiler -> [Maybe PackageDB] -> PackageDBStack) -> (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> StoreDirLayout
+ Distribution.Client.DistDirLayout: StoreDirLayout :: (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> (Compiler -> FilePath) -> (Compiler -> PackageDBCWD) -> (Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD) -> (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> StoreDirLayout
- Distribution.Client.DistDirLayout: [distPackageDB] :: DistDirLayout -> CompilerId -> PackageDB
+ Distribution.Client.DistDirLayout: [distPackageDB] :: DistDirLayout -> CompilerId -> PackageDBCWD
- Distribution.Client.DistDirLayout: [storePackageDBStack] :: StoreDirLayout -> Compiler -> [Maybe PackageDB] -> PackageDBStack
+ Distribution.Client.DistDirLayout: [storePackageDBStack] :: StoreDirLayout -> Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD
- Distribution.Client.DistDirLayout: [storePackageDB] :: StoreDirLayout -> Compiler -> PackageDB
+ Distribution.Client.DistDirLayout: [storePackageDB] :: StoreDirLayout -> Compiler -> PackageDBCWD
- Distribution.Client.Fetch: fetch :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FetchFlags -> [UserTarget] -> IO ()
+ Distribution.Client.Fetch: fetch :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FetchFlags -> [UserTarget] -> IO ()
- Distribution.Client.Freeze: freeze :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO ()
+ Distribution.Client.Freeze: freeze :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO ()
- Distribution.Client.Freeze: getFreezePkgs :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO [SolverPlanPackage]
+ Distribution.Client.Freeze: getFreezePkgs :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO [SolverPlanPackage]
- Distribution.Client.GenBounds: genBounds :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO ()
+ Distribution.Client.GenBounds: genBounds :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> FreezeFlags -> IO ()
- Distribution.Client.Glob: data FilePathRoot
+ Distribution.Client.Glob: data () => FilePathRoot
- Distribution.Client.Glob: data RootedGlob
+ Distribution.Client.Glob: data () => RootedGlob
- Distribution.Client.IndexUtils: getInstalledPackages :: Verbosity -> Compiler -> PackageDBStack -> ProgramDb -> IO InstalledPackageIndex
+ Distribution.Client.IndexUtils: getInstalledPackages :: Verbosity -> Compiler -> PackageDBStackCWD -> ProgramDb -> IO InstalledPackageIndex
- Distribution.Client.IndexUtils: getInstalledPackagesMonitorFiles :: Verbosity -> Compiler -> PackageDBStack -> ProgramDb -> Platform -> IO [FilePath]
+ Distribution.Client.IndexUtils: getInstalledPackagesMonitorFiles :: Verbosity -> Compiler -> Maybe (SymbolicPath CWD ('Dir from)) -> PackageDBStackS from -> ProgramDb -> Platform -> IO [FilePath]
- Distribution.Client.Init: initCmd :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> ProgramDb -> InitFlags -> IO ()
+ Distribution.Client.Init: initCmd :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> ProgramDb -> InitFlags -> IO ()
- Distribution.Client.Init.Types: evalPrompt :: PurePrompt a -> NonEmpty String -> a
+ Distribution.Client.Init.Types: evalPrompt :: PurePrompt a -> Inputs -> a
- Distribution.Client.Install: install :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> ConfigFlags -> ConfigExFlags -> InstallFlags -> HaddockFlags -> TestFlags -> BenchmarkFlags -> [UserTarget] -> IO ()
+ Distribution.Client.Install: install :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform -> ProgramDb -> GlobalFlags -> ConfigFlags -> ConfigExFlags -> InstallFlags -> HaddockFlags -> TestFlags -> BenchmarkFlags -> [UserTarget] -> IO ()
- Distribution.Client.Install: type InstallArgs = (PackageDBStack, RepoContext, Compiler, Platform, ProgramDb, GlobalFlags, ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags, TestFlags, BenchmarkFlags)
+ Distribution.Client.Install: type InstallArgs = (PackageDBStackCWD, RepoContext, Compiler, Platform, ProgramDb, GlobalFlags, ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags, TestFlags, BenchmarkFlags)
- Distribution.Client.Install: type InstallContext = (InstalledPackageIndex, SourcePackageDb, PkgConfigDb, [UserTarget], [PackageSpecifier UnresolvedSourcePackage], HttpTransport)
+ Distribution.Client.Install: type InstallContext = (InstalledPackageIndex, SourcePackageDb, Maybe PkgConfigDb, [UserTarget], [PackageSpecifier UnresolvedSourcePackage], HttpTransport)
- Distribution.Client.List: info :: Verbosity -> PackageDBStack -> RepoContext -> Compiler -> ProgramDb -> GlobalFlags -> InfoFlags -> [UserTarget] -> IO ()
+ Distribution.Client.List: info :: Verbosity -> PackageDBStackCWD -> RepoContext -> Compiler -> ProgramDb -> GlobalFlags -> InfoFlags -> [UserTarget] -> IO ()
- Distribution.Client.List: list :: Verbosity -> PackageDBStack -> RepoContext -> Maybe (Compiler, ProgramDb) -> ListFlags -> [String] -> IO ()
+ Distribution.Client.List: list :: Verbosity -> PackageDBStackCWD -> RepoContext -> Maybe (Compiler, ProgramDb) -> ListFlags -> [String] -> IO ()
- Distribution.Client.PackageHash: PackageHashConfigInputs :: CompilerId -> AbiTag -> Platform -> FlagAssignment -> [String] -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> Map String [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> [Maybe PackageDB] -> Bool -> Bool -> Bool -> Maybe String -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> PackageHashConfigInputs
+ Distribution.Client.PackageHash: PackageHashConfigInputs :: CompilerId -> AbiTag -> Platform -> FlagAssignment -> [String] -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> Map String [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> [Maybe PackageDBCWD] -> Bool -> Bool -> Bool -> Maybe String -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> Bool -> PackageHashConfigInputs
- Distribution.Client.PackageHash: [pkgHashPackageDbs] :: PackageHashConfigInputs -> [Maybe PackageDB]
+ Distribution.Client.PackageHash: [pkgHashPackageDbs] :: PackageHashConfigInputs -> [Maybe PackageDBCWD]
- Distribution.Client.ProjectBuilding.UnpackedPackage: buildAndInstallUnpackedPackage :: Verbosity -> DistDirLayout -> StoreDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> FilePath -> FilePath -> IO BuildResult
+ Distribution.Client.ProjectBuilding.UnpackedPackage: buildAndInstallUnpackedPackage :: Verbosity -> DistDirLayout -> StoreDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult
- Distribution.Client.ProjectBuilding.UnpackedPackage: buildAndRegisterUnpackedPackage :: Verbosity -> DistDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> FilePath -> FilePath -> Maybe FilePath -> (PackageBuildingPhase -> IO ()) -> IO ()
+ Distribution.Client.ProjectBuilding.UnpackedPackage: buildAndRegisterUnpackedPackage :: Verbosity -> DistDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> Maybe FilePath -> (PackageBuildingPhase -> IO ()) -> IO ()
- Distribution.Client.ProjectBuilding.UnpackedPackage: buildInplaceUnpackedPackage :: Verbosity -> DistDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> BuildStatusRebuild -> FilePath -> FilePath -> IO BuildResult
+ Distribution.Client.ProjectBuilding.UnpackedPackage: buildInplaceUnpackedPackage :: Verbosity -> DistDirLayout -> Maybe SemaphoreName -> BuildTimeSettings -> Lock -> Lock -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> BuildStatusRebuild -> SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult
- Distribution.Client.ProjectConfig: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag FilePath -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
+ Distribution.Client.ProjectConfig: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag FilePath -> Flag Bool -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
- Distribution.Client.ProjectConfig: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> Flag Bool -> ProjectConfigShared
+ Distribution.Client.ProjectConfig: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDBCWD] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> Flag Bool -> ProjectConfigShared
- Distribution.Client.ProjectConfig: [projectConfigPackageDBs] :: ProjectConfigShared -> [Maybe PackageDB]
+ Distribution.Client.ProjectConfig: [projectConfigPackageDBs] :: ProjectConfigShared -> [Maybe PackageDBCWD]
- Distribution.Client.ProjectConfig.Types: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag FilePath -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
+ Distribution.Client.ProjectConfig.Types: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag FilePath -> Flag Bool -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
- Distribution.Client.ProjectConfig.Types: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> Flag Bool -> ProjectConfigShared
+ Distribution.Client.ProjectConfig.Types: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDBCWD] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> Flag Bool -> ProjectConfigShared
- Distribution.Client.ProjectConfig.Types: [projectConfigPackageDBs] :: ProjectConfigShared -> [Maybe PackageDB]
+ Distribution.Client.ProjectConfig.Types: [projectConfigPackageDBs] :: ProjectConfigShared -> [Maybe PackageDBCWD]
- Distribution.Client.ProjectPlanning: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> BuildOptions -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
+ Distribution.Client.ProjectPlanning: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDBCWD] -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> Maybe CabalFileText -> BuildOptions -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> Bool -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
- Distribution.Client.ProjectPlanning: [elabBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: [elabInplaceBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabInplaceBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: [elabInplaceRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabInplaceRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: [elabInplaceSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabInplaceSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: [elabPackageDbs] :: ElaboratedConfiguredPackage -> [Maybe PackageDB]
+ Distribution.Client.ProjectPlanning: [elabPackageDbs] :: ElaboratedConfiguredPackage -> [Maybe PackageDBCWD]
- Distribution.Client.ProjectPlanning: [elabRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: [elabSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning: [elabSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning: setupHsBenchFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> BenchmarkFlags
+ Distribution.Client.ProjectPlanning: setupHsBenchFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> BenchmarkFlags
- Distribution.Client.ProjectPlanning: setupHsBuildFlags :: Flag String -> ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> BuildFlags
+ Distribution.Client.ProjectPlanning: setupHsBuildFlags :: Flag String -> ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> BuildFlags
- Distribution.Client.ProjectPlanning: setupHsConfigureFlags :: ElaboratedInstallPlan -> ElaboratedReadyPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> ConfigFlags
+ Distribution.Client.ProjectPlanning: setupHsConfigureFlags :: Monad m => (FilePath -> m (SymbolicPath Pkg (Dir PkgDB))) -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> m ConfigFlags
- Distribution.Client.ProjectPlanning: setupHsCopyFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> FilePath -> CopyFlags
+ Distribution.Client.ProjectPlanning: setupHsCopyFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> FilePath -> CopyFlags
- Distribution.Client.ProjectPlanning: setupHsHaddockFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> HaddockFlags
+ Distribution.Client.ProjectPlanning: setupHsHaddockFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> BuildTimeSettings -> CommonSetupFlags -> HaddockFlags
- Distribution.Client.ProjectPlanning: setupHsRegisterFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> FilePath -> RegisterFlags
+ Distribution.Client.ProjectPlanning: setupHsRegisterFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> FilePath -> RegisterFlags
- Distribution.Client.ProjectPlanning: setupHsReplFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> Verbosity -> FilePath -> ReplFlags
+ Distribution.Client.ProjectPlanning: setupHsReplFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig -> CommonSetupFlags -> ReplFlags
- Distribution.Client.ProjectPlanning: setupHsScriptOptions :: ElaboratedReadyPackage -> ElaboratedInstallPlan -> ElaboratedSharedConfig -> DistDirLayout -> FilePath -> FilePath -> Bool -> Lock -> SetupScriptOptions
+ Distribution.Client.ProjectPlanning: setupHsScriptOptions :: ElaboratedReadyPackage -> ElaboratedInstallPlan -> ElaboratedSharedConfig -> DistDirLayout -> SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> Bool -> Lock -> SetupScriptOptions
- Distribution.Client.ProjectPlanning: setupHsTestFlags :: ElaboratedConfiguredPackage -> Verbosity -> FilePath -> TestFlags
+ Distribution.Client.ProjectPlanning: setupHsTestFlags :: ElaboratedConfiguredPackage -> CommonSetupFlags -> TestFlags
- Distribution.Client.ProjectPlanning.Types: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> BuildOptions -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
+ Distribution.Client.ProjectPlanning.Types: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDBCWD] -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> PackageDBStackCWD -> Maybe CabalFileText -> BuildOptions -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe FilePath -> Bool -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
- Distribution.Client.ProjectPlanning.Types: [elabBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning.Types: [elabInplaceBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabInplaceBuildPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning.Types: [elabInplaceRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabInplaceRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning.Types: [elabInplaceSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabInplaceSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning.Types: [elabPackageDbs] :: ElaboratedConfiguredPackage -> [Maybe PackageDB]
+ Distribution.Client.ProjectPlanning.Types: [elabPackageDbs] :: ElaboratedConfiguredPackage -> [Maybe PackageDBCWD]
- Distribution.Client.ProjectPlanning.Types: [elabRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabRegisterPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.ProjectPlanning.Types: [elabSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStack
+ Distribution.Client.ProjectPlanning.Types: [elabSetupPackageDBStack] :: ElaboratedConfiguredPackage -> PackageDBStackCWD
- Distribution.Client.RebuildMonad: data FilePathRoot
+ Distribution.Client.RebuildMonad: data () => FilePathRoot
- Distribution.Client.RebuildMonad: data MonitorFilePath
+ Distribution.Client.RebuildMonad: data () => MonitorFilePath
- Distribution.Client.RebuildMonad: data RootedGlob
+ Distribution.Client.RebuildMonad: data () => RootedGlob
- Distribution.Client.Reconfigure: reconfigure :: ((ConfigFlags, ConfigExFlags) -> [String] -> GlobalFlags -> IO ()) -> Verbosity -> FilePath -> Flag (Maybe Int) -> Check (ConfigFlags, ConfigExFlags) -> [String] -> GlobalFlags -> SavedConfig -> IO SavedConfig
+ Distribution.Client.Reconfigure: reconfigure :: ((ConfigFlags, ConfigExFlags) -> [String] -> GlobalFlags -> IO ()) -> Verbosity -> SymbolicPath Pkg (Dir Dist) -> Flag (Maybe Int) -> Check (ConfigFlags, ConfigExFlags) -> [String] -> GlobalFlags -> SavedConfig -> IO SavedConfig
- Distribution.Client.Sandbox: findSavedDistPref :: SavedConfig -> Flag FilePath -> IO FilePath
+ Distribution.Client.Sandbox: findSavedDistPref :: SavedConfig -> Flag (SymbolicPath Pkg (Dir Dist)) -> IO (SymbolicPath Pkg (Dir Dist))
- Distribution.Client.Setup: BuildFlags :: [(String, FilePath)] -> [(String, [String])] -> Flag FilePath -> Flag Verbosity -> Flag (Maybe Int) -> Flag String -> [String] -> Flag FilePath -> BuildFlags
+ Distribution.Client.Setup: BuildFlags :: !CommonSetupFlags -> [(String, FilePath)] -> [(String, [String])] -> Flag (Maybe Int) -> Flag String -> BuildFlags
- Distribution.Client.Setup: ConfigFlags :: [String] -> Option' (Last' ProgramDb) -> [(String, FilePath)] -> [(String, [String])] -> NubList FilePath -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> Flag FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag String -> Flag ComponentId -> Flag Bool -> Flag FilePath -> Flag FilePath -> Flag Verbosity -> Flag Bool -> [Maybe PackageDB] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> [PackageVersionConstraint] -> [GivenComponent] -> [GivenComponent] -> [(ModuleName, Module)] -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag [UnitId] -> ConfigFlags
+ Distribution.Client.Setup: ConfigFlags :: !CommonSetupFlags -> Option' (Last' ProgramDb) -> [(String, FilePath)] -> [(String, [String])] -> NubList FilePath -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> Flag FilePath -> [SymbolicPath Pkg ('Dir Lib)] -> [SymbolicPath Pkg ('Dir Lib)] -> [SymbolicPath Pkg ('Dir Framework)] -> [SymbolicPath Pkg ('Dir Include)] -> Flag String -> Flag ComponentId -> Flag Bool -> Flag Bool -> [Maybe PackageDB] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> [PackageVersionConstraint] -> [GivenComponent] -> [PromisedComponent] -> [(ModuleName, Module)] -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag [UnitId] -> Flag Bool -> ConfigFlags
- Distribution.Client.Setup: [configExtraFrameworkDirs] :: ConfigFlags -> [FilePath]
+ Distribution.Client.Setup: [configExtraFrameworkDirs] :: ConfigFlags -> [SymbolicPath Pkg ('Dir Framework)]
- Distribution.Client.Setup: [configExtraIncludeDirs] :: ConfigFlags -> [FilePath]
+ Distribution.Client.Setup: [configExtraIncludeDirs] :: ConfigFlags -> [SymbolicPath Pkg ('Dir Include)]
- Distribution.Client.Setup: [configExtraLibDirsStatic] :: ConfigFlags -> [FilePath]
+ Distribution.Client.Setup: [configExtraLibDirsStatic] :: ConfigFlags -> [SymbolicPath Pkg ('Dir Lib)]
- Distribution.Client.Setup: [configExtraLibDirs] :: ConfigFlags -> [FilePath]
+ Distribution.Client.Setup: [configExtraLibDirs] :: ConfigFlags -> [SymbolicPath Pkg ('Dir Lib)]
- Distribution.Client.Setup: [configPromisedDependencies] :: ConfigFlags -> [GivenComponent]
+ Distribution.Client.Setup: [configPromisedDependencies] :: ConfigFlags -> [PromisedComponent]
- Distribution.Client.SetupWrapper: SetupScriptOptions :: VersionRange -> Maybe Version -> Maybe Compiler -> Maybe Platform -> PackageDBStack -> Maybe InstalledPackageIndex -> ProgramDb -> FilePath -> Maybe Handle -> Maybe FilePath -> [FilePath] -> [(String, Maybe FilePath)] -> Bool -> [(ComponentId, PackageId)] -> Bool -> Bool -> Bool -> Maybe Lock -> Bool -> SetupScriptOptions
+ Distribution.Client.SetupWrapper: SetupScriptOptions :: VersionRange -> Maybe Version -> Maybe Compiler -> Maybe Platform -> PackageDBStackCWD -> Maybe InstalledPackageIndex -> ProgramDb -> SymbolicPath Pkg (Dir Dist) -> Maybe Handle -> Maybe (SymbolicPath CWD (Dir Pkg)) -> [FilePath] -> [(String, Maybe FilePath)] -> Bool -> [(ComponentId, PackageId)] -> Bool -> Bool -> Bool -> Maybe Lock -> Bool -> SetupScriptOptions
- Distribution.Client.SetupWrapper: [useDistPref] :: SetupScriptOptions -> FilePath
+ Distribution.Client.SetupWrapper: [useDistPref] :: SetupScriptOptions -> SymbolicPath Pkg (Dir Dist)
- Distribution.Client.SetupWrapper: [usePackageDB] :: SetupScriptOptions -> PackageDBStack
+ Distribution.Client.SetupWrapper: [usePackageDB] :: SetupScriptOptions -> PackageDBStackCWD
- Distribution.Client.SetupWrapper: [useWorkingDir] :: SetupScriptOptions -> Maybe FilePath
+ Distribution.Client.SetupWrapper: [useWorkingDir] :: SetupScriptOptions -> Maybe (SymbolicPath CWD (Dir Pkg))
- Distribution.Client.SetupWrapper: runSetupCommand :: Verbosity -> Setup -> CommandUI flags -> flags -> [String] -> IO ()
+ Distribution.Client.SetupWrapper: runSetupCommand :: Verbosity -> Setup -> CommandUI flags -> (flags -> CommonSetupFlags) -> flags -> [String] -> IO ()
- Distribution.Client.SetupWrapper: setupWrapper :: Verbosity -> SetupScriptOptions -> Maybe PackageDescription -> CommandUI flags -> (Version -> flags) -> (Version -> [String]) -> IO ()
+ Distribution.Client.SetupWrapper: setupWrapper :: Verbosity -> SetupScriptOptions -> Maybe PackageDescription -> CommandUI flags -> (flags -> CommonSetupFlags) -> (Version -> IO flags) -> (Version -> [String]) -> IO ()
- Distribution.Client.Store: StoreDirLayout :: (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> (Compiler -> FilePath) -> (Compiler -> PackageDB) -> (Compiler -> [Maybe PackageDB] -> PackageDBStack) -> (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> StoreDirLayout
+ Distribution.Client.Store: StoreDirLayout :: (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> (Compiler -> FilePath) -> (Compiler -> PackageDBCWD) -> (Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD) -> (Compiler -> FilePath) -> (Compiler -> UnitId -> FilePath) -> StoreDirLayout
- Distribution.Client.Store: [storePackageDBStack] :: StoreDirLayout -> Compiler -> [Maybe PackageDB] -> PackageDBStack
+ Distribution.Client.Store: [storePackageDBStack] :: StoreDirLayout -> Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD
- Distribution.Client.Store: [storePackageDB] :: StoreDirLayout -> Compiler -> PackageDB
+ Distribution.Client.Store: [storePackageDB] :: StoreDirLayout -> Compiler -> PackageDBCWD
Files
- cabal-install.cabal +16/−16
- changelog +6/−1
- src/Distribution/Client/Check.hs +5/−3
- src/Distribution/Client/CmdBench.hs +2/−1
- src/Distribution/Client/CmdBuild.hs +3/−2
- src/Distribution/Client/CmdClean.hs +8/−3
- src/Distribution/Client/CmdConfigure.hs +3/−2
- src/Distribution/Client/CmdExec.hs +15/−10
- src/Distribution/Client/CmdFreeze.hs +4/−3
- src/Distribution/Client/CmdHaddock.hs +3/−2
- src/Distribution/Client/CmdHaddockProject.hs +111/−72
- src/Distribution/Client/CmdInstall.hs +21/−18
- src/Distribution/Client/CmdLegacy.hs +36/−16
- src/Distribution/Client/CmdListBin.hs +2/−2
- src/Distribution/Client/CmdOutdated.hs +3/−3
- src/Distribution/Client/CmdRepl.hs +2/−1
- src/Distribution/Client/CmdRun.hs +44/−12
- src/Distribution/Client/CmdSdist.hs +34/−22
- src/Distribution/Client/CmdTest.hs +2/−1
- src/Distribution/Client/CmdUpdate.hs +3/−2
- src/Distribution/Client/Compat/Orphans.hs +1/−1
- src/Distribution/Client/Config.hs +62/−32
- src/Distribution/Client/Configure.hs +32/−24
- src/Distribution/Client/Dependency.hs +20/−3
- src/Distribution/Client/DistDirLayout.hs +11/−11
- src/Distribution/Client/Fetch.hs +2/−6
- src/Distribution/Client/FileMonitor.hs +19/−161
- src/Distribution/Client/Freeze.hs +3/−7
- src/Distribution/Client/GenBounds.hs +4/−11
- src/Distribution/Client/Glob.hs +5/−58
- src/Distribution/Client/HttpUtils.hs +35/−14
- src/Distribution/Client/IndexUtils.hs +10/−15
- src/Distribution/Client/Init.hs +2/−3
- src/Distribution/Client/Init/Defaults.hs +1/−0
- src/Distribution/Client/Init/Format.hs +5/−5
- src/Distribution/Client/Init/Interactive/Command.hs +7/−1
- src/Distribution/Client/Init/NonInteractive/Heuristics.hs +11/−11
- src/Distribution/Client/Init/Types.hs +96/−36
- src/Distribution/Client/Init/Utils.hs +1/−1
- src/Distribution/Client/Install.hs +104/−88
- src/Distribution/Client/InstallSymlink.hs +4/−3
- src/Distribution/Client/List.hs +3/−6
- src/Distribution/Client/Main.hs +216/−105
- src/Distribution/Client/NixStyleOptions.hs +31/−1
- src/Distribution/Client/PackageHash.hs +6/−4
- src/Distribution/Client/ProjectBuilding.hs +27/−23
- src/Distribution/Client/ProjectBuilding/PackageFileMonitor.hs +2/−2
- src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs +66/−53
- src/Distribution/Client/ProjectConfig.hs +137/−82
- src/Distribution/Client/ProjectConfig/Legacy.hs +74/−47
- src/Distribution/Client/ProjectConfig/Types.hs +5/−3
- src/Distribution/Client/ProjectOrchestration.hs +17/−12
- src/Distribution/Client/ProjectPlanOutput.hs +12/−17
- src/Distribution/Client/ProjectPlanning.hs +298/−170
- src/Distribution/Client/ProjectPlanning/SetupPolicy.hs +7/−7
- src/Distribution/Client/ProjectPlanning/Types.hs +28/−17
- src/Distribution/Client/RebuildMonad.hs +1/−0
- src/Distribution/Client/Reconfigure.hs +34/−16
- src/Distribution/Client/Run.hs +49/−20
- src/Distribution/Client/Sandbox.hs +15/−6
- src/Distribution/Client/Sandbox/PackageEnvironment.hs +1/−0
- src/Distribution/Client/ScriptUtils.hs +13/−6
- src/Distribution/Client/Security/HTTP.hs +0/−5
- src/Distribution/Client/Setup.hs +97/−15
- src/Distribution/Client/SetupWrapper.hs +155/−93
- src/Distribution/Client/SourceFiles.hs +16/−13
- src/Distribution/Client/SrcDist.hs +23/−13
- src/Distribution/Client/Store.hs +1/−3
- src/Distribution/Client/TargetSelector.hs +27/−25
- src/Distribution/Client/Targets.hs +4/−8
- src/Distribution/Client/Utils.hs +79/−37
- src/Distribution/Client/VCS.hs +1/−1
- src/Distribution/Deprecated/ParseUtils.hs +0/−7
- src/Distribution/Deprecated/ReadP.hs +0/−12
- tests/IntegrationTests2.hs +18/−5
- tests/UnitTests/Distribution/Client/Configure.hs +12/−6
- tests/UnitTests/Distribution/Client/FileMonitor.hs +5/−12
- tests/UnitTests/Distribution/Client/Init.hs +2/−1
- tests/UnitTests/Distribution/Client/Init/FileCreators.hs +1/−1
- tests/UnitTests/Distribution/Client/Init/Golden.hs +5/−5
- tests/UnitTests/Distribution/Client/Init/Interactive.hs +24/−10
- tests/UnitTests/Distribution/Client/Init/NonInteractive.hs +12/−12
- tests/UnitTests/Distribution/Client/Init/Simple.hs +7/−7
- tests/UnitTests/Distribution/Client/ProjectConfig.hs +57/−8
- tests/UnitTests/Distribution/Client/TreeDiffInstances.hs +3/−2
- tests/UnitTests/Distribution/Client/UserConfig.hs +0/−3
- tests/UnitTests/Distribution/Solver/Modular/DSL.hs +9/−5
- tests/UnitTests/Distribution/Solver/Modular/DSL/TestCaseUtils.hs +2/−2
- tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs +38/−21
- tests/UnitTests/Distribution/Solver/Modular/QuickCheck/Utils.hs +86/−3
- tests/UnitTests/Distribution/Solver/Types/OptionalStanza.hs +0/−4
cabal-install.cabal view
@@ -1,7 +1,7 @@ Cabal-Version: 3.0 Name: cabal-install-Version: 3.12.1.0+Version: 3.14.1.0 Synopsis: The command-line interface for Cabal and Hackage. Description: The \'cabal\' command-line program simplifies the process of managing@@ -40,27 +40,28 @@ manual: True common warnings- ghc-options: -Wall -Wcompat -Wnoncanonical-monad-instances -Wincomplete-uni-patterns -Wincomplete-record-updates+ ghc-options:+ -Wall+ -Wcompat+ -Wnoncanonical-monad-instances+ -Wincomplete-uni-patterns+ -Wincomplete-record-updates+ -Wno-unticked-promoted-constructors if impl(ghc < 8.8) ghc-options: -Wnoncanonical-monadfail-instances - if impl(ghc >=9.0)- -- Warning: even though introduced with GHC 8.10, -Wunused-packages- -- gives false positives with GHC 8.10.- ghc-options: -Wunused-packages- common base-dep- build-depends: base >=4.11 && <4.21+ build-depends: base >=4.13 && <4.22 common cabal-dep- build-depends: Cabal ^>=3.12.1.0+ build-depends: Cabal ^>=3.14 common cabal-syntax-dep- build-depends: Cabal-syntax ^>=3.12.1.0+ build-depends: Cabal-syntax ^>=3.14 common cabal-install-solver-dep- build-depends: cabal-install-solver ^>=3.12.1.0+ build-depends: cabal-install-solver ^>=3.14 library import: warnings, base-dep, cabal-dep, cabal-syntax-dep, cabal-install-solver-dep@@ -230,7 +231,6 @@ edit-distance >= 0.2.2 && < 0.3, exceptions >= 0.10.4 && < 0.11, filepath >= 1.4.0.0 && < 1.6,- hashable >= 1.0 && < 1.5, HTTP >= 4000.1.5 && < 4000.5, mtl >= 2.0 && < 2.4, network-uri >= 2.6.0.2 && < 2.7,@@ -241,7 +241,7 @@ tar >= 0.5.0.3 && < 0.7, time >= 1.5.0.1 && < 1.15, zlib >= 0.5.3 && < 0.8,- hackage-security >= 0.6.2.6 && < 0.7,+ hackage-security >= 0.6.2.0 && < 0.7, text >= 1.2.3 && < 1.3 || >= 2.0 && < 2.2, parsec >= 3.1.13.0 && < 3.2, open-browser >= 0.2.1.0 && < 0.3,@@ -349,7 +349,7 @@ zlib, tasty >= 1.2.3 && <1.6, tasty-golden >=2.3.1.1 && <2.4,- tasty-quickcheck <0.11,+ tasty-quickcheck ^>=0.11, tasty-expected-failure, tasty-hunit >= 0.10, tree-diff,@@ -398,6 +398,7 @@ containers, directory, filepath,+ process, tasty >= 1.2.3 && <1.6, tasty-hunit >= 0.10, tagged@@ -429,7 +430,6 @@ containers, directory, filepath,- hashable, mtl, network-uri >= 2.6.2.0 && <2.7, random,@@ -437,6 +437,6 @@ tasty >= 1.2.3 && <1.6, tasty-expected-failure, tasty-hunit >= 0.10,- tasty-quickcheck <0.11,+ tasty-quickcheck <0.12, QuickCheck >= 2.14 && <2.16, pretty-show >= 1.6.15
changelog view
@@ -1,9 +1,14 @@ -*-change-log-*- +3.14.1.0 Hécate <hecate+github@glitchbra.in> November 2024+ * See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.14.1.0.md++3.14.0.0 Hécate <hecate+github@glitchbra.in> September 2024+ * See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.14.0.0.md+ 3.12.1.0 Artem Pelenitsyn <a.pelenitsyn@gmail.com> June 2024 * See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.12.1.0.md -3.10.2.0 Hécate <hecate+github@glitchbra.in> August 2023 3.10.3.0 Hécate <hecate+github@glitchbra.in> January 2024 * See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.10.3.0.md
src/Distribution/Client/Check.hs view
@@ -21,6 +21,7 @@ import Distribution.Client.Compat.Prelude import Prelude () +import Distribution.Client.Errors import Distribution.Client.Utils.Parsec (renderParseError) import Distribution.PackageDescription (GenericPackageDescription) import Distribution.PackageDescription.Check@@ -29,7 +30,9 @@ , runParseResult ) import Distribution.Parsec (PWarning (..), showPError)-import Distribution.Simple.Utils (defaultPackageDesc, dieWithException, notice, warn, warnError)+import Distribution.Simple.Utils (defaultPackageDescCwd, dieWithException, notice, warn, warnError)+import Distribution.Utils.Path (getSymbolicPath)+ import System.IO (hPutStr, stderr) import qualified Control.Monad as CM@@ -37,7 +40,6 @@ import qualified Data.Function as F import qualified Data.List as L import qualified Data.List.NonEmpty as NE-import Distribution.Client.Errors import qualified System.Directory as Dir readGenericPackageDescriptionCheck :: Verbosity -> FilePath -> IO ([PWarning], GenericPackageDescription)@@ -66,7 +68,7 @@ -- (e.g. @invalid-path-win@) to ignore. -> IO Bool check verbosity ignores = do- pdfile <- defaultPackageDesc verbosity+ pdfile <- getSymbolicPath <$> defaultPackageDescCwd verbosity (ws, ppd) <- readGenericPackageDescriptionCheck verbosity pdfile -- convert parse warnings into PackageChecks let ws' = map (wrapParseWarning pdfile) ws
src/Distribution/Client/CmdBench.hs view
@@ -50,6 +50,7 @@ import Distribution.Simple.Flag ( fromFlagOrDefault )+import Distribution.Simple.Setup (CommonSetupFlags (..)) import Distribution.Simple.Utils ( dieWithException , warn@@ -150,7 +151,7 @@ buildOutcomes <- runProjectBuildPhase verbosity baseCtx buildCtx runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags
src/Distribution/Client/CmdBuild.hs view
@@ -40,7 +40,8 @@ , withContextAndSelectors ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags , yesNoOpt )@@ -184,7 +185,7 @@ buildOutcomes <- runProjectBuildPhase verbosity baseCtx buildCtx runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) -- | This defines what a 'TargetSelector' means for the @bench@ command. -- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,
src/Distribution/Client/CmdClean.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE RecordWildCards #-} module Distribution.Client.CmdClean (cleanCommand, cleanAction) where@@ -51,6 +52,10 @@ , info , wrapText )+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Verbosity ( normal )@@ -77,7 +82,7 @@ data CleanFlags = CleanFlags { cleanSaveConfig :: Flag Bool , cleanVerbosity :: Flag Verbosity- , cleanDistDir :: Flag FilePath+ , cleanDistDir :: Flag (SymbolicPath Pkg (Dir Dist)) } deriving (Eq) @@ -132,7 +137,7 @@ cleanAction (ProjectFlags{..}, CleanFlags{..}) extraArgs _ = do let verbosity = fromFlagOrDefault normal cleanVerbosity saveConfig = fromFlagOrDefault False cleanSaveConfig- mdistDirectory = flagToMaybe cleanDistDir+ mdistDirectory = fmap getSymbolicPath $ flagToMaybe cleanDistDir mprojectDir = flagToMaybe flagProjectDir mprojectFile = flagToMaybe flagProjectFile @@ -165,7 +170,7 @@ info verbosity ("Deleting dist-newstyle (" ++ distRoot ++ ")") handleDoesNotExist () $ removeDirectoryRecursive distRoot - removeEnvFiles (distProjectRootDirectory distLayout)+ removeEnvFiles $ distProjectRootDirectory distLayout -- Clean specified script build caches and orphaned caches. -- There is currently no good way to specify to only clean orphaned caches.
src/Distribution/Client/CmdConfigure.hs view
@@ -22,6 +22,7 @@ ) import Distribution.Client.ProjectOrchestration import Distribution.Simple.Flag+import Distribution.Simple.Setup (CommonSetupFlags (..)) import Distribution.Client.NixStyleOptions ( NixStyleFlags (..)@@ -123,7 +124,7 @@ then notice v "Config file not written due to flag(s)." else writeProjectLocalExtraConfig (distDirLayout baseCtx) projConfig where- v = fromFlagOrDefault normal (configVerbosity configFlags)+ v = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) configureAction' :: NixStyleFlags () -> [String] -> GlobalFlags -> IO (ProjectBaseContext, ProjectConfig) configureAction' flags@NixStyleFlags{..} _extraArgs globalFlags = do@@ -164,7 +165,7 @@ return (baseCtx, conf <> cliConfig) else return (baseCtx, cliConfig) where- v = fromFlagOrDefault normal (configVerbosity configFlags)+ v = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags
src/Distribution/Client/CmdExec.hs view
@@ -54,8 +54,11 @@ , ElaboratedSharedConfig (..) ) import qualified Distribution.Client.ProjectPlanning as Planning+import Distribution.Client.ProjectPlanning.Types+ ( dataDirsEnvironmentForPlan+ ) import Distribution.Client.Setup- ( ConfigFlags (configVerbosity)+ ( ConfigFlags (configCommonFlags) , GlobalFlags ) import Distribution.Simple.Command@@ -84,6 +87,7 @@ ( programInvocation , runProgramInvocation )+import Distribution.Simple.Setup (CommonSetupFlags (..)) import Distribution.Simple.Utils ( createDirectoryIfMissingVerbose , dieWithException@@ -166,14 +170,14 @@ -- Some dependencies may have executables. Let's put those on the PATH. let extraPaths = pathAdditions baseCtx buildCtx+ pkgProgs = pkgConfigCompilerProgs (elaboratedShared buildCtx)+ extraEnvVars =+ dataDirsEnvironmentForPlan+ (distDirLayout baseCtx)+ (elaboratedPlanToExecute buildCtx) programDb <-- prependProgramSearchPath- verbosity- extraPaths- . pkgConfigCompilerProgs- . elaboratedShared- $ buildCtx+ prependProgramSearchPath verbosity extraPaths extraEnvVars pkgProgs -- Now that we have the packages, set up the environment. We accomplish this -- by creating an environment file that selects the databases and packages we@@ -222,7 +226,7 @@ then notice verbosity "Running of executable suppressed by flag(s)" else runProgramInvocation verbosity invocation where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags@@ -252,10 +256,11 @@ -> ([(String, Maybe String)] -> IO a) -> IO a withTempEnvFile verbosity baseCtx buildCtx buildStatus action = do- createDirectoryIfMissingVerbose verbosity True (distTempDirectory (distDirLayout baseCtx))+ let tmpDirTemplate = distTempDirectory (distDirLayout baseCtx)+ createDirectoryIfMissingVerbose verbosity True tmpDirTemplate withTempDirectory verbosity- (distTempDirectory (distDirLayout baseCtx))+ tmpDirTemplate "environment." ( \tmpDir -> do envOverrides <-
src/Distribution/Client/CmdFreeze.hs view
@@ -40,7 +40,8 @@ ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (setupVerbosity)+ , ConfigFlags (..) , GlobalFlags ) import Distribution.Package@@ -157,9 +158,9 @@ else do writeProjectLocalFreezeConfig distDirLayout freezeConfig notice verbosity $- "Wrote freeze file: " ++ distProjectFile distDirLayout "freeze"+ "Wrote freeze file: " ++ (distProjectFile distDirLayout "freeze") where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags
src/Distribution/Client/CmdHaddock.hs view
@@ -31,7 +31,8 @@ ( ElaboratedSharedConfig (..) ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags , InstallFlags (..) )@@ -147,7 +148,7 @@ flags@NixStyleFlags{..} <- mkFlagsAbsolute relFlags let- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) installDoc = fromFlagOrDefault True (installDocumentation installFlags) flags' = flags{installFlags = installFlags{installDocumentation = Flag installDoc}} cliConfig = commandLineFlagsToProjectConfig globalFlags flags' mempty -- ClientInstallFlags, not needed here
src/Distribution/Client/CmdHaddockProject.hs view
@@ -3,6 +3,7 @@ , haddockProjectAction ) where +import Control.Monad (mapM) import Distribution.Client.Compat.Prelude hiding (get) import Prelude () @@ -11,8 +12,8 @@ import Distribution.Client.DistDirLayout ( CabalDirLayout (..)- , DistDirLayout (..) , StoreDirLayout (..)+ , distBuildDirectory ) import Distribution.Client.InstallPlan (foldPlanPackage) import qualified Distribution.Client.InstallPlan as InstallPlan@@ -24,7 +25,6 @@ , ProjectBaseContext (..) , ProjectBuildContext (..) , TargetSelector (..)- , printPlan , pruneInstallPlanToTargets , resolveTargets , runProjectPreBuildPhase@@ -46,11 +46,20 @@ , withContextAndSelectors ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (setupVerbosity)+ , ConfigFlags (..) , GlobalFlags (..) ) import Distribution.Client.TargetProblem (TargetProblem (..)) +import Distribution.Simple.BuildPaths+ ( haddockBenchmarkDirPath+ , haddockDirName+ , haddockLibraryDirPath+ , haddockLibraryPath+ , haddockPath+ , haddockTestDirPath+ ) import Distribution.Simple.Command ( CommandUI (..) )@@ -74,7 +83,9 @@ import Distribution.Simple.Setup ( HaddockFlags (..) , HaddockProjectFlags (..)+ , HaddockTarget (..) , Visibility (..)+ , defaultCommonSetupFlags , defaultHaddockFlags , haddockProjectCommand )@@ -82,9 +93,11 @@ ( copyDirectoryRecursive , createDirectoryIfMissingVerbose , dieWithException+ , info , warn ) import Distribution.Types.InstalledPackageInfo (InstalledPackageInfo (..))+import Distribution.Types.PackageDescription (PackageDescription (benchmarks, subLibraries, testSuites)) import Distribution.Types.PackageId (pkgName) import Distribution.Types.PackageName (unPackageName) import Distribution.Types.UnitId (unUnitId)@@ -96,7 +109,7 @@ import Distribution.Client.Errors import System.Directory (doesDirectoryExist, doesFileExist)-import System.FilePath (normalise, takeDirectory, (<.>), (</>))+import System.FilePath (normalise, takeDirectory, (</>)) haddockProjectAction :: HaddockProjectFlags -> [String] -> GlobalFlags -> IO () haddockProjectAction flags _extraArgs globalFlags = do@@ -107,9 +120,14 @@ warn verbosity "haddock-project command is experimental, it might break in the future" -- build all packages with appropriate haddock flags- let haddockFlags =+ let commonFlags =+ defaultCommonSetupFlags+ { setupVerbosity = haddockProjectVerbosity flags+ }+ haddockFlags = defaultHaddockFlags- { haddockHtml = Flag True+ { haddockCommonFlags = commonFlags+ , haddockHtml = Flag True , -- one can either use `--haddock-base-url` or -- `--haddock-html-location`. haddockBaseUrl =@@ -141,16 +159,19 @@ then Flag (toPathTemplate "../doc-index.html") else NoFlag , haddockKeepTempFiles = haddockProjectKeepTempFiles flags- , haddockVerbosity = haddockProjectVerbosity flags- , haddockLib = haddockProjectLib flags- , haddockOutputDir = haddockProjectOutputDir flags+ , haddockResourcesDir = haddockProjectResourcesDir flags+ , haddockUseUnicode = haddockProjectUseUnicode flags+ -- NOTE: we don't pass `haddockOutputDir`. If we do, we'll need to+ -- make sure `InstalledPackageInfo` contains the right path to+ -- haddock interfaces. Instead we build documentation inside+ -- `dist-newstyle` directory and copy it to the output directory. } nixFlags = (commandDefaultFlags CmdHaddock.haddockCommand) { NixStyleOptions.haddockFlags = haddockFlags , NixStyleOptions.configFlags = (NixStyleOptions.configFlags (commandDefaultFlags CmdBuild.buildCommand))- { configVerbosity = haddockProjectVerbosity flags+ { configCommonFlags = commonFlags } } @@ -193,8 +214,6 @@ elaboratedPlan return (elaboratedPlan', targets) - printPlan verbosity baseCtx buildCtx- let elaboratedPlan :: ElaboratedInstallPlan elaboratedPlan = elaboratedPlanOriginal buildCtx @@ -249,61 +268,84 @@ packageInfos <- fmap (nub . concat) $ for pkgs $ \pkg -> case pkg of- Left _- | not localStyle ->- return []- Left package -> do- -- TODO: this might not work for public packages with sublibraries.- -- Issue #9026.+ Left package | localStyle -> do let packageName = unPackageName (pkgName $ sourcePackageId package) destDir = outputDir </> packageName fmap catMaybes $ for (haddockInterfaces package) $ \interfacePath -> do let docDir = takeDirectory interfacePath a <- doesFileExist interfacePath case a of- True ->+ True -> do copyDirectoryRecursive verbosity docDir destDir- >> return- ( Just- ( packageName- , interfacePath- , Hidden- )- )+ return $ Just $ Right (packageName, interfacePath, Hidden) False -> return Nothing+ Left _ -> return [] Right package -> case elabLocalToProject package of True -> do let distDirParams = elabDistDirParams sharedConfig' package- unitId = unUnitId (elabUnitId package)+ pkg_descr = elabPkgDescription package++ packageName = pkgName $ elabPkgSourceId package+ unitId = elabUnitId package+ packageDir = haddockDirName ForDevelopment pkg_descr+ destDir = outputDir </> packageDir+ interfacePath = destDir </> haddockPath pkg_descr+ buildDir = distBuildDirectory distLayout distDirParams- packageName = unPackageName (pkgName $ elabPkgSourceId package)- let docDir =+ docDir = buildDir </> "doc" </> "html"- </> packageName- destDir = outputDir </> unitId- interfacePath =- destDir- </> packageName- <.> "haddock"+ </> packageDir+ a <- doesDirectoryExist docDir- case a of- True ->+ if a+ then do copyDirectoryRecursive verbosity docDir destDir- >> return- [- ( unitId- , interfacePath- , Visible- )- ]- False -> do+ let infos :: [(String, FilePath, Visibility)]+ infos =+ (unPackageName packageName, interfacePath, Visible)+ : [ (sublibDirPath, sublibInterfacePath, Visible)+ | lib <- subLibraries pkg_descr+ , let sublibDirPath = haddockLibraryDirPath ForDevelopment pkg_descr lib+ sublibInterfacePath =+ outputDir+ </> sublibDirPath+ </> haddockLibraryPath pkg_descr lib+ ]+ ++ [ (testPath, testInterfacePath, Visible)+ | test <- testSuites pkg_descr+ , let testPath = haddockTestDirPath ForDevelopment pkg_descr test+ testInterfacePath =+ outputDir+ </> testPath+ </> haddockPath pkg_descr+ ]+ ++ [ (benchPath, benchInterfacePath, Visible)+ | bench <- benchmarks pkg_descr+ , let benchPath = haddockBenchmarkDirPath ForDevelopment pkg_descr bench+ benchInterfacePath =+ outputDir+ </> benchPath+ </> haddockPath pkg_descr+ ]+ infos' <-+ mapM+ ( \x@(_, path, _) -> do+ e <- doesFileExist path+ return $+ if e+ then Right x+ else Left path+ )+ infos+ return infos'+ else do warn verbosity ( "haddocks of "- ++ show unitId+ ++ unUnitId unitId ++ " not found in the store" ) return []@@ -311,63 +353,60 @@ | not localStyle -> return [] False -> do- let packageName = unPackageName (pkgName $ elabPkgSourceId package)+ let pkg_descr = elabPkgDescription package unitId = unUnitId (elabUnitId package) packageDir = storePackageDirectory (cabalStoreDirLayout cabalLayout) (pkgConfigCompiler sharedConfig') (elabUnitId package)+ -- TODO: use `InstallDirTemplates` docDir = packageDir </> "share" </> "doc" </> "html"- destDir = outputDir </> packageName- interfacePath =- destDir- </> packageName- <.> "haddock"+ destDir = outputDir </> haddockDirName ForDevelopment pkg_descr+ interfacePath = destDir </> haddockPath pkg_descr a <- doesDirectoryExist docDir case a of- True ->+ True -> do copyDirectoryRecursive verbosity docDir destDir- -- non local packages will be hidden in haddock's- -- generated contents page- >> return- [- ( unitId- , interfacePath- , Hidden- )- ]+ -- non local packages will be hidden in haddock's+ -- generated contents page+ return [Right (unitId, interfacePath, Hidden)] False -> do- warn- verbosity- ( "haddocks of "- ++ show unitId- ++ " not found in the store"- )- return []+ return [Left unitId] -- -- generate index, content, etc. -- + let (missingHaddocks, packageInfos') = partitionEithers packageInfos+ when (not (null missingHaddocks)) $ do+ warn verbosity "missing haddocks for some packages from the store"+ -- Show the package list if `-v1` is passed; it's usually a long list.+ -- One needs to add `package` stantza in `cabal.project` file for+ -- `cabal` to include a version which has haddocks (or set+ -- `documentation: True` in the global config).+ info verbosity (intercalate "\n" missingHaddocks)+ let flags' = flags { haddockProjectDir = Flag outputDir , haddockProjectInterfaces = Flag [ ( interfacePath- , Just name- , Just name+ , Just url+ , Just url , visibility )- | (name, interfacePath, visibility) <- packageInfos+ | (url, interfacePath, visibility) <- packageInfos' ]+ , haddockProjectUseUnicode = NoFlag } createHaddockIndex verbosity (pkgConfigCompilerProgs sharedConfig') (pkgConfigCompiler sharedConfig') (pkgConfigPlatform sharedConfig')+ Nothing flags' where verbosity = fromFlagOrDefault normal (haddockProjectVerbosity flags)
src/Distribution/Client/CmdInstall.hs view
@@ -97,7 +97,8 @@ ( runRebuild ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags (..) , InstallFlags (..) )@@ -130,8 +131,9 @@ ( Compiler (..) , CompilerFlavor (..) , CompilerId (..)- , PackageDB (..)- , PackageDBStack+ , PackageDBCWD+ , PackageDBStackCWD+ , PackageDBX (..) ) import Distribution.Simple.Configure ( configCompilerEx@@ -425,8 +427,9 @@ hcFlavor = flagToMaybe projectConfigHcFlavor hcPath = flagToMaybe projectConfigHcPath hcPkg = flagToMaybe projectConfigHcPkg+ extraPath = fromNubList packageConfigProgramPathExtra ++ fromNubList projectConfigProgPathExtra - configProgDb <- prependProgramSearchPath verbosity ((fromNubList packageConfigProgramPathExtra) ++ (fromNubList projectConfigProgPathExtra)) defaultProgramDb+ configProgDb <- prependProgramSearchPath verbosity extraPath [] defaultProgramDb let -- ProgramDb with directly user specified paths preProgDb =@@ -539,7 +542,7 @@ traverseInstall (installCheckUnitExes InstallCheckInstall) installCfg where configFlags' = disableTestsBenchsByDefault . ignoreProgramAffixes $ configFlags- verbosity = fromFlagOrDefault normal (configVerbosity configFlags')+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags') ignoreProject = flagIgnoreProject projectFlags cliConfig = commandLineFlagsToProjectConfig@@ -956,10 +959,10 @@ -> ProjectBuildContext -> PI.PackageIndex InstalledPackageInfo -> Compiler- -> PackageDBStack+ -> PackageDBStackCWD -> FilePath -- ^ Environment file- -> [GhcEnvironmentFileEntry]+ -> [GhcEnvironmentFileEntry FilePath] -> Bool -- ^ Whether we need to show a warning (i.e. we created a new environment -- file, and the user did not use --package-env)@@ -1062,9 +1065,9 @@ -- | Return the package specifiers and non-global environment file entries. getEnvSpecsAndNonGlobalEntries :: PI.InstalledPackageIndex- -> [GhcEnvironmentFileEntry]+ -> [GhcEnvironmentFileEntry FilePath] -> Bool- -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry)])+ -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry FilePath)]) getEnvSpecsAndNonGlobalEntries installedIndex entries installLibs = if installLibs then (envSpecs, envEntries')@@ -1074,8 +1077,8 @@ environmentFileToSpecifiers :: PI.InstalledPackageIndex- -> [GhcEnvironmentFileEntry]- -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry)])+ -> [GhcEnvironmentFileEntry FilePath]+ -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry FilePath)]) environmentFileToSpecifiers ipi = foldMap $ \case (GhcEnvFilePackageId unitId) | Just@@ -1123,8 +1126,8 @@ overwritePolicy installDir (mkSourceBinDir unit)- (mkExeName exe) (mkFinalExeName exe)+ (mkExeName exe) -- | -- -- * When 'InstallCheckOnly', warn if install would fail overwrite policy@@ -1169,7 +1172,7 @@ errorMessage installdir exe = case overwritePolicy of NeverOverwrite -> "Path '"- <> (installdir </> prettyShow exe)+ <> (installdir </> mkFinalExeName exe) <> "' already exists. " <> "Use --overwrite-policy=always to overwrite." -- This shouldn't even be possible, but we keep it in case symlinking or@@ -1246,7 +1249,7 @@ overwrite -- | Create 'GhcEnvironmentFileEntry's for packages with exposed libraries.-entriesForLibraryComponents :: TargetsMap -> [GhcEnvironmentFileEntry]+entriesForLibraryComponents :: TargetsMap -> [GhcEnvironmentFileEntry FilePath] entriesForLibraryComponents = Map.foldrWithKey' (\k v -> mappend (go k v)) [] where hasLib :: (ComponentTarget, NonEmpty TargetSelector) -> Bool@@ -1256,7 +1259,7 @@ go :: UnitId -> [(ComponentTarget, NonEmpty TargetSelector)]- -> [GhcEnvironmentFileEntry]+ -> [GhcEnvironmentFileEntry FilePath] go unitId targets | any hasLib targets = [GhcEnvFilePackageId unitId] | otherwise = []@@ -1288,7 +1291,7 @@ -- | Returns the list of @GhcEnvFilePackageId@ values already existing in the -- environment being operated on. The @Bool@ is @True@ if we took settings -- from an existing file, @False@ otherwise.-getExistingEnvEntries :: Verbosity -> CompilerFlavor -> Bool -> FilePath -> IO (Bool, [GhcEnvironmentFileEntry])+getExistingEnvEntries :: Verbosity -> CompilerFlavor -> Bool -> FilePath -> IO (Bool, [GhcEnvironmentFileEntry FilePath]) getExistingEnvEntries verbosity compilerFlavor supportsPkgEnvFiles envFile = do envFileExists <- doesFileExist envFile (usedExisting, allEntries) <-@@ -1332,8 +1335,8 @@ :: Compiler -> Flag FilePath -> Flag FilePath- -> [Maybe PackageDB]- -> IO PackageDBStack+ -> [Maybe PackageDBCWD]+ -> IO PackageDBStackCWD getPackageDbStack compiler storeDirFlag logsDirFlag packageDbs = do mstoreDir <- traverse makeAbsolute $ flagToMaybe storeDirFlag let
src/Distribution/Client/CmdLegacy.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-}@@ -37,23 +38,37 @@ regularCmd ui action = CommandSpec ui ((flip commandAddAction) (\flags extra globals -> action flags extra globals)) NormalCommand -wrapperCmd :: Monoid flags => CommandUI flags -> (flags -> Setup.Flag Verbosity) -> (flags -> Setup.Flag String) -> CommandSpec (Client.GlobalFlags -> IO ())-wrapperCmd ui verbosity' distPref =- CommandSpec ui (\ui' -> wrapperAction ui' verbosity' distPref) NormalCommand+wrapperCmd+ :: Monoid flags+ => CommandUI flags+ -> (flags -> Setup.CommonSetupFlags)+ -> CommandSpec (Client.GlobalFlags -> IO ())+wrapperCmd ui getCommonFlags =+ CommandSpec ui (\ui' -> wrapperAction ui' getCommonFlags) NormalCommand -wrapperAction :: Monoid flags => CommandUI flags -> (flags -> Setup.Flag Verbosity) -> (flags -> Setup.Flag String) -> Command (Client.GlobalFlags -> IO ())-wrapperAction command verbosityFlag distPrefFlag =+wrapperAction+ :: Monoid flags+ => CommandUI flags+ -> (flags -> Setup.CommonSetupFlags)+ -> Command (Client.GlobalFlags -> IO ())+wrapperAction command getCommonFlags = commandAddAction command { commandDefaultFlags = mempty } $ \flags extraArgs globalFlags -> do- let verbosity' = Setup.fromFlagOrDefault normal (verbosityFlag flags)+ let common = getCommonFlags flags+ verbosity' = Setup.fromFlagOrDefault normal (Setup.setupVerbosity common)+ mbWorkDir = Setup.flagToMaybe $ Setup.setupWorkingDir common load <- try (loadConfigOrSandboxConfig verbosity' globalFlags) let config = either (\(SomeException _) -> mempty) id load- distPref <- findSavedDistPref config (distPrefFlag flags)- let setupScriptOptions = defaultSetupScriptOptions{useDistPref = distPref}+ distPref <- findSavedDistPref config (Setup.setupDistPref common)+ let setupScriptOptions =+ defaultSetupScriptOptions+ { useDistPref = distPref+ , useWorkingDir = mbWorkDir+ } let command' = command{commandName = T.unpack . T.replace "v1-" "" . T.pack . commandName $ command} @@ -62,7 +77,8 @@ setupScriptOptions Nothing command'- (const flags)+ getCommonFlags+ (const (return flags)) (const extraArgs) --@@ -89,25 +105,25 @@ verbosity (a, _, _, _, _, _) = verbosity a instance HasVerbosity Setup.BuildFlags where- verbosity = verbosity . Setup.buildVerbosity+ verbosity = verbosity . Setup.setupVerbosity . Setup.buildCommonFlags instance HasVerbosity Setup.ConfigFlags where- verbosity = verbosity . Setup.configVerbosity+ verbosity = verbosity . Setup.setupVerbosity . Setup.configCommonFlags instance HasVerbosity Setup.ReplFlags where- verbosity = verbosity . Setup.replVerbosity+ verbosity = verbosity . Setup.setupVerbosity . Setup.replCommonFlags instance HasVerbosity Client.FreezeFlags where verbosity = verbosity . Client.freezeVerbosity instance HasVerbosity Setup.HaddockFlags where- verbosity = verbosity . Setup.haddockVerbosity+ verbosity = verbosity . Setup.setupVerbosity . Setup.haddockCommonFlags instance HasVerbosity Client.UpdateFlags where verbosity = verbosity . Client.updateVerbosity instance HasVerbosity Setup.CleanFlags where- verbosity = verbosity . Setup.cleanVerbosity+ verbosity = verbosity . Setup.setupVerbosity . Setup.cleanCommonFlags -- @@ -138,8 +154,12 @@ legacyCmd :: HasVerbosity flags => CommandUI flags -> (flags -> [String] -> globals -> IO action) -> [CommandSpec (globals -> IO action)] legacyCmd ui action = toLegacyCmd (regularCmd ui action) -legacyWrapperCmd :: Monoid flags => CommandUI flags -> (flags -> Setup.Flag Verbosity) -> (flags -> Setup.Flag String) -> [CommandSpec (Client.GlobalFlags -> IO ())]-legacyWrapperCmd ui verbosity' distPref = toLegacyCmd (wrapperCmd ui verbosity' distPref)+legacyWrapperCmd+ :: Monoid flags+ => CommandUI flags+ -> (flags -> Setup.CommonSetupFlags)+ -> [CommandSpec (Client.GlobalFlags -> IO ())]+legacyWrapperCmd ui commonFlags = toLegacyCmd (wrapperCmd ui commonFlags) newCmd :: CommandUI flags -> (flags -> [String] -> globals -> IO action) -> [CommandSpec (globals -> IO action)] newCmd origUi@CommandUI{..} action = [cmd defaultUi, cmd newUi, cmd origUi]
src/Distribution/Client/CmdListBin.hs view
@@ -49,7 +49,7 @@ import Distribution.Client.TargetProblem (TargetProblem (..)) import Distribution.Simple.BuildPaths (dllExtension, exeExtension) import Distribution.Simple.Command (CommandUI (..))-import Distribution.Simple.Setup (configVerbosity, fromFlagOrDefault)+import Distribution.Simple.Setup (configCommonFlags, fromFlagOrDefault, setupVerbosity) import Distribution.Simple.Utils (dieWithException, withOutputMarker, wrapText) import Distribution.System (Platform) import Distribution.Types.ComponentName (showComponentName)@@ -173,7 +173,7 @@ _ -> dieWithException verbosity MultipleTargetsFound where defaultVerbosity = verboseStderr silent- verbosity = fromFlagOrDefault defaultVerbosity (configVerbosity configFlags)+ verbosity = fromFlagOrDefault defaultVerbosity (setupVerbosity $ configCommonFlags configFlags) -- this is copied from elaboratedPackage
src/Distribution/Client/CmdOutdated.hs view
@@ -152,6 +152,7 @@ import qualified Data.Set as S import Distribution.Client.Errors+import Distribution.Utils.Path (relativeSymbolicPath) import System.Directory ( doesFileExist , getCurrentDirectory@@ -435,9 +436,8 @@ -- | Read the list of dependencies from the package description. depsFromPkgDesc :: Verbosity -> Compiler -> Platform -> IO [PackageVersionConstraint] depsFromPkgDesc verbosity comp platform = do- cwd <- getCurrentDirectory- path <- tryFindPackageDesc verbosity cwd- gpd <- readGenericPackageDescription verbosity path+ path <- tryFindPackageDesc verbosity Nothing+ gpd <- readGenericPackageDescription verbosity Nothing (relativeSymbolicPath path) let cinfo = compilerInfo comp epd = finalizePD
src/Distribution/Client/CmdRepl.hs view
@@ -103,6 +103,7 @@ ) import Distribution.Simple.Setup ( ReplOptions (..)+ , setupVerbosity ) import Distribution.Simple.Utils ( TempFileOptions (..)@@ -505,7 +506,7 @@ go m ("PATH", Just s) = foldl' (\m' f -> Map.insertWith (+) f 1 m') m (splitSearchPath s) go m _ = m - verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) keepTempFiles = fromFlagOrDefault False replKeepTempFiles validatedTargets ctx compiler elaboratedPlan targetSelectors = do
src/Distribution/Client/CmdRun.hs view
@@ -59,9 +59,11 @@ , binDirectoryFor ) import Distribution.Client.ProjectPlanning.Types- ( dataDirsEnvironmentForPlan+ ( ElaboratedPackageOrComponent (..)+ , dataDirsEnvironmentForPlan , elabExeDependencyPaths )+ import Distribution.Client.ScriptUtils ( AcceptNoTargets (..) , TargetContext (..)@@ -70,7 +72,8 @@ , withContextAndSelectors ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (setupVerbosity)+ , ConfigFlags (..) , GlobalFlags (..) ) import Distribution.Client.TargetProblem@@ -80,6 +83,10 @@ ( giveRTSWarning , occursOnlyOrBefore )++import Distribution.Simple.BuildToolDepends+ ( getAllInternalToolDependencies+ ) import Distribution.Simple.Command ( CommandUI (..) , usageAlternatives@@ -106,9 +113,17 @@ , warn , wrapText )+ import Distribution.Types.ComponentName ( componentNameRaw )+import Distribution.Types.Executable as PD+ ( buildInfo+ , exeName+ )+import qualified Distribution.Types.PackageDescription as PD+ ( executables+ ) import Distribution.Types.UnitId ( UnitId )@@ -199,7 +214,7 @@ GlobalContext -> return (ctx, normal) ScriptContext path exemeta -> (,silent) <$> updateContextAndWriteProjectFile ctx path exemeta - let verbosity = fromFlagOrDefault defaultVerbosity (configVerbosity configFlags)+ let verbosity = fromFlagOrDefault defaultVerbosity (setupVerbosity $ configCommonFlags configFlags) buildCtx <- runProjectPreBuildPhase verbosity baseCtx $ \elaboratedPlan -> do@@ -302,17 +317,34 @@ buildSettingDryRun (buildSettings baseCtx) || buildSettingOnlyDownload (buildSettings baseCtx) - let extraPath =- elabExeDependencyPaths pkg- ++ ( fromNubList- . projectConfigProgPathExtra- . projectConfigShared- . projectConfig- $ baseCtx- )+ let+ -- HACK alert: when doing a per-package build (e.g. with a Custom setup),+ -- 'elabExeDependencyPaths' will not contain any internal executables+ -- (they are deliberately filtered out; and even if they weren't, they have the wrong paths).+ -- We add them back in here to ensure that any "build-tool-depends" of+ -- the current executable is available in PATH at runtime.+ internalToolDepsOfThisExe+ | ElabPackage{} <- elabPkgOrComp pkg+ , let pkg_descr = elabPkgDescription pkg+ , thisExe : _ <- filter ((== exeName) . unUnqualComponentName . PD.exeName) $ PD.executables pkg_descr+ , let thisExeBI = PD.buildInfo thisExe =+ [ binDirectoryFor (distDirLayout baseCtx) (elaboratedShared buildCtx) pkg depExeNm+ | depExe <- getAllInternalToolDependencies pkg_descr thisExeBI+ , let depExeNm = unUnqualComponentName depExe+ ]+ | otherwise =+ []+ extraPath =+ elabExeDependencyPaths pkg+ ++ ( fromNubList+ . projectConfigProgPathExtra+ . projectConfigShared+ . projectConfig+ $ baseCtx+ )+ ++ internalToolDepsOfThisExe logExtraProgramSearchPath verbosity extraPath- progPath <- programSearchPathAsPATHVar (map ProgramSearchPathDir extraPath ++ defaultProgramSearchPath) if dryRun
src/Distribution/Client/CmdSdist.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-}@@ -26,6 +27,7 @@ import Distribution.Client.NixStyleOptions ( NixStyleFlags (..) , defaultNixStyleFlags+ , updNixStyleCommonSetupFlags ) import Distribution.Client.ProjectConfig ( ProjectConfig@@ -47,7 +49,8 @@ , establishProjectBaseContextWithRoot ) import Distribution.Client.Setup- ( GlobalFlags (..)+ ( CommonSetupFlags (..)+ , GlobalFlags (..) ) import Distribution.Client.TargetSelector ( ComponentKind@@ -63,6 +66,10 @@ import Distribution.Solver.Types.SourcePackage ( SourcePackage (..) )+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Client.Errors import Distribution.Client.SrcDist@@ -94,8 +101,6 @@ ) import Distribution.Simple.Setup ( Flag (..)- , configDistPref- , configVerbosity , flagToList , flagToMaybe , fromFlagOrDefault@@ -166,7 +171,7 @@ data SdistFlags = SdistFlags { sdistVerbosity :: Flag Verbosity- , sdistDistDir :: Flag FilePath+ , sdistDistDir :: Flag (SymbolicPath Pkg (Dir Dist)) , sdistListSources :: Flag Bool , sdistNulSeparated :: Flag Bool , sdistOutputPath :: Flag FilePath@@ -270,7 +275,13 @@ , Just "-" <- mOutputPath' -> dieWithException verbosity Can'tWriteMultipleTarballs | otherwise ->- traverse_ (\pkg -> packageToSdist verbosity (distProjectRootDirectory distDirLayout) format (outputPath pkg) pkg) pkgs+ for_ pkgs $ \pkg ->+ packageToSdist+ verbosity+ (distProjectRootDirectory distDirLayout)+ format+ (outputPath pkg)+ pkg where verbosity = fromFlagOrDefault normal sdistVerbosity listSources = fromFlagOrDefault False sdistListSources@@ -281,15 +292,15 @@ prjConfig = commandLineFlagsToProjectConfig globalFlags- (defaultNixStyleFlags ())- { configFlags =- (configFlags $ defaultNixStyleFlags ())- { configVerbosity = sdistVerbosity- , configDistPref = sdistDistDir- }- , projectFlags = pf+ (updNixStyleCommonSetupFlags (const commonFlags) $ defaultNixStyleFlags ())+ { projectFlags = pf } mempty+ commonFlags =+ mempty+ { setupVerbosity = sdistVerbosity+ , setupDistPref = sdistDistDir+ } globalConfigFlag = projectConfigConfigFile (projectConfigShared prjConfig) @@ -341,17 +352,18 @@ TarGzArchive -> do writeLBS =<< BSL.readFile tgz _ -> dieWithException verbosity $ CannotConvertTarballPackage (show format)- Right dir -> case format of- SourceList nulSep -> do- let gpd :: GenericPackageDescription- gpd = srcpkgDescription pkg+ Right dir -> do+ case format of+ SourceList nulSep -> do+ let gpd :: GenericPackageDescription+ gpd = srcpkgDescription pkg - files' <- listPackageSourcesWithDie verbosity dieWithException dir (flattenPackageDescription gpd) knownSuffixHandlers- let files = nub $ sort $ map normalise files'- let prefix = makeRelative projectRootDir dir- write $ concat [prefix </> i ++ [nulSep] | i <- files]- TarGzArchive -> do- packageDirToSdist verbosity (srcpkgDescription pkg) dir >>= writeLBS+ files' <- listPackageSourcesWithDie verbosity dieWithException (Just $ makeSymbolicPath dir) (flattenPackageDescription gpd) knownSuffixHandlers+ let files = nub $ sort $ map (normalise . getSymbolicPath) files'+ let prefix = makeRelative (normalise projectRootDir) dir+ write $ concat [prefix </> i ++ [nulSep] | i <- files]+ TarGzArchive -> do+ packageDirToSdist verbosity (srcpkgDescription pkg) dir >>= writeLBS --
src/Distribution/Client/CmdTest.hs view
@@ -66,6 +66,7 @@ import qualified System.Exit (exitSuccess) import Distribution.Client.Errors+import Distribution.Client.Setup (CommonSetupFlags (..)) import GHC.Environment ( getFullArgs )@@ -163,7 +164,7 @@ runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes where failWhenNoTestSuites = testFailWhenNoTestSuites testFlags- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags flags mempty -- ClientInstallFlags -- | This defines what a 'TargetSelector' means for the @test@ command.
src/Distribution/Client/CmdUpdate.hs view
@@ -56,7 +56,8 @@ ) import Distribution.Client.ProjectOrchestration import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags , RepoContext (..) , UpdateFlags@@ -223,7 +224,7 @@ reposToUpdate traverse_ (\_ -> collectJob jobCtrl) reposToUpdate where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) cliConfig = commandLineFlagsToProjectConfig globalFlags flags mempty -- ClientInstallFlags, not needed here globalConfigFlag = projectConfigConfigFile (projectConfigShared cliConfig)
src/Distribution/Client/Compat/Orphans.hs view
@@ -4,8 +4,8 @@ module Distribution.Client.Compat.Orphans () where import Control.Exception (SomeException)+import Data.Typeable (typeRep) import Distribution.Compat.Binary (Binary (..))-import Distribution.Compat.Typeable (typeRep) import Distribution.Utils.Structured (Structure (Nominal), Structured (..)) import Network.URI (URI (..), URIAuth (..)) import Prelude (error, return)
src/Distribution/Client/Config.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} -----------------------------------------------------------------------------@@ -177,6 +178,7 @@ ) import Distribution.Simple.Setup ( BenchmarkFlags (..)+ , CommonSetupFlags (..) , ConfigFlags (..) , Flag (..) , HaddockFlags (..)@@ -204,6 +206,7 @@ , warn ) import Distribution.Solver.Types.ConstraintSource+import Distribution.Utils.Path (getSymbolicPath, unsafeMakeSymbolicPath) import Distribution.Verbosity ( normal )@@ -459,9 +462,21 @@ where combine = combine' savedClientInstallFlags + combinedSavedCommonFlags which =+ CommonSetupFlags+ { setupDistPref = combine setupDistPref+ , setupWorkingDir = combine setupWorkingDir+ , setupCabalFilePath = combine setupCabalFilePath+ , setupVerbosity = combine setupVerbosity+ , setupTargets = lastNonEmpty setupTargets+ }+ where+ lastNonEmpty = lastNonEmpty' which+ combine = combine' which+ combinedSavedConfigureFlags = ConfigFlags- { configArgs = lastNonEmpty configArgs+ { configCommonFlags = combinedSavedCommonFlags (configCommonFlags . savedConfigureFlags) , configPrograms_ = configPrograms_ . savedConfigureFlags $ b , -- TODO: NubListify configProgramPaths = lastNonEmpty configProgramPaths@@ -475,6 +490,7 @@ , configVanillaLib = combine configVanillaLib , configProfLib = combine configProfLib , configProf = combine configProf+ , configProfShared = combine configProfShared , configSharedLib = combine configSharedLib , configStaticLib = combine configStaticLib , configDynExe = combine configDynExe@@ -503,9 +519,6 @@ , configDeterministic = combine configDeterministic , configIPID = combine configIPID , configCID = combine configCID- , configDistPref = combine configDistPref- , configCabalFilePath = combine configCabalFilePath- , configVerbosity = combine configVerbosity , configUserInstall = combine configUserInstall , -- TODO: NubListify configPackageDBs = lastNonEmpty configPackageDBs@@ -533,6 +546,7 @@ , configAllowDependingOnPrivateLibs = combine configAllowDependingOnPrivateLibs , configCoverageFor = combine configCoverageFor+ , configIgnoreBuildTools = combine configIgnoreBuildTools } where combine = combine' savedConfigureFlags@@ -596,7 +610,8 @@ combinedSavedHaddockFlags = HaddockFlags- { -- TODO: NubListify+ { haddockCommonFlags = combinedSavedCommonFlags (haddockCommonFlags . savedHaddockFlags)+ , -- TODO: NubListify haddockProgramPaths = lastNonEmpty haddockProgramPaths , -- TODO: NubListify haddockProgramArgs = lastNonEmpty haddockProgramArgs@@ -614,15 +629,12 @@ , haddockQuickJump = combine haddockQuickJump , haddockHscolourCss = combine haddockHscolourCss , haddockContents = combine haddockContents- , haddockDistPref = combine haddockDistPref , haddockKeepTempFiles = combine haddockKeepTempFiles- , haddockVerbosity = combine haddockVerbosity- , haddockCabalFilePath = combine haddockCabalFilePath , haddockIndex = combine haddockIndex , haddockBaseUrl = combine haddockBaseUrl- , haddockLib = combine haddockLib+ , haddockResourcesDir = combine haddockResourcesDir , haddockOutputDir = combine haddockOutputDir- , haddockArgs = lastNonEmpty haddockArgs+ , haddockUseUnicode = combine haddockUseUnicode } where combine = combine' savedHaddockFlags@@ -630,8 +642,7 @@ combinedSavedTestFlags = TestFlags- { testDistPref = combine testDistPref- , testVerbosity = combine testVerbosity+ { testCommonFlags = combinedSavedCommonFlags (testCommonFlags . savedTestFlags) , testHumanLog = combine testHumanLog , testMachineLog = combine testMachineLog , testShowDetails = combine testShowDetails@@ -646,12 +657,10 @@ combinedSavedBenchmarkFlags = BenchmarkFlags- { benchmarkDistPref = combine benchmarkDistPref- , benchmarkVerbosity = combine benchmarkVerbosity+ { benchmarkCommonFlags = combinedSavedCommonFlags (benchmarkCommonFlags . savedBenchmarkFlags) , benchmarkOptions = lastNonEmpty benchmarkOptions } where- combine = combine' savedBenchmarkFlags lastNonEmpty = lastNonEmpty' savedBenchmarkFlags combinedSavedReplMulti = combine' savedReplMulti id@@ -686,7 +695,10 @@ mempty { configHcFlavor = toFlag defaultCompiler , configUserInstall = toFlag defaultUserInstall- , configVerbosity = toFlag normal+ , configCommonFlags =+ mempty+ { setupVerbosity = toFlag normal+ } } , savedUserInstallDirs = mempty@@ -1295,18 +1307,9 @@ [] ++ [ viewAsFieldDescr $ optionDistPref- (configDistPref . savedConfigureFlags)- ( \distPref config ->- config- { savedConfigureFlags =- (savedConfigureFlags config)- { configDistPref = distPref- }- , savedHaddockFlags =- (savedHaddockFlags config)- { haddockDistPref = distPref- }- }+ (setupDistPref . configCommonFlags . savedConfigureFlags)+ ( \distPref ->+ updSavedCommonSetupFlags (\common -> common{setupDistPref = distPref}) ) ParseArgs ]@@ -1328,6 +1331,30 @@ toRelaxDeps True = RelaxDepsAll toRelaxDeps False = mempty +updSavedCommonSetupFlags+ :: (CommonSetupFlags -> CommonSetupFlags)+ -> SavedConfig+ -> SavedConfig+updSavedCommonSetupFlags setFlag config =+ config+ { savedConfigureFlags =+ let flags = savedConfigureFlags config+ common = configCommonFlags flags+ in flags{configCommonFlags = setFlag common}+ , savedHaddockFlags =+ let flags = savedHaddockFlags config+ common = haddockCommonFlags flags+ in flags{haddockCommonFlags = setFlag common}+ , savedTestFlags =+ let flags = savedTestFlags config+ common = testCommonFlags flags+ in flags{testCommonFlags = setFlag common}+ , savedBenchmarkFlags =+ let flags = savedBenchmarkFlags config+ common = benchmarkCommonFlags flags+ in flags{benchmarkCommonFlags = setFlag common}+ }+ -- TODO: next step, make the deprecated fields elicit a warning. -- deprecatedFieldDescriptions :: [FieldDescr SavedConfig]@@ -1517,6 +1544,9 @@ _ -> [s] splitMultiPath xs = xs + splitMultiSymPath =+ map unsafeMakeSymbolicPath . splitMultiPath . map getSymbolicPath+ -- This is a fixup, pending a full config parser rewrite, to -- ensure that config fields which can be comma-separated lists -- actually parse as comma-separated lists.@@ -1530,16 +1560,16 @@ splitMultiPath (fromNubList $ configProgramPathExtra scf) , configExtraLibDirs =- splitMultiPath+ splitMultiSymPath (configExtraLibDirs scf) , configExtraLibDirsStatic =- splitMultiPath+ splitMultiSymPath (configExtraLibDirsStatic scf) , configExtraFrameworkDirs =- splitMultiPath+ splitMultiSymPath (configExtraFrameworkDirs scf) , configExtraIncludeDirs =- splitMultiPath+ splitMultiSymPath (configExtraIncludeDirs scf) , configConfigureArgs = splitMultiPath
src/Distribution/Client/Configure.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} ----------------------------------------------------------------------------- @@ -23,7 +24,6 @@ -- * Saved configure flags , readConfigFlagsFrom , readConfigFlags- , cabalConfigFlagsFile , writeConfigFlagsTo , writeConfigFlags ) where@@ -86,8 +86,8 @@ import Distribution.Simple.Compiler ( Compiler , CompilerInfo- , PackageDB (..)- , PackageDBStack+ , PackageDBStackCWD+ , PackageDBX (..) , compilerInfo ) import Distribution.Simple.PackageDescription@@ -99,14 +99,16 @@ ) import Distribution.Simple.Program (ProgramDb) import Distribution.Simple.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , flagToMaybe , fromFlagOrDefault+ , maybeToFlag , toFlag ) import Distribution.Simple.Utils as Utils ( debug- , defaultPackageDesc+ , defaultPackageDescCwd , dieWithException , notice , warn@@ -121,6 +123,7 @@ ( PackageVersionConstraint (..) , thisPackageVersionConstraint )+import Distribution.Utils.Path import Distribution.Version ( Version , VersionRange@@ -129,7 +132,6 @@ ) import Distribution.Client.Errors-import System.FilePath ((</>)) -- | Choose the Cabal version such that the setup scripts compiled against this -- version will support the given command-line flags. Currently, it implements no@@ -142,7 +144,7 @@ -- | Configure the package found in the local directory configure :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -200,7 +202,8 @@ (setupScriptOptions installedPkgIndex Nothing) Nothing configureCommand- (const configFlags)+ configCommonFlags+ (const (return configFlags)) (const extraArgs) Right installPlan0 -> let installPlan = InstallPlan.configureInstallPlan configFlags installPlan0@@ -238,7 +241,7 @@ progdb ( fromFlagOrDefault (useDistPref defaultSetupScriptOptions)- (configDistPref configFlags)+ (setupDistPref $ configCommonFlags configFlags) ) ( chooseCabalVersion configExFlags@@ -250,11 +253,11 @@ logMsg message rest = debug verbosity message >> rest configureSetupScript- :: PackageDBStack+ :: PackageDBStackCWD -> Compiler -> Platform -> ProgramDb- -> FilePath+ -> SymbolicPath Pkg (Dir Dist) -> VersionRange -> Maybe Lock -> Bool@@ -305,7 +308,7 @@ -- finding the Cabal lib when compiling any Setup.hs even if we're doing -- a global install. However we also allow looking in a specific package -- db.- packageDBs' :: PackageDBStack+ packageDBs' :: PackageDBStackCWD index' :: Maybe InstalledPackageIndex (packageDBs', index') = case packageDBs of@@ -387,7 +390,7 @@ -> ConfigExFlags -> InstalledPackageIndex -> SourcePackageDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> IO (Progress String String SolverInstallPlan) planLocalPackage verbosity@@ -399,9 +402,9 @@ (SourcePackageDb _ packagePrefs) pkgConfigDb = do pkg <-- readGenericPackageDescription verbosity- =<< case flagToMaybe (configCabalFilePath configFlags) of- Nothing -> defaultPackageDesc verbosity+ readGenericPackageDescription verbosity Nothing+ =<< case flagToMaybe (setupCabalFilePath $ configCommonFlags configFlags) of+ Nothing -> relativeSymbolicPath <$> defaultPackageDescCwd verbosity Just fp -> return fp let@@ -501,7 +504,8 @@ scriptOptions (Just pkg) configureCommand- configureFlags+ configCommonFlags+ (return . configureFlags) (const extraArgs) where gpkg :: PkgDesc.GenericPackageDescription@@ -510,7 +514,12 @@ configureFlags = filterConfigureFlags configFlags- { configIPID =+ { configCommonFlags =+ (configCommonFlags configFlags)+ { setupVerbosity = toFlag verbosity+ , setupWorkingDir = maybeToFlag $ useWorkingDir scriptOptions+ }+ , configIPID = if isJust (flagToMaybe (configIPID configFlags)) then -- Make sure cabal configure --ipid works. configIPID configFlags@@ -531,7 +540,6 @@ ] , -- Use '--exact-configuration' if supported. configExactConfiguration = toFlag True- , configVerbosity = toFlag verbosity , -- NB: if the user explicitly specified -- --enable-tests/--enable-benchmarks, always respect it. -- (But if they didn't, let solver decide.)@@ -570,7 +578,7 @@ readConfigFlagsFrom flags = do readCommandFlags flags configureExCommand --- | The path (relative to @--build-dir@) where the arguments to @configure@+-- | The path (relative to the package root) where the arguments to @configure@ -- should be saved. cabalConfigFlagsFile :: FilePath -> FilePath cabalConfigFlagsFile dist = dist </> "cabal-config-flags"@@ -586,12 +594,12 @@ -- | Save the configure flags and environment to the specified files. writeConfigFlagsTo- :: FilePath+ :: Verbosity+ -> FilePath -- ^ path to saved flags file- -> Verbosity -> (ConfigFlags, ConfigExFlags) -> IO ()-writeConfigFlagsTo file verb flags = do+writeConfigFlagsTo verb file flags = do writeCommandFlags verb file configureExCommand flags -- | Save the build flags to the usual location.@@ -602,4 +610,4 @@ -> (ConfigFlags, ConfigExFlags) -> IO () writeConfigFlags verb dist =- writeConfigFlagsTo (cabalConfigFlagsFile dist) verb+ writeConfigFlagsTo verb (cabalConfigFlagsFile dist)
src/Distribution/Client/Dependency.hs view
@@ -64,6 +64,7 @@ , addDefaultSetupDependencies , addSetupCabalMinVersionConstraint , addSetupCabalMaxVersionConstraint+ , addSetupCabalProfiledDynamic ) where import Distribution.Client.Compat.Prelude@@ -631,7 +632,7 @@ } } where- isCustom = PD.buildType pkgdesc == PD.Custom+ isCustom = PD.buildType pkgdesc == PD.Custom || PD.buildType pkgdesc == PD.Hooks gpkgdesc = srcpkgDescription srcpkg pkgdesc = PD.packageDescription gpkgdesc @@ -671,6 +672,22 @@ where cabalPkgname = mkPackageName "Cabal" +-- | Add an a lower bound @setup.Cabal >= 3.13@ labeled with 'ConstraintSourceProfiledDynamic'+addSetupCabalProfiledDynamic+ :: DepResolverParams+ -> DepResolverParams+addSetupCabalProfiledDynamic =+ addConstraints+ [ LabeledPackageConstraint+ ( PackageConstraint+ (ScopeAnySetupQualifier cabalPkgname)+ (PackagePropertyVersion $ orLaterVersion (mkVersion [3, 13, 0]))+ )+ ConstraintSourceProfiledDynamic+ ]+ where+ cabalPkgname = mkPackageName "Cabal"+ upgradeDependencies :: DepResolverParams -> DepResolverParams upgradeDependencies = setPreferenceDefault PreferAllLatest @@ -730,7 +747,7 @@ gpkgdesc = srcpkgDescription srcpkg pkgdesc = PD.packageDescription gpkgdesc bt = PD.buildType pkgdesc- affected = bt == PD.Custom && hasBuildableFalse gpkgdesc+ affected = (bt == PD.Custom || bt == PD.Hooks) && hasBuildableFalse gpkgdesc -- Does this package contain any components with non-empty 'build-depends' -- and a 'buildable' field that could potentially be set to 'False'? False@@ -764,7 +781,7 @@ resolveDependencies :: Platform -> CompilerInfo- -> PkgConfigDb+ -> Maybe PkgConfigDb -> DepResolverParams -> Progress String String SolverInstallPlan resolveDependencies platform comp pkgConfigDB params =
src/Distribution/Client/DistDirLayout.hs view
@@ -43,8 +43,9 @@ import Distribution.Simple.Compiler ( Compiler (..) , OptimisationLevel (..)- , PackageDB (..)- , PackageDBStack+ , PackageDBCWD+ , PackageDBStackCWD+ , PackageDBX (..) ) import Distribution.Simple.Configure (interpretPackageDbFlags) import Distribution.System@@ -111,7 +112,7 @@ , distSdistDirectory :: FilePath , distTempDirectory :: FilePath , distBinDirectory :: FilePath- , distPackageDB :: CompilerId -> PackageDB+ , distPackageDB :: CompilerId -> PackageDBCWD , distHaddockOutputDir :: Maybe FilePath -- ^ Is needed when `--haddock-output-dir` flag is used. }@@ -121,8 +122,8 @@ { storeDirectory :: Compiler -> FilePath , storePackageDirectory :: Compiler -> UnitId -> FilePath , storePackageDBPath :: Compiler -> FilePath- , storePackageDB :: Compiler -> PackageDB- , storePackageDBStack :: Compiler -> [Maybe PackageDB] -> PackageDBStack+ , storePackageDB :: Compiler -> PackageDBCWD+ , storePackageDBStack :: Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD , storeIncomingDirectory :: Compiler -> FilePath , storeIncomingLock :: Compiler -> UnitId -> FilePath }@@ -144,7 +145,7 @@ -- -- It can either be an implicit project root in the current dir if no -- @cabal.project@ file is found, or an explicit root if either--- the file is found or the project root directory was specicied.+-- the file is found or the project root directory was specified. data ProjectRoot = -- | An implicit project root. It contains the absolute project -- root dir.@@ -167,8 +168,7 @@ :: ProjectRoot -- ^ the project root -> Maybe FilePath- -- ^ the @dist@ directory or default- -- (absolute or relative to the root)+ -- ^ the @dist@ directory (relative to package root) -> Maybe FilePath -- ^ the documentation directory -> DistDirLayout@@ -259,7 +259,7 @@ distPackageDBPath :: CompilerId -> FilePath distPackageDBPath compid = distDirectory </> "packagedb" </> prettyShow compid - distPackageDB :: CompilerId -> PackageDB+ distPackageDB :: CompilerId -> PackageDBCWD distPackageDB = SpecificPackageDB . distPackageDBPath distHaddockOutputDir :: Maybe FilePath@@ -283,11 +283,11 @@ storePackageDBPath compiler = storeDirectory compiler </> "package.db" - storePackageDB :: Compiler -> PackageDB+ storePackageDB :: Compiler -> PackageDBCWD storePackageDB compiler = SpecificPackageDB (storePackageDBPath compiler) - storePackageDBStack :: Compiler -> [Maybe PackageDB] -> PackageDBStack+ storePackageDBStack :: Compiler -> [Maybe PackageDBCWD] -> PackageDBStackCWD storePackageDBStack compiler extraPackageDB = (interpretPackageDbFlags False extraPackageDB) ++ [storePackageDB compiler]
src/Distribution/Client/Fetch.hs view
@@ -44,10 +44,6 @@ ( packageId ) import Distribution.Simple.Compiler- ( Compiler- , PackageDBStack- , compilerInfo- ) import Distribution.Simple.PackageIndex (InstalledPackageIndex) import Distribution.Simple.Program ( ProgramDb@@ -88,7 +84,7 @@ -- | Fetch a list of packages and their dependencies. fetch :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -161,7 +157,7 @@ -> FetchFlags -> InstalledPackageIndex -> SourcePackageDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> [PackageSpecifier UnresolvedSourcePackage] -> IO [UnresolvedSourcePackage] planPackages
src/Distribution/Client/FileMonitor.hs view
@@ -11,22 +11,7 @@ -- input values they depend on have changed. module Distribution.Client.FileMonitor ( -- * Declaring files to monitor- MonitorFilePath (..)- , MonitorKindFile (..)- , MonitorKindDir (..)- , RootedGlob (..)- , monitorFile- , monitorFileHashed- , monitorNonExistentFile- , monitorFileExistence- , monitorDirectory- , monitorNonExistentDirectory- , monitorDirectoryExistence- , monitorFileOrDirectory- , monitorFileGlob- , monitorFileGlobExistence- , monitorFileSearchPath- , monitorFileHashedSearchPath+ module Distribution.Simple.FileMonitor.Types -- * Creating and checking sets of monitored files , FileMonitor (..)@@ -50,7 +35,6 @@ import Data.Binary.Get (runGetOrFail) import qualified Data.ByteString.Lazy as BS-import qualified Data.Hashable as Hashable import qualified Data.Map.Strict as Map import Control.Exception@@ -66,133 +50,18 @@ import Control.Monad.Trans (MonadIO, liftIO) import Distribution.Client.Glob+import Distribution.Client.HashValue import Distribution.Client.Utils (MergeResult (..), mergeBy) import Distribution.Compat.Time+import Distribution.Simple.FileMonitor.Types import Distribution.Simple.Utils (handleDoesNotExist, writeFileAtomic) import Distribution.Utils.Structured (Tag (..), structuredEncode)+ import System.Directory import System.FilePath import System.IO --------------------------------------------------------------------------------- Types for specifying files to monitor------- | A description of a file (or set of files) to monitor for changes.------ Where file paths are relative they are relative to a common directory--- (e.g. project root), not necessarily the process current directory.-data MonitorFilePath- = MonitorFile- { monitorKindFile :: !MonitorKindFile- , monitorKindDir :: !MonitorKindDir- , monitorPath :: !FilePath- }- | MonitorFileGlob- { monitorKindFile :: !MonitorKindFile- , monitorKindDir :: !MonitorKindDir- , monitorPathGlob :: !RootedGlob- }- deriving (Eq, Show, Generic)--data MonitorKindFile- = FileExists- | FileModTime- | FileHashed- | FileNotExists- deriving (Eq, Show, Generic)--data MonitorKindDir- = DirExists- | DirModTime- | DirNotExists- deriving (Eq, Show, Generic)--instance Binary MonitorFilePath-instance Binary MonitorKindFile-instance Binary MonitorKindDir--instance Structured MonitorFilePath-instance Structured MonitorKindFile-instance Structured MonitorKindDir---- | Monitor a single file for changes, based on its modification time.--- The monitored file is considered to have changed if it no longer--- exists or if its modification time has changed.-monitorFile :: FilePath -> MonitorFilePath-monitorFile = MonitorFile FileModTime DirNotExists---- | Monitor a single file for changes, based on its modification time--- and content hash. The monitored file is considered to have changed if--- it no longer exists or if its modification time and content hash have--- changed.-monitorFileHashed :: FilePath -> MonitorFilePath-monitorFileHashed = MonitorFile FileHashed DirNotExists---- | Monitor a single non-existent file for changes. The monitored file--- is considered to have changed if it exists.-monitorNonExistentFile :: FilePath -> MonitorFilePath-monitorNonExistentFile = MonitorFile FileNotExists DirNotExists---- | Monitor a single file for existence only. The monitored file is--- considered to have changed if it no longer exists.-monitorFileExistence :: FilePath -> MonitorFilePath-monitorFileExistence = MonitorFile FileExists DirNotExists---- | Monitor a single directory for changes, based on its modification--- time. The monitored directory is considered to have changed if it no--- longer exists or if its modification time has changed.-monitorDirectory :: FilePath -> MonitorFilePath-monitorDirectory = MonitorFile FileNotExists DirModTime---- | Monitor a single non-existent directory for changes. The monitored--- directory is considered to have changed if it exists.-monitorNonExistentDirectory :: FilePath -> MonitorFilePath--- Just an alias for monitorNonExistentFile, since you can't--- tell the difference between a non-existent directory and--- a non-existent file :)-monitorNonExistentDirectory = monitorNonExistentFile---- | Monitor a single directory for existence. The monitored directory is--- considered to have changed only if it no longer exists.-monitorDirectoryExistence :: FilePath -> MonitorFilePath-monitorDirectoryExistence = MonitorFile FileNotExists DirExists---- | Monitor a single file or directory for changes, based on its modification--- time. The monitored file is considered to have changed if it no longer--- exists or if its modification time has changed.-monitorFileOrDirectory :: FilePath -> MonitorFilePath-monitorFileOrDirectory = MonitorFile FileModTime DirModTime---- | Monitor a set of files (or directories) identified by a file glob.--- The monitored glob is considered to have changed if the set of files--- matching the glob changes (i.e. creations or deletions), or for files if the--- modification time and content hash of any matching file has changed.-monitorFileGlob :: RootedGlob -> MonitorFilePath-monitorFileGlob = MonitorFileGlob FileHashed DirExists---- | Monitor a set of files (or directories) identified by a file glob for--- existence only. The monitored glob is considered to have changed if the set--- of files matching the glob changes (i.e. creations or deletions).-monitorFileGlobExistence :: RootedGlob -> MonitorFilePath-monitorFileGlobExistence = MonitorFileGlob FileExists DirExists---- | Creates a list of files to monitor when you search for a file which--- unsuccessfully looked in @notFoundAtPaths@ before finding it at--- @foundAtPath@.-monitorFileSearchPath :: [FilePath] -> FilePath -> [MonitorFilePath]-monitorFileSearchPath notFoundAtPaths foundAtPath =- monitorFile foundAtPath- : map monitorNonExistentFile notFoundAtPaths---- | Similar to 'monitorFileSearchPath', but also instructs us to--- monitor the hash of the found file.-monitorFileHashedSearchPath :: [FilePath] -> FilePath -> [MonitorFilePath]-monitorFileHashedSearchPath notFoundAtPaths foundAtPath =- monitorFileHashed foundAtPath- : map monitorNonExistentFile notFoundAtPaths-------------------------------------------------------------------------------- -- Implementation types, files status -- @@ -214,8 +83,6 @@ instance Binary MonitorStateFileSet instance Structured MonitorStateFileSet -type Hash = Int- -- | The state necessary to determine whether a monitored file has changed. -- -- This covers all the cases of 'MonitorFilePath' except for globs which is@@ -238,7 +105,7 @@ | -- | cached file mtime MonitorStateFileModTime !ModTime | -- | cached mtime and content hash- MonitorStateFileHashed !ModTime !Hash+ MonitorStateFileHashed !ModTime !HashValue | MonitorStateDirExists | -- | cached dir mtime MonitorStateDirModTime !ModTime@@ -1092,21 +959,21 @@ -- updating a file monitor the set of files is the same or largely the same so -- we can grab the previously known content hashes with their corresponding -- mtimes.-type FileHashCache = Map FilePath (ModTime, Hash)+type FileHashCache = Map FilePath (ModTime, HashValue) -- | We declare it a cache hit if the mtime of a file is the same as before.-lookupFileHashCache :: FileHashCache -> FilePath -> ModTime -> Maybe Hash+lookupFileHashCache :: FileHashCache -> FilePath -> ModTime -> Maybe HashValue lookupFileHashCache hashcache file mtime = do (mtime', hash) <- Map.lookup file hashcache guard (mtime' == mtime) return hash -- | Either get it from the cache or go read the file-getFileHash :: FileHashCache -> FilePath -> FilePath -> ModTime -> IO Hash+getFileHash :: FileHashCache -> FilePath -> FilePath -> ModTime -> IO HashValue getFileHash hashcache relfile absfile mtime = case lookupFileHashCache hashcache relfile mtime of Just hash -> return hash- Nothing -> readFileHash absfile+ Nothing -> readFileHashValue absfile -- | Build a 'FileHashCache' from the previous 'MonitorStateFileSet'. While -- in principle we could preserve the structure of the previous state, given@@ -1129,7 +996,7 @@ collectAllFileHashes singlePaths `Map.union` collectAllGlobHashes globPaths - collectAllFileHashes :: [MonitorStateFile] -> Map FilePath (ModTime, Hash)+ collectAllFileHashes :: [MonitorStateFile] -> Map FilePath (ModTime, HashValue) collectAllFileHashes singlePaths = Map.fromList [ (fpath, (mtime, hash))@@ -1141,7 +1008,7 @@ singlePaths ] - collectAllGlobHashes :: [MonitorStateGlob] -> Map FilePath (ModTime, Hash)+ collectAllGlobHashes :: [MonitorStateGlob] -> Map FilePath (ModTime, HashValue) collectAllGlobHashes globPaths = Map.fromList [ (fpath, (mtime, hash))@@ -1149,7 +1016,7 @@ , (fpath, (mtime, hash)) <- collectGlobHashes "" gstate ] - collectGlobHashes :: FilePath -> MonitorStateGlobRel -> [(FilePath, (ModTime, Hash))]+ collectGlobHashes :: FilePath -> MonitorStateGlobRel -> [(FilePath, (ModTime, HashValue))] collectGlobHashes dir (MonitorStateGlobDirs _ _ _ entries) = [ res | (subdir, fstate) <- entries@@ -1174,13 +1041,13 @@ unless unchanged (somethingChanged file) -- | Within the @root@ directory, check if @file@ has its 'ModTime' and--- 'Hash' is the same as @mtime@ and @hash@, short-circuiting if it is+-- 'HashValue' is the same as @mtime@ and @hash@, short-circuiting if it is -- different. probeFileModificationTimeAndHash :: FilePath -> FilePath -> ModTime- -> Hash+ -> HashValue -> ChangedM () probeFileModificationTimeAndHash root file mtime hash = do unchanged <-@@ -1223,12 +1090,12 @@ return (mtime == mtime') -- | Returns @True@ if, inside the @root@ directory, @file@ has the--- same 'ModTime' and 'Hash' as @mtime and @chash@.+-- same 'ModTime' and 'HashValue' as @mtime and @chash@. checkFileModificationTimeAndHashUnchanged :: FilePath -> FilePath -> ModTime- -> Hash+ -> HashValue -> IO Bool checkFileModificationTimeAndHashUnchanged root file mtime chash = handleIOException False $ do@@ -1236,15 +1103,9 @@ if mtime == mtime' then return True else do- chash' <- readFileHash (root </> file)+ chash' <- readFileHashValue (root </> file) return (chash == chash') --- | Read a non-cryptographic hash of a @file@.-readFileHash :: FilePath -> IO Hash-readFileHash file =- withBinaryFile file ReadMode $ \hnd ->- evaluate . Hashable.hash =<< BS.hGetContents hnd- -- | Given a directory @dir@, return @Nothing@ if its 'ModTime' -- is the same as @mtime@, and the new 'ModTime' if it is not. checkDirectoryModificationTime :: FilePath -> ModTime -> IO (Maybe ModTime)@@ -1258,12 +1119,9 @@ -- | Run an IO computation, returning the first argument @e@ if there is an 'error' -- call. ('ErrorCall') handleErrorCall :: a -> IO a -> IO a-handleErrorCall e = handle handler where-#if MIN_VERSION_base(4,9,0)+handleErrorCall e = handle handler+ where handler (ErrorCallWithLocation _ _) = return e-#else- handler (ErrorCall _) = return e-#endif -- | Run an IO computation, returning @e@ if there is any 'IOException'. --
src/Distribution/Client/Freeze.hs view
@@ -61,10 +61,6 @@ , packageVersion ) import Distribution.Simple.Compiler- ( Compiler- , PackageDBStack- , compilerInfo- ) import Distribution.Simple.PackageIndex (InstalledPackageIndex) import Distribution.Simple.Program ( ProgramDb@@ -98,7 +94,7 @@ -- constraining each dependency to an exact version. freeze :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -146,7 +142,7 @@ -- command. getFreezePkgs :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -199,7 +195,7 @@ -> FreezeFlags -> InstalledPackageIndex -> SourcePackageDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> [PackageSpecifier UnresolvedSourcePackage] -> IO [SolverPlanPackage] planPackages
src/Distribution/Client/GenBounds.hs view
@@ -46,10 +46,6 @@ ( finalizePD ) import Distribution.Simple.Compiler- ( Compiler- , PackageDBStack- , compilerInfo- ) import Distribution.Simple.PackageDescription ( readGenericPackageDescription )@@ -67,6 +63,7 @@ ( defaultComponentRequestedSpec ) import Distribution.Types.Dependency+import Distribution.Utils.Path (relativeSymbolicPath) import Distribution.Version ( LowerBound (..) , UpperBound (..)@@ -80,9 +77,6 @@ , intersectVersionRanges , orLaterVersion )-import System.Directory- ( getCurrentDirectory- ) -- | Given a version, return an API-compatible (according to PVP) version range. --@@ -121,7 +115,7 @@ -- | Entry point for the @gen-bounds@ command. genBounds :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -132,9 +126,8 @@ genBounds verbosity packageDBs repoCtxt comp platform progdb globalFlags freezeFlags = do let cinfo = compilerInfo comp - cwd <- getCurrentDirectory- path <- tryFindPackageDesc verbosity cwd- gpd <- readGenericPackageDescription verbosity path+ path <- relativeSymbolicPath <$> tryFindPackageDesc verbosity Nothing+ gpd <- readGenericPackageDescription verbosity Nothing path -- NB: We don't enable tests or benchmarks, since often they -- don't really have useful bounds. let epd =
src/Distribution/Client/Glob.hs view
@@ -12,48 +12,25 @@ , Glob (..) , GlobPiece (..) , GlobPieces- , matchGlob- , matchGlobPieces , matchFileGlob ) where import Distribution.Client.Compat.Prelude import Prelude () +import Distribution.Simple.FileMonitor.Types import Distribution.Simple.Glob import Distribution.Simple.Glob.Internal+ ( Glob (..)+ , GlobPiece (..)+ , GlobPieces+ ) import System.Directory import System.FilePath -import qualified Distribution.Compat.CharParsing as P-import qualified Text.PrettyPrint as Disp- -------------------------------------------------------------------------------- --- | A file path specified by globbing, relative--- to some root directory.-data RootedGlob- = RootedGlob- FilePathRoot- -- ^ what the glob is relative to- Glob- -- ^ the glob- deriving (Eq, Show, Generic)--instance Binary RootedGlob-instance Structured RootedGlob--data FilePathRoot- = FilePathRelative- | -- | e.g. @"/"@, @"c:\"@ or result of 'takeDrive'- FilePathRoot FilePath- | FilePathHomeDir- deriving (Eq, Show, Generic)--instance Binary FilePathRoot-instance Structured FilePathRoot- -- | Check if a 'RootedGlob' doesn't actually make use of any globbing and -- is in fact equivalent to a non-glob 'FilePath'. --@@ -105,33 +82,3 @@ case globroot of FilePathRelative -> return matches _ -> return (map (root </>) matches)----------------------------------------------------------------------------------- Parsing & pretty-printing-----instance Pretty RootedGlob where- pretty (RootedGlob root pathglob) = pretty root Disp.<> pretty pathglob--instance Parsec RootedGlob where- parsec = do- root <- parsec- case root of- FilePathRelative -> RootedGlob root <$> parsec- _ -> RootedGlob root <$> parsec <|> pure (RootedGlob root GlobDirTrailing)--instance Pretty FilePathRoot where- pretty FilePathRelative = Disp.empty- pretty (FilePathRoot root) = Disp.text root- pretty FilePathHomeDir = Disp.char '~' Disp.<> Disp.char '/'--instance Parsec FilePathRoot where- parsec = root <|> P.try home <|> P.try drive <|> pure FilePathRelative- where- root = FilePathRoot "/" <$ P.char '/'- home = FilePathHomeDir <$ P.string "~/"- drive = do- dr <- P.satisfy $ \c -> (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')- _ <- P.char ':'- _ <- P.char '/' <|> P.char '\\'- return (FilePathRoot (toUpper dr : ":\\"))
src/Distribution/Client/HttpUtils.hs view
@@ -192,7 +192,7 @@ -- Only use the external http transports if we actually have to -- (or have been told to do so) let transport'- | uriScheme uri == "http:"+ | isHttpURI uri , not (transportManuallySelected transport) = plainHttpTransport | otherwise =@@ -251,20 +251,35 @@ -- Utilities for repo url management -- +-- | If the remote repo is accessed over HTTPS, ensure that the transport+-- supports HTTPS. remoteRepoCheckHttps :: Verbosity -> HttpTransport -> RemoteRepo -> IO ()-remoteRepoCheckHttps verbosity transport repo- | uriScheme (remoteRepoURI repo) == "https:"- , not (transportSupportsHttps transport) =- dieWithException verbosity $ RemoteRepoCheckHttps (unRepoName (remoteRepoName repo)) requiresHttpsErrorMessage- | otherwise = return ()+remoteRepoCheckHttps verbosity transport repo =+ transportCheckHttpsWithError verbosity transport (remoteRepoURI repo) $+ RemoteRepoCheckHttps (unRepoName (remoteRepoName repo)) requiresHttpsErrorMessage +-- | If the URI scheme is HTTPS, ensure the transport supports HTTPS. transportCheckHttps :: Verbosity -> HttpTransport -> URI -> IO ()-transportCheckHttps verbosity transport uri- | uriScheme uri == "https:"+transportCheckHttps verbosity transport uri =+ transportCheckHttpsWithError verbosity transport uri $+ TransportCheckHttps uri requiresHttpsErrorMessage++-- | If the URI scheme is HTTPS, ensure the transport supports HTTPS.+-- If not, fail with the given error.+transportCheckHttpsWithError+ :: Verbosity -> HttpTransport -> URI -> CabalInstallException -> IO ()+transportCheckHttpsWithError verbosity transport uri err+ | isHttpsURI uri , not (transportSupportsHttps transport) =- dieWithException verbosity $ TransportCheckHttps uri requiresHttpsErrorMessage+ dieWithException verbosity err | otherwise = return () +isHttpsURI :: URI -> Bool+isHttpsURI uri = uriScheme uri == "https:"++isHttpURI :: URI -> Bool+isHttpURI uri = uriScheme uri == "http:"+ requiresHttpsErrorMessage :: String requiresHttpsErrorMessage = "requires HTTPS however the built-in HTTP implementation "@@ -280,12 +295,12 @@ remoteRepoTryUpgradeToHttps :: Verbosity -> HttpTransport -> RemoteRepo -> IO RemoteRepo remoteRepoTryUpgradeToHttps verbosity transport repo | remoteRepoShouldTryHttps repo- , uriScheme (remoteRepoURI repo) == "http:"+ , isHttpURI (remoteRepoURI repo) , not (transportSupportsHttps transport) , not (transportManuallySelected transport) = dieWithException verbosity $ TryUpgradeToHttps [name | (name, _, True, _) <- supportedTransports] | remoteRepoShouldTryHttps repo- , uriScheme (remoteRepoURI repo) == "http:"+ , isHttpURI (remoteRepoURI repo) , transportSupportsHttps transport = return repo@@ -408,7 +423,7 @@ case find (\(name', _, _, _) -> name' == name) supportedTransports of Just (_, mprog, _tls, mkTrans) -> do- baseProgDb <- prependProgramSearchPath verbosity extraPath emptyProgramDb+ baseProgDb <- prependProgramSearchPath verbosity extraPath [] emptyProgramDb progdb <- case mprog of Nothing -> return emptyProgramDb Just prog -> snd <$> requireProgram verbosity prog baseProgDb@@ -424,7 +439,7 @@ -- for all the transports except plain-http we need to try and find -- their external executable- baseProgDb <- prependProgramSearchPath verbosity extraPath emptyProgramDb+ baseProgDb <- prependProgramSearchPath verbosity extraPath [] emptyProgramDb progdb <- configureAllKnownPrograms verbosity $ addKnownPrograms@@ -505,12 +520,18 @@ (Just (Left (uname, passwd)), _) -> Just $ Left (uname ++ ":" ++ passwd) (Nothing, Just a) -> Just $ Left a (Nothing, Nothing) -> Nothing+ let authnSchemeArg+ -- When using TLS, we can accept Basic authentication. Let curl+ -- decide based on the scheme(s) offered by the server.+ | isHttpsURI uri = "--anyauth"+ -- When not using TLS, force Digest scheme+ | otherwise = "--digest" case mbAuthStringToken of Just (Left up) -> progInvocation { progInvokeInput = Just . IODataText . unlines $- [ "--digest"+ [ authnSchemeArg , "--user " ++ up ] , progInvokeArgs = ["--config", "-"] ++ progInvokeArgs progInvocation
src/Distribution/Client/IndexUtils.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-}@@ -82,9 +83,6 @@ , emptyPackageDescription ) import Distribution.Simple.Compiler- ( Compiler- , PackageDBStack- ) import qualified Distribution.Simple.Configure as Configure ( getInstalledPackages , getInstalledPackagesMonitorFiles@@ -114,7 +112,6 @@ , parseGenericPackageDescriptionMaybe ) import qualified Distribution.PackageDescription.Parsec as PackageDesc.Parse-import qualified Distribution.Simple.PackageDescription as PackageDesc.Parse import Distribution.Solver.Types.PackageIndex (PackageIndex) import qualified Distribution.Solver.Types.PackageIndex as PackageIndex@@ -134,7 +131,7 @@ import Distribution.Client.GZipUtils (maybeDecompress) import Distribution.Client.Utils ( byteStringToFilePath- , tryFindAddSourcePackageDesc+ , tryReadAddSourcePackageDesc ) import Distribution.Compat.Directory (listDirectory) import Distribution.Compat.Time (getFileAge, getModTime)@@ -150,7 +147,7 @@ , (<.>) , (</>) )-import qualified System.FilePath.Posix as FilePath.Posix+import qualified System.FilePath as FilePath import System.IO import System.IO.Error (isDoesNotExistError) import System.IO.Unsafe (unsafeInterleaveIO)@@ -163,11 +160,11 @@ getInstalledPackages :: Verbosity -> Compiler- -> PackageDBStack+ -> PackageDBStackCWD -> ProgramDb -> IO InstalledPackageIndex getInstalledPackages verbosity comp packageDbs progdb =- Configure.getInstalledPackages verbosity' comp packageDbs progdb+ Configure.getInstalledPackages verbosity' comp Nothing (coercePackageDBStack packageDbs) progdb where verbosity' = lessVerbose verbosity @@ -460,8 +457,8 @@ if isDoesNotExistError e then do case repo of- RepoRemote{..} -> dieWithException verbosity $ MissingPackageList repoRemote- RepoSecure{..} -> dieWithException verbosity $ MissingPackageList repoRemote+ RepoRemote{..} -> warn verbosity $ exceptionMessageCabalInstall $ MissingPackageList repoRemote+ RepoSecure{..} -> warn verbosity $ exceptionMessageCabalInstall $ MissingPackageList repoRemote RepoLocalNoIndex local _ -> warn verbosity $ "Error during construction of local+noindex "@@ -638,8 +635,7 @@ if not dirExists then return Nothing else do- cabalFile <- tryFindAddSourcePackageDesc verbosity path "Error reading package index."- descr <- PackageDesc.Parse.readGenericPackageDescription normal cabalFile+ descr <- tryReadAddSourcePackageDesc verbosity path "Error reading package index." return . Just $ BuildTreeRef (refTypeFromTypeCode typeCode)@@ -930,7 +926,7 @@ let bs = BS.toStrict contents in ((`CacheGPD` bs) <$> parseGenericPackageDescriptionMaybe bs) where- filename = prettyShow pkgId FilePath.Posix.</> prettyShow (packageName pkgId) ++ ".cabal"+ filename = prettyShow pkgId FilePath.</> prettyShow (packageName pkgId) ++ ".cabal" readCabalEntry _ _ x = x withIndexEntries verbosity index callback _ = do -- non-secure repositories@@ -1044,8 +1040,7 @@ path <- fmap byteStringToFilePath . getEntryContent $ blockno pkg <- do let err = "Error reading package index from cache."- file <- tryFindAddSourcePackageDesc verbosity path err- PackageDesc.Parse.readGenericPackageDescription normal file+ tryReadAddSourcePackageDesc verbosity path err let srcpkg = mkPkg (BuildTreeRef refType (packageId pkg) pkg path blockno) accum srcpkgs (srcpkg : btrs) prefs entries accum srcpkgs btrs prefs (CachePreference pref@(Dependency pn _ _) _ _ : entries) =
src/Distribution/Client/Init.hs view
@@ -31,7 +31,7 @@ -- | This is the main driver for the init script. initCmd :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> ProgramDb@@ -41,8 +41,7 @@ installedPkgIndex <- getInstalledPackages v comp packageDBs progdb sourcePkgDb <- getSourcePackages v repoCtxt hSetBuffering stdout NoBuffering- settings <- createProject v installedPkgIndex sourcePkgDb initFlags- writeProject settings+ runPromptIO (writeProject =<< createProject v installedPkgIndex sourcePkgDb initFlags) where -- When no flag is set, default to interactive. --
src/Distribution/Client/Init/Defaults.hs view
@@ -135,6 +135,7 @@ , CabalSpecV2_4 , CabalSpecV3_0 , CabalSpecV3_4+ , CabalSpecV3_14 ] defaultInitFlags :: InitFlags
src/Distribution/Client/Init/Format.hs view
@@ -180,7 +180,7 @@ , field "hs-source-dirs" formatHsSourceDirs- (unsafeMakeSymbolicPath <$> srcDirs)+ (makeSymbolicPath <$> srcDirs) ["Directories containing source files."] True opts@@ -247,7 +247,7 @@ , field "hs-source-dirs" formatHsSourceDirs- (unsafeMakeSymbolicPath <$> appDirs)+ (makeSymbolicPath <$> appDirs) ["Directories containing source files."] True opts@@ -316,7 +316,7 @@ , field "hs-source-dirs" formatHsSourceDirs- (unsafeMakeSymbolicPath <$> dirs)+ (makeSymbolicPath <$> dirs) ["Directories containing source files."] True opts@@ -473,14 +473,14 @@ Just fs -> field "extra-doc-files"- formatExtraSourceFiles+ (formatExtraSourceFiles . map unsafeMakeSymbolicPath) (toList fs) ["Extra doc files to be distributed with the package, such as a CHANGELOG or a README."] True opts , field "extra-source-files"- formatExtraSourceFiles+ (formatExtraSourceFiles . map unsafeMakeSymbolicPath) (toList $ _pkgExtraSrcFiles pkgDesc) ["Extra source files to be distributed with the package, such as examples, or a tutorial module."] True
src/Distribution/Client/Init/Interactive/Command.hs view
@@ -313,6 +313,7 @@ parseCabalVersion "3.0" = CabalSpecV3_0 parseCabalVersion "3.4" = CabalSpecV3_4 parseCabalVersion "3.12" = CabalSpecV3_12+ parseCabalVersion "3.14" = CabalSpecV3_14 parseCabalVersion _ = defaultCabalVersion -- 2.4 displayCabalVersion :: CabalSpecVersion -> String displayCabalVersion v = case v of@@ -321,6 +322,7 @@ CabalSpecV2_4 -> "2.4 (+ support for '**' globbing)" CabalSpecV3_0 -> "3.0 (+ set notation for ==, common stanzas in ifs, more redundant commas, better pkgconfig-depends)" CabalSpecV3_4 -> "3.4 (+ sublibraries in 'mixins', optional 'default-language')"+ CabalSpecV3_14 -> "3.14 (+ build-type: Hooks)" _ -> showCabalSpecVersion v packageNamePrompt :: Interactive m => SourcePackageDb -> InitFlags -> m PackageName@@ -458,13 +460,17 @@ ghc2021 = "GHC2021 (requires at least GHC 9.2)" ghc2024 = "GHC2024 (requires at least GHC 9.10)" + lastChosenLanguage <- getLastChosenLanguage+ l <- promptList ("Choose a language for your " ++ pkgType) [h2010, h98, ghc2021, ghc2024]- (DefaultPrompt h2010)+ (DefaultPrompt (maybe h2010 id lastChosenLanguage)) Nothing True++ setLastChosenLanguage (Just l) if | l == h2010 -> return Haskell2010
src/Distribution/Client/Init/NonInteractive/Heuristics.hs view
@@ -165,14 +165,14 @@ guessGitInfo :: Interactive m => String -> m (Maybe String) guessGitInfo target = do- localInfo <- readProcessWithExitCode "git" ["config", "--local", target] ""- if null $ snd' localInfo- then do- globalInfo <- readProcessWithExitCode "git" ["config", "--global", target] ""- case fst' globalInfo of- ExitSuccess -> return $ Just (trim $ snd' globalInfo)- _ -> return Nothing- else return $ Just (trim $ snd' localInfo)- where- fst' (x, _, _) = x- snd' (_, x, _) = x+ localInfo <- maybeReadProcessWithExitCode "git" ["config", "--local", target] ""+ case localInfo of+ Nothing -> return Nothing+ Just (_, localStdout, _) ->+ if null localStdout+ then do+ globalInfo <- maybeReadProcessWithExitCode "git" ["config", "--global", target] ""+ case globalInfo of+ Just (ExitSuccess, globalStdout, _) -> return $ Just (trim globalStdout)+ _ -> return Nothing+ else return $ Just (trim localStdout)
src/Distribution/Client/Init/Types.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TypeApplications #-} -- | -- Module : Distribution.Client.Init.Types@@ -39,7 +41,11 @@ -- * Typeclasses , Interactive (..) , BreakException (..)- , PurePrompt (..)+ , PromptIO+ , runPromptIO+ , Inputs+ , PurePrompt+ , runPrompt , evalPrompt , Severity (..) @@ -63,9 +69,12 @@ import Prelude (read) import Control.Monad.Catch+import Control.Monad.IO.Class+import Control.Monad.Reader import Data.List.NonEmpty (fromList) +import qualified Data.IORef import Distribution.CabalSpecVersion import Distribution.Client.Utils as P import Distribution.Fields.Pretty@@ -282,15 +291,33 @@ -- -------------------------------------------------------------------- -- -- Interactive prompt monad +newtype PromptIO a = PromptIO (ReaderT (Data.IORef.IORef SessionState) IO a)+ deriving (Functor, Applicative, Monad, MonadIO)++sessionState :: PromptIO (Data.IORef.IORef SessionState)+sessionState = PromptIO ask++runPromptIO :: PromptIO a -> IO a+runPromptIO (PromptIO pio) =+ (Data.IORef.newIORef newSessionState) >>= (runReaderT pio)++type Inputs = NonEmpty String+ newtype PurePrompt a = PurePrompt- { _runPrompt- :: NonEmpty String- -> Either BreakException (a, NonEmpty String)+ { runPromptState+ :: (Inputs, SessionState)+ -> Either BreakException (a, (Inputs, SessionState)) } deriving (Functor) -evalPrompt :: PurePrompt a -> NonEmpty String -> a-evalPrompt act s = case _runPrompt act s of+runPrompt :: PurePrompt a -> Inputs -> Either BreakException (a, Inputs)+runPrompt act args =+ fmap+ (\(a, (s, _)) -> (a, s))+ (runPromptState act (args, newSessionState))++evalPrompt :: PurePrompt a -> Inputs -> a+evalPrompt act s = case runPrompt act s of Left e -> error $ show e Right (a, _) -> a @@ -306,7 +333,7 @@ return = pure PurePrompt a >>= k = PurePrompt $ \s -> case a s of Left e -> Left e- Right (a', s') -> _runPrompt (k a') s'+ Right (a', s') -> runPromptState (k a') s' class Monad m => Interactive m where -- input functions@@ -320,6 +347,7 @@ doesFileExist :: FilePath -> m Bool canonicalizePathNoThrow :: FilePath -> m FilePath readProcessWithExitCode :: FilePath -> [String] -> String -> m (ExitCode, String, String)+ maybeReadProcessWithExitCode :: FilePath -> [String] -> String -> m (Maybe (ExitCode, String, String)) getEnvironment :: m [(String, String)] getCurrentYear :: m Integer listFilesInside :: (FilePath -> m Bool) -> FilePath -> m [FilePath]@@ -341,37 +369,63 @@ break :: m Bool throwPrompt :: BreakException -> m a -instance Interactive IO where- getLine = P.getLine- readFile = P.readFile- getCurrentDirectory = P.getCurrentDirectory- getHomeDirectory = P.getHomeDirectory- getDirectoryContents = P.getDirectoryContents- listDirectory = P.listDirectory- doesDirectoryExist = P.doesDirectoryExist- doesFileExist = P.doesFileExist- canonicalizePathNoThrow = P.canonicalizePathNoThrow- readProcessWithExitCode = Process.readProcessWithExitCode- getEnvironment = P.getEnvironment- getCurrentYear = P.getCurrentYear- listFilesInside = P.listFilesInside- listFilesRecursive = P.listFilesRecursive+ -- session state functions+ getLastChosenLanguage :: m (Maybe String)+ setLastChosenLanguage :: (Maybe String) -> m () - putStr = P.putStr- putStrLn = P.putStrLn- createDirectory = P.createDirectory- removeDirectory = P.removeDirectoryRecursive- writeFile = P.writeFile- removeExistingFile = P.removeExistingFile- copyFile = P.copyFile- renameDirectory = P.renameDirectory- hFlush = System.IO.hFlush+newtype SessionState = SessionState+ { lastChosenLanguage :: (Maybe String)+ }++newSessionState :: SessionState+newSessionState = SessionState{lastChosenLanguage = Nothing}++instance Interactive PromptIO where+ getLine = liftIO P.getLine+ readFile = liftIO <$> P.readFile+ getCurrentDirectory = liftIO P.getCurrentDirectory+ getHomeDirectory = liftIO P.getHomeDirectory+ getDirectoryContents = liftIO <$> P.getDirectoryContents+ listDirectory = liftIO <$> P.listDirectory+ doesDirectoryExist = liftIO <$> P.doesDirectoryExist+ doesFileExist = liftIO <$> P.doesFileExist+ canonicalizePathNoThrow = liftIO <$> P.canonicalizePathNoThrow+ readProcessWithExitCode a b c = liftIO $ Process.readProcessWithExitCode a b c+ maybeReadProcessWithExitCode a b c = liftIO $ (Just <$> Process.readProcessWithExitCode a b c) `P.catch` const @_ @IOError (pure Nothing)+ getEnvironment = liftIO P.getEnvironment+ getCurrentYear = liftIO P.getCurrentYear+ listFilesInside test dir = do+ -- test is run within a new env and not the current env+ -- all usages of listFilesInside are pure functions actually+ liftIO $ P.listFilesInside (\f -> liftIO $ runPromptIO (test f)) dir+ listFilesRecursive = liftIO <$> P.listFilesRecursive++ putStr = liftIO <$> P.putStr+ putStrLn = liftIO <$> P.putStrLn+ createDirectory = liftIO <$> P.createDirectory+ removeDirectory = liftIO <$> P.removeDirectoryRecursive+ writeFile a b = liftIO $ P.writeFile a b+ removeExistingFile = liftIO <$> P.removeExistingFile+ copyFile a b = liftIO $ P.copyFile a b+ renameDirectory a b = liftIO $ P.renameDirectory a b+ hFlush = liftIO <$> System.IO.hFlush message q severity msg | q == silent = pure () | otherwise = putStrLn $ "[" ++ displaySeverity severity ++ "] " ++ msg break = return False- throwPrompt = throwM+ throwPrompt = liftIO <$> throwM + getLastChosenLanguage = do+ stateRef <- sessionState+ liftIO $ lastChosenLanguage <$> Data.IORef.readIORef stateRef++ setLastChosenLanguage value = do+ stateRef <- sessionState+ liftIO $+ Data.IORef.modifyIORef+ stateRef+ (\state -> state{lastChosenLanguage = value})+ instance Interactive PurePrompt where getLine = pop readFile !_ = pop@@ -387,6 +441,7 @@ readProcessWithExitCode !_ !_ !_ = do input <- pop return (ExitSuccess, input, "")+ maybeReadProcessWithExitCode a b c = Just <$> readProcessWithExitCode a b c getEnvironment = fmap (map read) popList getCurrentYear = fmap read pop listFilesInside pred' !_ = do@@ -411,13 +466,18 @@ _ -> return () break = return True- throwPrompt (BreakException e) = PurePrompt $ \s ->+ throwPrompt (BreakException e) = PurePrompt $ \(i, _) -> Left $ BreakException- ("Error: " ++ e ++ "\nStacktrace: " ++ show s)+ ("Error: " ++ e ++ "\nStacktrace: " ++ show i) + getLastChosenLanguage = PurePrompt $ \(i, s) ->+ Right (lastChosenLanguage s, (i, s))+ setLastChosenLanguage l = PurePrompt $ \(i, s) ->+ Right ((), (i, s{lastChosenLanguage = l}))+ pop :: PurePrompt String-pop = PurePrompt $ \(p :| ps) -> Right (p, fromList ps)+pop = PurePrompt $ \(i :| is, s) -> Right (i, (fromList is, s)) popAbsolute :: PurePrompt String popAbsolute = do@@ -429,7 +489,7 @@ pop >>= \case "True" -> pure True "False" -> pure False- s -> throwPrompt $ BreakException $ "popBool: " ++ s+ i -> throwPrompt $ BreakException $ "popBool: " ++ i popList :: PurePrompt [String] popList =
src/Distribution/Client/Init/Utils.hs view
@@ -128,7 +128,7 @@ Nothing -> return Nothing Just moduleName -> do let fileExtension = takeExtension f- relativeSourcePath <- makeRelative f <$> getCurrentDirectory+ relativeSourcePath <- makeRelative (normalise f) <$> getCurrentDirectory imports <- retrieveModuleImports f extensions <- retrieveModuleExtensions f
src/Distribution/Client/Install.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} ----------------------------------------------------------------------------- @@ -56,7 +57,6 @@ ( equalFilePath , takeDirectory , (<.>)- , (</>) ) import System.IO ( IOMode (AppendMode)@@ -111,6 +111,7 @@ , InstallFlags (..) , RepoContext (..) , configureCommand+ , filterCommonFlags , filterConfigureFlags , filterTestFlags )@@ -172,8 +173,9 @@ ( Compiler (compilerId) , CompilerId (..) , CompilerInfo (..)- , PackageDB (..)- , PackageDBStack+ , PackageDBCWD+ , PackageDBStackCWD+ , PackageDBX (..) , compilerFlavor , compilerInfo )@@ -193,30 +195,35 @@ import Distribution.Simple.Program (ProgramDb) import Distribution.Simple.Register (defaultRegisterOptions, registerPackage) import Distribution.Simple.Setup- ( BenchmarkFlags+ ( BenchmarkFlags (..) , BuildFlags (..)+ , CommonSetupFlags (..)+ , CopyFlags (..) , HaddockFlags (..)- , TestFlags+ , RegisterFlags (..)+ , TestFlags (..) , buildCommand+ , copyCommonFlags+ , defaultCommonSetupFlags , defaultDistPref , emptyBuildFlags , flagToMaybe , fromFlag , fromFlagOrDefault , haddockCommand+ , maybeToFlag+ , registerCommonFlags+ , setupDistPref+ , setupVerbosity+ , setupWorkingDir+ , testCommonFlags , toFlag ) import qualified Distribution.Simple.Setup as Cabal- ( CopyFlags (..)- , Flag (..)- , RegisterFlags (..)- , TestFlags (..)- , copyCommand- , emptyCopyFlags- , emptyRegisterFlags- , registerCommand- , testCommand+import Distribution.Utils.Path hiding+ ( (<.>) )+ import Distribution.Simple.Utils ( VerboseException , createDirectoryIfMissingVerbose@@ -293,7 +300,7 @@ -- | Installs the packages needed to satisfy a list of dependencies. install :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> Platform@@ -373,7 +380,7 @@ type InstallContext = ( InstalledPackageIndex , SourcePackageDb- , PkgConfigDb+ , Maybe PkgConfigDb , [UserTarget] , [PackageSpecifier UnresolvedSourcePackage] , HttpTransport@@ -384,7 +391,7 @@ -- | Initial arguments given to 'install' or 'makeInstallContext'. type InstallArgs =- ( PackageDBStack+ ( PackageDBStackCWD , RepoContext , Compiler , Platform@@ -559,7 +566,7 @@ -> InstallFlags -> InstalledPackageIndex -> SourcePackageDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> [PackageSpecifier UnresolvedSourcePackage] -> Progress String String SolverInstallPlan planPackages@@ -1217,7 +1224,7 @@ regenerateHaddockIndex :: Verbosity- -> [PackageDB]+ -> [PackageDBCWD] -> Compiler -> Platform -> ProgramDb@@ -1482,7 +1489,7 @@ distPref = fromFlagOrDefault (useDistPref defaultSetupScriptOptions)- (configDistPref configFlags)+ (setupDistPref $ configCommonFlags configFlags) setupScriptOptions index lock rpkg = configureSetupScript@@ -1698,7 +1705,7 @@ :: Verbosity -> PackageIdentifier -> ResolvedPkgLoc- -> FilePath+ -> SymbolicPath Pkg (Dir Dist) -> (Maybe FilePath -> IO BuildOutcome) -> IO BuildOutcome installLocalPackage verbosity pkgid location distPref installPkg =@@ -1733,7 +1740,7 @@ :: Verbosity -> PackageIdentifier -> FilePath- -> FilePath+ -> SymbolicPath Pkg (Dir Dist) -> (Maybe FilePath -> IO BuildOutcome) -> IO BuildOutcome installLocalTarballPackage@@ -1774,9 +1781,9 @@ -- fails even with this workaround. We probably can live with that. maybeRenameDistDir :: FilePath -> IO () maybeRenameDistDir absUnpackedPath = do- let distDirPath = absUnpackedPath </> defaultDistPref- distDirPathTmp = absUnpackedPath </> (defaultDistPref ++ "-tmp")- distDirPathNew = absUnpackedPath </> distPref+ let distDirPath = absUnpackedPath </> getSymbolicPath defaultDistPref+ distDirPathTmp = absUnpackedPath </> (getSymbolicPath defaultDistPref ++ "-tmp")+ distDirPathNew = absUnpackedPath </> getSymbolicPath distPref distDirExists <- doesDirectoryExist distDirPath when ( distDirExists@@ -1854,6 +1861,15 @@ ++ " with the latest revision from the index." writeFileAtomic descFilePath pkgtxt + let mbWorkDir = fmap makeSymbolicPath workingDir+ commonFlags ver =+ (`filterCommonFlags` ver) $+ defaultCommonSetupFlags+ { setupDistPref = setupDistPref $ configCommonFlags configFlags+ , setupVerbosity = toFlag verbosity'+ , setupWorkingDir = maybeToFlag mbWorkDir+ }+ -- Make sure that we pass --libsubdir etc to 'setup configure' (necessary if -- the setup script was compiled against an old version of the Cabal lib). configFlags' <- addDefaultInstallDirs configFlags@@ -1862,9 +1878,34 @@ configureFlags = filterConfigureFlags configFlags'- { configVerbosity = toFlag verbosity'+ { configCommonFlags =+ (configCommonFlags (configFlags'))+ { setupVerbosity = toFlag verbosity'+ } } + buildFlags vers =+ emptyBuildFlags{buildCommonFlags = commonFlags vers}+ shouldHaddock = fromFlag (installDocumentation installFlags)+ haddockFlags' vers =+ haddockFlags{haddockCommonFlags = commonFlags vers}+ testsEnabled =+ fromFlag (configTests configFlags)+ && fromFlagOrDefault False (installRunTests installFlags)+ testFlags' vers =+ (`filterTestFlags` vers) $+ testFlags{testCommonFlags = commonFlags vers}+ copyFlags vers =+ Cabal.emptyCopyFlags+ { Cabal.copyDest = toFlag InstallDirs.NoCopyDest+ , copyCommonFlags = commonFlags vers+ }+ shouldRegister = PackageDescription.hasLibs pkg+ registerFlags vers =+ Cabal.emptyRegisterFlags+ { registerCommonFlags = commonFlags vers+ }+ -- Path to the optional log file. mLogPath <- maybeLogPath @@ -1872,19 +1913,19 @@ -- Configure phase onFailure ConfigureFailed $ do noticeProgress ProgressStarting- setup configureCommand configureFlags mLogPath+ setup configureCommand configCommonFlags (return . configureFlags) mLogPath -- Build phase onFailure BuildFailed $ do noticeProgress ProgressBuilding- setup buildCommand' buildFlags mLogPath+ setup buildCommand' buildCommonFlags (return . buildFlags) mLogPath -- Doc generation phase docsResult <- if shouldHaddock then ( do- setup haddockCommand haddockFlags' mLogPath+ setup haddockCommand haddockCommonFlags (return . haddockFlags') mLogPath return DocsOk ) `catchIO` (\_ -> return DocsFailed)@@ -1894,7 +1935,7 @@ -- Tests phase onFailure TestsFailed $ do when (testsEnabled && PackageDescription.hasTests pkg) $- setup Cabal.testCommand testFlags' mLogPath+ setup Cabal.testCommand testCommonFlags (return . testFlags') mLogPath let testsResult | testsEnabled = TestsOk@@ -1911,11 +1952,14 @@ platform pkg $ do- setup Cabal.copyCommand copyFlags mLogPath+ setup Cabal.copyCommand copyCommonFlags (return . copyFlags) mLogPath -- Capture installed package configuration file, so that -- it can be incorporated into the final InstallPlan- ipkgs <- genPkgConfs mLogPath+ ipkgs <-+ if shouldRegister+ then genPkgConfs registerFlags mLogPath+ else return [] let ipkgs' = case ipkgs of [ipkg] -> [ipkg{Installed.installedUnitId = uid}] _ -> ipkgs@@ -1928,6 +1972,7 @@ verbosity comp progdb+ mbWorkDir packageDBs ipkg' defaultRegisterOptions@@ -1944,38 +1989,6 @@ noticeProgress phase = when isParallelBuild $ progressMessage verbosity phase dispname-- buildFlags _ =- emptyBuildFlags- { buildDistPref = configDistPref configFlags- , buildVerbosity = toFlag verbosity'- }- shouldHaddock = fromFlag (installDocumentation installFlags)- haddockFlags' _ =- haddockFlags- { haddockVerbosity = toFlag verbosity'- , haddockDistPref = configDistPref configFlags- }- testsEnabled =- fromFlag (configTests configFlags)- && fromFlagOrDefault False (installRunTests installFlags)- testFlags' =- filterTestFlags- testFlags- { Cabal.testDistPref = configDistPref configFlags- }- copyFlags _ =- Cabal.emptyCopyFlags- { Cabal.copyDistPref = configDistPref configFlags- , Cabal.copyDest = toFlag InstallDirs.NoCopyDest- , Cabal.copyVerbosity = toFlag verbosity'- }- shouldRegister = PackageDescription.hasLibs pkg- registerFlags _ =- Cabal.emptyRegisterFlags- { Cabal.regDistPref = configDistPref configFlags- , Cabal.regVerbosity = toFlag verbosity'- } verbosity' = maybe verbosity snd useLogFile tempTemplate name = name ++ "-" ++ prettyShow pkgid @@ -2001,30 +2014,32 @@ (configUserInstall configFlags') genPkgConfs- :: Maybe FilePath+ :: (Version -> Cabal.RegisterFlags)+ -> Maybe FilePath -> IO [Installed.InstalledPackageInfo]- genPkgConfs mLogPath =- if shouldRegister- then do- tmp <- getTemporaryDirectory- withTempDirectory verbosity tmp (tempTemplate "pkgConf") $ \dir -> do- let pkgConfDest = dir </> "pkgConf"- registerFlags' version =- (registerFlags version)- { Cabal.regGenPkgConf = toFlag (Just pkgConfDest)- }- setup Cabal.registerCommand registerFlags' mLogPath- is_dir <- doesDirectoryExist pkgConfDest- let notHidden = not . isHidden- isHidden name = "." `isPrefixOf` name- if is_dir- then -- Sort so that each prefix of the package- -- configurations is well formed+ genPkgConfs flags mLogPath = do+ tmp <- getTemporaryDirectory+ withTempDirectory verbosity tmp (tempTemplate "pkgConf") $ \dir -> do+ let pkgConfDest = makeSymbolicPath dir </> makeRelativePathEx "pkgConf"+ registerFlags' version =+ (flags version)+ { Cabal.regGenPkgConf = toFlag (Just pkgConfDest)+ }+ setup+ Cabal.registerCommand+ registerCommonFlags+ (return . registerFlags')+ mLogPath+ is_dir <- doesDirectoryExist (interpretSymbolicPathCWD pkgConfDest)+ let notHidden = not . isHidden+ isHidden name = "." `isPrefixOf` name+ if is_dir+ then -- Sort so that each prefix of the package+ -- configurations is well formed - traverse (readPkgConf pkgConfDest) . sort . filter notHidden- =<< getDirectoryContents pkgConfDest- else fmap (: []) $ readPkgConf "." pkgConfDest- else return []+ traverse (readPkgConf (getSymbolicPath pkgConfDest)) . sort . filter notHidden+ =<< getDirectoryContents (getSymbolicPath pkgConfDest)+ else fmap (: []) $ readPkgConf "." (getSymbolicPath pkgConfDest) readPkgConf :: FilePath@@ -2056,7 +2071,7 @@ when logFileExists $ removeFile logFileName return (Just logFileName) - setup cmd flags mLogPath =+ setup cmd getCommonFlags flags mLogPath = Exception.bracket (traverse (\path -> openFile path AppendMode) mLogPath) (traverse_ hClose)@@ -2065,10 +2080,11 @@ verbosity scriptOptions { useLoggingHandle = logFileHandle- , useWorkingDir = workingDir+ , useWorkingDir = makeSymbolicPath <$> workingDir } (Just pkg) cmd+ getCommonFlags flags (const []) )
src/Distribution/Client/InstallSymlink.hs view
@@ -84,6 +84,7 @@ import System.FilePath ( isAbsolute , joinPath+ , normalise , splitPath , (</>) )@@ -98,7 +99,7 @@ import Distribution.Client.Compat.Directory (createFileLink, getSymbolicLinkTarget, pathIsSymbolicLink) import Distribution.Client.Init.Prompt (promptYesNo)-import Distribution.Client.Init.Types (DefaultPrompt (MandatoryPrompt))+import Distribution.Client.Init.Types (DefaultPrompt (MandatoryPrompt), runPromptIO) import Distribution.Client.Types.OverwritePolicy import qualified Data.ByteString as BS@@ -316,7 +317,7 @@ symlinkBinary inputs@Symlink{publicBindir, privateBindir, publicName, privateName} = do onSymlinkBinary mkLink overwrite (return False) maybeOverwrite inputs where- relativeBindir = makeRelative publicBindir privateBindir+ relativeBindir = makeRelative (normalise publicBindir) privateBindir mkLink :: IO Bool mkLink = True <$ createFileLink (relativeBindir </> privateName) (publicBindir </> publicName)@@ -335,7 +336,7 @@ promptRun :: String -> IO Bool -> IO Bool promptRun s m = do- a <- promptYesNo s MandatoryPrompt+ a <- runPromptIO $ promptYesNo s MandatoryPrompt if a then m else pure a -- | Check a file path of a symlink that we would like to create to see if it
src/Distribution/Client/List.hs view
@@ -43,9 +43,6 @@ import Distribution.Types.UnqualComponentName import Distribution.Simple.Compiler- ( Compiler- , PackageDBStack- ) import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex import Distribution.Simple.Program (ProgramDb)@@ -141,7 +138,7 @@ -- | Return a list of packages matching given search strings. getPkgList :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Maybe (Compiler, ProgramDb) -> ListFlags@@ -213,7 +210,7 @@ -- | Show information about packages. list :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Maybe (Compiler, ProgramDb) -> ListFlags@@ -249,7 +246,7 @@ info :: Verbosity- -> PackageDBStack+ -> PackageDBStackCWD -> RepoContext -> Compiler -> ProgramDb
src/Distribution/Client/Main.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} @@ -24,6 +25,7 @@ ( ActAsSetupFlags (..) , BuildFlags (..) , CheckFlags (..)+ , CommonSetupFlags (..) , ConfigExFlags (..) , ConfigFlags (..) , FetchFlags (..)@@ -49,6 +51,7 @@ , defaultConfigExFlags , defaultInstallFlags , fetchCommand+ , filterCommonFlags , formatCommand , freezeCommand , genBoundsCommand@@ -83,7 +86,6 @@ , RegisterFlags (..) , ReplFlags (..) , TestFlags (..)- , configAbsolutePaths , defaultHaddockFlags , flagToMaybe , fromFlag@@ -181,6 +183,8 @@ , buildable ) +import Distribution.Client.Errors+import Distribution.Compat.ResponseFile import qualified Distribution.Make as Make import Distribution.PackageDescription.PrettyPrint ( writeGenericPackageDescription@@ -202,7 +206,7 @@ , defaultCommandFallback , hiddenCommand )-import Distribution.Simple.Compiler (PackageDBStack)+import Distribution.Simple.Compiler (PackageDBStack, interpretPackageDBStack) import Distribution.Simple.Configure ( ConfigStateFileError (..) , configCompilerAuxEx@@ -237,6 +241,10 @@ ( display ) import qualified Distribution.Types.UnqualComponentName as Make+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Verbosity as Verbosity ( normal )@@ -248,11 +256,8 @@ import Control.Exception (AssertionFailed, assert, try) import Data.Monoid (Any (..))-import Distribution.Client.Errors-import Distribution.Compat.ResponseFile import System.Directory ( doesFileExist- , getCurrentDirectory , withCurrentDirectory ) import System.Environment (getEnvironment, getExecutablePath, getProgName)@@ -427,7 +432,7 @@ , regularCmd CmdPath.pathCommand CmdPath.pathAction , regularCmd genBoundsCommand genBoundsAction , regularCmd CmdOutdated.outdatedCommand CmdOutdated.outdatedAction- , wrapperCmd hscolourCommand hscolourVerbosity hscolourDistPref+ , wrapperCmd hscolourCommand hscolourCommonFlags , hiddenCmd formatCommand formatAction , hiddenCmd actAsSetupCommand actAsSetupAction , hiddenCmd manpageCommand (manpageAction commandSpecs)@@ -460,8 +465,8 @@ , legacyCmd testCommand testAction , legacyCmd benchmarkCommand benchmarkAction , legacyCmd cleanCommand cleanAction- , legacyWrapperCmd copyCommand copyVerbosity copyDistPref- , legacyWrapperCmd registerCommand regVerbosity regDistPref+ , legacyWrapperCmd copyCommand copyCommonFlags+ , legacyWrapperCmd registerCommand registerCommonFlags , legacyCmd reconfigureCommand reconfigureAction ] @@ -489,35 +494,40 @@ wrapperCmd :: Monoid flags => CommandUI flags- -> (flags -> Flag Verbosity)- -> (flags -> Flag String)+ -> (flags -> CommonSetupFlags) -> CommandSpec Action-wrapperCmd ui verbosity distPref =- CommandSpec ui (\ui' -> wrapperAction ui' verbosity distPref) NormalCommand+wrapperCmd ui getCommonFlags =+ CommandSpec ui (\ui' -> wrapperAction ui' getCommonFlags) NormalCommand wrapperAction :: Monoid flags => CommandUI flags- -> (flags -> Flag Verbosity)- -> (flags -> Flag String)+ -> (flags -> CommonSetupFlags) -> Command Action-wrapperAction command verbosityFlag distPrefFlag =+wrapperAction command getCommonFlags = commandAddAction command { commandDefaultFlags = mempty } $ \flags extraArgs globalFlags -> do- let verbosity = fromFlagOrDefault normal (verbosityFlag flags)+ let common = getCommonFlags flags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common+ mbWorkDir = flagToMaybe $ setupWorkingDir common load <- try (loadConfigOrSandboxConfig verbosity globalFlags) let config = either (\(SomeException _) -> mempty) id load- distPref <- findSavedDistPref config (distPrefFlag flags)- let setupScriptOptions = defaultSetupScriptOptions{useDistPref = distPref}+ distPref <- findSavedDistPref config (setupDistPref common)+ let setupScriptOptions =+ defaultSetupScriptOptions+ { useDistPref = distPref+ , useWorkingDir = mbWorkDir+ } setupWrapper verbosity setupScriptOptions Nothing command- (const flags)+ getCommonFlags+ (const (return flags)) (const extraArgs) configureAction@@ -525,11 +535,12 @@ -> [String] -> Action configureAction (configFlags, configExFlags) extraArgs globalFlags = do- let verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ let common = configCommonFlags configFlags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common config <- updateInstallDirs (configUserInstall configFlags) <$> loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (configDistPref configFlags)+ distPref <- getSymbolicPath <$> findSavedDistPref config (setupDistPref common) nixInstantiate verbosity distPref True globalFlags config nixShell verbosity distPref globalFlags config $ do let configFlags' = savedConfigureFlags config `mappend` configFlags@@ -549,7 +560,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> configure verbosity- packageDBs+ (interpretPackageDBStack Nothing packageDBs) repoContext comp platform@@ -563,11 +574,12 @@ -> [String] -> Action reconfigureAction flags@(configFlags, _) _ globalFlags = do- let verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ let common = configCommonFlags configFlags+ verbosity = fromFlagOrDefault normal (setupVerbosity common) config <- updateInstallDirs (configUserInstall configFlags) <$> loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (configDistPref configFlags)+ distPref <- findSavedDistPref config (setupDistPref common) let checkFlags = Check $ \_ saved -> do let flags' = saved <> flags unless (saved == flags') $ info verbosity message@@ -579,7 +591,7 @@ message = "flags changed: " ++ unwords (commandShowOptions configureExCommand flags)- nixInstantiate verbosity distPref True globalFlags config+ nixInstantiate verbosity (getSymbolicPath distPref) True globalFlags config _ <- reconfigure configureAction@@ -594,9 +606,10 @@ buildAction :: BuildFlags -> [String] -> Action buildAction buildFlags extraArgs globalFlags = do- let verbosity = fromFlagOrDefault normal (buildVerbosity buildFlags)+ let common = buildCommonFlags buildFlags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (buildDistPref buildFlags)+ distPref <- findSavedDistPref config (setupDistPref common) -- Calls 'configureAction' to do the real work, so nothing special has to be -- done to support sandboxes. config' <-@@ -609,36 +622,49 @@ [] globalFlags config- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do build verbosity config' distPref buildFlags extraArgs -- | Actually do the work of building the package. This is separate from -- 'buildAction' so that 'testAction' and 'benchmarkAction' do not invoke -- 'reconfigure' twice.-build :: Verbosity -> SavedConfig -> FilePath -> BuildFlags -> [String] -> IO ()+build :: Verbosity -> SavedConfig -> SymbolicPath Pkg (Dir Dist) -> BuildFlags -> [String] -> IO () build verbosity config distPref buildFlags extraArgs = setupWrapper verbosity setupOptions Nothing (Cabal.buildCommand progDb)- mkBuildFlags+ buildCommonFlags+ (return . mkBuildFlags) (const extraArgs) where progDb = defaultProgramDb setupOptions = defaultSetupScriptOptions{useDistPref = distPref} mkBuildFlags version = filterBuildFlags version config buildFlags'+ commonFlags = buildCommonFlags buildFlags buildFlags' = buildFlags- { buildVerbosity = toFlag verbosity- , buildDistPref = toFlag distPref+ { buildCommonFlags =+ commonFlags+ { setupVerbosity = toFlag verbosity+ , setupDistPref = toFlag distPref+ } } -- | Make sure that we don't pass new flags to setup scripts compiled against -- old versions of Cabal. filterBuildFlags :: Version -> SavedConfig -> BuildFlags -> BuildFlags-filterBuildFlags version config buildFlags+filterBuildFlags version config buildFlags =+ let flags' = filterBuildFlags' version config buildFlags+ in flags'+ { buildCommonFlags =+ filterCommonFlags (buildCommonFlags flags') version+ }++filterBuildFlags' :: Version -> SavedConfig -> BuildFlags -> BuildFlags+filterBuildFlags' version config buildFlags | version >= mkVersion [1, 19, 1] = buildFlags_latest -- Cabal < 1.19.1 doesn't support 'build -j'. | otherwise = buildFlags_pre_1_19_1@@ -659,11 +685,11 @@ replAction :: ReplFlags -> [String] -> Action replAction replFlags extraArgs globalFlags = do- let verbosity = fromFlagOrDefault normal (replVerbosity replFlags)+ let common = replCommonFlags replFlags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (replDistPref replFlags)- cwd <- getCurrentDirectory- pkgDesc <- findPackageDesc cwd+ distPref <- findSavedDistPref config (setupDistPref common)+ pkgDesc <- findPackageDesc Nothing let -- There is a .cabal file in the current directory: start a REPL and load -- the project's modules.@@ -686,14 +712,25 @@ { useCabalVersion = orLaterVersion $ mkVersion [1, 18, 0] , useDistPref = distPref }+ commonFlags = replCommonFlags replFlags replFlags' = replFlags- { replVerbosity = toFlag verbosity- , replDistPref = toFlag distPref+ { replCommonFlags =+ commonFlags+ { setupVerbosity = toFlag verbosity+ , setupDistPref = toFlag distPref+ } } - nixShell verbosity distPref globalFlags config $- setupWrapper verbosity setupOptions Nothing (Cabal.replCommand progDb) (const replFlags') (const extraArgs)+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $+ setupWrapper+ verbosity+ setupOptions+ Nothing+ (Cabal.replCommand progDb)+ Cabal.replCommonFlags+ (const (return replFlags'))+ (const extraArgs) -- No .cabal file in the current directory: just start the REPL (possibly -- using the sandbox package DB).@@ -706,7 +743,7 @@ (replProgramPaths replFlags) (replProgramArgs replFlags) programDb- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do startInterpreter verbosity programDb'@@ -728,16 +765,18 @@ -> Action installAction (configFlags, _, installFlags, _, _, _) _ globalFlags | fromFlagOrDefault False (installOnly installFlags) = do- let verb = fromFlagOrDefault normal (configVerbosity configFlags)+ let common = configCommonFlags configFlags+ verb = fromFlagOrDefault normal (setupVerbosity common) config <- loadConfigOrSandboxConfig verb globalFlags- dist <- findSavedDistPref config (configDistPref configFlags)+ dist <- findSavedDistPref config (setupDistPref common) let setupOpts = defaultSetupScriptOptions{useDistPref = dist} setupWrapper verb setupOpts Nothing installCommand- (const (mempty, mempty, mempty, mempty, mempty, mempty))+ (const common)+ (const (return (mempty, mempty, mempty, mempty, mempty, mempty))) (const []) installAction ( configFlags@@ -749,12 +788,13 @@ ) extraArgs globalFlags = do- let verb = fromFlagOrDefault normal (configVerbosity configFlags)+ let common = configCommonFlags configFlags+ verb = fromFlagOrDefault normal $ setupVerbosity common config <- updateInstallDirs (configUserInstall configFlags) <$> loadConfigOrSandboxConfig verb globalFlags - dist <- findSavedDistPref config (configDistPref configFlags)+ dist <- findSavedDistPref config $ setupDistPref common do targets <- readUserTargets verb extraArgs@@ -762,7 +802,12 @@ let configFlags' = maybeForceTests installFlags' $ savedConfigureFlags config- `mappend` configFlags{configDistPref = toFlag dist}+ `mappend` configFlags+ { configCommonFlags =+ (configCommonFlags configFlags)+ { setupDistPref = toFlag dist+ }+ } configExFlags' = defaultConfigExFlags `mappend` savedConfigureExFlags config@@ -774,15 +819,30 @@ haddockFlags' = defaultHaddockFlags `mappend` savedHaddockFlags config- `mappend` haddockFlags{haddockDistPref = toFlag dist}+ `mappend` haddockFlags+ { haddockCommonFlags =+ (haddockCommonFlags haddockFlags)+ { setupDistPref = toFlag dist+ }+ } testFlags' = Cabal.defaultTestFlags `mappend` savedTestFlags config- `mappend` testFlags{testDistPref = toFlag dist}+ `mappend` testFlags+ { testCommonFlags =+ (testCommonFlags testFlags)+ { setupDistPref = toFlag dist+ }+ } benchmarkFlags' = Cabal.defaultBenchmarkFlags `mappend` savedBenchmarkFlags config- `mappend` benchmarkFlags{benchmarkDistPref = toFlag dist}+ `mappend` benchmarkFlags+ { benchmarkCommonFlags =+ (benchmarkCommonFlags benchmarkFlags)+ { setupDistPref = toFlag dist+ }+ } globalFlags' = savedGlobalFlags config `mappend` globalFlags (comp, platform, progdb) <- configCompilerAux' configFlags' @@ -790,18 +850,16 @@ -- future. progdb' <- configureAllKnownPrograms verb progdb - configFlags'' <- configAbsolutePaths configFlags'- withRepoContext verb globalFlags' $ \repoContext -> install verb- (configPackageDB' configFlags'')+ (interpretPackageDBStack Nothing (configPackageDB' configFlags')) repoContext comp platform progdb' globalFlags'- configFlags''+ configFlags' configExFlags' installFlags' haddockFlags'@@ -821,12 +879,15 @@ -> GlobalFlags -> IO () testAction (buildFlags, testFlags) extraArgs globalFlags = do- let verbosity = fromFlagOrDefault normal (buildVerbosity buildFlags)+ let verbosity = fromFlagOrDefault normal (setupVerbosity $ buildCommonFlags buildFlags) config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (testDistPref testFlags)+ distPref <- findSavedDistPref config (setupDistPref $ testCommonFlags testFlags) let buildFlags' = buildFlags- { buildVerbosity = testVerbosity testFlags+ { buildCommonFlags =+ (buildCommonFlags buildFlags)+ { setupVerbosity = setupVerbosity $ testCommonFlags testFlags+ } } checkFlags = Check $ \_ flags@(configFlags, configExFlags) -> if fromFlagOrDefault False (configTests configFlags)@@ -849,14 +910,20 @@ [] globalFlags config- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do let setupOptions = defaultSetupScriptOptions{useDistPref = distPref}- testFlags' = testFlags{testDistPref = toFlag distPref}+ testFlags' =+ testFlags+ { testCommonFlags =+ (testCommonFlags testFlags){setupDistPref = toFlag distPref}+ }+ mbWorkDir = flagToMaybe $ testWorkingDir testFlags -- The package was just configured, so the LBI must be available. names <- componentNamesFromLBI verbosity+ mbWorkDir distPref "test suites" (\c -> case c of LBI.CTest{} -> True; _ -> False)@@ -870,7 +937,14 @@ | otherwise = extraArgs build verbosity config distPref buildFlags' extraArgs'- setupWrapper verbosity setupOptions Nothing Cabal.testCommand (const testFlags') (const extraArgs')+ setupWrapper+ verbosity+ setupOptions+ Nothing+ Cabal.testCommand+ Cabal.testCommonFlags+ (const (return testFlags'))+ (const extraArgs') data ComponentNames = ComponentNamesUnknown@@ -879,12 +953,14 @@ -- | Return the names of all buildable components matching a given predicate. componentNamesFromLBI :: Verbosity- -> FilePath+ -> Maybe (SymbolicPath CWD (Dir Pkg))+ -- ^ working directory+ -> SymbolicPath Pkg (Dir Dist) -> String -> (LBI.Component -> Bool) -> IO ComponentNames-componentNamesFromLBI verbosity distPref targetsDescr compPred = do- eLBI <- tryGetPersistBuildConfig distPref+componentNamesFromLBI verbosity mbWorkDir distPref targetsDescr compPred = do+ eLBI <- tryGetPersistBuildConfig mbWorkDir distPref case eLBI of Left err -> case err of -- Note: the build config could have been generated by a custom setup@@ -920,13 +996,16 @@ let verbosity = fromFlagOrDefault normal- (buildVerbosity buildFlags)+ (setupVerbosity $ buildCommonFlags buildFlags) config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (benchmarkDistPref benchmarkFlags)+ distPref <- findSavedDistPref config (setupDistPref $ benchmarkCommonFlags benchmarkFlags) let buildFlags' = buildFlags- { buildVerbosity = benchmarkVerbosity benchmarkFlags+ { buildCommonFlags =+ (buildCommonFlags buildFlags)+ { setupVerbosity = setupVerbosity $ benchmarkCommonFlags benchmarkFlags+ } } let checkFlags = Check $ \_ flags@(configFlags, configExFlags) ->@@ -950,14 +1029,22 @@ [] globalFlags config- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do let setupOptions = defaultSetupScriptOptions{useDistPref = distPref}- benchmarkFlags' = benchmarkFlags{benchmarkDistPref = toFlag distPref}+ benchmarkFlags' =+ benchmarkFlags+ { benchmarkCommonFlags =+ (benchmarkCommonFlags benchmarkFlags)+ { setupDistPref = toFlag distPref+ }+ }+ mbWorkDir = flagToMaybe $ benchmarkWorkingDir benchmarkFlags -- The package was just configured, so the LBI must be available. names <- componentNamesFromLBI verbosity+ mbWorkDir distPref "benchmarks" (\c -> case c of LBI.CBench{} -> True; _ -> False)@@ -971,13 +1058,21 @@ | otherwise = extraArgs build verbosity config' distPref buildFlags' extraArgs'- setupWrapper verbosity setupOptions Nothing Cabal.benchmarkCommand (const benchmarkFlags') (const extraArgs')+ setupWrapper+ verbosity+ setupOptions+ Nothing+ Cabal.benchmarkCommand+ Cabal.benchmarkCommonFlags+ (const (return benchmarkFlags'))+ (const extraArgs') haddockAction :: HaddockFlags -> [String] -> Action haddockAction haddockFlags extraArgs globalFlags = do- let verbosity = fromFlag (haddockVerbosity haddockFlags)+ let common = haddockCommonFlags haddockFlags+ verbosity = fromFlag $ setupVerbosity common config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (haddockDistPref haddockFlags)+ distPref <- findSavedDistPref config (setupDistPref common) config' <- reconfigure configureAction@@ -988,11 +1083,17 @@ [] globalFlags config- nixShell verbosity distPref globalFlags config $ do+ let mbWorkDir = flagToMaybe $ setupWorkingDir common+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do let haddockFlags' = defaultHaddockFlags `mappend` savedHaddockFlags config'- `mappend` haddockFlags{haddockDistPref = toFlag distPref}+ `mappend` haddockFlags+ { haddockCommonFlags =+ (haddockCommonFlags haddockFlags)+ { setupDistPref = toFlag distPref+ }+ } setupScriptOptions = defaultSetupScriptOptions { useDistPref = distPref@@ -1002,36 +1103,44 @@ setupScriptOptions Nothing haddockCommand- (const haddockFlags')+ haddockCommonFlags+ (const (return haddockFlags')) (const extraArgs) when (haddockForHackage haddockFlags == Flag ForHackage) $ do- pkg <- fmap LBI.localPkgDescr (getPersistBuildConfig distPref)- let dest = distPref </> name <.> "tar.gz"+ pkg <- fmap LBI.localPkgDescr (getPersistBuildConfig mbWorkDir distPref)+ let dest = getSymbolicPath distPref </> name <.> "tar.gz" name = display (packageId pkg) ++ "-docs"- docDir = distPref </> "doc" </> "html"+ docDir = getSymbolicPath distPref </> "doc" </> "html" createTarGzFile dest docDir name notice verbosity $ "Documentation tarball created: " ++ dest cleanAction :: CleanFlags -> [String] -> Action cleanAction cleanFlags extraArgs globalFlags = do+ let common = cleanCommonFlags cleanFlags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common load <- try (loadConfigOrSandboxConfig verbosity globalFlags) let config = either (\(SomeException _) -> mempty) id load- distPref <- findSavedDistPref config (cleanDistPref cleanFlags)+ distPref <- findSavedDistPref config $ setupDistPref common let setupScriptOptions = defaultSetupScriptOptions { useDistPref = distPref , useWin32CleanHack = True }- cleanFlags' = cleanFlags{cleanDistPref = toFlag distPref}+ cleanFlags' =+ cleanFlags+ { cleanCommonFlags =+ (cleanCommonFlags cleanFlags)+ { setupDistPref = toFlag distPref+ }+ } setupWrapper verbosity setupScriptOptions Nothing cleanCommand- (const cleanFlags')+ cleanCommonFlags+ (const (return cleanFlags')) (const extraArgs)- where- verbosity = fromFlagOrDefault normal (cleanVerbosity cleanFlags) listAction :: ListFlags -> [String] -> Action listAction listFlags extraArgs globalFlags = do@@ -1055,7 +1164,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> List.list verbosity- (configPackageDB' configFlags)+ (interpretPackageDBStack Nothing (configPackageDB' configFlags)) repoContext compProgdb listFlags@@ -1078,7 +1187,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> List.info verbosity- (configPackageDB' configFlags)+ (interpretPackageDBStack Nothing (configPackageDB' configFlags)) repoContext comp progdb@@ -1097,7 +1206,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> fetch verbosity- (configPackageDB' configFlags)+ (interpretPackageDBStack Nothing (configPackageDB' configFlags)) repoContext comp platform@@ -1111,7 +1220,7 @@ let verbosity = fromFlag (freezeVerbosity freezeFlags) config <- loadConfigOrSandboxConfig verbosity globalFlags distPref <- findSavedDistPref config NoFlag- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do let configFlags = savedConfigureFlags config globalFlags' = savedGlobalFlags config `mappend` globalFlags (comp, platform, progdb) <- configCompilerAux' configFlags@@ -1119,7 +1228,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> freeze verbosity- (configPackageDB' configFlags)+ (interpretPackageDBStack Nothing (configPackageDB' configFlags)) repoContext comp platform@@ -1132,7 +1241,7 @@ let verbosity = fromFlag (freezeVerbosity freezeFlags) config <- loadConfigOrSandboxConfig verbosity globalFlags distPref <- findSavedDistPref config NoFlag- nixShell verbosity distPref globalFlags config $ do+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do let configFlags = savedConfigureFlags config globalFlags' = savedGlobalFlags config `mappend` globalFlags (comp, platform, progdb) <- configCompilerAux' configFlags@@ -1140,7 +1249,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> genBounds verbosity- (configPackageDB' configFlags)+ (interpretPackageDBStack Nothing (configPackageDB' configFlags)) repoContext comp platform@@ -1217,8 +1326,9 @@ [] globalFlags distPref <- findSavedDistPref config NoFlag- pkg <- fmap LBI.localPkgDescr (getPersistBuildConfig distPref)- return $ distPref </> display (packageId pkg) ++ "-docs" <.> "tar.gz"+ let mbWorkDir = flagToMaybe $ configWorkingDir $ savedConfigureFlags config+ pkg <- fmap LBI.localPkgDescr (getPersistBuildConfig mbWorkDir distPref)+ return $ getSymbolicPath distPref </> display (packageId pkg) ++ "-docs" <.> "tar.gz" checkAction :: CheckFlags -> [String] -> Action checkAction checkFlags extraArgs _globalFlags = do@@ -1234,13 +1344,11 @@ formatAction verbosityFlag extraArgs _globalFlags = do let verbosity = fromFlag verbosityFlag path <- case extraArgs of- [] -> do- cwd <- getCurrentDirectory- tryFindPackageDesc verbosity cwd- (p : _) -> return p- pkgDesc <- readGenericPackageDescription verbosity path+ [] -> relativeSymbolicPath <$> tryFindPackageDesc verbosity Nothing+ (p : _) -> return $ makeSymbolicPath p+ pkgDesc <- readGenericPackageDescription verbosity Nothing path -- Uses 'writeFileAtomic' under the hood.- writeGenericPackageDescription path pkgDesc+ writeGenericPackageDescription (getSymbolicPath path) pkgDesc reportAction :: ReportFlags -> [String] -> Action reportAction reportFlags extraArgs globalFlags = do@@ -1262,9 +1370,10 @@ runAction :: BuildFlags -> [String] -> Action runAction buildFlags extraArgs globalFlags = do- let verbosity = fromFlagOrDefault normal (buildVerbosity buildFlags)+ let common = buildCommonFlags buildFlags+ verbosity = fromFlagOrDefault normal $ setupVerbosity common config <- loadConfigOrSandboxConfig verbosity globalFlags- distPref <- findSavedDistPref config (buildDistPref buildFlags)+ distPref <- findSavedDistPref config $ setupDistPref common config' <- reconfigure configureAction@@ -1275,8 +1384,9 @@ [] globalFlags config- nixShell verbosity distPref globalFlags config $ do- lbi <- getPersistBuildConfig distPref+ let mbWorkDir = flagToMaybe $ setupWorkingDir common+ nixShell verbosity (getSymbolicPath distPref) globalFlags config $ do+ lbi <- getPersistBuildConfig mbWorkDir distPref (exe, exeArgs) <- splitRunArgs verbosity lbi extraArgs build verbosity config' distPref buildFlags ["exe:" ++ display (exeName exe)]@@ -1323,7 +1433,7 @@ withRepoContext verbosity globalFlags' $ \repoContext -> initCmd verbosity- (configPackageDB' confFlags')+ (interpretPackageDBStack Nothing (configPackageDB' confFlags')) repoContext comp progdb@@ -1360,10 +1470,11 @@ in case bt of Simple -> Simple.defaultMainArgs args Configure ->- Simple.defaultMainWithHooksArgs- Simple.autoconfUserHooks+ Simple.defaultMainWithSetupHooksArgs+ Simple.autoconfSetupHooks args Make -> Make.defaultMainArgs args+ Hooks -> error "actAsSetupAction Hooks" Custom -> error "actAsSetupAction Custom" manpageAction :: [CommandSpec action] -> ManpageFlags -> [String] -> Action
src/Distribution/Client/NixStyleOptions.hs view
@@ -8,13 +8,19 @@ ( NixStyleFlags (..) , nixStyleOptions , defaultNixStyleFlags+ , updNixStyleCommonSetupFlags ) where import Distribution.Client.Compat.Prelude import Prelude () import Distribution.Simple.Command (OptionField (..), ShowOrParseArgs)-import Distribution.Simple.Setup (BenchmarkFlags, HaddockFlags, TestFlags)+import Distribution.Simple.Setup+ ( BenchmarkFlags (benchmarkCommonFlags)+ , CommonSetupFlags (..)+ , HaddockFlags (..)+ , TestFlags (testCommonFlags)+ ) import Distribution.Solver.Types.ConstraintSource (ConstraintSource (..)) import Distribution.Client.ProjectFlags@@ -125,4 +131,28 @@ , benchmarkFlags = mempty , projectFlags = defaultProjectFlags , extraFlags = x+ }++updNixStyleCommonSetupFlags+ :: (CommonSetupFlags -> CommonSetupFlags)+ -> NixStyleFlags a+ -> NixStyleFlags a+updNixStyleCommonSetupFlags setFlag nixFlags =+ nixFlags+ { configFlags =+ let flags = configFlags nixFlags+ common = configCommonFlags flags+ in flags{configCommonFlags = setFlag common}+ , haddockFlags =+ let flags = haddockFlags nixFlags+ common = haddockCommonFlags flags+ in flags{haddockCommonFlags = setFlag common}+ , testFlags =+ let flags = testFlags nixFlags+ common = testCommonFlags flags+ in flags{testCommonFlags = setFlag common}+ , benchmarkFlags =+ let flags = benchmarkFlags nixFlags+ common = benchmarkCommonFlags flags+ in flags{benchmarkCommonFlags = setFlag common} }
src/Distribution/Client/PackageHash.hs view
@@ -44,7 +44,7 @@ , CompilerId , DebugInfoLevel (..) , OptimisationLevel (..)- , PackageDB+ , PackageDBCWD , ProfDetailLevel (..) , showProfDetailLevel )@@ -221,7 +221,7 @@ , pkgHashExtraIncludeDirs :: [FilePath] , pkgHashProgPrefix :: Maybe PathTemplate , pkgHashProgSuffix :: Maybe PathTemplate- , pkgHashPackageDbs :: [Maybe PackageDB]+ , pkgHashPackageDbs :: [Maybe PackageDBCWD] , -- Haddock options pkgHashDocumentation :: Bool , pkgHashHaddockHoogle :: Bool@@ -238,8 +238,9 @@ , pkgHashHaddockContents :: Maybe PathTemplate , pkgHashHaddockIndex :: Maybe PathTemplate , pkgHashHaddockBaseUrl :: Maybe String- , pkgHashHaddockLib :: Maybe String+ , pkgHashHaddockResourcesDir :: Maybe String , pkgHashHaddockOutputDir :: Maybe FilePath+ , pkgHashHaddockUseUnicode :: Bool -- TODO: [required eventually] pkgHashToolsVersions ? -- TODO: [required eventually] pkgHashToolsExtraOptions ? }@@ -347,8 +348,9 @@ , opt "haddock-contents-location" Nothing (maybe "" fromPathTemplate) pkgHashHaddockContents , opt "haddock-index-location" Nothing (maybe "" fromPathTemplate) pkgHashHaddockIndex , opt "haddock-base-url" Nothing (fromMaybe "") pkgHashHaddockBaseUrl- , opt "haddock-lib" Nothing (fromMaybe "") pkgHashHaddockLib+ , opt "haddock-resources-dir" Nothing (fromMaybe "") pkgHashHaddockResourcesDir , opt "haddock-output-dir" Nothing (fromMaybe "") pkgHashHaddockOutputDir+ , opt "haddock-use-unicode" False prettyShow pkgHashHaddockUseUnicode ] ++ Map.foldrWithKey (\prog args acc -> opt (prog ++ "-options") [] unwords args : acc) [] pkgHashProgramArgs where
src/Distribution/Client/ProjectBuilding.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -71,15 +72,15 @@ import Distribution.Package import Distribution.Simple.Compiler- ( Compiler- , PackageDB (..)- , jsemSupported- ) import Distribution.Simple.Program import qualified Distribution.Simple.Register as Cabal import Distribution.Compat.Graph (IsNode (..)) import Distribution.Simple.Utils+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Version import qualified Data.Map as Map@@ -89,7 +90,7 @@ import Control.Exception (assert, bracket, handle) import System.Directory (doesDirectoryExist, doesFileExist, renameDirectory)-import System.FilePath (makeRelative, takeDirectory, (<.>), (</>))+import System.FilePath (makeRelative, normalise, takeDirectory, (<.>), (</>)) import System.Semaphore (SemaphoreName (..)) import Distribution.Client.Errors@@ -473,7 +474,7 @@ :: Verbosity -> Compiler -> ProgramDb- -> PackageDB+ -> PackageDBCWD -> IO () createPackageDBIfMissing verbosity@@ -533,7 +534,7 @@ case pkgBuildStatus of BuildStatusDownload -> downloadPhase BuildStatusUnpack tarball -> unpackTarballPhase tarball- BuildStatusRebuild srcdir status -> rebuildPhase status srcdir+ BuildStatusRebuild srcdir status -> rebuildPhase status (makeSymbolicPath srcdir) -- TODO: perhaps re-nest the types to make these impossible BuildStatusPreExisting{} -> unexpectedState BuildStatusInstalled{} -> unexpectedState@@ -570,7 +571,7 @@ -- 'BuildInplaceOnly' style packages. 'BuildAndInstall' style packages -- would only start from download or unpack phases. --- rebuildPhase :: BuildStatusRebuild -> FilePath -> IO BuildResult+ rebuildPhase :: BuildStatusRebuild -> SymbolicPath CWD (Dir Pkg) -> IO BuildResult rebuildPhase buildStatus srcdir = assert (isInplaceBuildStyle $ elabBuildStyle pkg)@@ -579,11 +580,13 @@ srcdir builddir where+ distdir = distBuildDirectory (elabDistDirParams sharedPackageConfig pkg) builddir =- distBuildDirectory- (elabDistDirParams sharedPackageConfig pkg)+ makeSymbolicPath $+ makeRelative (normalise $ getSymbolicPath srcdir) distdir+ -- TODO: [nice to have] ^^ do this relative stuff better - buildAndInstall :: FilePath -> FilePath -> IO BuildResult+ buildAndInstall :: SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult buildAndInstall srcdir builddir = buildAndInstallUnpackedPackage verbosity@@ -597,12 +600,9 @@ plan rpkg srcdir- builddir'- where- builddir' = makeRelative srcdir builddir- -- TODO: [nice to have] ^^ do this relative stuff better+ builddir - buildInplace :: BuildStatusRebuild -> FilePath -> FilePath -> IO BuildResult+ buildInplace :: BuildStatusRebuild -> SymbolicPath CWD (Dir Pkg) -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult buildInplace buildStatus srcdir builddir = -- TODO: [nice to have] use a relative build dir rather than absolute buildInplaceUnpackedPackage@@ -698,8 +698,8 @@ -> DistDirParams -> BuildStyle -> Maybe CabalFileText- -> ( FilePath -- Source directory- -> FilePath -- Build directory+ -> ( SymbolicPath CWD (Dir Pkg) -- Source directory+ -> SymbolicPath Pkg (Dir Dist) -- Build directory -> IO a ) -> IO a@@ -723,15 +723,15 @@ -- this way we avoid breaking those packages BuildAndInstall -> let tmpdir = distTempDirectory+ builddir = relativeSymbolicPath $ makeRelativePathEx "dist" in withTempDirectory verbosity tmpdir "src" $ \unpackdir -> do+ let srcdir = makeSymbolicPath $ unpackdir </> prettyShow pkgid unpackPackageTarball verbosity tarball unpackdir pkgid pkgTextOverride- let srcdir = unpackdir </> prettyShow pkgid- builddir = srcdir </> "dist" buildPkg srcdir builddir -- In this case we make sure the tarball has been unpacked to the@@ -740,10 +740,14 @@ BuildInplaceOnly{} -> do let srcrootdir = distUnpackedSrcRootDirectory srcdir = distUnpackedSrcDirectory pkgid- builddir = distBuildDirectory dparams+ builddir =+ makeSymbolicPath $+ makeRelative (normalise srcdir) $+ distBuildDirectory dparams+ -- TODO: [nice to have] ^^ do this relative stuff better+ exists <- doesDirectoryExist srcdir -- TODO: [nice to have] use a proper file monitor rather -- than this dir exists test- exists <- doesDirectoryExist srcdir unless exists $ do createDirectoryIfMissingVerbose verbosity True srcrootdir unpackPackageTarball@@ -758,7 +762,7 @@ srcrootdir pkgid dparams- buildPkg srcdir builddir+ buildPkg (makeSymbolicPath srcdir) builddir unpackPackageTarball :: Verbosity
src/Distribution/Client/ProjectBuilding/PackageFileMonitor.hs view
@@ -26,7 +26,7 @@ ) import qualified Data.Set as Set-import Distribution.Client.Init.Types (removeExistingFile)+import Distribution.Client.Init.Types (removeExistingFile, runPromptIO) ----------------------------- -- Package change detection@@ -291,4 +291,4 @@ invalidatePackageRegFileMonitor :: PackageFileMonitor -> IO () invalidatePackageRegFileMonitor PackageFileMonitor{pkgFileMonitorReg} =- removeExistingFile (fileMonitorCacheFile pkgFileMonitorReg)+ runPromptIO $ removeExistingFile (fileMonitorCacheFile pkgFileMonitorReg)
src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-}@@ -42,7 +43,9 @@ import Distribution.Client.FileMonitor import Distribution.Client.JobControl import Distribution.Client.Setup- ( filterConfigureFlags+ ( CommonSetupFlags+ , filterCommonFlags+ , filterConfigureFlags , filterHaddockArgs , filterHaddockFlags , filterTestFlags@@ -70,7 +73,8 @@ import Distribution.Simple.BuildPaths (haddockDirName) import Distribution.Simple.Command (CommandUI) import Distribution.Simple.Compiler- ( PackageDBStack+ ( PackageDBStackCWD+ , coercePackageDBStack ) import qualified Distribution.Simple.InstallDirs as InstallDirs import Distribution.Simple.LocalBuildInfo@@ -85,6 +89,10 @@ import Distribution.Simple.Utils import Distribution.System (Platform (..))+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Version import qualified Data.ByteString as BS@@ -126,7 +134,7 @@ | PBInstallPhase { runCopy :: FilePath -> IO () , runRegister- :: PackageDBStack+ :: PackageDBStackCWD -> Cabal.RegisterOptions -> IO InstalledPackageInfo }@@ -151,9 +159,9 @@ -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage- -> FilePath- -> FilePath- -> Maybe (FilePath)+ -> SymbolicPath CWD (Dir Pkg)+ -> SymbolicPath Pkg (Dir Dist)+ -> Maybe FilePath -- ^ The path to an /initialized/ log file -> (PackageBuildingPhase -> IO ()) -> IO ()@@ -161,7 +169,7 @@ verbosity distDirLayout@DistDirLayout{distTempDirectory} maybe_semaphore- BuildTimeSettings{buildSettingNumJobs}+ buildTimeSettings@BuildTimeSettings{buildSettingNumJobs} registerLock cacheLock pkgshared@ElaboratedSharedConfig@@ -178,27 +186,27 @@ delegate $ PBConfigurePhase $ annotateFailure mlogFile ConfigureFailed $- setup configureCommand configureFlags configureArgs+ setup configureCommand Cabal.configCommonFlags configureFlags configureArgs -- Build phase delegate $ PBBuildPhase $ annotateFailure mlogFile BuildFailed $ do- setup buildCommand buildFlags buildArgs+ setup buildCommand Cabal.buildCommonFlags (return . buildFlags) buildArgs -- Haddock phase whenHaddock $ delegate $ PBHaddockPhase $ annotateFailure mlogFile HaddocksFailed $ do- setup haddockCommand haddockFlags haddockArgs+ setup haddockCommand Cabal.haddockCommonFlags (return . haddockFlags) haddockArgs -- Install phase delegate $ PBInstallPhase { runCopy = \destdir -> annotateFailure mlogFile InstallFailed $- setup Cabal.copyCommand (copyFlags destdir) copyArgs+ setup Cabal.copyCommand Cabal.copyCommonFlags (return . copyFlags destdir) copyArgs , runRegister = \pkgDBStack registerOpts -> annotateFailure mlogFile InstallFailed $ do -- We register ourselves rather than via Setup.hs. We need to@@ -211,7 +219,8 @@ verbosity compiler progdb- pkgDBStack+ Nothing+ (coercePackageDBStack pkgDBStack) ipkg registerOpts return ipkg@@ -222,21 +231,21 @@ delegate $ PBTestPhase $ annotateFailure mlogFile TestsFailed $- setup testCommand testFlags testArgs+ setup testCommand Cabal.testCommonFlags (return . testFlags) testArgs -- Bench phase whenBench $ delegate $ PBBenchPhase $ annotateFailure mlogFile BenchFailed $- setup benchCommand benchFlags benchArgs+ setup benchCommand Cabal.benchmarkCommonFlags (return . benchFlags) benchArgs -- Repl phase whenRepl $ delegate $ PBReplPhase $ annotateFailure mlogFile ReplFailed $- setupInteractive replCommand replFlags replArgs+ setupInteractive replCommand Cabal.replCommonFlags replFlags replArgs return () where@@ -262,27 +271,31 @@ | hasValidHaddockTargets pkg = action | otherwise = return () + mbWorkDir = useWorkingDir scriptOptions+ commonFlags v =+ flip filterCommonFlags v $+ setupHsCommonFlags verbosity mbWorkDir builddir+ configureCommand = Cabal.configureCommand defaultProgramDb configureFlags v =- flip filterConfigureFlags v $- setupHsConfigureFlags+ flip filterConfigureFlags v+ <$> setupHsConfigureFlags+ (\p -> makeSymbolicPath <$> canonicalizePath p) plan rpkg pkgshared- verbosity- builddir+ (commonFlags v) configureArgs _ = setupHsConfigureArgs pkg buildCommand = Cabal.buildCommand defaultProgramDb- buildFlags _ = setupHsBuildFlags comp_par_strat pkg pkgshared verbosity builddir+ buildFlags v = setupHsBuildFlags comp_par_strat pkg pkgshared $ commonFlags v buildArgs _ = setupHsBuildArgs pkg - copyFlags destdir _ =+ copyFlags destdir v = setupHsCopyFlags pkg pkgshared- verbosity- builddir+ (commonFlags v) destdir -- In theory, we could want to copy less things than those that were -- built, but instead, we simply copy the targets that were built.@@ -293,26 +306,23 @@ flip filterTestFlags v $ setupHsTestFlags pkg- verbosity- builddir+ (commonFlags v) testArgs _ = setupHsTestArgs pkg benchCommand = Cabal.benchmarkCommand- benchFlags _ =+ benchFlags v = setupHsBenchFlags pkg pkgshared- verbosity- builddir+ (commonFlags v) benchArgs _ = setupHsBenchArgs pkg replCommand = Cabal.replCommand defaultProgramDb- replFlags _ =+ replFlags v = setupHsReplFlags pkg pkgshared- verbosity- builddir+ (commonFlags v) replArgs _ = setupHsReplArgs pkg haddockCommand = Cabal.haddockCommand@@ -321,8 +331,8 @@ setupHsHaddockFlags pkg pkgshared- verbosity- builddir+ buildTimeSettings+ (commonFlags v) haddockArgs v = flip filterHaddockArgs v $ setupHsHaddockArgs pkg@@ -340,11 +350,12 @@ setup :: CommandUI flags- -> (Version -> flags)+ -> (flags -> CommonSetupFlags)+ -> (Version -> IO flags) -> (Version -> [String]) -> IO ()- setup cmd flags args =- withLogging $ \mLogFileHandle ->+ setup cmd getCommonFlags flags args =+ withLogging $ \mLogFileHandle -> do setupWrapper verbosity scriptOptions@@ -356,21 +367,24 @@ } (Just (elabPkgDescription pkg)) cmd+ getCommonFlags flags args setupInteractive :: CommandUI flags+ -> (flags -> CommonSetupFlags) -> (Version -> flags) -> (Version -> [String]) -> IO ()- setupInteractive cmd flags args =+ setupInteractive cmd getCommonFlags flags args = setupWrapper verbosity scriptOptions{isInteractive = True} (Just (elabPkgDescription pkg)) cmd- flags+ getCommonFlags+ (\v -> return (flags v)) args generateInstalledPackageInfo :: IO InstalledPackageInfo@@ -379,14 +393,13 @@ verbosity distTempDirectory $ \pkgConfDest -> do- let registerFlags _ =+ let registerFlags v = setupHsRegisterFlags pkg pkgshared- verbosity- builddir+ (commonFlags v) pkgConfDest- setup Cabal.registerCommand registerFlags (const [])+ setup (Cabal.registerCommand) Cabal.registerCommonFlags (\v -> return (registerFlags v)) (const []) withLogging :: (Maybe Handle -> IO r) -> IO r withLogging action =@@ -411,8 +424,8 @@ -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> BuildStatusRebuild- -> FilePath- -> FilePath+ -> SymbolicPath CWD (Dir Pkg)+ -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult buildInplaceUnpackedPackage verbosity@@ -434,7 +447,7 @@ -- TODO: [code cleanup] there is duplication between the -- distdirlayout and the builddir here builddir is not -- enough, we also need the per-package cachedir- createDirectoryIfMissingVerbose verbosity True builddir+ createDirectoryIfMissingVerbose verbosity True $ getSymbolicPath builddir createDirectoryIfMissingVerbose verbosity True@@ -464,7 +477,7 @@ whenReConfigure $ do runConfigure invalidatePackageRegFileMonitor packageFileMonitor- updatePackageConfigFileMonitor packageFileMonitor srcdir pkg+ updatePackageConfigFileMonitor packageFileMonitor (getSymbolicPath srcdir) pkg PBBuildPhase{runBuild} -> do whenRebuild $ do timestamp <- beginUpdateFileMonitor@@ -475,10 +488,10 @@ `onException` invalidatePackageRegFileMonitor packageFileMonitor let listSimple =- execRebuild srcdir (needElaboratedConfiguredPackage pkg)+ execRebuild (getSymbolicPath srcdir) (needElaboratedConfiguredPackage pkg) listSdist = fmap (map monitorFileHashed) $- allPackageSourceFiles verbosity srcdir+ allPackageSourceFiles verbosity (getSymbolicPath srcdir) ifNullThen m m' = do xs <- m if null xs then m' else return xs@@ -511,7 +524,7 @@ pkg updatePackageBuildFileMonitor packageFileMonitor- srcdir+ (getSymbolicPath srcdir) timestamp pkg buildStatus@@ -558,7 +571,7 @@ return (Just ipkg) else return Nothing - updatePackageRegFileMonitor packageFileMonitor srcdir mipkg+ updatePackageRegFileMonitor packageFileMonitor (getSymbolicPath srcdir) mipkg PBTestPhase{runTest} -> runTest PBBenchPhase{runBench} -> runBench PBReplPhase{runRepl} -> runRepl@@ -617,8 +630,8 @@ -> ElaboratedSharedConfig -> ElaboratedInstallPlan -> ElaboratedReadyPackage- -> FilePath- -> FilePath+ -> SymbolicPath CWD (Dir Pkg)+ -> SymbolicPath Pkg (Dir Dist) -> IO BuildResult buildAndInstallUnpackedPackage verbosity@@ -638,7 +651,7 @@ rpkg@(ReadyPackage pkg) srcdir builddir = do- createDirectoryIfMissingVerbose verbosity True (srcdir </> builddir)+ createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPath (Just srcdir) builddir) -- TODO: [code cleanup] deal consistently with talking to older -- Setup.hs versions, much like we do for ghc, with a proper
src/Distribution/Client/ProjectConfig.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeApplications #-} -- | Handling project configuration. module Distribution.Client.ProjectConfig@@ -18,8 +19,10 @@ -- * Project root , findProjectRoot+ , getProjectRootUsability , ProjectRoot (..)- , BadProjectRoot+ , BadProjectRoot (..)+ , ProjectRootUsability (..) -- * Project config files , readProjectConfig@@ -34,6 +37,7 @@ , writeProjectLocalFreezeConfig , writeProjectConfigFile , commandLineFlagsToProjectConfig+ , onlyTopLevelProvenance -- * Packages within projects , ProjectPackageLocation (..)@@ -93,6 +97,7 @@ ( RepoContext (..) , withRepoContext' )+import Distribution.Client.HashValue import Distribution.Client.HttpUtils ( HttpTransport , configureTransport@@ -102,12 +107,12 @@ import Distribution.Client.Types import Distribution.Client.Utils.Parsec (renderParseError) +import Distribution.Solver.Types.ConstraintSource import Distribution.Solver.Types.PackageConstraint- ( PackageProperty (..)- ) import Distribution.Solver.Types.Settings import Distribution.Solver.Types.SourcePackage +import Distribution.Client.Errors import Distribution.Client.Setup ( defaultMaxBackjumps , defaultSolver@@ -115,6 +120,7 @@ import Distribution.Client.SrcDist ( packageDirToSdist )+import Distribution.Client.Targets import Distribution.Client.Types.SourceRepo ( SourceRepoList , SourceRepositoryPackage (..)@@ -135,11 +141,6 @@ , showPWarning ) import Distribution.Package- ( PackageId- , PackageName- , UnitId- , packageId- ) import Distribution.PackageDescription.Parsec ( parseGenericPackageDescription )@@ -186,6 +187,10 @@ import Distribution.Types.SourceRepo ( RepoType (..) )+import Distribution.Utils.Generic+ ( toUTF8BS+ , toUTF8LBS+ ) import Distribution.Utils.NubList ( fromNubList )@@ -194,24 +199,20 @@ , verbose ) import Distribution.Version- ( Version- ) import qualified Codec.Archive.Tar as Tar import qualified Codec.Archive.Tar.Entry as Tar import qualified Distribution.Client.GZipUtils as GZipUtils import qualified Distribution.Client.Tar as Tar +import Control.Exception (handle) import Control.Monad.Trans (liftIO) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS-import qualified Data.Hashable as Hashable import qualified Data.List.NonEmpty as NE import qualified Data.Map as Map import qualified Data.Set as Set-import Numeric (showHex) -import Distribution.Client.Errors import Network.URI ( URI (..) , URIAuth (..)@@ -219,6 +220,15 @@ , uriToString ) import System.Directory+ ( canonicalizePath+ , doesDirectoryExist+ , doesFileExist+ , doesPathExist+ , getCurrentDirectory+ , getDirectoryContents+ , getHomeDirectory+ , pathIsSymbolicLink+ ) import System.FilePath hiding (combine) import System.IO ( IOMode (ReadMode)@@ -310,9 +320,34 @@ where -- TODO: [required eventually] some of these settings need validation, e.g. -- the flag assignments need checking.+ cabalPkgname = mkPackageName "Cabal"++ profilingDynamicConstraint =+ ( UserConstraint+ (UserAnySetupQualifier cabalPkgname)+ (PackagePropertyVersion $ orLaterVersion (mkVersion [3, 13, 0]))+ , ConstraintSourceProfiledDynamic+ )++ profDynEnabledGlobally = fromFlagOrDefault False (packageConfigProfShared projectConfigLocalPackages)++ profDynEnabledAnyLocally =+ or+ [ fromFlagOrDefault False (packageConfigProfShared ppc)+ | (_, ppc) <- Map.toList (getMapMappend projectConfigSpecificPackage)+ ]++ -- Add a setup.Cabal >= 3.13 constraint if prof+dyn is enabled globally+ -- or any package in the project enables it.+ -- Ideally we'd apply this constraint only on the closure of packages requiring prof+dyn,+ -- but that would require another solver run for marginal advantages that+ -- will further shrink as 3.13 is adopted.+ solverCabalLibConstraints =+ [profilingDynamicConstraint | profDynEnabledGlobally || profDynEnabledAnyLocally]+ solverSettingRemoteRepos = fromNubList projectConfigRemoteRepos solverSettingLocalNoIndexRepos = fromNubList projectConfigLocalNoIndexRepos- solverSettingConstraints = projectConfigConstraints+ solverSettingConstraints = solverCabalLibConstraints ++ projectConfigConstraints solverSettingPreferences = projectConfigPreferences solverSettingFlagAssignment = packageConfigFlagAssignment projectConfigLocalPackages solverSettingFlagAssignments =@@ -504,6 +539,24 @@ -- Reading and writing project config files -- +-- | Get @ProjectRootUsability@ of a given file+getProjectRootUsability :: FilePath -> IO ProjectRootUsability+getProjectRootUsability filePath = do+ exists <- doesFileExist filePath+ if exists+ then return ProjectRootUsabilityPresentAndUsable+ else do+ let isUsableAction =+ handle @IOException+ -- NOTE: if any IOException is raised, we assume the file does not exist.+ -- That is what happen when we call @pathIsSymbolicLink@ on a @FilePath@ that does not exist.+ (const $ pure False)+ ((||) <$> pathIsSymbolicLink filePath <*> doesPathExist filePath)+ isUnusable <- isUsableAction+ if isUnusable+ then return ProjectRootUsabilityPresentAndUnusable+ else return ProjectRootUsabilityNotPresent+ -- | Find the root of this project. -- -- The project directory will be one of the following:@@ -527,13 +580,18 @@ "Specifying an absolute path to the project file is deprecated." <> " Use --project-dir to set the project's directory." - doesFileExist file >>= \case- False -> left (BadProjectRootExplicitFile file)- True -> uncurry projectRoot =<< first dropTrailingPathSeparator . splitFileName <$> canonicalizePath file+ getProjectRootUsability file >>= \case+ ProjectRootUsabilityPresentAndUsable ->+ uncurry projectRoot+ =<< first dropTrailingPathSeparator . splitFileName <$> canonicalizePath file+ ProjectRootUsabilityNotPresent ->+ left (BadProjectRootExplicitFileNotFound file)+ ProjectRootUsabilityPresentAndUnusable ->+ left (BadProjectRootFileBroken file) | otherwise -> probeProjectRoot mprojectFile Just dir -> doesDirectoryExist dir >>= \case- False -> left (BadProjectRootDir dir)+ False -> left (BadProjectRootDirNotFound dir) True -> do projectDir <- canonicalizePath dir @@ -541,13 +599,21 @@ Nothing -> pure $ Right (ProjectRootExplicit projectDir defaultProjectFile) Just projectFile | isAbsolute projectFile ->- doesFileExist projectFile >>= \case- False -> left (BadProjectRootAbsoluteFile projectFile)- True -> Right . ProjectRootExplicitAbsolute dir <$> canonicalizePath projectFile+ getProjectRootUsability projectFile >>= \case+ ProjectRootUsabilityNotPresent ->+ left (BadProjectRootAbsoluteFileNotFound projectFile)+ ProjectRootUsabilityPresentAndUsable ->+ Right . ProjectRootExplicitAbsolute dir <$> canonicalizePath projectFile+ ProjectRootUsabilityPresentAndUnusable ->+ left (BadProjectRootFileBroken projectFile) | otherwise ->- doesFileExist (projectDir </> projectFile) >>= \case- False -> left (BadProjectRootDirFile dir projectFile)- True -> projectRoot projectDir projectFile+ getProjectRootUsability (projectDir </> projectFile) >>= \case+ ProjectRootUsabilityNotPresent ->+ left (BadProjectRootDirFileNotFound dir projectFile)+ ProjectRootUsabilityPresentAndUsable ->+ projectRoot projectDir projectFile+ ProjectRootUsabilityPresentAndUnusable ->+ left (BadProjectRootFileBroken projectFile) where left = pure . Left @@ -556,7 +622,7 @@ probeProjectRoot :: Maybe FilePath -> IO (Either BadProjectRoot ProjectRoot) probeProjectRoot mprojectFile = do- startdir <- getCurrentDirectory+ startdir <- System.Directory.getCurrentDirectory homedir <- getHomeDirectory probe startdir homedir where@@ -572,46 +638,51 @@ go dir | isDrive dir || dir == homedir = case mprojectFile of Nothing -> return (Right (ProjectRootImplicit startdir))- Just file -> return (Left (BadProjectRootExplicitFile file))+ Just file -> return (Left (BadProjectRootExplicitFileNotFound file)) go dir = do- exists <- doesFileExist (dir </> projectFileName)- if exists- then return (Right (ProjectRootExplicit dir projectFileName))- else go (takeDirectory dir)+ getProjectRootUsability (dir </> projectFileName) >>= \case+ ProjectRootUsabilityNotPresent ->+ go (takeDirectory dir)+ ProjectRootUsabilityPresentAndUsable ->+ return (Right $ ProjectRootExplicit dir projectFileName)+ ProjectRootUsabilityPresentAndUnusable ->+ return (Left $ BadProjectRootFileBroken projectFileName) -- | Errors returned by 'findProjectRoot'. data BadProjectRoot- = BadProjectRootExplicitFile FilePath- | BadProjectRootDir FilePath- | BadProjectRootAbsoluteFile FilePath- | BadProjectRootDirFile FilePath FilePath-#if MIN_VERSION_base(4,8,0)- deriving (Show, Typeable)-#else- deriving (Typeable)--instance Show BadProjectRoot where- show = renderBadProjectRoot-#endif+ = BadProjectRootExplicitFileNotFound FilePath+ | BadProjectRootDirNotFound FilePath+ | BadProjectRootAbsoluteFileNotFound FilePath+ | BadProjectRootDirFileNotFound FilePath FilePath+ | BadProjectRootFileBroken FilePath+ deriving (Show, Typeable, Eq) -#if MIN_VERSION_base(4,8,0) instance Exception BadProjectRoot where displayException = renderBadProjectRoot-#else-instance Exception BadProjectRoot-#endif renderBadProjectRoot :: BadProjectRoot -> String renderBadProjectRoot = \case- BadProjectRootExplicitFile projectFile ->+ BadProjectRootExplicitFileNotFound projectFile -> "The given project file '" ++ projectFile ++ "' does not exist."- BadProjectRootDir dir ->+ BadProjectRootDirNotFound dir -> "The given project directory '" <> dir <> "' does not exist."- BadProjectRootAbsoluteFile file ->+ BadProjectRootAbsoluteFileNotFound file -> "The given project file '" <> file <> "' does not exist."- BadProjectRootDirFile dir file ->+ BadProjectRootDirFileNotFound dir file -> "The given project directory/file combination '" <> dir </> file <> "' does not exist."+ BadProjectRootFileBroken file ->+ "The given project file '" <> file <> "' is broken. Is it a broken symbolic link?" +-- | State of the project file, encodes if the file can be used+data ProjectRootUsability+ = -- | The file is present and can be used+ ProjectRootUsabilityPresentAndUsable+ | -- | The file is present but can't be used (e.g. broken symlink)+ ProjectRootUsabilityPresentAndUnusable+ | -- | The file is not present+ ProjectRootUsabilityNotPresent+ deriving (Eq, Show)+ withGlobalConfig :: Verbosity -- ^ verbosity@@ -819,21 +890,11 @@ -- | Exception thrown by 'findProjectPackages'. data BadPackageLocations = BadPackageLocations (Set ProjectConfigProvenance) [BadPackageLocation]-#if MIN_VERSION_base(4,8,0) deriving (Show, Typeable)-#else- deriving (Typeable) -instance Show BadPackageLocations where- show = renderBadPackageLocations-#endif--#if MIN_VERSION_base(4,8,0) instance Exception BadPackageLocations where displayException = renderBadPackageLocations-#else-instance Exception BadPackageLocations-#endif+ -- TODO: [nice to have] custom exception subclass for Doc rendering, colour etc data BadPackageLocation@@ -1505,11 +1566,8 @@ . showChar ' ' . showsPrec 11 ws -instance Exception CabalFileParseError-#if MIN_VERSION_base(4,8,0)- where+instance Exception CabalFileParseError where displayException = renderCabalFileParseError-#endif renderCabalFileParseError :: CabalFileParseError -> String renderCabalFileParseError (CabalFileParseError filePath contents errors _ warnings) =@@ -1601,7 +1659,7 @@ localFileNameForRemoteTarball uri = mangleName uri ++ "-"- ++ showHex locationHash ""+ ++ showHashValue locationHash where mangleName = truncateString 10@@ -1611,15 +1669,15 @@ . dropTrailingPathSeparator . uriPath - locationHash :: Word- locationHash = fromIntegral (Hashable.hash (uriToString id uri ""))+ locationHash :: HashValue+ locationHash = hashValue (toUTF8LBS (uriToString id uri "")) -- | The name to use for a local file or dir for a remote 'SourceRepo'. -- This is deterministic based on the source repo identity details, and -- intended to produce non-clashing file names for different repos. localFileNameForRemoteRepo :: SourceRepoList -> FilePath localFileNameForRemoteRepo SourceRepositoryPackage{srpType, srpLocation} =- mangleName srpLocation ++ "-" ++ showHex locationHash ""+ mangleName srpLocation ++ "-" ++ showHashValue locationHash where mangleName = truncateString 10@@ -1628,9 +1686,10 @@ . dropTrailingPathSeparator -- just the parts that make up the "identity" of the repo- locationHash :: Word+ locationHash :: HashValue locationHash =- fromIntegral (Hashable.hash (show srpType, srpLocation))+ hashValue $+ LBS.fromChunks [toUTF8BS srpLocation, toUTF8BS (show srpType)] -- | Truncate a string, with a visual indication that it is truncated. truncateString :: Int -> String -> String@@ -1651,21 +1710,11 @@ data BadPerPackageCompilerPaths = BadPerPackageCompilerPaths [(PackageName, String)]-#if MIN_VERSION_base(4,8,0) deriving (Show, Typeable)-#else- deriving (Typeable) -instance Show BadPerPackageCompilerPaths where- show = renderBadPerPackageCompilerPaths-#endif--#if MIN_VERSION_base(4,8,0) instance Exception BadPerPackageCompilerPaths where displayException = renderBadPerPackageCompilerPaths-#else-instance Exception BadPerPackageCompilerPaths-#endif+ -- TODO: [nice to have] custom exception subclass for Doc rendering, colour etc renderBadPerPackageCompilerPaths :: BadPerPackageCompilerPaths -> String@@ -1705,3 +1754,9 @@ ] of [] -> return () ps -> throwIO (BadPerPackageCompilerPaths ps)++-- | Filter out non-top-level project configs.+onlyTopLevelProvenance :: Set ProjectConfigProvenance -> Set ProjectConfigProvenance+onlyTopLevelProvenance = Set.filter $ \case+ Implicit -> False+ Explicit ps -> isTopLevelConfigPath ps
src/Distribution/Client/ProjectConfig/Legacy.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-}@@ -84,6 +85,7 @@ ( CompilerInfo (..) , DebugInfoLevel (..) , OptimisationLevel (..)+ , interpretPackageDB ) import Distribution.Simple.InstallDirs (CopyDest (NoCopyDest)) import Distribution.Simple.LocalBuildInfo@@ -100,6 +102,7 @@ ) import Distribution.Simple.Setup ( BenchmarkFlags (..)+ , CommonSetupFlags (..) , ConfigFlags (..) , DumpBuildInfo (DumpBuildInfo, NoDumpBuildInfo) , Flag (..)@@ -139,7 +142,9 @@ , toNubList ) +import Distribution.Client.HttpUtils import Distribution.Client.ParseUtils+import Distribution.Client.ReplFlags (multiReplOption) import Distribution.Deprecated.ParseUtils ( PError (..) , PWarning (..)@@ -159,6 +164,7 @@ , (+++) ) import qualified Distribution.Deprecated.ReadP as Parse+import Distribution.Fields.ConfVar (parseConditionConfVarFromClause) import Distribution.Parsec (ParsecParser, parsecToken) import Distribution.Simple.Command ( CommandUI (commandOptions)@@ -171,6 +177,10 @@ import Distribution.Types.PackageVersionConstraint ( PackageVersionConstraint )+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import qualified Data.ByteString.Char8 as BS import qualified Data.Map as Map@@ -185,11 +195,6 @@ ) import qualified Text.PrettyPrint as Disp -import Distribution.Fields.ConfVar (parseConditionConfVarFromClause)--import Distribution.Client.HttpUtils-import Distribution.Client.ReplFlags (multiReplOption)- ------------------------------------------------------------------ -- Handle extended project config files with conditionals and imports. --@@ -504,6 +509,7 @@ , packageConfigHaddockInternal = packageConfigHaddockInternal pc , packageConfigHaddockQuickJump = packageConfigHaddockQuickJump pc , packageConfigHaddockLinkedSource = packageConfigHaddockLinkedSource pc+ , packageConfigHaddockUseUnicode = packageConfigHaddockUseUnicode pc } ) @@ -680,17 +686,25 @@ , globalStoreDir = projectConfigStoreDir } = globalFlags + projectConfigPackageDBs = (fmap . fmap) (interpretPackageDB Nothing) projectConfigPackageDBs_+ ConfigFlags- { configDistPref = projectConfigDistDir+ { configCommonFlags = commonFlags , configHcFlavor = projectConfigHcFlavor , configHcPath = projectConfigHcPath , configHcPkg = projectConfigHcPkg , -- configProgramPathExtra = projectConfigProgPathExtra DELETE ME configInstallDirs = projectConfigInstallDirs , -- configUserInstall = projectConfigUserInstall,- configPackageDBs = projectConfigPackageDBs+ configPackageDBs = projectConfigPackageDBs_ } = configFlags + CommonSetupFlags+ { setupDistPref = projectConfigAbsoluteDistDir+ } = commonFlags++ projectConfigDistDir = fmap getSymbolicPath projectConfigAbsoluteDistDir+ ConfigExFlags { configCabalVersion = projectConfigCabalVersion , configExConstraints = projectConfigConstraints@@ -758,6 +772,7 @@ , configFullyStaticExe = packageConfigFullyStaticExe , configProfExe = packageConfigProfExe , configProf = packageConfigProf+ , configProfShared = packageConfigProfShared , configProfDetail = packageConfigProfDetail , configProfLibDetail = packageConfigProfLibDetail , configConfigureArgs = packageConfigConfigureArgs@@ -769,10 +784,6 @@ , configSplitObjs = packageConfigSplitObjs , configStripExes = packageConfigStripExes , configStripLibs = packageConfigStripLibs- , configExtraLibDirs = packageConfigExtraLibDirs- , configExtraLibDirsStatic = packageConfigExtraLibDirsStatic- , configExtraFrameworkDirs = packageConfigExtraFrameworkDirs- , configExtraIncludeDirs = packageConfigExtraIncludeDirs , configConfigurationsFlags = packageConfigFlagAssignment , configTests = packageConfigTests , configBenchmarks = packageConfigBenchmarks@@ -783,6 +794,10 @@ , configRelocatable = packageConfigRelocatable , configCoverageFor = _ } = configFlags+ packageConfigExtraLibDirs = fmap getSymbolicPath $ configExtraLibDirs configFlags+ packageConfigExtraLibDirsStatic = fmap getSymbolicPath $ configExtraLibDirsStatic configFlags+ packageConfigExtraFrameworkDirs = fmap getSymbolicPath $ configExtraFrameworkDirs configFlags+ packageConfigExtraIncludeDirs = fmap getSymbolicPath $ configExtraIncludeDirs configFlags packageConfigProgramPaths = MapLast (Map.fromList configProgramPaths) packageConfigProgramArgs = MapMappend (Map.fromListWith (++) configProgramArgs) @@ -811,8 +826,9 @@ , haddockContents = packageConfigHaddockContents , haddockIndex = packageConfigHaddockIndex , haddockBaseUrl = packageConfigHaddockBaseUrl- , haddockLib = packageConfigHaddockLib+ , haddockResourcesDir = packageConfigHaddockResourcesDir , haddockOutputDir = packageConfigHaddockOutputDir+ , haddockUseUnicode = packageConfigHaddockUseUnicode } = haddockFlags TestFlags@@ -859,9 +875,13 @@ } = globalFlags ConfigFlags- { configVerbosity = projectConfigVerbosity+ { configCommonFlags = commonFlags } = configFlags + CommonSetupFlags+ { setupVerbosity = projectConfigVerbosity+ } = commonFlags+ InstallFlags { installDryRun = projectConfigDryRun , installOnlyDownload = projectConfigOnlyDownload@@ -951,11 +971,16 @@ , globalProgPathExtra = projectConfigProgPathExtra } + commonFlags =+ mempty+ { setupVerbosity = projectConfigVerbosity+ , setupDistPref = fmap makeSymbolicPath $ projectConfigDistDir+ }+ configFlags = mempty- { configVerbosity = projectConfigVerbosity- , configDistPref = projectConfigDistDir- , configPackageDBs = projectConfigPackageDBs+ { configCommonFlags = commonFlags+ , configPackageDBs = fmap (fmap (fmap unsafeMakeSymbolicPath)) projectConfigPackageDBs , configInstallDirs = projectConfigInstallDirs } @@ -1033,9 +1058,12 @@ , legacyBenchmarkFlags = mempty } where+ commonFlags =+ mempty+ configFlags = ConfigFlags- { configArgs = mempty+ { configCommonFlags = commonFlags , configPrograms_ = mempty , configProgramPaths = mempty , configProgramArgs = mempty@@ -1052,6 +1080,7 @@ , configFullyStaticExe = mempty , configProfExe = mempty , configProf = mempty+ , configProfShared = mempty , configProfDetail = mempty , configProfLibDetail = mempty , configConfigureArgs = mempty@@ -1060,9 +1089,6 @@ , configProgSuffix = mempty , configInstallDirs = projectConfigInstallDirs , configScratchDir = mempty- , configDistPref = mempty- , configCabalFilePath = mempty- , configVerbosity = mempty , configUserInstall = mempty -- projectConfigUserInstall, , configPackageDBs = mempty , configGHCiLib = mempty@@ -1093,6 +1119,7 @@ , configDumpBuildInfo = mempty , configAllowDependingOnPrivateLibs = mempty , configCoverageFor = mempty+ , configIgnoreBuildTools = mempty } haddockFlags =@@ -1110,9 +1137,11 @@ , legacyBenchmarkFlags = benchmarkFlags } where+ commonFlags =+ mempty configFlags = ConfigFlags- { configArgs = mempty+ { configCommonFlags = commonFlags , configPrograms_ = configPrograms_ mempty , configProgramPaths = Map.toList (getMapLast packageConfigProgramPaths) , configProgramArgs = Map.toList (getMapMappend packageConfigProgramArgs)@@ -1129,6 +1158,7 @@ , configFullyStaticExe = packageConfigFullyStaticExe , configProfExe = packageConfigProfExe , configProf = packageConfigProf+ , configProfShared = packageConfigProfShared , configProfDetail = packageConfigProfDetail , configProfLibDetail = packageConfigProfLibDetail , configConfigureArgs = packageConfigConfigureArgs@@ -1137,9 +1167,6 @@ , configProgSuffix = packageConfigProgSuffix , configInstallDirs = mempty , configScratchDir = mempty- , configDistPref = mempty- , configCabalFilePath = mempty- , configVerbosity = mempty , configUserInstall = mempty , configPackageDBs = mempty , configGHCiLib = packageConfigGHCiLib@@ -1147,13 +1174,13 @@ , configSplitObjs = packageConfigSplitObjs , configStripExes = packageConfigStripExes , configStripLibs = packageConfigStripLibs- , configExtraLibDirs = packageConfigExtraLibDirs- , configExtraLibDirsStatic = packageConfigExtraLibDirsStatic- , configExtraFrameworkDirs = packageConfigExtraFrameworkDirs+ , configExtraLibDirs = fmap makeSymbolicPath $ packageConfigExtraLibDirs+ , configExtraLibDirsStatic = fmap makeSymbolicPath $ packageConfigExtraLibDirsStatic+ , configExtraFrameworkDirs = fmap makeSymbolicPath $ packageConfigExtraFrameworkDirs , configConstraints = mempty , configDependencies = mempty , configPromisedDependencies = mempty- , configExtraIncludeDirs = packageConfigExtraIncludeDirs+ , configExtraIncludeDirs = fmap makeSymbolicPath $ packageConfigExtraIncludeDirs , configIPID = mempty , configCID = mempty , configDeterministic = mempty@@ -1170,6 +1197,7 @@ , configDumpBuildInfo = packageConfigDumpBuildInfo , configAllowDependingOnPrivateLibs = mempty , configCoverageFor = mempty+ , configIgnoreBuildTools = mempty } installFlags =@@ -1180,7 +1208,8 @@ haddockFlags = HaddockFlags- { haddockProgramPaths = mempty+ { haddockCommonFlags = commonFlags+ , haddockProgramPaths = mempty , haddockProgramArgs = mempty , haddockHoogle = packageConfigHaddockHoogle , haddockHtml = packageConfigHaddockHtml@@ -1196,21 +1225,17 @@ , haddockQuickJump = packageConfigHaddockQuickJump , haddockHscolourCss = packageConfigHaddockHscolourCss , haddockContents = packageConfigHaddockContents- , haddockDistPref = mempty , haddockKeepTempFiles = mempty- , haddockVerbosity = mempty- , haddockCabalFilePath = mempty , haddockIndex = packageConfigHaddockIndex , haddockBaseUrl = packageConfigHaddockBaseUrl- , haddockLib = packageConfigHaddockLib+ , haddockResourcesDir = packageConfigHaddockResourcesDir , haddockOutputDir = packageConfigHaddockOutputDir- , haddockArgs = mempty+ , haddockUseUnicode = packageConfigHaddockUseUnicode } testFlags = TestFlags- { testDistPref = mempty- , testVerbosity = mempty+ { testCommonFlags = commonFlags , testHumanLog = packageConfigTestHumanLog , testMachineLog = packageConfigTestMachineLog , testShowDetails = packageConfigTestShowDetails@@ -1222,8 +1247,7 @@ benchmarkFlags = BenchmarkFlags- { benchmarkDistPref = mempty- , benchmarkVerbosity = mempty+ { benchmarkCommonFlags = commonFlags , benchmarkOptions = packageConfigBenchmarkOptions } @@ -1485,26 +1509,26 @@ "extra-include-dirs" showTokenQ parseTokenQ- configExtraIncludeDirs- (\v conf -> conf{configExtraIncludeDirs = v})+ (fmap getSymbolicPath . configExtraIncludeDirs)+ (\v conf -> conf{configExtraIncludeDirs = fmap makeSymbolicPath v}) , newLineListField "extra-lib-dirs" showTokenQ parseTokenQ- configExtraLibDirs- (\v conf -> conf{configExtraLibDirs = v})+ (fmap getSymbolicPath . configExtraLibDirs)+ (\v conf -> conf{configExtraLibDirs = fmap makeSymbolicPath v}) , newLineListField "extra-lib-dirs-static" showTokenQ parseTokenQ- configExtraLibDirsStatic- (\v conf -> conf{configExtraLibDirsStatic = v})+ (fmap getSymbolicPath . configExtraLibDirsStatic)+ (\v conf -> conf{configExtraLibDirsStatic = fmap makeSymbolicPath v}) , newLineListField "extra-framework-dirs" showTokenQ parseTokenQ- configExtraFrameworkDirs- (\v conf -> conf{configExtraFrameworkDirs = v})+ (fmap getSymbolicPath . configExtraFrameworkDirs)+ (\v conf -> conf{configExtraFrameworkDirs = fmap makeSymbolicPath v}) , newLineListField "extra-prog-path" showTokenQ@@ -1532,11 +1556,13 @@ , "program-suffix" , "library-vanilla" , "library-profiling"+ , "library-vanilla" , "shared" , "static" , "executable-dynamic" , "executable-static" , "profiling"+ , "profiling-shared" , "executable-profiling" , "profiling-detail" , "library-profiling-detail"@@ -1606,8 +1632,9 @@ , "index-location" , "keep-temp-files" , "base-url"- , "lib"+ , "resources-dir" , "output-dir"+ , "use-unicode" ] . commandOptionsToFields )
src/Distribution/Client/ProjectConfig/Types.hs view
@@ -69,7 +69,7 @@ , CompilerFlavor , DebugInfoLevel (..) , OptimisationLevel (..)- , PackageDB+ , PackageDBCWD , ProfDetailLevel ) import Distribution.Simple.InstallDirs@@ -198,7 +198,7 @@ -- projectConfigUserInstall :: Flag Bool, projectConfigInstallDirs :: InstallDirs (Flag PathTemplate)- , projectConfigPackageDBs :: [Maybe PackageDB]+ , projectConfigPackageDBs :: [Maybe PackageDBCWD] , -- configuration used both by the solver and other phases projectConfigRemoteRepos :: NubList RemoteRepo -- ^ Available Hackage servers.@@ -265,6 +265,7 @@ , packageConfigFullyStaticExe :: Flag Bool , packageConfigProf :: Flag Bool -- TODO: [code cleanup] sort out , packageConfigProfLib :: Flag Bool -- this duplication+ , packageConfigProfShared :: Flag Bool , packageConfigProfExe :: Flag Bool -- and consistency , packageConfigProfDetail :: Flag ProfDetailLevel , packageConfigProfLibDetail :: Flag ProfDetailLevel@@ -305,8 +306,9 @@ , packageConfigHaddockContents :: Flag PathTemplate -- TODO: [required eventually] use this , packageConfigHaddockIndex :: Flag PathTemplate -- TODO: [required eventually] use this , packageConfigHaddockBaseUrl :: Flag String -- TODO: [required eventually] use this- , packageConfigHaddockLib :: Flag String -- TODO: [required eventually] use this+ , packageConfigHaddockResourcesDir :: Flag String -- TODO: [required eventually] use this , packageConfigHaddockOutputDir :: Flag FilePath -- TODO: [required eventually] use this+ , packageConfigHaddockUseUnicode :: Flag Bool -- TODO: [required eventually] use this , packageConfigHaddockForHackage :: Flag HaddockTarget , -- Test options packageConfigTestHumanLog :: Flag PathTemplate
src/Distribution/Client/ProjectOrchestration.hs view
@@ -216,6 +216,7 @@ import Distribution.Utils.NubList ( fromNubList )+import Distribution.Utils.Path (makeSymbolicPath) import Distribution.Verbosity import Distribution.Version ( mkVersion@@ -1042,13 +1043,20 @@ showConfigureFlags :: ElaboratedConfiguredPackage -> String showConfigureFlags elab =- let fullConfigureFlags =- setupHsConfigureFlags- elaboratedPlan- (ReadyPackage elab)- elaboratedShared+ let commonFlags =+ setupHsCommonFlags verbosity- "$builddir"+ Nothing -- omit working directory+ (makeSymbolicPath "$builddir")+ fullConfigureFlags =+ runIdentity $+ ( setupHsConfigureFlags+ (\_ -> return (error "unused"))+ elaboratedPlan+ (ReadyPackage elab)+ elaboratedShared+ commonFlags+ ) -- \| Given a default value @x@ for a flag, nub @Flag x@ -- into @NoFlag@. This gives us a tidier command line -- rendering.@@ -1056,7 +1064,7 @@ nubFlag x (Setup.Flag x') | x == x' = Setup.NoFlag nubFlag _ f = f - (tryLibProfiling, tryExeProfiling) =+ (tryLibProfiling, tryLibProfilingShared, tryExeProfiling) = computeEffectiveProfiling fullConfigureFlags partialConfigureFlags =@@ -1067,7 +1075,8 @@ nubFlag tryExeProfiling (configProfExe fullConfigureFlags) , configProfLib = nubFlag tryLibProfiling (configProfLib fullConfigureFlags)- -- Maybe there are more we can add+ , configProfShared =+ nubFlag tryLibProfilingShared (configProfShared fullConfigureFlags) } in -- Not necessary to "escape" it, it's just for user output unwords . ("" :) $@@ -1406,11 +1415,7 @@ " The build process terminated with exit code " ++ show n _ -> " The exception was:\n "-#if MIN_VERSION_base(4,8,0) ++ displayException e-#else- ++ show e-#endif buildFailureException :: BuildFailureReason -> Maybe SomeException buildFailureException reason =
src/Distribution/Client/ProjectPlanOutput.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -39,7 +40,6 @@ import qualified Distribution.Compat.Binary as Binary import Distribution.Compat.Graph (Graph, Node) import qualified Distribution.Compat.Graph as Graph-import Distribution.Compiler (CompilerFlavor (GHC, GHCJS)) import Distribution.InstalledPackageInfo (InstalledPackageInfo) import Distribution.Package import qualified Distribution.PackageDescription as PD@@ -49,15 +49,6 @@ , exeExtension ) import Distribution.Simple.Compiler- ( Compiler- , CompilerId (..)- , PackageDB (..)- , PackageDBStack- , compilerFlavor- , compilerId- , compilerVersion- , showCompilerId- ) import Distribution.Simple.GHC ( GhcEnvironmentFileEntry (..) , GhcImplInfo (supportsPkgEnvFiles)@@ -70,6 +61,10 @@ import Distribution.Types.Version ( mkVersion )+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import Distribution.Verbosity import Distribution.Client.Compat.Prelude@@ -225,7 +220,7 @@ | elabSetupScriptCliVersion elab < mkVersion [3, 7, 0, 0] = "build-info" J..= J.Null | otherwise =- "build-info" J..= J.String (buildInfoPref dist_dir)+ "build-info" J..= J.String (getSymbolicPath $ buildInfoPref $ makeSymbolicPath dist_dir) packageLocationToJ :: PackageLocation (Maybe FilePath) -> J.Value packageLocationToJ pkgloc =@@ -866,7 +861,7 @@ :: FilePath -> ElaboratedInstallPlan -> PostBuildProjectStatus- -> [GhcEnvironmentFileEntry]+ -> [GhcEnvironmentFileEntry FilePath] renderGhcEnvironmentFile projectRootDir elaboratedInstallPlan@@ -972,7 +967,7 @@ elabRequiresRegistration pkg && installedUnitId pkg `Set.member` packagesProbablyUpToDate -selectGhcEnvironmentFilePackageDbs :: ElaboratedInstallPlan -> PackageDBStack+selectGhcEnvironmentFilePackageDbs :: ElaboratedInstallPlan -> PackageDBStackCWD selectGhcEnvironmentFilePackageDbs elaboratedInstallPlan = -- If we have any inplace packages then their package db stack is the -- one we should use since it'll include the store + the local db but@@ -982,7 +977,7 @@ ([], pkgs) -> checkSamePackageDBs pkgs (pkgs, _) -> checkSamePackageDBs pkgs where- checkSamePackageDBs :: [ElaboratedConfiguredPackage] -> PackageDBStack+ checkSamePackageDBs :: [ElaboratedConfiguredPackage] -> PackageDBStackCWD checkSamePackageDBs pkgs = case ordNub (map elabBuildPackageDBStack pkgs) of [packageDbs] -> packageDbs@@ -1014,14 +1009,14 @@ InstallPlan.PreExisting _ -> Nothing ] -relativePackageDBPaths :: FilePath -> PackageDBStack -> PackageDBStack+relativePackageDBPaths :: FilePath -> PackageDBStackCWD -> PackageDBStackCWD relativePackageDBPaths relroot = map (relativePackageDBPath relroot) -relativePackageDBPath :: FilePath -> PackageDB -> PackageDB+relativePackageDBPath :: FilePath -> PackageDBCWD -> PackageDBCWD relativePackageDBPath relroot pkgdb = case pkgdb of GlobalPackageDB -> GlobalPackageDB UserPackageDB -> UserPackageDB SpecificPackageDB path -> SpecificPackageDB relpath where- relpath = makeRelative relroot path+ relpath = makeRelative (normalise relroot) path
src/Distribution/Client/ProjectPlanning.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE LambdaCase #-}@@ -74,6 +75,7 @@ -- * Setup.hs CLI flags for building , setupHsScriptOptions+ , setupHsCommonFlags , setupHsConfigureFlags , setupHsConfigureArgs , setupHsBuildFlags@@ -136,6 +138,10 @@ import Distribution.Utils.LogProgress import Distribution.Utils.MapAccum import Distribution.Utils.NubList+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) import qualified Hackage.Security.Client as Sec @@ -159,6 +165,8 @@ , componentName , pkgComponents )++import Distribution.Simple.BuildWay import Distribution.Simple.PackageIndex (InstalledPackageIndex) import Distribution.Simple.Program import Distribution.Simple.Program.Db@@ -184,6 +192,7 @@ import Distribution.Backpack.ModuleShape import Distribution.Simple.Utils+import Distribution.Verbosity import Distribution.Version import qualified Distribution.InstalledPackageInfo as IPI@@ -386,13 +395,13 @@ localPackages <- phaseReadLocalPackages (projectConfig <> cliConfig) return (projectConfig, localPackages) - sequence_- [ do- info verbosity . render . vcat $- text "this build was affected by the following (project) config files:"- : [text "-" <+> docProjectConfigPath path]- | Explicit path <- Set.toList $ projectConfigProvenance projectConfig- ]+ let configfiles =+ [ text "-" <+> docProjectConfigPath path+ | Explicit path <- Set.toList . (if verbosity >= verbose then id else onlyTopLevelProvenance) $ projectConfigProvenance projectConfig+ ]+ unless (null configfiles) $+ notice (verboseStderr verbosity) . render . vcat $+ text "Configuration is affected by the following files:" : configfiles return (projectConfig <> cliConfig, localPackages) where@@ -459,7 +468,7 @@ , packageConfigProgramPathExtra } } = do- let fileMonitorCompiler = newFileMonitor . distProjectCacheFile $ "compiler"+ let fileMonitorCompiler = newFileMonitor $ distProjectCacheFile "compiler" progsearchpath <- liftIO $ getSystemSearchPath rerunIfChanged@@ -474,9 +483,10 @@ ) $ do liftIO $ info verbosity "Compiler settings changed, reconfiguring..."- progdb <- liftIO $ prependProgramSearchPath verbosity (fromNubList packageConfigProgramPathExtra) defaultProgramDb+ let extraPath = fromNubList packageConfigProgramPathExtra+ progdb <- liftIO $ prependProgramSearchPath verbosity extraPath [] defaultProgramDb let progdb' = userSpecifyPaths (Map.toList (getMapLast packageConfigProgramPaths)) progdb- result@(_, _, progdb'') <-+ (comp, plat, progdb'') <- liftIO $ Cabal.configCompilerEx hcFlavor@@ -493,7 +503,12 @@ -- programs it cares about, and those are the ones we monitor here. monitorFiles (programsMonitorFiles progdb'') - return result+ -- Configure the unconfigured programs in the program database,+ -- as we can't serialise unconfigured programs.+ -- See also #2241 and #9840.+ finalProgDb <- liftIO $ configureAllKnownPrograms verbosity progdb''++ return (comp, plat, finalProgDb) where hcFlavor = flagToMaybe projectConfigHcFlavor hcPath = flagToMaybe projectConfigHcPath@@ -650,7 +665,7 @@ -> (Compiler, Platform, ProgramDb) -> [PackageSpecifier UnresolvedSourcePackage] -> InstalledPackageIndex- -> Rebuild (SolverInstallPlan, PkgConfigDb, IndexUtils.TotalIndexState, IndexUtils.ActiveRepos)+ -> Rebuild (SolverInstallPlan, Maybe PkgConfigDb, IndexUtils.TotalIndexState, IndexUtils.ActiveRepos) phaseRunSolver projectConfig@ProjectConfig { projectConfigShared@@ -710,7 +725,7 @@ dieWithException verbosity $ PhaseRunSolverErr msg Right plan -> return (plan, pkgConfigDB, tis, ar) where- corePackageDbs :: [PackageDB]+ corePackageDbs :: PackageDBStackCWD corePackageDbs = Cabal.interpretPackageDbFlags False (projectConfigPackageDBs projectConfigShared) @@ -762,7 +777,7 @@ phaseElaboratePlan :: ProjectConfig -> (Compiler, Platform, ProgramDb)- -> PkgConfigDb+ -> Maybe PkgConfigDb -> SolverInstallPlan -> [PackageSpecifier (SourcePackage (PackageLocation loc))] -> Rebuild@@ -941,7 +956,7 @@ -> Compiler -> ProgramDb -> Platform- -> PackageDBStack+ -> PackageDBStackCWD -> Rebuild InstalledPackageIndex getInstalledPackages verbosity compiler progdb platform packagedbs = do monitorFiles . map monitorFileOrDirectory@@ -949,7 +964,8 @@ ( IndexUtils.getInstalledPackagesMonitorFiles verbosity compiler- packagedbs+ Nothing -- use ambient working directory+ (coercePackageDBStack packagedbs) progdb platform )@@ -995,7 +1011,7 @@ $ repos return sourcePkgDbWithTIS -getPkgConfigDb :: Verbosity -> ProgramDb -> Rebuild PkgConfigDb+getPkgConfigDb :: Verbosity -> ProgramDb -> Rebuild (Maybe PkgConfigDb) getPkgConfigDb verbosity progdb = do dirs <- liftIO $ getPkgConfigDbDirs verbosity progdb -- Just monitor the dirs so we'll notice new .pc files.@@ -1195,7 +1211,7 @@ -> SolverSettings -> InstalledPackageIndex -> SourcePackageDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> [PackageSpecifier UnresolvedSourcePackage] -> Map PackageName (Map OptionalStanza Bool) -> Progress String String SolverInstallPlan@@ -1518,7 +1534,7 @@ -> Platform -> Compiler -> ProgramDb- -> PkgConfigDb+ -> Maybe PkgConfigDb -> DistDirLayout -> StoreDirLayout -> SolverInstallPlan@@ -1614,13 +1630,18 @@ (map fst src_comps) let whyNotPerComp = why_not_per_component src_comps case NE.nonEmpty whyNotPerComp of- Nothing -> return comps+ Nothing -> do+ elaborationWarnings+ return comps Just notPerCompReasons -> do checkPerPackageOk comps notPerCompReasons- return- [ elaborateSolverToPackage notPerCompReasons spkg g $- comps ++ maybeToList setupComponent- ]+ pkgComp <-+ elaborateSolverToPackage+ notPerCompReasons+ spkg+ g+ (comps ++ maybeToList setupComponent)+ return [pkgComp] Left cns -> dieProgress $ hang@@ -1628,6 +1649,7 @@ 4 (vcat (map (text . componentNameStanza) cns)) where+ bt = PD.buildType (elabPkgDescription elab0) -- You are eligible to per-component build if this list is empty why_not_per_component g = cuz_buildtype ++ cuz_spec ++ cuz_length ++ cuz_flag@@ -1643,11 +1665,12 @@ -- type, and teach all of the code paths how to handle it. -- Once you've implemented this, swap it for the code below. cuz_buildtype =- case PD.buildType (elabPkgDescription elab0) of+ case bt of PD.Configure -> [CuzBuildType CuzConfigureBuildType] PD.Custom -> [CuzBuildType CuzCustomBuildType]+ PD.Hooks -> [CuzBuildType CuzHooksBuildType] PD.Make -> [CuzBuildType CuzMakeBuildType]- _ -> []+ PD.Simple -> [] -- cabal-format versions prior to 1.8 have different build-depends semantics -- for now it's easier to just fallback to legacy-mode when specVersion < 1.8 -- see, https://github.com/haskell/cabal/issues/4121@@ -1681,7 +1704,7 @@ <+> fsep (punctuate comma $ map (text . whyNotPerComponent) $ toList reasons) -- TODO: Maybe exclude Backpack too - elab0 = elaborateSolverToCommon spkg+ (elab0, elaborationWarnings) = elaborateSolverToCommon spkg pkgid = elabPkgSourceId elab0 pd = elabPkgDescription elab0 @@ -1691,7 +1714,7 @@ -- have to add dependencies on this from all other components setupComponent :: Maybe ElaboratedConfiguredPackage setupComponent- | PD.buildType (elabPkgDescription elab0) == PD.Custom =+ | bt `elem` [PD.Custom, PD.Hooks] = Just elab0 { elabModuleShape = emptyModuleShape@@ -1915,7 +1938,7 @@ ++ " from " ++ prettyShow (elabPkgSourceId elab0) )- (pkgConfigDbPkgVersion pkgConfigDB pn)+ (pkgConfigDB >>= \db -> pkgConfigDbPkgVersion db pn) ) | PkgconfigDependency pn _ <- PD.pkgconfigDepends@@ -1977,7 +2000,7 @@ -> SolverPackage UnresolvedPkgLoc -> ComponentsGraph -> [ElaboratedConfiguredPackage]- -> ElaboratedConfiguredPackage+ -> LogProgress ElaboratedConfiguredPackage elaborateSolverToPackage pkgWhyNotPerComponent pkg@( SolverPackage@@ -1988,13 +2011,14 @@ _exe_deps0 ) compGraph- comps =+ comps = do -- Knot tying: the final elab includes the -- pkgInstalledId, which is calculated by hashing many -- of the other fields of the elaboratedPackage.- elab+ elaborationWarnings+ return elab where- elab0@ElaboratedConfiguredPackage{..} =+ (elab0@ElaboratedConfiguredPackage{..}, elaborationWarnings) = elaborateSolverToCommon pkg elab1 =@@ -2080,7 +2104,7 @@ elaborateSolverToCommon :: SolverPackage UnresolvedPkgLoc- -> ElaboratedConfiguredPackage+ -> (ElaboratedConfiguredPackage, LogProgress ()) elaborateSolverToCommon pkg@( SolverPackage (SourcePackage pkgid gdesc srcloc descOverride)@@ -2089,7 +2113,7 @@ deps0 _exe_deps0 ) =- elaboratedPackage+ (elaboratedPackage, wayWarnings pkgid) where elaboratedPackage = ElaboratedConfiguredPackage{..} @@ -2157,6 +2181,13 @@ elabBuildHaddocks = perPkgOptionFlag pkgid False packageConfigDocumentation + -- `documentation: true` should imply `-haddock` for GHC+ addHaddockIfDocumentationEnabled :: ConfiguredProgram -> ConfiguredProgram+ addHaddockIfDocumentationEnabled cp@ConfiguredProgram{..} =+ if programId == "ghc" && elabBuildHaddocks+ then cp{programOverrideArgs = "-haddock" : programOverrideArgs}+ else cp+ elabPkgSourceLocation = srcloc elabPkgSourceHash = Map.lookup pkgid sourcePackageHashes elabLocalToProject = isLocalToProject pkg@@ -2190,13 +2221,14 @@ elabBuildOptions = LBC.BuildOptions { withVanillaLib = perPkgOptionFlag pkgid True packageConfigVanillaLib -- TODO: [required feature]: also needs to be handled recursively- , withSharedLib = pkgid `Set.member` pkgsUseSharedLibrary+ , withSharedLib = canBuildSharedLibs && pkgid `Set.member` pkgsUseSharedLibrary , withStaticLib = perPkgOptionFlag pkgid False packageConfigStaticLib , withDynExe = perPkgOptionFlag pkgid False packageConfigDynExe , withFullyStaticExe = perPkgOptionFlag pkgid False packageConfigFullyStaticExe , withGHCiLib = perPkgOptionFlag pkgid False packageConfigGHCiLib -- TODO: [required feature] needs to default to enabled on windows still , withProfExe = perPkgOptionFlag pkgid False packageConfigProf- , withProfLib = pkgid `Set.member` pkgsUseProfilingLibrary+ , withProfLib = canBuildProfilingLibs && pkgid `Set.member` pkgsUseProfilingLibrary+ , withProfLibShared = canBuildProfilingSharedLibs && pkgid `Set.member` pkgsUseProfilingLibraryShared , exeCoverage = perPkgOptionFlag pkgid False packageConfigCoverage , libCoverage = perPkgOptionFlag pkgid False packageConfigCoverage , withOptimization = perPkgOptionFlag pkgid NormalOptimisation packageConfigOptimization@@ -2236,7 +2268,7 @@ Map.fromList [ (programId prog, args) | prog <- configuredPrograms compilerprogdb- , let args = programOverrideArgs prog+ , let args = programOverrideArgs $ addHaddockIfDocumentationEnabled prog , not (null args) ] <> perPkgOptionMapMappend pkgid packageConfigProgramArgs@@ -2265,8 +2297,9 @@ elabHaddockContents = perPkgOptionMaybe pkgid packageConfigHaddockContents elabHaddockIndex = perPkgOptionMaybe pkgid packageConfigHaddockIndex elabHaddockBaseUrl = perPkgOptionMaybe pkgid packageConfigHaddockBaseUrl- elabHaddockLib = perPkgOptionMaybe pkgid packageConfigHaddockLib+ elabHaddockResourcesDir = perPkgOptionMaybe pkgid packageConfigHaddockResourcesDir elabHaddockOutputDir = perPkgOptionMaybe pkgid packageConfigHaddockOutputDir+ elabHaddockUseUnicode = perPkgOptionFlag pkgid False packageConfigHaddockUseUnicode elabTestMachineLog = perPkgOptionMaybe pkgid packageConfigTestMachineLog elabTestHumanLog = perPkgOptionMaybe pkgid packageConfigTestHumanLog@@ -2355,35 +2388,112 @@ pkgsUseSharedLibrary :: Set PackageId pkgsUseSharedLibrary = packagesWithLibDepsDownwardClosedProperty needsSharedLib++ needsSharedLib pkgid =+ fromMaybe+ compilerShouldUseSharedLibByDefault+ -- Case 1: --enable-shared or --disable-shared is passed explicitly, honour that.+ ( case pkgSharedLib of+ Just v -> Just v+ Nothing -> case pkgDynExe of+ -- case 2: If --enable-executable-dynamic is passed then turn on+ -- shared library generation.+ Just True ->+ -- Case 3: If --enable-profiling is passed, then we are going to+ -- build profiled dynamic, so no need for shared libraries.+ case pkgProf of+ Just True -> if canBuildProfilingSharedLibs then Nothing else Just True+ _ -> Just True+ -- But don't necessarily turn off shared library generation if+ -- --disable-executable-dynamic is passed. The shared objects might+ -- be needed for something different.+ _ -> Nothing+ ) where- needsSharedLib pkg =- fromMaybe- compilerShouldUseSharedLibByDefault- (liftM2 (||) pkgSharedLib pkgDynExe)- where- pkgid = packageId pkg- pkgSharedLib = perPkgOptionMaybe pkgid packageConfigSharedLib- pkgDynExe = perPkgOptionMaybe pkgid packageConfigDynExe+ pkgSharedLib = perPkgOptionMaybe pkgid packageConfigSharedLib+ pkgDynExe = perPkgOptionMaybe pkgid packageConfigDynExe+ pkgProf = perPkgOptionMaybe pkgid packageConfigProf -- TODO: [code cleanup] move this into the Cabal lib. It's currently open -- coded in Distribution.Simple.Configure, but should be made a proper -- function of the Compiler or CompilerInfo. compilerShouldUseSharedLibByDefault = case compilerFlavor compiler of- GHC -> GHC.isDynamic compiler+ GHC -> GHC.compilerBuildWay compiler == DynWay && canBuildSharedLibs GHCJS -> GHCJS.isDynamic compiler _ -> False + compilerShouldUseProfilingLibByDefault =+ case compilerFlavor compiler of+ GHC -> GHC.compilerBuildWay compiler == ProfWay && canBuildProfilingLibs+ _ -> False++ compilerShouldUseProfilingSharedLibByDefault =+ case compilerFlavor compiler of+ GHC -> GHC.compilerBuildWay compiler == ProfDynWay && canBuildProfilingSharedLibs+ _ -> False++ -- Returns False if we definitely can't build shared libs+ canBuildWayLibs predicate = case predicate compiler of+ Just can_build -> can_build+ -- If we don't know for certain, just assume we can+ -- which matches behaviour in previous cabal releases+ Nothing -> True++ canBuildSharedLibs = canBuildWayLibs dynamicSupported+ canBuildProfilingLibs = canBuildWayLibs profilingVanillaSupported+ canBuildProfilingSharedLibs = canBuildWayLibs profilingDynamicSupported++ wayWarnings pkg = do+ when+ (needsProfilingLib pkg && not canBuildProfilingLibs)+ (warnProgress (text "Compiler does not support building p libraries, profiling is disabled"))+ when+ (needsSharedLib pkg && not canBuildSharedLibs)+ (warnProgress (text "Compiler does not support building dyn libraries, dynamic libraries are disabled"))+ when+ (needsProfilingLibShared pkg && not canBuildProfilingSharedLibs)+ (warnProgress (text "Compiler does not support building p_dyn libraries, profiling dynamic libraries are disabled."))+ pkgsUseProfilingLibrary :: Set PackageId pkgsUseProfilingLibrary = packagesWithLibDepsDownwardClosedProperty needsProfilingLib++ needsProfilingLib pkg =+ fromFlagOrDefault compilerShouldUseProfilingLibByDefault (profBothFlag <> profLibFlag) where- needsProfilingLib pkg =- fromFlagOrDefault False (profBothFlag <> profLibFlag)- where- pkgid = packageId pkg- profBothFlag = lookupPerPkgOption pkgid packageConfigProf- profLibFlag = lookupPerPkgOption pkgid packageConfigProfLib+ pkgid = packageId pkg+ profBothFlag = lookupPerPkgOption pkgid packageConfigProf+ profLibFlag = lookupPerPkgOption pkgid packageConfigProfLib++ pkgsUseProfilingLibraryShared :: Set PackageId+ pkgsUseProfilingLibraryShared =+ packagesWithLibDepsDownwardClosedProperty needsProfilingLibShared++ needsProfilingLibShared pkg =+ fromMaybe+ compilerShouldUseProfilingSharedLibByDefault+ -- case 1: If --enable-profiling-shared is passed explicitly, honour that+ ( case profLibSharedFlag of+ Just v -> Just v+ Nothing -> case pkgDynExe of+ Just True ->+ case pkgProf of+ -- case 2: --enable-executable-dynamic + --enable-profiling+ -- turn on shared profiling libraries+ Just True -> if canBuildProfilingSharedLibs then Just True else Nothing+ _ -> Nothing+ -- But don't necessarily turn off shared library generation is+ -- --disable-executable-dynamic is passed. The shared objects might+ -- be needed for something different.+ _ -> Nothing+ )+ where+ pkgid = packageId pkg+ profLibSharedFlag = perPkgOptionMaybe pkgid packageConfigProfShared+ pkgDynExe = perPkgOptionMaybe pkgid packageConfigDynExe+ pkgProf = perPkgOptionMaybe pkgid packageConfigProf+ -- TODO: [code cleanup] unused: the old deprecated packageConfigProfExe libDepGraph =@@ -2400,7 +2510,7 @@ libDepGraph [ Graph.nodeKey pkg | pkg <- SolverInstallPlan.toList solverPlan- , property pkg -- just the packages that satisfy the property+ , property (packageId pkg) -- just the packages that satisfy the property -- TODO: [nice to have] this does not check the config consistency, -- e.g. a package explicitly turning off profiling, but something -- depending on it that needs profiling. This really needs a separate@@ -3657,8 +3767,8 @@ -> ElaboratedInstallPlan -> ElaboratedSharedConfig -> DistDirLayout- -> FilePath- -> FilePath+ -> SymbolicPath CWD (Dir Pkg)+ -> SymbolicPath Pkg (Dir Dist) -> Bool -> Lock -> SetupScriptOptions@@ -3675,7 +3785,14 @@ cacheLock = SetupScriptOptions { useCabalVersion = thisVersion elabSetupScriptCliVersion- , useCabalSpecVersion = Just elabSetupScriptCliVersion+ , useCabalSpecVersion =+ if PD.buildType elabPkgDescription == PD.Hooks+ then -- NB: we don't want to commit to a Cabal version here:+ -- - all that should matter for Hooks build-type is the+ -- version of Cabal-hooks, not of Cabal,+ -- - if we commit to a Cabal version, the logic in+ Nothing+ else Just elabSetupScriptCliVersion , useCompiler = Just pkgConfigCompiler , usePlatform = Just pkgConfigPlatform , usePackageDB = elabSetupPackageDBStack@@ -3793,24 +3910,31 @@ -- TODO: [code cleanup] perhaps reorder this code -- based on the ElaboratedInstallPlan + ElaboratedSharedConfig, -- make the various Setup.hs {configure,build,copy} flags- setupHsConfigureFlags- :: ElaboratedInstallPlan+ :: Monad m+ => (FilePath -> m (SymbolicPath Pkg (Dir PkgDB)))+ -- ^ How to transform a path which is relative to cabal-install cwd to one which+ -- is relative to the route of the package about to be compiled. The simplest way+ -- to do this is to convert the potentially relative path into an absolute path.+ -> ElaboratedInstallPlan -> ElaboratedReadyPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath- -> Cabal.ConfigFlags+ -> Cabal.CommonSetupFlags+ -> m Cabal.ConfigFlags setupHsConfigureFlags+ mkSymbolicPath plan (ReadyPackage elab@ElaboratedConfiguredPackage{..}) sharedConfig@ElaboratedSharedConfig{..}- verbosity- builddir =- sanityCheckElaboratedConfiguredPackage- sharedConfig- elab- (Cabal.ConfigFlags{..})+ configCommonFlags = do+ -- explicitly clear, then our package db stack+ -- TODO: [required eventually] have to do this differently for older Cabal versions+ configPackageDBs <- (traverse . traverse . traverse) mkSymbolicPath (Nothing : map Just elabBuildPackageDBStack)+ return $+ sanityCheckElaboratedConfiguredPackage+ sharedConfig+ elab+ Cabal.ConfigFlags{..} where Cabal.ConfigFlags { configVanillaLib@@ -3821,6 +3945,7 @@ , configGHCiLib , -- , configProfExe -- overridden configProfLib+ , configProfShared , -- , configProf -- overridden configProfDetail , configProfLibDetail@@ -3837,11 +3962,6 @@ configProfExe = mempty configProf = toFlag $ LBC.withProfExe elabBuildOptions - configArgs = mempty -- unused, passed via args- configDistPref = toFlag builddir- configCabalFilePath = mempty- configVerbosity = toFlag verbosity- configInstantiateWith = Map.toList elabInstantiatedWith configDeterministic = mempty -- doesn't matter, configIPID/configCID overridese@@ -3882,10 +4002,10 @@ configConfigurationsFlags = elabFlagAssignment configConfigureArgs = elabConfigureScriptArgs- configExtraLibDirs = elabExtraLibDirs- configExtraLibDirsStatic = elabExtraLibDirsStatic- configExtraFrameworkDirs = elabExtraFrameworkDirs- configExtraIncludeDirs = elabExtraIncludeDirs+ configExtraLibDirs = fmap makeSymbolicPath $ elabExtraLibDirs+ configExtraLibDirsStatic = fmap makeSymbolicPath $ elabExtraLibDirsStatic+ configExtraFrameworkDirs = fmap makeSymbolicPath $ elabExtraFrameworkDirs+ configExtraIncludeDirs = fmap makeSymbolicPath $ elabExtraIncludeDirs configProgPrefix = maybe mempty toFlag elabProgPrefix configProgSuffix = maybe mempty toFlag elabProgSuffix @@ -3907,7 +4027,7 @@ ] configPromisedDependencies =- [ cidToGivenComponent cid+ [ cidToPromisedComponent cid | (cid, is_internal) <- elabLibDependencies elab , is_internal ]@@ -3920,10 +4040,6 @@ ] ElabComponent _ -> [] - -- explicitly clear, then our package db stack- -- TODO: [required eventually] have to do this differently for older Cabal versions- configPackageDBs = Nothing : map Just elabBuildPackageDBStack- configTests = case elabPkgOrComp of ElabPackage pkg -> toFlag (TestStanzas `optStanzaSetMember` pkgStanzasEnabled pkg) ElabComponent _ -> mempty@@ -3938,6 +4054,7 @@ configPrograms_ = mempty -- never use, shouldn't exist configUseResponseFiles = mempty configAllowDependingOnPrivateLibs = Flag $ not $ libraryVisibilitySupported pkgConfigCompiler+ configIgnoreBuildTools = mempty cidToGivenComponent :: ConfiguredId -> GivenComponent cidToGivenComponent (ConfiguredId srcid mb_cn cid) = GivenComponent (packageName srcid) ln cid@@ -3947,8 +4064,17 @@ Just _ -> error "non-library dependency" Nothing -> LMainLibName - configCoverageFor = determineCoverageFor elabPkgSourceId plan+ configCoverageFor = determineCoverageFor elab plan + cidToPromisedComponent :: ConfiguredId -> PromisedComponent+ cidToPromisedComponent (ConfiguredId srcid mb_cn cid) =+ PromisedComponent srcid ln cid+ where+ ln = case mb_cn of+ Just (CLibName lname) -> lname+ Just _ -> error "non-library dependency"+ Nothing -> LMainLibName+ setupHsConfigureArgs :: ElaboratedConfiguredPackage -> [String]@@ -3961,27 +4087,37 @@ (error "setupHsConfigureArgs: trying to configure setup") (compComponentName comp) +setupHsCommonFlags+ :: Verbosity+ -> Maybe (SymbolicPath CWD (Dir Pkg))+ -> SymbolicPath Pkg (Dir Dist)+ -> Cabal.CommonSetupFlags+setupHsCommonFlags verbosity mbWorkDir builddir =+ Cabal.CommonSetupFlags+ { setupDistPref = toFlag builddir+ , setupVerbosity = toFlag verbosity+ , setupCabalFilePath = mempty+ , setupWorkingDir = maybeToFlag mbWorkDir+ , setupTargets = []+ }+ setupHsBuildFlags :: Flag String -> ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> Cabal.BuildFlags-setupHsBuildFlags par_strat elab _ verbosity builddir =+setupHsBuildFlags par_strat elab _ common = Cabal.BuildFlags- { buildProgramPaths = mempty -- unused, set at configure time+ { buildCommonFlags = common+ , buildProgramPaths = mempty -- unused, set at configure time , buildProgramArgs = mempty -- unused, set at configure time- , buildVerbosity = toFlag verbosity- , buildDistPref = toFlag builddir , buildNumJobs = mempty -- TODO: [nice to have] sometimes want to use toFlag (Just numBuildJobs), , buildUseSemaphore = if elabSetupScriptCliVersion elab >= mkVersion [3, 11, 0, 0] then -- Cabal 3.11 is the first version that supports parallelism semaphores par_strat else mempty- , buildArgs = mempty -- unused, passed via args not flags- , buildCabalFilePath = mempty } setupHsBuildArgs :: ElaboratedConfiguredPackage -> [String]@@ -3996,13 +4132,11 @@ setupHsTestFlags :: ElaboratedConfiguredPackage- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> Cabal.TestFlags-setupHsTestFlags (ElaboratedConfiguredPackage{..}) verbosity builddir =+setupHsTestFlags (ElaboratedConfiguredPackage{..}) common = Cabal.TestFlags- { testDistPref = toFlag builddir- , testVerbosity = toFlag verbosity+ { testCommonFlags = common , testMachineLog = maybe mempty toFlag elabTestMachineLog , testHumanLog = maybe mempty toFlag elabTestHumanLog , testShowDetails = maybe (Flag Cabal.Always) toFlag elabTestShowDetails@@ -4020,13 +4154,11 @@ setupHsBenchFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> Cabal.BenchmarkFlags-setupHsBenchFlags (ElaboratedConfiguredPackage{..}) _ verbosity builddir =+setupHsBenchFlags (ElaboratedConfiguredPackage{..}) _ common = Cabal.BenchmarkFlags- { benchmarkDistPref = toFlag builddir- , benchmarkVerbosity = toFlag verbosity+ { benchmarkCommonFlags = common , benchmarkOptions = elabBenchmarkOptions } @@ -4037,15 +4169,13 @@ setupHsReplFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> Cabal.ReplFlags-setupHsReplFlags _ sharedConfig verbosity builddir =+setupHsReplFlags _ sharedConfig common = Cabal.ReplFlags- { replProgramPaths = mempty -- unused, set at configure time+ { replCommonFlags = common+ , replProgramPaths = mempty -- unused, set at configure time , replProgramArgs = mempty -- unused, set at configure time- , replVerbosity = toFlag verbosity- , replDistPref = toFlag builddir , replReload = mempty -- only used as callback from repl , replReplOptions = pkgConfigReplOptions sharedConfig -- runtime override for repl flags }@@ -4057,88 +4187,81 @@ setupHsCopyFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> FilePath -> Cabal.CopyFlags-setupHsCopyFlags _ _ verbosity builddir destdir =+setupHsCopyFlags _ _ common destdir = Cabal.CopyFlags- { copyArgs = [] -- TODO: could use this to only copy what we enabled+ { copyCommonFlags = common , copyDest = toFlag (InstallDirs.CopyTo destdir)- , copyDistPref = toFlag builddir- , copyVerbosity = toFlag verbosity- , copyCabalFilePath = mempty } setupHsRegisterFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> Cabal.CommonSetupFlags -> FilePath -> Cabal.RegisterFlags setupHsRegisterFlags ElaboratedConfiguredPackage{..} _- verbosity- builddir+ common pkgConfFile = Cabal.RegisterFlags- { regPackageDB = mempty -- misfeature+ { registerCommonFlags = common+ , regPackageDB = mempty -- misfeature , regGenScript = mempty -- never use- , regGenPkgConf = toFlag (Just pkgConfFile)+ , regGenPkgConf = toFlag (Just (makeSymbolicPath pkgConfFile)) , regInPlace = case elabBuildStyle of BuildInplaceOnly{} -> toFlag True BuildAndInstall -> toFlag False , regPrintId = mempty -- never use- , regDistPref = toFlag builddir- , regArgs = []- , regVerbosity = toFlag verbosity- , regCabalFilePath = mempty } setupHsHaddockFlags :: ElaboratedConfiguredPackage -> ElaboratedSharedConfig- -> Verbosity- -> FilePath+ -> BuildTimeSettings+ -> Cabal.CommonSetupFlags -> Cabal.HaddockFlags-setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) (ElaboratedSharedConfig{..}) verbosity builddir =- Cabal.HaddockFlags- { haddockProgramPaths =- case lookupProgram haddockProgram pkgConfigCompilerProgs of- Nothing -> mempty- Just prg ->- [- ( programName haddockProgram- , locationPath (programLocation prg)- )- ]- , haddockProgramArgs = mempty -- unused, set at configure time- , haddockHoogle = toFlag elabHaddockHoogle- , haddockHtml = toFlag elabHaddockHtml- , haddockHtmlLocation = maybe mempty toFlag elabHaddockHtmlLocation- , haddockForHackage = toFlag elabHaddockForHackage- , haddockForeignLibs = toFlag elabHaddockForeignLibs- , haddockExecutables = toFlag elabHaddockExecutables- , haddockTestSuites = toFlag elabHaddockTestSuites- , haddockBenchmarks = toFlag elabHaddockBenchmarks- , haddockInternal = toFlag elabHaddockInternal- , haddockCss = maybe mempty toFlag elabHaddockCss- , haddockLinkedSource = toFlag elabHaddockLinkedSource- , haddockQuickJump = toFlag elabHaddockQuickJump- , haddockHscolourCss = maybe mempty toFlag elabHaddockHscolourCss- , haddockContents = maybe mempty toFlag elabHaddockContents- , haddockDistPref = toFlag builddir- , haddockKeepTempFiles = mempty -- TODO: from build settings- , haddockVerbosity = toFlag verbosity- , haddockCabalFilePath = mempty- , haddockIndex = maybe mempty toFlag elabHaddockIndex- , haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl- , haddockLib = maybe mempty toFlag elabHaddockLib- , haddockOutputDir = maybe mempty toFlag elabHaddockOutputDir- , haddockArgs = mempty- }+setupHsHaddockFlags+ (ElaboratedConfiguredPackage{..})+ (ElaboratedSharedConfig{..})+ (BuildTimeSettings{buildSettingKeepTempFiles = keepTmpFiles})+ common =+ Cabal.HaddockFlags+ { haddockCommonFlags = common+ , haddockProgramPaths =+ case lookupProgram haddockProgram pkgConfigCompilerProgs of+ Nothing -> mempty+ Just prg ->+ [+ ( programName haddockProgram+ , locationPath (programLocation prg)+ )+ ]+ , haddockProgramArgs = mempty -- unused, set at configure time+ , haddockHoogle = toFlag elabHaddockHoogle+ , haddockHtml = toFlag elabHaddockHtml+ , haddockHtmlLocation = maybe mempty toFlag elabHaddockHtmlLocation+ , haddockForHackage = toFlag elabHaddockForHackage+ , haddockForeignLibs = toFlag elabHaddockForeignLibs+ , haddockExecutables = toFlag elabHaddockExecutables+ , haddockTestSuites = toFlag elabHaddockTestSuites+ , haddockBenchmarks = toFlag elabHaddockBenchmarks+ , haddockInternal = toFlag elabHaddockInternal+ , haddockCss = maybe mempty toFlag elabHaddockCss+ , haddockLinkedSource = toFlag elabHaddockLinkedSource+ , haddockQuickJump = toFlag elabHaddockQuickJump+ , haddockHscolourCss = maybe mempty toFlag elabHaddockHscolourCss+ , haddockContents = maybe mempty toFlag elabHaddockContents+ , haddockKeepTempFiles = toFlag keepTmpFiles+ , haddockIndex = maybe mempty toFlag elabHaddockIndex+ , haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl+ , haddockResourcesDir = maybe mempty toFlag elabHaddockResourcesDir+ , haddockOutputDir = maybe mempty toFlag elabHaddockOutputDir+ , haddockUseUnicode = toFlag elabHaddockUseUnicode+ } setupHsHaddockArgs :: ElaboratedConfiguredPackage -> [String] -- TODO: Does the issue #3335 affects test as well@@ -4294,8 +4417,9 @@ , pkgHashHaddockContents = elabHaddockContents , pkgHashHaddockIndex = elabHaddockIndex , pkgHashHaddockBaseUrl = elabHaddockBaseUrl- , pkgHashHaddockLib = elabHaddockLib+ , pkgHashHaddockResourcesDir = elabHaddockResourcesDir , pkgHashHaddockOutputDir = elabHaddockOutputDir+ , pkgHashHaddockUseUnicode = elabHaddockUseUnicode } where ElaboratedConfiguredPackage{..} = normaliseConfiguredPackage shared pkg@@ -4360,13 +4484,14 @@ -- The list of non-pre-existing libraries without module holes, i.e. the -- main library and sub-libraries components of all the local packages in--- the project that do not require instantiations or are instantiations.+-- the project that are dependencies of the components being built and that do+-- not require instantiations or are instantiations. determineCoverageFor- :: PackageId- -- ^ The 'PackageId' of the package or component being configured+ :: ElaboratedConfiguredPackage+ -- ^ The package or component being configured -> ElaboratedInstallPlan -> Flag [UnitId]-determineCoverageFor configuredPkgSourceId plan =+determineCoverageFor configuredPkg plan = Flag $ mapMaybe ( \case@@ -4379,15 +4504,18 @@ $ Graph.toList $ InstallPlan.toGraph plan where- shouldCoverPkg elab@ElaboratedConfiguredPackage{elabModuleShape, elabPkgSourceId, elabLocalToProject} =+ libDeps = elabLibDependencies configuredPkg+ shouldCoverPkg elab@ElaboratedConfiguredPackage{elabModuleShape, elabPkgSourceId = pkgSID, elabLocalToProject} = elabLocalToProject && not (isIndefiniteOrInstantiation elabModuleShape) -- TODO(#9493): We can only cover libraries in the same package -- as the testsuite- && configuredPkgSourceId == elabPkgSourceId+ && elabPkgSourceId configuredPkg == pkgSID -- Libraries only! We don't cover testsuite modules, so we never need -- the paths to their mix dirs. Furthermore, we do not install testsuites... && maybe False (\case CLibName{} -> True; CNotLibName{} -> False) (elabComponentName elab)+ -- We only want coverage for libraries which are dependencies of the given one+ && pkgSID `elem` map (confSrcId . fst) libDeps isIndefiniteOrInstantiation :: ModuleShape -> Bool isIndefiniteOrInstantiation = not . Set.null . modShapeRequires
src/Distribution/Client/ProjectPlanning/SetupPolicy.hs view
@@ -59,17 +59,17 @@ -- @since 3.12.0.0 packageSetupScriptStyle :: PackageDescription -> SetupScriptStyle packageSetupScriptStyle pkg- | buildType pkg == Custom+ | customOrHooks , Just setupbi <- setupBuildInfo pkg -- does have a custom-setup stanza , not (defaultSetupDepends setupbi) -- but not one we added ourselves = SetupCustomExplicitDeps- | buildType pkg == Custom+ | customOrHooks , Just setupbi <- setupBuildInfo pkg -- does have a custom-setup stanza , defaultSetupDepends setupbi -- that we had to add ourselves = SetupCustomImplicitDeps- | buildType pkg == Custom+ | customOrHooks , Nothing <- setupBuildInfo pkg -- we get this case pre-solver = SetupCustomImplicitDeps@@ -79,6 +79,8 @@ SetupNonCustomExternalLib | otherwise = SetupNonCustomInternalLib+ where+ customOrHooks = buildType pkg `elem` [Custom, Hooks] -- | Part of our Setup.hs handling policy is implemented by getting the solver -- to work out setup dependencies for packages. The solver already handles@@ -131,11 +133,10 @@ -- For other build types (like Simple) if we still need to compile an -- external Setup.hs, it'll be one of the simple ones that only depends- -- on Cabal and base.+ -- on Cabal. SetupNonCustomExternalLib -> Just [ Dependency cabalPkgname cabalConstraint mainLibSet- , Dependency basePkgname anyVersion mainLibSet ] where cabalConstraint = orLaterVersion (csvToVersion (specVersion pkg))@@ -215,9 +216,8 @@ fromMaybe [] $ Graph.closure libDepGraph (CD.setupDeps deps) -cabalPkgname, basePkgname :: PackageName+cabalPkgname :: PackageName cabalPkgname = mkPackageName "Cabal"-basePkgname = mkPackageName "base" legacyCustomSetupPkgs :: Compiler -> Platform -> [PackageName] legacyCustomSetupPkgs compiler (Platform _ os) =
src/Distribution/Client/ProjectPlanning/Types.hs view
@@ -86,6 +86,7 @@ import Distribution.Backpack import Distribution.Backpack.ModuleShape +import Distribution.Compat.Graph (IsNode (..)) import Distribution.InstalledPackageInfo (InstalledPackageInfo) import Distribution.ModuleName (ModuleName) import Distribution.Package@@ -106,20 +107,19 @@ , ReplOptions , TestShowDetails )+import Distribution.Simple.Utils (ordNub)+import Distribution.Solver.Types.ComponentDeps (ComponentDeps)+import qualified Distribution.Solver.Types.ComponentDeps as CD+import Distribution.Solver.Types.OptionalStanza import Distribution.System import Distribution.Types.ComponentRequestedSpec import qualified Distribution.Types.LocalBuildConfig as LBC import Distribution.Types.PackageDescription (PackageDescription (..)) import Distribution.Types.PkgconfigVersion+import Distribution.Utils.Path (getSymbolicPath) import Distribution.Verbosity (normal) import Distribution.Version -import Distribution.Compat.Graph (IsNode (..))-import Distribution.Simple.Utils (ordNub)-import Distribution.Solver.Types.ComponentDeps (ComponentDeps)-import qualified Distribution.Solver.Types.ComponentDeps as CD-import Distribution.Solver.Types.OptionalStanza- import qualified Data.ByteString.Lazy as LBS import qualified Data.List.NonEmpty as NE import qualified Data.Map as Map@@ -262,13 +262,13 @@ -- that a user enabled tests globally, and some local packages -- just happen not to have any tests. (But perhaps we should -- warn if ALL local packages don't have any tests.)- , elabPackageDbs :: [Maybe PackageDB]- , elabSetupPackageDBStack :: PackageDBStack- , elabBuildPackageDBStack :: PackageDBStack- , elabRegisterPackageDBStack :: PackageDBStack- , elabInplaceSetupPackageDBStack :: PackageDBStack- , elabInplaceBuildPackageDBStack :: PackageDBStack- , elabInplaceRegisterPackageDBStack :: PackageDBStack+ , elabPackageDbs :: [Maybe PackageDBCWD]+ , elabSetupPackageDBStack :: PackageDBStackCWD+ , elabBuildPackageDBStack :: PackageDBStackCWD+ , elabRegisterPackageDBStack :: PackageDBStackCWD+ , elabInplaceSetupPackageDBStack :: PackageDBStackCWD+ , elabInplaceBuildPackageDBStack :: PackageDBStackCWD+ , elabInplaceRegisterPackageDBStack :: PackageDBStackCWD , elabPkgDescriptionOverride :: Maybe CabalFileText , -- TODO: make per-component variants of these flags elabBuildOptions :: LBC.BuildOptions@@ -300,8 +300,9 @@ , elabHaddockContents :: Maybe PathTemplate , elabHaddockIndex :: Maybe PathTemplate , elabHaddockBaseUrl :: Maybe String- , elabHaddockLib :: Maybe String+ , elabHaddockResourcesDir :: Maybe String , elabHaddockOutputDir :: Maybe FilePath+ , elabHaddockUseUnicode :: Bool , elabTestMachineLog :: Maybe PathTemplate , elabTestHumanLog :: Maybe PathTemplate , elabTestShowDetails :: Maybe TestShowDetails@@ -457,9 +458,7 @@ BuildInplaceOnly{} -> Just ( pkgPathEnvVar (elabPkgDescription pkg) "datadir"- , Just $- srcPath (elabPkgSourceLocation pkg)- </> dataDir (elabPkgDescription pkg)+ , Just dataDirPath ) where srcPath (LocalUnpackedPackage path) = path@@ -473,7 +472,17 @@ "calling dataDirEnvVarForPackage on a not-downloaded repo is an error" unpackedPath = distUnpackedSrcDirectory distDirLayout $ elabPkgSourceId pkg+ rawDataDir = getSymbolicPath $ dataDir (elabPkgDescription pkg)+ pkgDir = srcPath (elabPkgSourceLocation pkg)+ dataDirPath+ | null rawDataDir =+ pkgDir+ | otherwise =+ pkgDir </> rawDataDir +-- NB: rawDataDir may be absolute, in which case+-- (</>) drops its first argument.+ instance Package ElaboratedConfiguredPackage where packageId = elabPkgSourceId @@ -754,6 +763,7 @@ data NotPerComponentBuildType = CuzConfigureBuildType | CuzCustomBuildType+ | CuzHooksBuildType | CuzMakeBuildType deriving (Eq, Show, Generic) @@ -771,6 +781,7 @@ "build-type is " ++ case bt of CuzConfigureBuildType -> "Configure" CuzCustomBuildType -> "Custom"+ CuzHooksBuildType -> "Hooks" CuzMakeBuildType -> "Make" CuzCabalSpecVersion -> "cabal-version is less than 1.8" CuzNoBuildableComponents -> "there are no buildable components"
src/Distribution/Client/RebuildMonad.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE ScopedTypeVariables #-}
src/Distribution/Client/Reconfigure.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE DataKinds #-}+ module Distribution.Client.Reconfigure (Check (..), reconfigure) where import Distribution.Client.Compat.Prelude@@ -8,10 +10,11 @@ import Distribution.Simple.Configure (localBuildInfoFile) import Distribution.Simple.Setup (Flag, flagToMaybe, toFlag) import Distribution.Simple.Utils- ( defaultPackageDesc+ ( defaultPackageDescCwd , existsAndIsMoreRecentThan , info )+import Distribution.Utils.Path import Distribution.Client.Config (SavedConfig (..)) import Distribution.Client.Configure (readConfigFlags)@@ -21,7 +24,8 @@ ( userPackageEnvironmentFile ) import Distribution.Client.Setup- ( ConfigExFlags+ ( CommonSetupFlags (..)+ , ConfigExFlags , ConfigFlags (..) , GlobalFlags (..) )@@ -80,7 +84,7 @@ -- ^ configure action -> Verbosity -- ^ Verbosity setting- -> FilePath+ -> SymbolicPath Pkg (Dir Dist) -- ^ \"dist\" prefix -> Flag (Maybe Int) -- ^ -j flag for reinstalling add-source deps.@@ -104,7 +108,7 @@ globalFlags config = do- savedFlags@(_, _) <- readConfigFlags dist+ savedFlags@(_, _) <- readConfigFlags $ getSymbolicPath dist useNix <- fmap isJust (findNixExpr globalFlags config) alreadyInNixShell <- inNixShell@@ -121,7 +125,7 @@ -- No, because 'nixShell' doesn't spawn a new process if it is already -- running in a Nix shell. - nixInstantiate verbosity dist False globalFlags config+ nixInstantiate verbosity (getSymbolicPath dist) False globalFlags config return config else do let checks :: Check (ConfigFlags, ConfigExFlags)@@ -138,12 +142,18 @@ when frc $ configureAction flags extraArgs globalFlags return config' where+ mbWorkDir = flagToMaybe $ configWorkingDir $ savedConfigureFlags config -- Changing the verbosity does not require reconfiguration, but the new -- verbosity should be used if reconfiguring. checkVerb :: Check (ConfigFlags, b) checkVerb = Check $ \_ (configFlags, configExFlags) -> do- let configFlags' :: ConfigFlags- configFlags' = configFlags{configVerbosity = toFlag verbosity}+ let common = configCommonFlags configFlags+ configFlags' :: ConfigFlags+ configFlags' =+ configFlags+ { configCommonFlags =+ common{setupVerbosity = toFlag verbosity}+ } return (mempty, (configFlags', configExFlags)) -- Reconfiguration is required if @--build-dir@ changes.@@ -151,18 +161,25 @@ checkDist = Check $ \_ (configFlags, configExFlags) -> do -- Always set the chosen @--build-dir@ before saving the flags, -- or bad things could happen.- savedDist <- findSavedDistPref config (configDistPref configFlags)+ let common = configCommonFlags configFlags+ savedDist <- findSavedDistPref config (setupDistPref common) let distChanged :: Bool distChanged = dist /= savedDist when distChanged $ info verbosity "build directory changed" let configFlags' :: ConfigFlags- configFlags' = configFlags{configDistPref = toFlag dist}+ configFlags' =+ configFlags+ { configCommonFlags =+ common{setupDistPref = toFlag dist}+ } return (Any distChanged, (configFlags', configExFlags)) checkOutdated :: Check (ConfigFlags, b) checkOutdated = Check $ \_ flags@(configFlags, _) -> do- let buildConfig :: FilePath- buildConfig = localBuildInfoFile dist+ let common = configCommonFlags configFlags+ buildConfig, userCabalConfig :: FilePath+ buildConfig = interpretSymbolicPath mbWorkDir $ localBuildInfoFile dist+ userCabalConfig = userPackageEnvironmentFile -- Has the package ever been configured? If not, reconfiguration is -- required.@@ -173,7 +190,7 @@ -- to force reconfigure. Note that it's possible to use @cabal.config@ -- even without sandboxes. userPackageEnvironmentFileModified <-- existsAndIsMoreRecentThan userPackageEnvironmentFile buildConfig+ existsAndIsMoreRecentThan userCabalConfig buildConfig when userPackageEnvironmentFileModified $ info verbosity@@ -185,11 +202,12 @@ -- Is the configuration older than the package description? descrFile <- maybe- (defaultPackageDesc verbosity)+ (relativeSymbolicPath <$> defaultPackageDescCwd verbosity) return- (flagToMaybe (configCabalFilePath configFlags))- outdated <- existsAndIsMoreRecentThan descrFile buildConfig- when outdated $ info verbosity (descrFile ++ " was changed")+ (flagToMaybe (setupCabalFilePath common))+ let descrPath = interpretSymbolicPath mbWorkDir descrFile+ outdated <- existsAndIsMoreRecentThan descrPath buildConfig+ when outdated $ info verbosity (getSymbolicPath descrFile ++ " was changed") let failed :: Any failed =
src/Distribution/Client/Run.hs view
@@ -1,4 +1,5 @@ -----------------------------------------------------------------------------+{-# LANGUAGE DataKinds #-} ----------------------------------------------------------------------------- @@ -26,20 +27,30 @@ , PackageDescription (..) , TestSuite (..) )-import Distribution.Simple.Build.PathsModule (pkgPathEnvVar)+import Distribution.Simple (PackageDBX (..))+import Distribution.Simple.Build (addInternalBuildTools) import Distribution.Simple.BuildPaths (exeExtension) import Distribution.Simple.Compiler (CompilerFlavor (..), compilerFlavor)+import Distribution.Simple.Flag (fromFlag) import Distribution.Simple.LocalBuildInfo ( ComponentName (..) , LocalBuildInfo (..) , buildDir , depLibraryPaths+ , interpretSymbolicPathLBI+ , mbWorkDirLBI )+import Distribution.Simple.Program.Db+import Distribution.Simple.Program.Find+import Distribution.Simple.Program.Run+import Distribution.Simple.Register (internalPackageDBPath)++import Distribution.Simple.Setup (ConfigFlags (..)) import Distribution.Simple.Utils ( addLibraryPath , dieWithException , notice- , rawSystemExitWithEnv+ , rawSystemExitWithEnvCwd , warn ) import Distribution.System (Platform (..))@@ -49,8 +60,7 @@ import Distribution.Client.Errors import Distribution.Compat.Environment (getEnvironment)-import System.Directory (getCurrentDirectory)-import System.FilePath ((<.>), (</>))+import Distribution.Utils.Path -- | Return the executable to run and any extra arguments that should be -- forwarded to it. Die in case of error.@@ -133,42 +143,61 @@ -- | Run a given executable. run :: Verbosity -> LocalBuildInfo -> Executable -> [String] -> IO () run verbosity lbi exe exeArgs = do- curDir <- getCurrentDirectory- let buildPref = buildDir lbi+ let distPref = fromFlag $ configDistPref $ configFlags lbi+ buildPref = buildDir lbi pkg_descr = localPkgDescr lbi- dataDirEnvVar =- ( pkgPathEnvVar pkg_descr "datadir"- , curDir </> dataDir pkg_descr- )+ i = interpretSymbolicPathLBI lbi -- See Note [Symbolic paths] in Distribution.Utils.Path+ mbWorkDir = mbWorkDirLBI lbi+ internalPkgDb = internalPackageDBPath lbi distPref+ lbiForExe =+ lbi+ { withPackageDB = withPackageDB lbi ++ [SpecificPackageDB internalPkgDb]+ , -- Include any build-tool-depends on build tools internal to the current package.+ withPrograms =+ addInternalBuildTools+ pkg_descr+ lbi+ (buildInfo exe)+ (withPrograms lbi)+ } (path, runArgs) <- let exeName' = prettyShow $ exeName exe- in case compilerFlavor (compiler lbi) of+ in case compilerFlavor (compiler lbiForExe) of GHCJS -> do let (script, cmd, cmdArgs) = GHCJS.runCmd- (withPrograms lbi)- (buildPref </> exeName' </> exeName')+ (withPrograms lbiForExe)+ (i buildPref </> exeName' </> exeName') script' <- tryCanonicalizePath script return (cmd, cmdArgs ++ [script']) _ -> do p <- tryCanonicalizePath $- buildPref </> exeName' </> (exeName' <.> exeExtension (hostPlatform lbi))+ i buildPref </> exeName' </> (exeName' <.> exeExtension (hostPlatform lbiForExe)) return (p, []) - env <- (dataDirEnvVar :) <$> getEnvironment+ -- Compute the appropriate environment for running the executable+ existingEnv <- getEnvironment+ let progDb = withPrograms lbiForExe+ pathVar = progSearchPath progDb+ envOverrides = progOverrideEnv progDb+ newPath <- programSearchPathAsPATHVar pathVar+ overrideEnv <- fromMaybe [] <$> getEffectiveEnvironment ([("PATH", Just newPath)] ++ envOverrides)+ let env = overrideEnv ++ existingEnv+ -- Add (DY)LD_LIBRARY_PATH if needed env' <-- if withDynExe lbi+ if withDynExe lbiForExe then do- let (Platform _ os) = hostPlatform lbi- clbi <- case componentNameTargets' pkg_descr lbi (CExeName (exeName exe)) of+ let (Platform _ os) = hostPlatform lbiForExe+ clbi <- case componentNameTargets' pkg_descr lbiForExe (CExeName (exeName exe)) of [target] -> return (targetCLBI target) [] -> dieWithException verbosity CouldNotFindExecutable _ -> dieWithException verbosity FoundMultipleMatchingExes- paths <- depLibraryPaths True False lbi clbi+ paths <- depLibraryPaths True False lbiForExe clbi return (addLibraryPath os paths env) else return env+ notice verbosity $ "Running " ++ prettyShow (exeName exe) ++ "..."- rawSystemExitWithEnv verbosity path (runArgs ++ exeArgs) env'+ rawSystemExitWithEnvCwd verbosity mbWorkDir path (runArgs ++ exeArgs) env'
src/Distribution/Client/Sandbox.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} @@ -28,7 +29,8 @@ , loadConfig ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags (..) , configCompilerAux' )@@ -56,8 +58,14 @@ , fromFlagOrDefault ) import Distribution.System (Platform)+import Distribution.Utils.Path hiding+ ( (<.>)+ , (</>)+ ) -import System.Directory (getCurrentDirectory)+import System.Directory+ ( getCurrentDirectory+ ) -- * Basic sandbox functions. @@ -116,11 +124,11 @@ return config' -- | Return the saved \"dist/\" prefix, or the default prefix.-findSavedDistPref :: SavedConfig -> Flag FilePath -> IO FilePath+findSavedDistPref :: SavedConfig -> Flag (SymbolicPath Pkg (Dir Dist)) -> IO (SymbolicPath Pkg (Dir Dist)) findSavedDistPref config flagDistPref = do let defDistPref = useDistPref defaultSetupScriptOptions flagDistPref' =- configDistPref (savedConfigureFlags config)+ (setupDistPref (configCommonFlags $ savedConfigureFlags config)) `mappend` flagDistPref findDistPref defDistPref flagDistPref' @@ -134,8 +142,9 @@ :: ConfigFlags -> IO (Compiler, Platform, ProgramDb) getPersistOrConfigCompiler configFlags = do- distPref <- findDistPrefOrDefault (configDistPref configFlags)- mlbi <- maybeGetPersistBuildConfig distPref+ let common = configCommonFlags configFlags+ distPref <- findDistPrefOrDefault (setupDistPref common)+ mlbi <- maybeGetPersistBuildConfig (flagToMaybe $ setupWorkingDir common) distPref case mlbi of Nothing -> do configCompilerAux' configFlags Just lbi ->
src/Distribution/Client/Sandbox/PackageEnvironment.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} -----------------------------------------------------------------------------
src/Distribution/Client/ScriptUtils.hs view
@@ -75,7 +75,8 @@ ( runRebuild ) import Distribution.Client.Setup- ( ConfigFlags (..)+ ( CommonSetupFlags (..)+ , ConfigFlags (..) , GlobalFlags (..) ) import Distribution.Client.TargetSelector@@ -195,6 +196,9 @@ import Data.ByteString.Lazy () import qualified Data.Set as S import Distribution.Client.Errors+import Distribution.Utils.Path+ ( unsafeMakeSymbolicPath+ ) import System.Directory ( canonicalizePath , doesFileExist@@ -203,6 +207,7 @@ ) import System.FilePath ( makeRelative+ , normalise , takeDirectory , takeFileName , (</>)@@ -332,7 +337,7 @@ act tc' ctx' sels where- verbosity = fromFlagOrDefault normal (configVerbosity configFlags)+ verbosity = fromFlagOrDefault normal (setupVerbosity $ configCommonFlags configFlags) ignoreProject = flagIgnoreProject projectFlags cliConfig = commandLineFlagsToProjectConfig globalFlags flags mempty globalConfigFlag = projectConfigConfigFile (projectConfigShared cliConfig)@@ -382,7 +387,7 @@ build_dir = distBuildDirectory (distDirLayout ctx') $ (scriptDistDirParams script) ctx' compiler platform exePath = build_dir </> "bin" </> scriptExeFileName script- exePathRel = makeRelative projectRoot exePath+ exePathRel = makeRelative (normalise projectRoot) exePath executable' = executable@@ -402,7 +407,9 @@ -- but still grantee that it's deleted if they do create it -- 2) Because the path returned by createTempDirectory is not predicable getMkTmp m = return $ do- tmpDir <- getTemporaryDirectory >>= flip createTempDirectory "cabal-repl."+ tmpBaseDir <- getTemporaryDirectory+ tmpRelDir <- createTempDirectory tmpBaseDir "cabal-repl."+ let tmpDir = tmpBaseDir </> tmpRelDir putMVar m tmpDir return tmpDir rmTmp m _ = tryTakeMVar m >>= maybe (return ()) (handleDoesNotExist () . removeDirectoryRecursive)@@ -458,12 +465,12 @@ else writePackageFile return (ctx & lLocalPackages %~ (++ [SpecificSourcePackage srcPkg])) --- | Add add the executable metadata to the context and write a .cabal file.+-- | Add the executable metadata to the context and write a .cabal file. updateContextAndWriteProjectFile :: ProjectBaseContext -> FilePath -> Executable -> IO ProjectBaseContext updateContextAndWriteProjectFile ctx scriptPath scriptExecutable = do let projectRoot = distProjectRootDirectory $ distDirLayout ctx - absScript <- canonicalizePath scriptPath+ absScript <- unsafeMakeSymbolicPath . makeRelative (normalise projectRoot) <$> canonicalizePath scriptPath let sourcePackage = fakeProjectSourcePackage projectRoot
src/Distribution/Client/Security/HTTP.hs view
@@ -189,13 +189,8 @@ ++ " for " ++ show uri -#if MIN_VERSION_base(4,8,0) deriving instance Show UnexpectedResponse instance Exception UnexpectedResponse where displayException = HC.pretty-#else-instance Show UnexpectedResponse where show = HC.pretty-instance Exception UnexpectedResponse-#endif wrapCustomEx :: ( ( HC.Throws UnexpectedResponse
src/Distribution/Client/Setup.hs view
@@ -23,8 +23,10 @@ , RepoContext (..) , withRepoContext , configureCommand+ , CommonSetupFlags (..) , ConfigFlags (..) , configureOptions+ , filterCommonFlags , filterConfigureFlags , configPackageDB' , configCompilerAux'@@ -185,6 +187,7 @@ , BooleanFlag (..) , BuildFlags (..) , CleanFlags (..)+ , CommonSetupFlags (..) , ConfigFlags (..) , CopyFlags (..) , HaddockFlags (..)@@ -197,6 +200,7 @@ , optionVerbosity , readPackageDbList , showPackageDbList+ , testCommonFlags , trueArg ) import qualified Distribution.Simple.Setup as Cabal@@ -206,7 +210,9 @@ import Distribution.System (Platform) import Distribution.Types.GivenComponent ( GivenComponent (..)+ , PromisedComponent (..) )+import Distribution.Types.PackageId import Distribution.Types.PackageVersionConstraint ( PackageVersionConstraint (..) )@@ -222,6 +228,7 @@ import Distribution.Version ( Version , mkVersion+ , nullVersion ) import Control.Exception@@ -627,6 +634,34 @@ configureOptions :: ShowOrParseArgs -> [OptionField ConfigFlags] configureOptions = commandOptions configureCommand +filterCommonFlags :: CommonSetupFlags -> Version -> CommonSetupFlags+filterCommonFlags flags cabalLibVersion+ -- NB: we expect the latest version to be the most common case,+ -- so test it first.+ | cabalLibVersion >= mkVersion [3, 13, 0] = flags_latest+ | cabalLibVersion < mkVersion [1, 2, 5] = flags_1_2_5+ | cabalLibVersion < mkVersion [2, 1, 0] = flags_2_1_0+ | cabalLibVersion < mkVersion [3, 13, 0] = flags_3_13_0+ | otherwise = error "the impossible just happened" -- see first guard+ where+ flags_latest = flags+ flags_3_13_0 =+ flags_latest+ { setupWorkingDir = NoFlag+ }+ -- Cabal < 3.13 does not support the --working-dir flag.+ flags_2_1_0 =+ flags_3_13_0+ { -- Cabal < 2.1 doesn't know about -v +timestamp modifier+ setupVerbosity = fmap verboseNoTimestamp (setupVerbosity flags_3_13_0)+ }+ flags_1_2_5 =+ flags_2_1_0+ { -- Cabal < 1.25 doesn't have extended verbosity syntax+ setupVerbosity =+ fmap verboseNoFlags (setupVerbosity flags_2_1_0)+ }+ -- | Given some 'ConfigFlags' for the version of Cabal that -- cabal-install was built with, and a target older 'Version' of -- Cabal that we want to pass these flags to, convert the@@ -636,10 +671,18 @@ -- in some cases it may also mean "emulating" a feature using -- some more legacy flags. filterConfigureFlags :: ConfigFlags -> Version -> ConfigFlags-filterConfigureFlags flags cabalLibVersion+filterConfigureFlags flags cabalLibVersion =+ let flags' = filterConfigureFlags' flags cabalLibVersion+ in flags'+ { configCommonFlags =+ filterCommonFlags (configCommonFlags flags') cabalLibVersion+ }++filterConfigureFlags' :: ConfigFlags -> Version -> ConfigFlags+filterConfigureFlags' flags cabalLibVersion -- NB: we expect the latest version to be the most common case, -- so test it first.- | cabalLibVersion >= mkVersion [3, 11, 0] = flags_latest+ | cabalLibVersion >= mkVersion [3, 13, 0] = flags_latest -- The naming convention is that flags_version gives flags with -- all flags *introduced* in version eliminated. -- It is NOT the latest version of Cabal library that@@ -661,6 +704,7 @@ | cabalLibVersion < mkVersion [2, 5, 0] = flags_2_5_0 | cabalLibVersion < mkVersion [3, 7, 0] = flags_3_7_0 | cabalLibVersion < mkVersion [3, 11, 0] = flags_3_11_0+ | cabalLibVersion < mkVersion [3, 13, 0] = flags_3_13_0 | otherwise = error "the impossible just happened" -- see first guard where flags_latest =@@ -672,8 +716,26 @@ configConstraints = [] } + flags_3_13_0 =+ let scrubVersion pc =+ pc+ { promisedComponentPackage =+ (promisedComponentPackage pc){pkgVersion = nullVersion}+ }+ in -- Earlier Cabal versions don't understand about ..+ flags_latest+ { -- Building profiled shared libraries+ configProfShared = NoFlag+ , configIgnoreBuildTools = NoFlag+ , -- Older versions of Cabal don't include the package version in the+ -- --promised-dependency flag, by setting the version to nullVersion,+ -- it won't be printed.+ configPromisedDependencies =+ map scrubVersion (configPromisedDependencies flags)+ }+ flags_3_11_0 =- flags_latest+ flags_3_13_0 { -- It's too late to convert configPromisedDependencies to anything -- meaningful, so we just assert that it's empty. -- We add a Cabal>=3.11 constraint before solving when multi-repl is@@ -717,9 +779,7 @@ flags_2_1_0 = flags_2_5_0- { -- Cabal < 2.1 doesn't know about -v +timestamp modifier- configVerbosity = fmap verboseNoTimestamp (configVerbosity flags_latest)- , -- Cabal < 2.1 doesn't know about --<enable|disable>-static+ { -- Cabal < 2.1 doesn't know about --<enable|disable>-static configStaticLib = NoFlag , configSplitSections = NoFlag }@@ -728,8 +788,6 @@ flags_2_1_0 { -- Cabal < 1.25.0 doesn't know about --dynlibdir. configInstallDirs = configInstallDirs_1_25_0- , -- Cabal < 1.25 doesn't have extended verbosity syntax- configVerbosity = fmap verboseNoFlags (configVerbosity flags_2_1_0) , -- Cabal < 1.25 doesn't support --deterministic configDeterministic = mempty }@@ -747,7 +805,7 @@ -- Cabal < 1.23 doesn't know about '--profiling-detail'. -- Cabal < 1.23 has a hacked up version of 'enable-profiling' -- which we shouldn't use.- (tryLibProfiling, tryExeProfiling) = computeEffectiveProfiling flags+ (tryLibProfiling, _tryLibProfilingShared, tryExeProfiling) = computeEffectiveProfiling flags flags_1_23_0 = flags_1_25_0 { configProfDetail = NoFlag@@ -822,11 +880,15 @@ -- | Configure the compiler, but reduce verbosity during this step. configCompilerAux' :: ConfigFlags -> IO (Compiler, Platform, ProgramDb)-configCompilerAux' configFlags =+configCompilerAux' configFlags = do+ let commonFlags = configCommonFlags configFlags configCompilerAuxEx configFlags { -- FIXME: make configCompilerAux use a sensible verbosity- configVerbosity = fmap lessVerbose (configVerbosity configFlags)+ configCommonFlags =+ commonFlags+ { setupVerbosity = fmap lessVerbose (setupVerbosity commonFlags)+ } } -- ------------------------------------------------------------@@ -1097,7 +1159,15 @@ -- in some cases it may also mean "emulating" a feature using -- some more legacy flags. filterTestFlags :: TestFlags -> Version -> TestFlags-filterTestFlags flags cabalLibVersion+filterTestFlags flags cabalLibVersion =+ let flags' = filterTestFlags' flags cabalLibVersion+ in flags'+ { testCommonFlags =+ filterCommonFlags (testCommonFlags flags') cabalLibVersion+ }++filterTestFlags' :: TestFlags -> Version -> TestFlags+filterTestFlags' flags cabalLibVersion -- NB: we expect the latest version to be the most common case, -- so test it first. | cabalLibVersion >= mkVersion [3, 0, 0] = flags_latest@@ -2335,7 +2405,15 @@ args_2_3_0 = [] filterHaddockFlags :: HaddockFlags -> Version -> HaddockFlags-filterHaddockFlags flags cabalLibVersion+filterHaddockFlags flags cabalLibVersion =+ let flags' = filterHaddockFlags' flags cabalLibVersion+ in flags'+ { haddockCommonFlags =+ filterCommonFlags (haddockCommonFlags flags') cabalLibVersion+ }++filterHaddockFlags' :: HaddockFlags -> Version -> HaddockFlags+filterHaddockFlags' flags cabalLibVersion | cabalLibVersion >= mkVersion [2, 3, 0] = flags_latest | cabalLibVersion < mkVersion [2, 3, 0] = flags_2_3_0 | otherwise = flags_latest@@ -2345,7 +2423,10 @@ flags_2_3_0 = flags_latest { -- Cabal < 2.3 doesn't know about per-component haddock- haddockArgs = []+ haddockCommonFlags =+ (haddockCommonFlags flags_latest)+ { setupTargets = []+ } } haddockOptions :: ShowOrParseArgs -> [OptionField HaddockFlags]@@ -2376,8 +2457,9 @@ , "use-index" , "for-hackage" , "base-url"- , "lib"+ , "resources-dir" , "output-dir"+ , "use-unicode" ] ]
src/Distribution/Client/SetupWrapper.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} {- FOURMOLU_DISABLE -}@@ -33,10 +34,6 @@ import qualified Distribution.Backpack as Backpack import Distribution.CabalSpecVersion (cabalSpecMinimumLibraryVersion)-import Distribution.Compiler- ( CompilerFlavor (GHC, GHCJS)- , buildCompilerId- ) import qualified Distribution.Make as Make import Distribution.Package ( ComponentId@@ -64,11 +61,6 @@ , exeExtension ) import Distribution.Simple.Compiler- ( Compiler (compilerId)- , PackageDB (..)- , PackageDBStack- , compilerFlavor- ) import Distribution.Simple.Configure ( configCompilerEx )@@ -82,14 +74,16 @@ import Distribution.Simple.Program ( ProgramDb , emptyProgramDb- , getDbProgramOutput+ , getDbProgramOutputCwd , getProgramSearchPath , ghcProgram , ghcjsProgram- , runDbProgram+ , runDbProgramCwd ) import Distribution.Simple.Program.Db- ( prependProgramSearchPath+ ( configureAllKnownPrograms+ , prependProgramSearchPath+ , progOverrideEnv ) import Distribution.Simple.Program.Find ( programSearchPathAsPATHVar@@ -123,7 +117,7 @@ import Distribution.Client.Types import Distribution.Client.Utils ( existsAndIsMoreRecentThan- , inDir+ , makeRelativeToDirS #ifdef mingw32_HOST_OS , canonicalizePathNoThrow #endif@@ -133,6 +127,9 @@ , withEnvOverrides , withExtraPathEnv )+import Distribution.Utils.Path+ hiding ( (</>), (<.>) )+import qualified Distribution.Utils.Path as Cabal.Path import qualified Distribution.InstalledPackageInfo as IPI import Distribution.Simple.Command ( CommandUI (..)@@ -146,13 +143,14 @@ , renderGhcOptions ) import Distribution.Simple.Setup- ( Flag (..)+ ( Flag (..), CommonSetupFlags (..), GlobalFlags (..) ) import Distribution.Simple.Utils ( cabalVersion , copyFileVerbose , createDirectoryIfMissingVerbose , debug+ , die' , dieWithException , info , infoNoWrap@@ -176,6 +174,8 @@ import Distribution.Verbosity import Data.List (foldl1')+import qualified Data.Map.Lazy as Map+import Distribution.Simple.Setup (globalCommand) import Distribution.Client.Compat.ExecutablePath (getExecutablePath) import Distribution.Compat.Process (proc) import System.Directory (doesFileExist)@@ -250,12 +250,12 @@ -- if needed. , useCompiler :: Maybe Compiler , usePlatform :: Maybe Platform- , usePackageDB :: PackageDBStack+ , usePackageDB :: PackageDBStackCWD , usePackageIndex :: Maybe InstalledPackageIndex , useProgramDb :: ProgramDb- , useDistPref :: FilePath+ , useDistPref :: SymbolicPath Pkg (Dir Dist) , useLoggingHandle :: Maybe Handle- , useWorkingDir :: Maybe FilePath+ , useWorkingDir :: Maybe (SymbolicPath CWD (Dir Pkg)) , useExtraPathEnv :: [FilePath] -- ^ Extra things to add to PATH when invoking the setup script. , useExtraEnvOverrides :: [(String, Maybe FilePath)]@@ -339,10 +339,12 @@ } workingDir :: SetupScriptOptions -> FilePath-workingDir options =- case fromMaybe "" (useWorkingDir options) of- [] -> "."- dir -> dir+workingDir options = case useWorkingDir options of+ Just dir+ | let fp = getSymbolicPath dir+ , not $ null fp+ -> fp+ _ -> "." -- | A @SetupRunner@ implements a 'SetupMethod'. type SetupRunner =@@ -382,9 +384,10 @@ , setupPackage = pkg } where+ mbWorkDir = useWorkingDir options getPkg =- tryFindPackageDesc verbosity (fromMaybe "." (useWorkingDir options))- >>= readGenericPackageDescription verbosity+ (relativeSymbolicPath <$> tryFindPackageDesc verbosity mbWorkDir)+ >>= readGenericPackageDescription verbosity mbWorkDir >>= return . packageDescription -- | Decide if we're going to be able to do a direct internal call to the@@ -398,6 +401,7 @@ -> IO (Version, SetupMethod, SetupScriptOptions) getSetupMethod verbosity options pkg buildType' | buildType' == Custom+ || buildType' == Hooks || maybe False (cabalVersion /=) (useCabalSpecVersion options) || not (cabalVersion `withinRange` useCabalVersion options) = getExternalSetupMethod verbosity options pkg buildType'@@ -476,14 +480,20 @@ -> Setup -> CommandUI flags -- ^ command definition+ -> (flags -> CommonSetupFlags) -> flags -- ^ command flags -> [String] -- ^ extra command-line arguments -> IO ()-runSetupCommand verbosity setup cmd flags extraArgs = do- let args = commandName cmd : commandShowOptions cmd flags ++ extraArgs- runSetup verbosity setup args+runSetupCommand verbosity setup cmd getCommonFlags flags extraArgs =+ -- The 'setupWorkingDir' flag corresponds to a global argument which needs to+ -- be passed before the individual command (e.g. 'configure' or 'build').+ let common = getCommonFlags flags+ globalFlags = mempty { globalWorkingDir = setupWorkingDir common }+ args = commandShowOptions (globalCommand []) globalFlags+ ++ (commandName cmd : commandShowOptions cmd flags ++ extraArgs)+ in runSetup verbosity setup args -- | Configure a 'Setup' and run a command in one step. The command flags -- may depend on the Cabal library version in use.@@ -492,18 +502,23 @@ -> SetupScriptOptions -> Maybe PackageDescription -> CommandUI flags- -> (Version -> flags)+ -> (flags -> CommonSetupFlags)+ -> (Version -> IO flags) -- ^ produce command flags given the Cabal library version -> (Version -> [String]) -> IO ()-setupWrapper verbosity options mpkg cmd flags extraArgs = do+setupWrapper verbosity options mpkg cmd getCommonFlags getFlags getExtraArgs = do setup <- getSetup verbosity options mpkg+ let version = setupVersion setup+ extraArgs = getExtraArgs version+ flags <- getFlags version runSetupCommand verbosity setup cmd- (flags $ setupVersion setup)- (extraArgs $ setupVersion setup)+ getCommonFlags+ flags+ extraArgs -- ------------------------------------------------------------ @@ -511,6 +526,7 @@ -- ------------------------------------------------------------ +-- | Run a Setup script by directly invoking the @Cabal@ library. internalSetupMethod :: SetupRunner internalSetupMethod verbosity options bt args = do info verbosity $@@ -518,18 +534,26 @@ ++ show bt ++ " and args:\n " ++ show args- inDir (useWorkingDir options) $ do- withEnv "HASKELL_DIST_DIR" (useDistPref options) $- withExtraPathEnv (useExtraPathEnv options) $- withEnvOverrides (useExtraEnvOverrides options) $- buildTypeAction bt args+ -- NB: we do not set the working directory of the process here, because+ -- we will instead pass the -working-dir flag when invoking the Setup script.+ -- Note that the Setup script is guaranteed to support this flag, because+ -- the logic in 'getSetupMethod' guarantees we have an up-to-date Cabal version.+ --+ -- In the future, it would be desirable to also stop relying on the following+ -- pieces of process-global state, as this would allow us to use this internal+ -- setup method in concurrent contexts.+ withEnv "HASKELL_DIST_DIR" (getSymbolicPath $ useDistPref options) $+ withExtraPathEnv (useExtraPathEnv options) $+ withEnvOverrides (useExtraEnvOverrides options) $+ buildTypeAction bt args buildTypeAction :: BuildType -> ([String] -> IO ()) buildTypeAction Simple = Simple.defaultMainArgs buildTypeAction Configure =- Simple.defaultMainWithHooksArgs- Simple.autoconfUserHooks+ Simple.defaultMainWithSetupHooksArgs+ Simple.autoconfSetupHooks buildTypeAction Make = Make.defaultMainArgs+buildTypeAction Hooks = error "buildTypeAction Hooks" buildTypeAction Custom = error "buildTypeAction Custom" invoke :: Verbosity -> FilePath -> [String] -> SetupScriptOptions -> IO ()@@ -539,7 +563,7 @@ Nothing -> return () Just logHandle -> info verbosity $ "Redirecting build log to " ++ show logHandle - progDb <- prependProgramSearchPath verbosity (useExtraPathEnv options) (useProgramDb options)+ progDb <- prependProgramSearchPath verbosity (useExtraPathEnv options) (useExtraEnvOverrides options) (useProgramDb options) searchpath <- programSearchPathAsPATHVar $ getProgramSearchPath progDb@@ -547,16 +571,16 @@ env <- getEffectiveEnvironment $ [ ("PATH", Just searchpath)- , ("HASKELL_DIST_DIR", Just (useDistPref options))+ , ("HASKELL_DIST_DIR", Just (getSymbolicPath $ useDistPref options)) ]- ++ useExtraEnvOverrides options+ ++ progOverrideEnv progDb let loggingHandle = case useLoggingHandle options of Nothing -> Inherit Just hdl -> UseHandle hdl cp = (proc path args)- { Process.cwd = useWorkingDir options+ { Process.cwd = fmap getSymbolicPath $ useWorkingDir options , Process.env = env , Process.std_out = loggingHandle , Process.std_err = loggingHandle@@ -642,7 +666,7 @@ debug verbosity $ "Using explicit dependencies: " ++ show (useDependenciesExclusive options)- createDirectoryIfMissingVerbose verbosity True setupDir+ createDirectoryIfMissingVerbose verbosity True $ i setupDir (cabalLibVersion, mCabalLibInstalledPkgId, options') <- cabalLibVersionToUse debug verbosity $ "Using Cabal library version " ++ prettyShow cabalLibVersion path <-@@ -668,7 +692,7 @@ -- See 'Note: win32 clean hack' above. #ifdef mingw32_HOST_OS -- setupProgFile may not exist if we're using a cached program- setupProgFile' <- canonicalizePathNoThrow setupProgFile+ setupProgFile' <- canonicalizePathNoThrow $ i setupProgFile let win32CleanHackNeeded = (useWin32CleanHack options) -- Skip when a cached setup script is used.@@ -680,13 +704,19 @@ return (cabalLibVersion, ExternalMethod path', options'') where- setupDir = workingDir options </> useDistPref options </> "setup"- setupVersionFile = setupDir </> "setup" <.> "version"- setupHs = setupDir </> "setup" <.> "hs"- setupProgFile = setupDir </> "setup" <.> exeExtension buildPlatform+ mbWorkDir = useWorkingDir options+ -- See Note [Symbolic paths] in Distribution.Utils.Path+ i = interpretSymbolicPath mbWorkDir+ setupDir = useDistPref options Cabal.Path.</> makeRelativePathEx "setup"+ setupVersionFile = setupDir Cabal.Path.</> makeRelativePathEx ("setup" <.> "version")+ setupHs = setupDir Cabal.Path.</> makeRelativePathEx ("setup" <.> "hs")+ setupHooks = setupDir Cabal.Path.</> makeRelativePathEx ("SetupHooks" <.> "hs")+ setupProgFile = setupDir Cabal.Path.</> makeRelativePathEx ("setup" <.> exeExtension buildPlatform)+ platform = fromMaybe buildPlatform (usePlatform options) - useCachedSetupExecutable = (bt == Simple || bt == Configure || bt == Make)+ useCachedSetupExecutable =+ bt == Simple || bt == Configure || bt == Make maybeGetInstalledPackages :: SetupScriptOptions@@ -760,12 +790,12 @@ doesFileExist cachedSetupProgFile else (&&)- <$> setupProgFile `existsAndIsMoreRecentThan` setupHs- <*> setupProgFile `existsAndIsMoreRecentThan` setupVersionFile+ <$> i setupProgFile `existsAndIsMoreRecentThan` i setupHs+ <*> i setupProgFile `existsAndIsMoreRecentThan` i setupVersionFile writeSetupVersionFile :: Version -> IO () writeSetupVersionFile version =- writeFile setupVersionFile (show version ++ "\n")+ writeFile (i setupVersionFile) (show version ++ "\n") installedVersion :: IO@@ -786,7 +816,7 @@ savedVersion :: IO (Maybe Version) savedVersion = do- versionString <- readFile setupVersionFile `catchIO` \_ -> return ""+ versionString <- readFile (i setupVersionFile) `catchIO` \_ -> return "" case reads versionString of [(version, s)] | all isSpace s -> return (Just version) _ -> return Nothing@@ -799,24 +829,44 @@ unless (useHs || useLhs) $ dieWithException verbosity UpdateSetupScript let src = (if useHs then customSetupHs else customSetupLhs)- srcNewer <- src `moreRecentFile` setupHs+ srcNewer <- src `moreRecentFile` i setupHs when srcNewer $ if useHs- then copyFileVerbose verbosity src setupHs- else runSimplePreProcessor ppUnlit src setupHs verbosity+ then copyFileVerbose verbosity src (i setupHs)+ else runSimplePreProcessor ppUnlit src (i setupHs) verbosity where customSetupHs = workingDir options </> "Setup.hs" customSetupLhs = workingDir options </> "Setup.lhs"+ updateSetupScript cabalLibVersion Hooks = do++ let customSetupHooks = workingDir options </> "SetupHooks.hs"+ useHs <- doesFileExist customSetupHooks+ unless (useHs) $+ die'+ verbosity+ "Using 'build-type: Hooks' but there is no SetupHooks.hs file."+ copyFileVerbose verbosity customSetupHooks (i setupHooks)+ rewriteFileLBS verbosity (i setupHs) (buildTypeScript cabalLibVersion)+-- rewriteFileLBS verbosity hooksHs hooksScript updateSetupScript cabalLibVersion _ =- rewriteFileLBS verbosity setupHs (buildTypeScript cabalLibVersion)+ rewriteFileLBS verbosity (i setupHs) (buildTypeScript cabalLibVersion) buildTypeScript :: Version -> BS.ByteString- buildTypeScript cabalLibVersion = case bt of+ buildTypeScript cabalLibVersion = "{-# LANGUAGE NoImplicitPrelude #-}\n" <> case bt of Simple -> "import Distribution.Simple; main = defaultMain\n" Configure- | cabalLibVersion >= mkVersion [1, 3, 10] -> "import Distribution.Simple; main = defaultMainWithHooks autoconfUserHooks\n"- | otherwise -> "import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks\n"+ | cabalLibVersion >= mkVersion [3, 13, 0]+ -> "import Distribution.Simple; main = defaultMainWithSetupHooks autoconfSetupHooks\n"+ | cabalLibVersion >= mkVersion [1, 3, 10]+ -> "import Distribution.Simple; main = defaultMainWithHooks autoconfUserHooks\n"+ | otherwise+ -> "import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks\n" Make -> "import Distribution.Make; main = defaultMain\n"+ Hooks+ | cabalLibVersion >= mkVersion [3, 13, 0]+ -> "import Distribution.Simple; import SetupHooks; main = defaultMainWithSetupHooks setupHooks\n"+ | otherwise+ -> error "buildTypeScript Hooks with Cabal < 3.13" Custom -> error "buildTypeScript Custom" installedCabalVersion@@ -978,11 +1028,19 @@ createDirectoryIfMissingVerbose verbosity True setupCacheDir installExecutableFile verbosity src cachedSetupProgFile -- Do not strip if we're using GHCJS, since the result may be a script- when (maybe True ((/= GHCJS) . compilerFlavor) $ useCompiler options') $+ when (maybe True ((/= GHCJS) . compilerFlavor) $ useCompiler options') $ do+ -- Add the relevant PATH overrides for the package to the+ -- program database.+ setupProgDb+ <- prependProgramSearchPath verbosity+ (useExtraPathEnv options)+ (useExtraEnvOverrides options)+ (useProgramDb options')+ >>= configureAllKnownPrograms verbosity Strip.stripExe verbosity platform- (useProgramDb options')+ setupProgDb cachedSetupProgFile return cachedSetupProgFile where@@ -1001,12 +1059,13 @@ cabalLibVersion maybeCabalLibInstalledPkgId forceCompile = do- setupHsNewer <- setupHs `moreRecentFile` setupProgFile- cabalVersionNewer <- setupVersionFile `moreRecentFile` setupProgFile+ setupHsNewer <- i setupHs `moreRecentFile` i setupProgFile+ cabalVersionNewer <- i setupVersionFile `moreRecentFile` i setupProgFile let outOfDate = setupHsNewer || cabalVersionNewer when (outOfDate || forceCompile) $ do debug verbosity "Setup executable needs to be updated, compiling..." (compiler, progdb, options'') <- configureCompiler options'+ pkgDbs <- traverse (traverse (makeRelativeToDirS mbWorkDir)) (coercePackageDBStack (usePackageDB options'')) let cabalPkgid = PackageIdentifier (mkPackageName "Cabal") cabalLibVersion (program, extraOpts) = case compilerFlavor compiler of@@ -1018,32 +1077,24 @@ (\ipkgid -> [(ipkgid, cabalPkgid)]) maybeCabalLibInstalledPkgId - -- With 'useDependenciesExclusive' we enforce the deps specified,- -- so only the given ones can be used. Otherwise we allow the use- -- of packages in the ambient environment, and add on a dep on the- -- Cabal library (unless 'useDependencies' already contains one).- --- -- With 'useVersionMacros' we use a version CPP macros .h file.- --- -- Both of these options should be enabled for packages that have- -- opted-in and declared a custom-settup stanza.- --+ -- With 'useDependenciesExclusive' and Custom build type,+ -- we enforce the deps specified, so only the given ones can be used.+ -- Otherwise we add on a dep on the Cabal library+ -- (unless 'useDependencies' already contains one). selectedDeps- | useDependenciesExclusive options' =- useDependencies options'+ | (useDependenciesExclusive options' && (bt /= Hooks))+ -- NB: to compile build-type: Hooks packages, we need Cabal+ -- in order to compile @main = defaultMainWithSetupHooks setupHooks@.+ || any (isCabalPkgId . snd) (useDependencies options')+ = useDependencies options' | otherwise =- useDependencies options'- ++ if any- (isCabalPkgId . snd)- (useDependencies options')- then []- else cabalDep+ useDependencies options' ++ cabalDep addRenaming (ipid, _) = -- Assert 'DefUnitId' invariant ( Backpack.DefiniteUnitId (unsafeMkDefUnitId (newSimpleUnitId ipid)) , defaultRenaming )- cppMacrosFile = setupDir </> "setup_macros.h"+ cppMacrosFile = setupDir Cabal.Path.</> makeRelativePathEx "setup_macros.h" ghcOptions = mempty { -- Respect -v0, but don't crank up verbosity on GHC if@@ -1052,41 +1103,52 @@ ghcOptVerbosity = Flag (min verbosity normal) , ghcOptMode = Flag GhcModeMake , ghcOptInputFiles = toNubListR [setupHs]- , ghcOptOutputFile = Flag setupProgFile- , ghcOptObjDir = Flag setupDir- , ghcOptHiDir = Flag setupDir+ , ghcOptOutputFile = Flag $ setupProgFile+ , ghcOptObjDir = Flag $ setupDir+ , ghcOptHiDir = Flag $ setupDir , ghcOptSourcePathClear = Flag True , ghcOptSourcePath = case bt of- Custom -> toNubListR [workingDir options']+ Custom -> toNubListR [sameDirectory]+ Hooks -> toNubListR [sameDirectory] _ -> mempty- , ghcOptPackageDBs = usePackageDB options''+ , ghcOptPackageDBs = pkgDbs , ghcOptHideAllPackages = Flag (useDependenciesExclusive options') , ghcOptCabal = Flag (useDependenciesExclusive options') , ghcOptPackages = toNubListR $ map addRenaming selectedDeps+ -- With 'useVersionMacros', use a version CPP macros .h file. , ghcOptCppIncludes = toNubListR [ cppMacrosFile | useVersionMacros options' ] , ghcOptExtra = extraOpts+ , ghcOptExtensions = toNubListR $+ if bt == Custom || any (isBasePkgId . snd) selectedDeps+ then []+ else [ Simple.DisableExtension Simple.ImplicitPrelude ]+ -- Pass -WNoImplicitPrelude to avoid depending on base+ -- when compiling a Simple Setup.hs file.+ , ghcOptExtensionMap = Map.fromList . Simple.compilerExtensions $ compiler } let ghcCmdLine = renderGhcOptions compiler platform ghcOptions when (useVersionMacros options') $- rewriteFileEx verbosity cppMacrosFile $+ rewriteFileEx verbosity (i cppMacrosFile) $ generatePackageVersionMacros (pkgVersion $ package pkg) (map snd selectedDeps) case useLoggingHandle options of- Nothing -> runDbProgram verbosity program progdb ghcCmdLine+ Nothing -> runDbProgramCwd verbosity mbWorkDir program progdb ghcCmdLine -- If build logging is enabled, redirect compiler output to -- the log file.- (Just logHandle) -> do+ Just logHandle -> do output <-- getDbProgramOutput+ getDbProgramOutputCwd verbosity+ mbWorkDir program progdb ghcCmdLine hPutStr logHandle output- return setupProgFile+ return $ i setupProgFile -isCabalPkgId :: PackageIdentifier -> Bool+isCabalPkgId, isBasePkgId :: PackageIdentifier -> Bool isCabalPkgId (PackageIdentifier pname _) = pname == mkPackageName "Cabal"+isBasePkgId (PackageIdentifier pname _) = pname == mkPackageName "base"
src/Distribution/Client/SourceFiles.hs view
@@ -103,7 +103,7 @@ } ) = do- traverse_ needIfExists fs+ traverse_ (needIfExists . getSymbolicPath) fs needBuildInfo pkg_descr bi [] needExecutable :: PackageDescription -> Executable -> Rebuild ()@@ -116,14 +116,14 @@ ) = do needBuildInfo pkg_descr bi []- needMainFile bi mainPath+ needMainFile bi $ getSymbolicPath mainPath needTestSuite :: PackageDescription -> TestSuite -> Rebuild () needTestSuite pkg_descr t = case testInterface t of TestSuiteExeV10 _ mainPath -> do needBuildInfo pkg_descr bi []- needMainFile bi mainPath+ needMainFile bi $ getSymbolicPath mainPath TestSuiteLibV09 _ m -> needBuildInfo pkg_descr bi [m] TestSuiteUnsupported _ -> return () -- soft fail@@ -157,7 +157,7 @@ case benchmarkInterface bm of BenchmarkExeV10 _ mainPath -> do needBuildInfo pkg_descr bi []- needMainFile bi mainPath+ needMainFile bi $ getSymbolicPath mainPath BenchmarkUnsupported _ -> return () -- soft fail where bi :: BuildInfo@@ -170,18 +170,21 @@ findNeededModules builtinHaskellSuffixes findNeededModules builtinHaskellBootSuffixes root <- askRoot- expandedExtraSrcFiles <- liftIO $ fmap concat . for (extraSrcFiles pkg_descr) $ \fpath -> matchDirFileGlobWithDie normal (\_ _ -> return []) (specVersion pkg_descr) root fpath+ expandedExtraSrcFiles <- liftIO $+ fmap concat . for (extraSrcFiles pkg_descr) $+ \fpath ->+ matchDirFileGlobWithDie normal (\_ _ -> return []) (specVersion pkg_descr) (Just $ makeSymbolicPath root) fpath traverse_ needIfExists $ concat- [ cSources bi- , cxxSources bi- , jsSources bi- , cmmSources bi- , asmSources bi- , expandedExtraSrcFiles+ [ map getSymbolicPath $ cSources bi+ , map getSymbolicPath $ cxxSources bi+ , map getSymbolicPath $ jsSources bi+ , map getSymbolicPath $ cmmSources bi+ , map getSymbolicPath $ asmSources bi+ , map getSymbolicPath $ expandedExtraSrcFiles ]- for_ (installIncludes bi) $ \f ->- findFileMonitored ("." : includeDirs bi) f+ for_ (fmap getSymbolicPath $ installIncludes bi) $ \f ->+ findFileMonitored ("." : fmap getSymbolicPath (includeDirs bi)) f >>= maybe (return ()) need where findNeededModules :: [Suffix] -> Rebuild ()
src/Distribution/Client/SrcDist.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-} -- | Utilities to implement cabal @v2-sdist@. module Distribution.Client.SrcDist@@ -12,16 +13,19 @@ import Control.Monad.State.Lazy (StateT, evalStateT, gets, modify) import Control.Monad.Trans (liftIO) import Control.Monad.Writer.Lazy (WriterT, execWriterT, tell)-import System.FilePath (normalise, takeDirectory, (</>)) -import Distribution.Client.Utils (tryFindAddSourcePackageDesc)+import Distribution.Client.Errors+import Distribution.Client.Utils (tryReadAddSourcePackageDesc) import Distribution.Package (Package (packageId)) import Distribution.PackageDescription.Configuration (flattenPackageDescription)-import Distribution.Simple.PackageDescription (readGenericPackageDescription) import Distribution.Simple.PreProcess (knownSuffixHandlers) import Distribution.Simple.SrcDist (listPackageSourcesWithDie) import Distribution.Simple.Utils (dieWithException) import Distribution.Types.GenericPackageDescription (GenericPackageDescription)+import Distribution.Utils.Path+ ( getSymbolicPath+ , makeSymbolicPath+ ) import qualified Codec.Archive.Tar as Tar import qualified Codec.Archive.Tar.Entry as Tar@@ -29,7 +33,8 @@ import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.Set as Set-import Distribution.Client.Errors+import System.Directory (canonicalizePath)+import System.FilePath -- | List all source files of a given add-source dependency. Exits with error if -- something is wrong (e.g. there is no .cabal file in the given directory).@@ -38,12 +43,17 @@ -- TODO: when sandboxes are removed, move to ProjectBuilding. allPackageSourceFiles :: Verbosity -> FilePath -> IO [FilePath] allPackageSourceFiles verbosity packageDir = do- pd <- do- let err = "Error reading source files of package."- desc <- tryFindAddSourcePackageDesc verbosity packageDir err- flattenPackageDescription `fmap` readGenericPackageDescription verbosity desc-- listPackageSourcesWithDie verbosity (\_ _ -> return []) packageDir pd knownSuffixHandlers+ let err = "Error reading source files of package."+ gpd <- tryReadAddSourcePackageDesc verbosity packageDir err+ let pd = flattenPackageDescription gpd+ srcs <-+ listPackageSourcesWithDie+ verbosity+ (\_ _ -> return [])+ (Just $ makeSymbolicPath packageDir)+ pd+ knownSuffixHandlers+ return $ map getSymbolicPath srcs -- | Create a tarball for a package in a directory packageDirToSdist@@ -57,10 +67,10 @@ packageDirToSdist verbosity gpd dir = do -- let thisDie :: Verbosity -> String -> IO a -- thisDie v s = die' v $ "sdist of " <> prettyShow (packageId gpd) ++ ": " ++ s-- files' <- listPackageSourcesWithDie verbosity dieWithException dir (flattenPackageDescription gpd) knownSuffixHandlers+ absDir <- canonicalizePath dir+ files' <- listPackageSourcesWithDie verbosity dieWithException (Just $ makeSymbolicPath absDir) (flattenPackageDescription gpd) knownSuffixHandlers let files :: [FilePath]- files = nub $ sort $ map normalise files'+ files = nub $ sort $ map (normalise . getSymbolicPath) files' let entriesM :: StateT (Set.Set FilePath) (WriterT [Tar.Entry] IO) () entriesM = do
src/Distribution/Client/Store.hs view
@@ -48,10 +48,8 @@ #else import System.IO (openFile, IOMode(ReadWriteMode), hClose) import GHC.IO.Handle.Lock (hLock, hTryLock, LockMode(ExclusiveLock))-#if MIN_VERSION_base(4,11,0) import GHC.IO.Handle.Lock (hUnlock) #endif-#endif -- $concurrency --@@ -217,7 +215,7 @@ -- Atomically rename the temp dir to the final store entry location. renameDirectory incomingEntryDir finalEntryDir for_ otherFiles $ \file -> do- let finalStoreFile = storeDirectory compiler </> makeRelative (incomingTmpDir </> (dropDrive (storeDirectory compiler))) file+ let finalStoreFile = storeDirectory compiler </> makeRelative (normalise $ incomingTmpDir </> (dropDrive (storeDirectory compiler))) file createDirectoryIfMissing True (takeDirectory finalStoreFile) renameFile file finalStoreFile
src/Distribution/Client/TargetSelector.hs view
@@ -131,6 +131,8 @@ , ordNub ) import Distribution.Utils.Path+ ( getSymbolicPath+ ) import qualified System.Directory as IO ( canonicalizePath , doesDirectoryExist@@ -138,18 +140,18 @@ , getCurrentDirectory ) import System.FilePath- ( dropTrailingPathSeparator- , equalFilePath- , normalise- , (<.>)- , (</>)- )-import System.FilePath as FilePath ( dropExtension+ , dropTrailingPathSeparator+ , equalFilePath , joinPath+ , normalise , splitDirectories- , splitPath+ )+import qualified System.FilePath as FilePath+ ( splitPath , takeExtension+ , (<.>)+ , (</>) ) import Text.EditDistance ( defaultEditCosts@@ -475,7 +477,7 @@ fileStatus f = do fexists <- doesFileExist f dexists <- doesDirectoryExist f- case splitPath f of+ case FilePath.splitPath f of _ | fexists -> FileStatusExistsFile <$> canonicalizePath f | dexists -> FileStatusExistsDir <$> canonicalizePath f@@ -923,7 +925,7 @@ let ql = targetQualLevel usertarget in foldSyntax (<|>)- (<//>)+ (</>) (\ql' match _ -> guard (ql == ql') >> match usertarget) syntax where@@ -1892,8 +1894,8 @@ dirabs <- canonicalizePath dir dirrel <- makeRelativeToCwd dirActions dirabs -- TODO: ought to get this earlier in project reading- let fileabs = dirabs </> prettyShow (packageName pkg) <.> "cabal"- filerel = dirrel </> prettyShow (packageName pkg) <.> "cabal"+ let fileabs = dirabs FilePath.</> prettyShow (packageName pkg) FilePath.<.> "cabal"+ filerel = dirrel FilePath.</> prettyShow (packageName pkg) FilePath.<.> "cabal" exists <- doesFileExist fileabs return ( Just (dirabs, dirrel)@@ -1920,8 +1922,8 @@ , cinfoSrcDirs = ordNub (map getSymbolicPath (hsSourceDirs bi)) , cinfoModules = ordNub (componentModules c) , cinfoHsFiles = ordNub (componentHsFiles c)- , cinfoCFiles = ordNub (cSources bi)- , cinfoJsFiles = ordNub (jsSources bi)+ , cinfoCFiles = ordNub (map getSymbolicPath $ cSources bi)+ , cinfoJsFiles = ordNub (map getSymbolicPath $ jsSources bi) } | c <- pkgComponents pkg , let bi = componentBuildInfo c@@ -1945,19 +1947,19 @@ componentModules (CBench bench) = benchmarkModules bench componentHsFiles :: Component -> [FilePath]-componentHsFiles (CExe exe) = [modulePath exe]+componentHsFiles (CExe exe) = [getSymbolicPath $ modulePath exe] componentHsFiles ( CTest TestSuite { testInterface = TestSuiteExeV10 _ mainfile }- ) = [mainfile]+ ) = [getSymbolicPath mainfile] componentHsFiles ( CBench Benchmark { benchmarkInterface = BenchmarkExeV10 _ mainfile }- ) = [mainfile]+ ) = [getSymbolicPath mainfile] componentHsFiles _ = [] ------------------------------@@ -2082,7 +2084,7 @@ guardPackageFile :: String -> FileStatus -> Match () guardPackageFile _ (FileStatusExistsFile file)- | takeExtension file == ".cabal" =+ | FilePath.takeExtension file == ".cabal" = increaseConfidence guardPackageFile str _ = matchErrorExpected "package .cabal file" str @@ -2090,10 +2092,10 @@ matchPackage pinfo = \str fstatus -> orNoThingIn "project" "" $ matchPackageName pinfo str- <//> ( matchPackageNameUnknown str+ </> ( matchPackageNameUnknown str <|> matchPackageDir pinfo str fstatus <|> matchPackageFile pinfo str fstatus- )+ ) matchPackageName :: [KnownPackage] -> String -> Match KnownPackage matchPackageName ps = \str -> do@@ -2259,7 +2261,7 @@ -> Match (FilePath, KnownComponent) matchComponentOtherFile cs = matchFile- [ (normalise (srcdir </> file), c)+ [ (normalise (srcdir FilePath.</> file), c) | c <- cs , srcdir <- cinfoSrcDirs c , file <-@@ -2275,7 +2277,7 @@ -> Match (FilePath, KnownComponent) matchComponentModuleFile cs str = do matchFile- [ (normalise (d </> toFilePath m), c)+ [ (normalise (d FilePath.</> toFilePath m), c) | c <- cs , d <- cinfoSrcDirs c , m <- cinfoModules c@@ -2389,10 +2391,10 @@ mzero = empty mplus = matchPlus -(<//>) :: Match a -> Match a -> Match a-(<//>) = matchPlusShadowing+(</>) :: Match a -> Match a -> Match a+(</>) = matchPlusShadowing -infixl 3 <//>+infixl 3 </> -- | Combine two matchers. Exact matches are used over inexact matches -- but if we have multiple exact, or inexact then the we collect all the
src/Distribution/Client/Targets.hs view
@@ -78,7 +78,7 @@ ( RepoContext (..) ) import qualified Distribution.Client.Tar as Tar-import Distribution.Client.Utils (tryFindPackageDesc)+import Distribution.Client.Utils (tryReadGenericPackageDesc) import Distribution.Types.PackageVersionConstraint ( PackageVersionConstraint (..) )@@ -100,15 +100,13 @@ import Distribution.PackageDescription.Parsec ( parseGenericPackageDescriptionMaybe )-import Distribution.Simple.PackageDescription- ( readGenericPackageDescription- ) import qualified Data.ByteString.Lazy as BS import qualified Data.Map as Map import Distribution.Client.Errors import qualified Distribution.Client.GZipUtils as GZipUtils import qualified Distribution.Compat.CharParsing as P+import Distribution.Utils.Path (makeSymbolicPath) import Network.URI ( URI (..) , URIAuth (..)@@ -350,7 +348,7 @@ return [PackageTargetLocation (LocalUnpackedPackage dir)] UserTargetLocalCabalFile file -> do let dir = takeDirectory file- _ <- tryFindPackageDesc verbosity dir (localPackageError dir) -- just as a check+ _ <- tryReadGenericPackageDesc verbosity (makeSymbolicPath dir) (localPackageError dir) -- just as a check return [PackageTargetLocation (LocalUnpackedPackage dir)] UserTargetLocalTarball tarballFile -> return [PackageTargetLocation (LocalTarballPackage tarballFile)]@@ -389,9 +387,7 @@ modifyLocation :: ResolvedPkgLoc -> IO UnresolvedSourcePackage modifyLocation location = case location of LocalUnpackedPackage dir -> do- pkg <-- tryFindPackageDesc verbosity dir (localPackageError dir)- >>= readGenericPackageDescription verbosity+ pkg <- tryReadGenericPackageDesc verbosity (makeSymbolicPath dir) (localPackageError dir) return SourcePackage { srcpkgPackageId = packageId pkg
src/Distribution/Client/Utils.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE ScopedTypeVariables #-} module Distribution.Client.Utils@@ -7,7 +8,6 @@ , duplicates , duplicatesBy , readMaybe- , inDir , withEnv , withEnvOverrides , logDirChange@@ -19,6 +19,7 @@ , makeAbsoluteToCwd , makeRelativeToCwd , makeRelativeToDir+ , makeRelativeToDirS , makeRelativeCanonical , filePathToByteString , byteStringToFilePath@@ -26,8 +27,8 @@ , canonicalizePathNoThrow , moreRecentFile , existsAndIsMoreRecentThan- , tryFindAddSourcePackageDesc- , tryFindPackageDesc+ , tryReadAddSourcePackageDesc+ , tryReadGenericPackageDesc , relaxEncodingErrors , ProgressPhase (..) , progressMessage@@ -65,20 +66,33 @@ ( elemIndex , groupBy )+import Distribution.Client.Errors import Distribution.Compat.Environment import Distribution.Compat.Time (getModTime) import Distribution.Simple.Setup (Flag (..)) import Distribution.Simple.Utils (dieWithException, findPackageDesc, noticeNoWrap)+import Distribution.Utils.Path+ ( CWD+ , FileOrDir (..)+ , Pkg+ , RelativePath+ , SymbolicPath+ , getSymbolicPath+ , makeSymbolicPath+ , relativeSymbolicPath+ , sameDirectory+ , symbolicPathRelative_maybe+ ) import Distribution.Version+ import System.Directory ( canonicalizePath , doesDirectoryExist , doesFileExist- , getCurrentDirectory , getDirectoryContents , removeFile- , setCurrentDirectory )+import qualified System.Directory as Directory import System.FilePath import System.IO ( Handle@@ -107,7 +121,8 @@ import qualified System.IO.Error as IOError #endif import qualified Data.Set as Set-import Distribution.Client.Errors+import Distribution.Simple.PackageDescription (readGenericPackageDescription)+import Distribution.Types.GenericPackageDescription (GenericPackageDescription) -- | Generic merging utility. For sorted input lists this is a full outer join. mergeBy :: forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [MergeResult a b]@@ -159,17 +174,6 @@ (\(name, _) -> removeExistingFile name) (\(name, h) -> hClose h >> action name) --- | Executes the action in the specified directory.------ Warning: This operation is NOT thread-safe, because current--- working directory is a process-global concept.-inDir :: Maybe FilePath -> IO a -> IO a-inDir Nothing m = m-inDir (Just d) m = do- old <- getCurrentDirectory- setCurrentDirectory d- m `Exception.finally` setCurrentDirectory old- -- | Executes the action with an environment variable set to some -- value. --@@ -249,14 +253,14 @@ makeAbsoluteToCwd path | isAbsolute path = return path | otherwise = do- cwd <- getCurrentDirectory+ cwd <- Directory.getCurrentDirectory return $! cwd </> path -- | Given a path (relative or absolute), make it relative to the current -- directory, including using @../..@ if necessary. makeRelativeToCwd :: FilePath -> IO FilePath makeRelativeToCwd path =- makeRelativeCanonical <$> canonicalizePath path <*> getCurrentDirectory+ makeRelativeCanonical <$> canonicalizePath path <*> Directory.getCurrentDirectory -- | Given a path (relative or absolute), make it relative to the given -- directory, including using @../..@ if necessary.@@ -264,6 +268,16 @@ makeRelativeToDir path dir = makeRelativeCanonical <$> canonicalizePath path <*> canonicalizePath dir +-- | makeRelativeToDir for SymbolicPath+makeRelativeToDirS :: Maybe (SymbolicPath CWD (Dir dir)) -> SymbolicPath CWD to -> IO (SymbolicPath dir to)+makeRelativeToDirS Nothing s = makeRelativeToDirS (Just sameDirectory) s+makeRelativeToDirS (Just root) p =+ case symbolicPathRelative_maybe p of+ -- TODO: Use AbsolutePath+ Nothing -> return $ makeSymbolicPath (getSymbolicPath p)+ Just rel_path ->+ makeSymbolicPath <$> makeRelativeToDir (getSymbolicPath root) (getSymbolicPath rel_path)+ -- | Given a canonical absolute path and canonical absolute dir, make the path -- relative to the directory, including using @../..@ if necessary. Returns -- the original absolute path if it is not on the same drive as the given dir.@@ -377,20 +391,41 @@ return () -- | Like 'tryFindPackageDesc', but with error specific to add-source deps.-tryFindAddSourcePackageDesc :: Verbosity -> FilePath -> String -> IO FilePath-tryFindAddSourcePackageDesc verbosity depPath err =- tryFindPackageDesc verbosity depPath $- err- ++ "\n"- ++ "Failed to read cabal file of add-source dependency: "- ++ depPath+tryReadAddSourcePackageDesc+ :: Verbosity+ -> FilePath+ -> String+ -> IO GenericPackageDescription+tryReadAddSourcePackageDesc verbosity depPath err = do+ let pkgDir = makeSymbolicPath depPath+ pkgDescPath <-+ try_find_package_desc verbosity pkgDir $+ err+ ++ "\n"+ ++ "Failed to read cabal file of add-source dependency: "+ ++ depPath+ readGenericPackageDescription verbosity (Just pkgDir) (relativeSymbolicPath pkgDescPath) --- | Try to find a @.cabal@ file, in directory @depPath@. Fails if one cannot be+-- | Try to read a @.cabal@ file, in directory @depPath@. Fails if one cannot be -- found, with @err@ prefixing the error message. This function simply allows -- us to give a more descriptive error than that provided by @findPackageDesc@.-tryFindPackageDesc :: Verbosity -> FilePath -> String -> IO FilePath-tryFindPackageDesc verbosity depPath err = do- errOrCabalFile <- findPackageDesc depPath+tryReadGenericPackageDesc+ :: Verbosity+ -> SymbolicPath CWD (Dir Pkg)+ -> String+ -> IO GenericPackageDescription+tryReadGenericPackageDesc verbosity pkgDir err = do+ pkgDescPath <- try_find_package_desc verbosity pkgDir err+ readGenericPackageDescription verbosity (Just pkgDir) (relativeSymbolicPath pkgDescPath)++-- | Internal helper function for 'tryReadAddSourcePackageDesc' and 'tryReadGenericPackageDesc'.+try_find_package_desc+ :: Verbosity+ -> SymbolicPath CWD (Dir Pkg)+ -> String+ -> IO (RelativePath Pkg File)+try_find_package_desc verbosity pkgDir err = do+ errOrCabalFile <- findPackageDesc (Just pkgDir) case errOrCabalFile of Right file -> return file Left _ -> dieWithException verbosity $ TryFindPackageDescErr err@@ -411,13 +446,20 @@ noticeNoWrap verbosity $ phaseStr ++ subject ++ "\n" where phaseStr = case phase of- ProgressDownloading -> "Downloading "- ProgressDownloaded -> "Downloaded "- ProgressStarting -> "Starting "- ProgressBuilding -> "Building "- ProgressHaddock -> "Haddock "- ProgressInstalling -> "Installing "- ProgressCompleted -> "Completed "+ ProgressDownloading ->+ "Downloading "+ ProgressDownloaded ->+ "Downloaded "+ ProgressStarting ->+ "Starting "+ ProgressBuilding ->+ "Building "+ ProgressHaddock ->+ "Haddock "+ ProgressInstalling ->+ "Installing "+ ProgressCompleted ->+ "Completed " -- | Given a version, return an API-compatible (according to PVP) version range. --
src/Distribution/Client/VCS.hs view
@@ -206,7 +206,7 @@ -> VCS Program -> IO (VCS ConfiguredProgram) configureVCS verbosity progPaths vcs@VCS{vcsProgram = prog} = do- progPath <- prependProgramSearchPath verbosity progPaths emptyProgramDb+ progPath <- prependProgramSearchPath verbosity progPaths [] emptyProgramDb asVcsConfigured <$> requireProgram verbosity prog progPath where asVcsConfigured (prog', _) = vcs{vcsProgram = prog'}
src/Distribution/Deprecated/ParseUtils.hs view
@@ -121,19 +121,12 @@ pure = ParseOk [] (<*>) = ap -{- FOURMOLU_DISABLE -} instance Monad ParseResult where return = pure ParseFailed err >>= _ = ParseFailed err ParseOk ws x >>= f = case f x of ParseFailed err -> ParseFailed err ParseOk ws' x' -> ParseOk (ws' ++ ws) x'-#if !(MIN_VERSION_base(4,9,0))- fail = parseResultFail-#elif !(MIN_VERSION_base(4,13,0))- fail = Fail.fail-#endif-{- FOURMOLU_ENABLE -} instance Foldable ParseResult where foldMap _ (ParseFailed _) = mempty
src/Distribution/Deprecated/ReadP.hs view
@@ -119,12 +119,6 @@ (Result x p) >>= k = k x `mplus` (p >>= k) (Final r) >>= k = final [ys' | (x, s) <- r, ys' <- run (k x) s] -#if !(MIN_VERSION_base(4,9,0))- fail _ = Fail-#elif !(MIN_VERSION_base(4,13,0))- fail = Fail.fail-#endif- instance Fail.MonadFail (P s) where fail _ = Fail @@ -179,12 +173,6 @@ instance Monad (Parser r s) where return = pure R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k))--#if !(MIN_VERSION_base(4,9,0))- fail _ = R (const Fail)-#elif !(MIN_VERSION_base(4,13,0))- fail = Fail.fail-#endif instance Fail.MonadFail (Parser r s) where fail _ = R (const Fail)
tests/IntegrationTests2.hs view
@@ -59,7 +59,7 @@ import Distribution.Version import Distribution.ModuleName (ModuleName) import Distribution.Text-import Distribution.Utils.Path+import Distribution.Utils.Path (unsafeMakeSymbolicPath) import qualified Distribution.Client.CmdHaddockProject as CmdHaddockProject import Distribution.Client.Setup (globalStoreDir) import Distribution.Client.GlobalFlags (defaultGlobalFlags)@@ -74,7 +74,9 @@ import Control.Exception hiding (assert) import System.FilePath import System.Directory+import System.Environment (setEnv) import System.IO (hPutStrLn, stderr)+import System.Process (callProcess) import Test.Tasty import Test.Tasty.HUnit@@ -93,7 +95,16 @@ #endif main :: IO ()-main =+main = do+ -- this is needed to ensure tests aren't affected by the user's cabal config+ cwd <- getCurrentDirectory+ let configDir = cwd </> basedir </> "config" </> "cabal-config"+ setEnv "CABAL_DIR" configDir+ removeDirectoryRecursive configDir <|> return ()+ createDirectoryIfMissing True configDir+ -- sigh+ callProcess "cabal" ["user-config", "init", "-f"]+ callProcess "cabal" ["update"] defaultMainWithIngredients (defaultIngredients ++ [includingOptions projectConfigOptionDescriptions]) (withProjectConfig $ \config ->@@ -488,7 +499,7 @@ withCFiles :: Executable -> [FilePath] -> Executable withCFiles exe files =- exe { buildInfo = (buildInfo exe) { cSources = files } }+ exe { buildInfo = (buildInfo exe) { cSources = map unsafeMakeSymbolicPath files } } withHsSrcDirs :: Executable -> [FilePath] -> Executable withHsSrcDirs exe srcDirs =@@ -1971,8 +1982,8 @@ -- Tests whether config options are commented or not testConfigOptionComments :: Assertion testConfigOptionComments = do- _ <- createDefaultConfigFile verbosity [] (basedir </> "config/default-config")- defaultConfigFile <- readFile (basedir </> "config/default-config")+ _ <- createDefaultConfigFile verbosity [] (basedir </> "config" </> "default-config")+ defaultConfigFile <- readFile (basedir </> "config" </> "default-config") " url" @=? findLineWith False "url" defaultConfigFile " -- secure" @=? findLineWith True "secure" defaultConfigFile@@ -2099,7 +2110,9 @@ " -- contents-location" @=? findLineWith True "contents-location" defaultConfigFile " -- index-location" @=? findLineWith True "index-location" defaultConfigFile " -- base-url" @=? findLineWith True "base-url" defaultConfigFile+ " -- resources-dir" @=? findLineWith True "resources-dir" defaultConfigFile " -- output-dir" @=? findLineWith True "output-dir" defaultConfigFile+ " -- use-unicode" @=? findLineWith True "use-unicode" defaultConfigFile " -- interactive" @=? findLineWith True "interactive" defaultConfigFile " -- quiet" @=? findLineWith True "quiet" defaultConfigFile
tests/UnitTests/Distribution/Client/Configure.hs view
@@ -42,7 +42,8 @@ { configFlags = mempty { configOptimization = Flag MaximumOptimisation- , configVerbosity = Flag silent+ , configCommonFlags =+ mempty{setupVerbosity = Flag silent} } } projConfig <- configureAction' flags [] defaultGlobalFlags@@ -59,7 +60,8 @@ , configFlags = mempty { configOptimization = Flag NoOptimisation- , configVerbosity = Flag silent+ , configCommonFlags =+ mempty{setupVerbosity = Flag silent} } } (_, ProjectConfig{..}) <- configureAction' flags [] defaultGlobalFlags@@ -75,7 +77,8 @@ } , configFlags = mempty- { configVerbosity = Flag silent+ { configCommonFlags =+ mempty{setupVerbosity = Flag silent} } } (_, ProjectConfig{..}) <- configureAction' flags [] defaultGlobalFlags@@ -87,7 +90,8 @@ defaultTestFlags { configFlags = mempty- { configVerbosity = Flag silent+ { configCommonFlags =+ mempty{setupVerbosity = Flag silent} } } (_, ProjectConfig{..}) <- configureAction' flags [] defaultGlobalFlags@@ -99,7 +103,8 @@ defaultTestFlags { configFlags = mempty- { configVerbosity = Flag silent+ { configCommonFlags =+ mempty{setupVerbosity = Flag silent} } } backup = projectDir </> "cabal.project.local~"@@ -118,7 +123,8 @@ defaultTestFlags { configFlags = mempty- { configVerbosity = Flag silent+ { configCommonFlags =+ mempty{setupVerbosity = Flag silent} , configProgramArgs = [("ghc", ghcFlags)] } }
tests/UnitTests/Distribution/Client/FileMonitor.hs view
@@ -32,7 +32,7 @@ tests mtimeChange = [ testGroup "Structured hashes"- [ testCase "MonitorStateFile" $ structureHash (Proxy :: Proxy MonitorStateFile) @?= Fingerprint 0xe4108804c34962f6 0x06e94f8fc9e48e13+ [ testCase "MonitorStateFile" $ structureHash (Proxy :: Proxy MonitorStateFile) @?= Fingerprint 0xe1339b9dcfdfe19d 0x9135a5f30da7ca82 , testCase "MonitorStateGlob" $ structureHash (Proxy :: Proxy MonitorStateGlob) @?= Fingerprint fingerprintStateGlob1 fingerprintStateGlob2 , testCase "MonitorStateFileSet" $ structureHash (Proxy :: Proxy MonitorStateFileSet) @?= Fingerprint fingerprintStateFileSet1 fingerprintStateFileSet2 ]@@ -88,17 +88,10 @@ Windows -> expectFailBecause msg _ -> id fingerprintStateGlob1, fingerprintStateGlob2, fingerprintStateFileSet1, fingerprintStateFileSet2 :: Word64-#if MIN_VERSION_base(4,19,0)- fingerprintStateGlob1 = 0x4ebc6a7d12bb2132- fingerprintStateGlob2 = 0x2c2292eeda0a9319- fingerprintStateFileSet1 = 0x01df5796f9030851- fingerprintStateFileSet2 = 0x2f5c472be17bee98-#else- fingerprintStateGlob1 = 0xf32c0d1644dd9ee5- fingerprintStateGlob2 = 0x0f2494f7b6031fb6- fingerprintStateFileSet1 = 0x06d4a13275c24282- fingerprintStateFileSet2 = 0x791b2a88684b5f37-#endif+ fingerprintStateGlob1 = 0x1f9edda22b7e8de6+ fingerprintStateGlob2 = 0xda1d085c9fc6f5db+ fingerprintStateFileSet1 = 0x00ac4a0df546905d+ fingerprintStateFileSet2 = 0x5b2b2df018b1fa83 -- Check the file system behaves the way we expect it to
tests/UnitTests/Distribution/Client/Init.hs view
@@ -17,6 +17,7 @@ import Distribution.Client.Init.Types import Distribution.Client.Sandbox import Distribution.Client.Setup+import Distribution.Simple.Compiler import Distribution.Verbosity tests :: IO [TestTree]@@ -32,7 +33,7 @@ withRepoContext v globalFlags' $ \repoCtx -> do let pkgDb = configPackageDB' confFlags' - pkgIx <- getInstalledPackages v comp pkgDb progdb+ pkgIx <- getInstalledPackages v comp (interpretPackageDBStack Nothing pkgDb) progdb srcDb <- getSourcePackages v repoCtx return
tests/UnitTests/Distribution/Client/Init/FileCreators.hs view
@@ -81,7 +81,7 @@ "False" ] - case flip _runPrompt inputs $ do+ case flip runPrompt inputs $ do projSettings <- createProject comp silent pkgIx srcDb dummyFlags' writeProject projSettings of Left (BreakException ex) -> assertFailure $ show ex
tests/UnitTests/Distribution/Client/Init/Golden.hs view
@@ -105,7 +105,7 @@ ] where runPkgDesc opts flags args = do- case _runPrompt (genPkgDescription flags srcDb) args of+ case runPrompt (genPkgDescription flags srcDb) args of Left e -> assertFailure $ show e Right (pkg, _) -> mkStanza $ mkPkgDescription opts pkg @@ -146,7 +146,7 @@ ] where runGoldenExe opts args flags =- case _runPrompt (genExeTarget flags pkgIx) args of+ case runPrompt (genExeTarget flags pkgIx) args of Right (t, _) -> mkStanza [mkExeStanza opts $ t{_exeDependencies = mangleBaseDep t _exeDependencies}] Left e -> assertFailure $ show e @@ -192,7 +192,7 @@ ] where runGoldenLib opts args flags =- case _runPrompt (genLibTarget flags pkgIx) args of+ case runPrompt (genLibTarget flags pkgIx) args of Right (t, _) -> mkStanza [mkLibStanza opts $ t{_libDependencies = mangleBaseDep t _libDependencies}] Left e -> assertFailure $ show e @@ -243,7 +243,7 @@ ] where runGoldenTest opts args flags =- case _runPrompt (genTestTarget flags pkgIx) args of+ case runPrompt (genTestTarget flags pkgIx) args of Left e -> assertFailure $ show e Right (Nothing, _) -> assertFailure@@ -286,7 +286,7 @@ ] where runGoldenTest args flags =- case _runPrompt (createProject v pkgIx srcDb flags) args of+ case runPrompt (createProject v pkgIx srcDb flags) args of Left e -> assertFailure $ show e (Right (ProjectSettings opts pkgDesc (Just libTarget) (Just exeTarget) (Just testTarget), _)) -> do let pkgFields = mkPkgDescription opts pkgDesc
tests/UnitTests/Distribution/Client/Init/Interactive.hs view
@@ -76,7 +76,7 @@ , dependencies = Flag [] } - case (_runPrompt $ createProject silent pkgIx srcDb dummyFlags') (fromList ["[]", "3", "quxTest/Main.hs"]) of+ case (runPrompt $ createProject silent pkgIx srcDb dummyFlags') (fromList ["[]", "3", "quxTest/Main.hs"]) of Right (ProjectSettings opts desc (Just lib) (Just exe) (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -186,7 +186,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) (Just exe) (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -286,7 +286,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) Nothing (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -372,7 +372,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc Nothing Nothing (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -460,7 +460,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) (Just exe) Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -546,7 +546,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) Nothing Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -631,7 +631,7 @@ , extraSrc = Flag ["README.md"] } - case (_runPrompt $ createProject silent pkgIx srcDb flags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb flags) inputs of Right (ProjectSettings opts desc (Just lib) Nothing Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -709,7 +709,7 @@ "y" ] - case (_runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc Nothing (Just exe) Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -809,7 +809,7 @@ ] ] where- runGenTest inputs go = case _runPrompt go inputs of+ runGenTest inputs go = case runPrompt go inputs of Left e -> assertFailure $ show e Right{} -> return () @@ -1031,6 +1031,20 @@ ] ] , testGroup+ "Check languagePrompt session state"+ [ testSimplePrompt+ "Use last language"+ ( \flags -> do+ a <- languagePrompt flags "first language"+ b <- languagePrompt flags "second language"+ pure (a, b)+ )+ (GHC2024, GHC2024)+ [ "4"+ , "" -- default+ ]+ ]+ , testGroup "Check srcDirsPrompt output" [ testNumberedPrompt "Source dirs indices"@@ -1113,7 +1127,7 @@ -> [String] -> TestTree testPrompt label f g h input = testCase label $- case (_runPrompt $ f emptyFlags) (fromList input) of+ case (runPrompt $ f emptyFlags) (fromList input) of Left x -> g x -- :: BreakException Right x -> h x -- :: (a, other inputs)
tests/UnitTests/Distribution/Client/Init/NonInteractive.hs view
@@ -93,7 +93,7 @@ , "[\"quxTest/Main.hs\"]" ] - case (_runPrompt $ createProject comp silent pkgIx srcDb dummyFlags') inputs of+ case (runPrompt $ createProject comp silent pkgIx srcDb dummyFlags') inputs of Right (ProjectSettings opts desc (Just lib) (Just exe) (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -180,7 +180,7 @@ "False" ] - case (_runPrompt $ createProject comp silent pkgIx srcDb dummyFlags') inputs of+ case (runPrompt $ createProject comp silent pkgIx srcDb dummyFlags') inputs of Right (ProjectSettings opts desc (Just lib) (Just exe) (Just test), _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -356,7 +356,7 @@ , "[\"test/Main.hs\", \"test/Foo.hs\", \"test/bar.y\"]" ] - case ( _runPrompt $+ case ( runPrompt $ createProject comp silent@@ -508,7 +508,7 @@ , "[\"test/Main.hs\", \"test/Foo.hs\", \"test/bar.y\"]" ] - case ( _runPrompt $+ case ( runPrompt $ createProject comp silent@@ -664,7 +664,7 @@ , "[\"app/Main.hs\", \"src/Foo.hs\", \"src/bar.y\"]" ] - case (_runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) (Just exe) Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -774,7 +774,7 @@ , "[\"app/Main.hs\", \"src/Foo.hs\", \"src/bar.y\"]" ] - case (_runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc (Just lib) Nothing Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -865,7 +865,7 @@ , "[\"app/Main.hs\", \"src/Foo.hs\", \"src/bar.y\"]" ] - case (_runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of+ case (runPrompt $ createProject comp silent pkgIx srcDb emptyFlags) inputs of Right (ProjectSettings opts desc Nothing (Just exe) Nothing, _) -> do _optOverwrite opts @?= False _optMinimal opts @?= False@@ -931,7 +931,7 @@ , "[]" ] - case (_runPrompt $ genPkgDescription emptyFlags srcDb) inputs of+ case (runPrompt $ genPkgDescription emptyFlags srcDb) inputs of Left e -> assertFailure $ show e Right{} -> return () ]@@ -980,7 +980,7 @@ , "[\"app/Main.hs\", \"src/Foo.hs\", \"src/bar.y\"]" ] - case (_runPrompt $ genLibTarget emptyFlags comp pkgIx defaultCabalVersion) inputs of+ case (runPrompt $ genLibTarget emptyFlags comp pkgIx defaultCabalVersion) inputs of Left e -> assertFailure $ show e Right{} -> return () ]@@ -1021,7 +1021,7 @@ , "[\"app/Main.hs\", \"src/Foo.hs\", \"src/bar.y\"]" ] - case (_runPrompt $ genExeTarget emptyFlags comp pkgIx defaultCabalVersion) inputs of+ case (runPrompt $ genExeTarget emptyFlags comp pkgIx defaultCabalVersion) inputs of Left e -> assertFailure $ show e Right{} -> return () ]@@ -1058,7 +1058,7 @@ ] flags = emptyFlags{initializeTestSuite = Flag True} - case (_runPrompt $ genTestTarget flags comp pkgIx defaultCabalVersion) inputs of+ case (runPrompt $ genTestTarget flags comp pkgIx defaultCabalVersion) inputs of Left e -> assertFailure $ show e Right{} -> return () ]@@ -1403,7 +1403,7 @@ -> [String] -> TestTree testGo label f g h inputs = testCase label $- case (_runPrompt $ f emptyFlags) (NEL.fromList inputs) of+ case (runPrompt $ f emptyFlags) (NEL.fromList inputs) of Left x -> g x Right x -> h x
tests/UnitTests/Distribution/Client/Init/Simple.hs view
@@ -69,7 +69,7 @@ Nothing Nothing - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple lib project: " ++ show e Right (settings', _) -> settings @=? settings' , testCase "Simple lib createProject - with tests" $ do@@ -83,7 +83,7 @@ Nothing (Just $ simpleTestTarget (Just pkgName) baseDep) - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple lib (with tests)project: " ++ show e Right (settings', _) -> settings @=? settings' , testCase "Simple exe createProject" $ do@@ -97,7 +97,7 @@ (Just $ simpleExeTarget Nothing baseDep) Nothing - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple exe project: " ++ show e Right (settings', _) -> settings @=? settings' , testCase "Simple lib+exe createProject - no tests" $ do@@ -111,7 +111,7 @@ (Just $ simpleExeTarget (Just pkgName) baseDep) Nothing - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple lib+exe project: " ++ show e Right (settings', _) -> settings @=? settings' , testCase "Simple lib+exe createProject - with tests" $ do@@ -125,7 +125,7 @@ (Just $ simpleExeTarget (Just pkgName) baseDep) (Just $ simpleTestTarget (Just pkgName) baseDep) - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple lib+exe (with tests) project: " ++ show e Right (settings', _) -> settings @=? settings' , testCase "Simple standalone tests" $ do@@ -139,12 +139,12 @@ Nothing (Just $ simpleTestTarget Nothing baseDep) - case _runPrompt (createProject v pkgIx srcDb flags) inputs of+ case runPrompt (createProject v pkgIx srcDb flags) inputs of Left e -> assertFailure $ "Failed to create simple standalone test project: " ++ show e Right (settings', _) -> settings @=? settings' ] where- baseDep = case _runPrompt (getBaseDep pkgIx emptyFlags) $ fromList [] of+ baseDep = case runPrompt (getBaseDep pkgIx emptyFlags) $ fromList [] of Left e -> error $ show e Right a -> fst a
tests/UnitTests/Distribution/Client/ProjectConfig.hs view
@@ -10,10 +10,6 @@ module UnitTests.Distribution.Client.ProjectConfig (tests) where -#if !MIN_VERSION_base(4,8,0)-import Data.Monoid-import Control.Applicative-#endif import Control.Monad import Data.Either (isRight) import Data.Foldable (for_)@@ -102,6 +98,7 @@ , testProperty "specific" prop_roundtrip_printparse_specific , testProperty "all" prop_roundtrip_printparse_all ]+ , testGetProjectRootUsability , testFindProjectRoot ] where@@ -110,6 +107,31 @@ CompilerId GHC v -> v < mkVersion [7, 7] _ -> False +testGetProjectRootUsability :: TestTree+testGetProjectRootUsability =+ testGroup+ "getProjectRootUsability"+ [ test "relative path" file ProjectRootUsabilityPresentAndUsable+ , test "absolute path" absFile ProjectRootUsabilityPresentAndUsable+ , test "symbolic link" fileSymlink ProjectRootUsabilityPresentAndUsable+ , test "file not present" fileNotPresent ProjectRootUsabilityNotPresent+ , test "directory" brokenDirCabalProject ProjectRootUsabilityPresentAndUnusable+ , test "broken symbolic link" fileSymlinkBroken ProjectRootUsabilityPresentAndUnusable+ ]+ where+ dir = fixturesDir </> "project-root"+ file = defaultProjectFile+ absFile = dir </> file+ fileNotPresent = file <.> "not-present"+ fileSymlink = file <.> "symlink"+ fileSymlinkBroken = fileSymlink <.> "broken"+ brokenDirCabalProject = "cabal" <.> "project" <.> "dir" <.> "broken"+ test name fileName expectedState =+ testCase name $+ withCurrentDirectory dir $+ getProjectRootUsability fileName+ >>= (@?= expectedState)+ testFindProjectRoot :: TestTree testFindProjectRoot = testGroup@@ -120,6 +142,10 @@ , test "explicit file in lib" (cd libDir) Nothing (Just file) (succeeds dir file) , test "other file" (cd dir) Nothing (Just fileOther) (succeeds dir fileOther) , test "other file in lib" (cd libDir) Nothing (Just fileOther) (succeeds dir fileOther)+ , test "symbolic link" (cd dir) Nothing (Just fileSymlink) (succeeds dir fileSymlink)+ , test "symbolic link in lib" (cd libDir) Nothing (Just fileSymlink) (succeeds dir fileSymlink)+ , test "broken symbolic link" (cd dir) Nothing (Just fileSymlinkBroken) (failsWith $ BadProjectRootFileBroken fileSymlinkBroken)+ , test "broken symbolic link in lib" (cd libDir) Nothing (Just fileSymlinkBroken) (failsWith $ BadProjectRootFileBroken fileSymlinkBroken) , -- Deprecated use-case test "absolute file" Nothing Nothing (Just absFile) (succeeds dir file) , test "nested file" (cd dir) Nothing (Just nixFile) (succeeds dir nixFile)@@ -141,6 +167,9 @@ nixFile = "nix" </> file nixOther = nixFile <.> "other" + fileSymlink = file <.> "symlink"+ fileSymlinkBroken = fileSymlink <.> "broken"+ missing path = Just (path <.> "does_not_exist") test name wrap projectDir projectFile validate =@@ -169,6 +198,18 @@ Left _ -> pure () Right x -> assertFailure $ "Expected an error, but found " <> show x + failsWith expectedError result = case result of+ Left actualError ->+ if actualError == expectedError+ then pure ()+ else+ assertFailure $+ "Expected an error "+ <> show expectedError+ <> ", but found "+ <> show actualError+ Right x -> assertFailure $ "Expected an error, but found " <> show x+ fixturesDir :: FilePath fixturesDir = unsafePerformIO $@@ -683,6 +724,7 @@ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> shortListOf 5 arbitraryShortToken <*> arbitrary <*> arbitrary@@ -726,6 +768,7 @@ <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitraryFlag arbitraryShortToken <*> arbitrary <*> shortListOf 5 arbitrary@@ -751,6 +794,7 @@ , packageConfigFullyStaticExe = x50 , packageConfigProf = x07 , packageConfigProfLib = x08+ , packageConfigProfShared = x08_1 , packageConfigProfExe = x09 , packageConfigProfDetail = x10 , packageConfigProfLibDetail = x11@@ -791,8 +835,9 @@ , packageConfigHaddockForHackage = x41 , packageConfigHaddockIndex = x54 , packageConfigHaddockBaseUrl = x55- , packageConfigHaddockLib = x56+ , packageConfigHaddockResourcesDir = x56 , packageConfigHaddockOutputDir = x57+ , packageConfigHaddockUseUnicode = x58 , packageConfigTestHumanLog = x44 , packageConfigTestMachineLog = x45 , packageConfigTestShowDetails = x46@@ -814,6 +859,7 @@ , packageConfigFullyStaticExe = x50' , packageConfigProf = x07' , packageConfigProfLib = x08'+ , packageConfigProfShared = x08_1' , packageConfigProfExe = x09' , packageConfigProfDetail = x10' , packageConfigProfLibDetail = x11'@@ -854,8 +900,9 @@ , packageConfigHaddockForHackage = x41' , packageConfigHaddockIndex = x54' , packageConfigHaddockBaseUrl = x55'- , packageConfigHaddockLib = x56'+ , packageConfigHaddockResourcesDir = x56' , packageConfigHaddockOutputDir = x57'+ , packageConfigHaddockUseUnicode = x58' , packageConfigTestHumanLog = x44' , packageConfigTestMachineLog = x45' , packageConfigTestShowDetails = x46'@@ -866,7 +913,7 @@ , packageConfigBenchmarkOptions = x52' } | ( ( (x00', x01', x02', x03', x04')- , (x05', x42', x06', x50', x07', x08', x09')+ , (x05', x42', x06', x50', x07', x08', x08_1', x09') , (x10', x11', x12', x13', x14') , (x15', x16', x53', x17', x18', x19') )@@ -878,12 +925,13 @@ , (x44', x45', x46', x47', x48', x49', x51', x52', x54', x55') , x56' , x57'+ , x58' ) ) <- shrink ( ( (preShrink_Paths x00, preShrink_Args x01, x02, x03, x04)- , (x05, x42, x06, x50, x07, x08, x09)+ , (x05, x42, x06, x50, x07, x08, x08_1, x09) , (x10, x11, map NonEmpty x12, x13, x14) , ( x15@@ -903,6 +951,7 @@ , (x44, x45, x46, x47, x48, x49, x51, x52, x54, x55) , x56 , x57+ , x58 ) ) ]
tests/UnitTests/Distribution/Client/TreeDiffInstances.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} @@ -21,7 +22,7 @@ import Distribution.Client.Types.OverwritePolicy (OverwritePolicy) import Distribution.Client.Types.SourceRepo (SourceRepositoryPackage) -import Distribution.Simple.Compiler (PackageDB)+import Distribution.Simple.Compiler (PackageDBX) import Data.TreeDiff.Class import Data.TreeDiff.Instances.Cabal ()@@ -54,7 +55,7 @@ instance ToExpr Outcome instance ToExpr OverwritePolicy instance ToExpr PackageConfig-instance ToExpr PackageDB+instance ToExpr (PackageDBX FilePath) instance ToExpr PackageProperty instance ToExpr PreferOldest instance ToExpr PreSolver
tests/UnitTests/Distribution/Client/UserConfig.hs view
@@ -7,9 +7,6 @@ import Control.Exception (bracket) import Control.Monad (replicateM_) import Data.List (nub, sort)-#if !MIN_VERSION_base(4,8,0)-import Data.Monoid-#endif import System.Directory ( doesFileExist , getCurrentDirectory
tests/UnitTests/Distribution/Solver/Modular/DSL.hs view
@@ -449,7 +449,7 @@ , C.maintainer = "maintainer" , C.description = "description" , C.synopsis = "synopsis"- , C.licenseFiles = [C.unsafeMakeSymbolicPath "LICENSE"]+ , C.licenseFiles = [C.makeRelativePathEx "LICENSE"] , -- Version 2.0 is required for internal libraries. C.specVersion = C.CabalSpecV2_0 }@@ -524,21 +524,25 @@ defaultExe = mempty { C.buildInfo = defaultTopLevelBuildInfo- , C.modulePath = "Main.hs"+ , C.modulePath = C.makeRelativePathEx "Main.hs" } defaultTest :: C.TestSuite defaultTest = mempty { C.testBuildInfo = defaultTopLevelBuildInfo- , C.testInterface = C.TestSuiteExeV10 (C.mkVersion [1, 0]) "Test.hs"+ , C.testInterface =+ C.TestSuiteExeV10 (C.mkVersion [1, 0]) $+ C.makeRelativePathEx "Test.hs" } defaultBenchmark :: C.Benchmark defaultBenchmark = mempty { C.benchmarkBuildInfo = defaultTopLevelBuildInfo- , C.benchmarkInterface = C.BenchmarkExeV10 (C.mkVersion [1, 0]) "Benchmark.hs"+ , C.benchmarkInterface =+ C.BenchmarkExeV10 (C.mkVersion [1, 0]) $+ C.makeRelativePathEx "Benchmark.hs" } -- Split the set of dependencies into the set of dependencies of the library,@@ -779,7 +783,7 @@ -> Maybe [Extension] -- List of languages supported by the compiler, or Nothing if unknown. -> Maybe [Language]- -> PC.PkgConfigDb+ -> Maybe PC.PkgConfigDb -> [ExamplePkgName] -> Maybe Int -> CountConflicts
tests/UnitTests/Distribution/Solver/Modular/DSL/TestCaseUtils.hs view
@@ -130,7 +130,7 @@ , testDb :: ExampleDb , testSupportedExts :: Maybe [Extension] , testSupportedLangs :: Maybe [Language]- , testPkgConfigDb :: PkgConfigDb+ , testPkgConfigDb :: Maybe PkgConfigDb , testEnableAllTests :: EnableAllTests } @@ -233,7 +233,7 @@ , testDb = db , testSupportedExts = exts , testSupportedLangs = langs- , testPkgConfigDb = maybe NoPkgConfigDb pkgConfigDbFromList mPkgConfigDb+ , testPkgConfigDb = pkgConfigDbFromList <$> mPkgConfigDb , testEnableAllTests = EnableAllTests False }
tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs view
@@ -10,7 +10,6 @@ import Control.Arrow ((&&&)) import Data.Either (lefts)-import Data.Hashable (Hashable (..)) import Data.List (groupBy, isInfixOf) import Text.Show.Pretty (parseValue, valToStr)@@ -20,7 +19,7 @@ import Test.Tasty (TestTree) import Distribution.Types.Flag (FlagName)-import Distribution.Utils.ShortText (ShortText)+import Distribution.Utils.ShortText (ShortText, fromShortText) import Distribution.Client.Setup (defaultMaxBackjumps) @@ -47,12 +46,26 @@ import UnitTests.Distribution.Solver.Modular.DSL import UnitTests.Distribution.Solver.Modular.QuickCheck.Utils- ( testPropertyWithSeed+ ( ArbitraryOrd (..)+ , testPropertyWithSeed ) tests :: [TestTree] tests =- [ -- This test checks that certain solver parameters do not affect the+ [ testPropertyWithSeed "solver does not throw exceptions" $+ \test goalOrder reorderGoals indepGoals prefOldest ->+ let r =+ solve+ (EnableBackjumping True)+ (FineGrainedConflicts True)+ reorderGoals+ (CountConflicts True)+ indepGoals+ prefOldest+ (getBlind <$> goalOrder)+ test+ in resultPlan r `seq` ()+ , -- This test checks that certain solver parameters do not affect the -- existence of a solution. It runs the solver twice, and only sets those -- parameters on the second run. The test also applies parameters that -- can affect the existence of a solution to both runs.@@ -210,6 +223,9 @@ { unVarOrdering :: Variable P.QPN -> Variable P.QPN -> Ordering } +instance Arbitrary VarOrdering where+ arbitrary = VarOrdering <$> arbitraryCompare+ solve :: EnableBackjumping -> FineGrainedConflicts@@ -227,7 +243,7 @@ (unTestDb (testDb test)) Nothing Nothing- (pkgConfigDbFromList [])+ (Just $ pkgConfigDbFromList []) (map unPN (testTargets test)) -- The backjump limit prevents individual tests from using -- too much time and memory.@@ -516,6 +532,11 @@ shrink (IndependentGoals indep) = [IndependentGoals False | indep] +instance Arbitrary PreferOldest where+ arbitrary = PreferOldest <$> arbitrary++ shrink (PreferOldest prefOldest) = [PreferOldest False | prefOldest]+ instance Arbitrary Component where arbitrary = oneof@@ -600,22 +621,18 @@ shrink BenchStanzas = [TestStanzas] shrink TestStanzas = [] --- Randomly sorts solver variables using 'hash'.--- TODO: Sorting goals with this function is very slow.-instance Arbitrary VarOrdering where- arbitrary = do- f <- arbitrary :: Gen (Int -> Int)- return $ VarOrdering (comparing (f . hash))--instance Hashable pn => Hashable (Variable pn)-instance Hashable a => Hashable (P.Qualified a)-instance Hashable P.PackagePath-instance Hashable P.Qualifier-instance Hashable P.Namespace-instance Hashable OptionalStanza-instance Hashable FlagName-instance Hashable PackageName-instance Hashable ShortText+instance ArbitraryOrd pn => ArbitraryOrd (Variable pn)+instance ArbitraryOrd a => ArbitraryOrd (P.Qualified a)+instance ArbitraryOrd P.PackagePath+instance ArbitraryOrd P.Qualifier+instance ArbitraryOrd P.Namespace+instance ArbitraryOrd OptionalStanza+instance ArbitraryOrd FlagName+instance ArbitraryOrd PackageName+instance ArbitraryOrd ShortText where+ arbitraryCompare = do+ strc <- arbitraryCompare+ pure $ \l r -> strc (fromShortText l) (fromShortText r) deriving instance Generic (Variable pn) deriving instance Generic (P.Qualified a)
tests/UnitTests/Distribution/Solver/Modular/QuickCheck/Utils.hs view
@@ -1,10 +1,17 @@+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeOperators #-}+ module UnitTests.Distribution.Solver.Modular.QuickCheck.Utils ( testPropertyWithSeed+ , ArbitraryOrd (..) ) where import Data.Tagged (Tagged, retag)+import GHC.Generics import System.Random (getStdRandom, random) +import qualified Test.QuickCheck as QC import Test.Tasty (TestTree) import Test.Tasty.Options (OptionDescription, lookupOption, setOption) import Test.Tasty.Providers (IsTest (..), singleTest)@@ -31,7 +38,83 @@ run options (QCWithSeed test) progress = do replay <- case lookupOption options of- QuickCheckReplay (Just override) -> return override- QuickCheckReplay Nothing -> getStdRandom random+ QuickCheckReplayLegacy override -> return override+ _ -> getStdRandom random notice normal $ "Using --quickcheck-replay=" ++ show replay- run (setOption (QuickCheckReplay (Just replay)) options) test progress+ run (setOption (QuickCheckReplayLegacy replay) options) test progress++-- | Typeclass for doing arbitrary (but law-abiding) comparisons. See also+-- 'ArbitraryOrd', this is the version that works with 'GHC.Generics'.+class GArbitraryOrd f where+ garbitraryCompare :: QC.Gen (f p -> f p -> Ordering)++instance GArbitraryOrd V1 where+ garbitraryCompare = pure $ \_ _ -> EQ++instance GArbitraryOrd U1 where+ garbitraryCompare = pure $ \_ _ -> EQ++instance (GArbitraryOrd f, GArbitraryOrd g) => GArbitraryOrd (f :+: g) where+ garbitraryCompare = do+ bias <- QC.arbitrary+ lcompare <- garbitraryCompare+ rcompare <- garbitraryCompare+ pure $ \l r ->+ let args = if bias then (l, r) else (r, l)+ in case args of+ (L1 x, L1 y) -> lcompare x y+ (L1 _, R1 _) -> LT+ (R1 x, R1 y) -> rcompare x y+ (R1 _, L1 _) -> GT++instance (GArbitraryOrd f, GArbitraryOrd g) => GArbitraryOrd (f :*: g) where+ garbitraryCompare = do+ bias <- QC.arbitrary+ xcompare <- garbitraryCompare+ ycompare <- garbitraryCompare+ pure $ \l r ->+ let (x1 :*: y1, x2 :*: y2) = if bias then (l, r) else (r, l)+ in case xcompare x1 x2 of+ LT -> LT+ EQ -> ycompare y1 y2+ GT -> GT++instance GArbitraryOrd f => GArbitraryOrd (M1 i t f) where+ garbitraryCompare = (\c (M1 l) (M1 r) -> c l r) <$> garbitraryCompare++instance ArbitraryOrd c => GArbitraryOrd (K1 i c) where+ garbitraryCompare = (\c (K1 l) (K1 r) -> c l r) <$> arbitraryCompare++-- | Typeclass for doing arbitrary (but law-abiding) comparisons.+class ArbitraryOrd a where+ arbitraryCompare :: QC.Gen (a -> a -> Ordering)+ default arbitraryCompare+ :: (Generic a, GArbitraryOrd (Rep a)) => QC.Gen (a -> a -> Ordering)+ arbitraryCompare = (\c l r -> c (from l) (from r)) <$> garbitraryCompare++instance ArbitraryOrd Char where+ arbitraryCompare = arbitraryCompareReverseSection++-- | Construct an arbitrary comparison by (conceptually) laying out all values+-- in a list, picking two values (since we are using arbitrary these should+-- be "good" values), and then reversing the section between these two values.+arbitraryCompareReverseSection+ :: (QC.Arbitrary a, Ord a) => QC.Gen (a -> a -> Ordering)+arbitraryCompareReverseSection = do+ x <- QC.arbitrary+ y <- QC.arbitrary+ let inside n = n >= min x y && n <= max x y+ pure $ \l r -> if inside l && inside r then compare r l else compare l r++instance ArbitraryOrd a => ArbitraryOrd [a] where+ arbitraryCompare = do+ shorterIsLess <- QC.arbitrary+ cmp <- arbitraryCompare+ let go [] [] = EQ+ go [] (_ : _) = if shorterIsLess then LT else GT+ go (_ : _) [] = if shorterIsLess then GT else LT+ go (x : xs) (y : ys) = case cmp x y of+ LT -> LT+ EQ -> go xs ys+ GT -> GT+ pure go
tests/UnitTests/Distribution/Solver/Types/OptionalStanza.hs view
@@ -10,10 +10,6 @@ import Test.Tasty import Test.Tasty.QuickCheck -#if !MIN_VERSION_base(4,8,0)-import Data.Monoid-#endif- tests :: [TestTree] tests = [ testProperty "fromList . toList = id" $ \xs ->