diff --git a/Cabal/src/Distribution/Simple/Flag.hs b/Cabal/src/Distribution/Simple/Flag.hs index 018a7288274..7804eac5cfb 100644 --- a/Cabal/src/Distribution/Simple/Flag.hs +++ b/Cabal/src/Distribution/Simple/Flag.hs @@ -1,5 +1,7 @@ -{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DeriveFoldable #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleContexts #-} ----------------------------------------------------------------------------- -- | @@ -53,7 +55,7 @@ import Distribution.Compat.Stack -- Its monoid instance gives us the behaviour where it starts out as -- 'NoFlag' and later flags override earlier ones. -- -data Flag a = Flag a | NoFlag deriving (Eq, Generic, Show, Read, Typeable) +data Flag a = Flag a | NoFlag deriving (Eq, Generic, Show, Read, Typeable, Foldable, Traversable) instance Binary a => Binary (Flag a) instance Structured a => Structured (Flag a) @@ -67,6 +69,14 @@ instance Applicative Flag where NoFlag <*> _ = NoFlag pure = Flag +{-instance Foldable Flag where + foldMap _ NoFlag = mempty + foldMap f (Flag x) = f x + +instance Traversable Flag where + sequenceA NoFlag = pure NoFlag + sequenceA (Flag x) = Flag <$> x-} + instance Monoid (Flag a) where mempty = NoFlag mappend = (<>) diff --git a/Cabal/src/Distribution/Simple/Haddock.hs b/Cabal/src/Distribution/Simple/Haddock.hs index 950a6761df5..059e19be7cc 100644 --- a/Cabal/src/Distribution/Simple/Haddock.hs +++ b/Cabal/src/Distribution/Simple/Haddock.hs @@ -139,7 +139,7 @@ data HaddockArgs = HaddockArgs { -- ^ Modules to process. argLib :: Flag String -- ^ haddock's static \/ auxiliary files. -} deriving Generic +} deriving (Generic, Show) -- | The FilePath of a directory, it's a monoid under '()'. newtype Directory = Dir { unDir' :: FilePath } deriving (Read,Show,Eq,Ord) @@ -150,7 +150,7 @@ unDir = normalise . unDir' type Template = String data Output = Html | Hoogle - deriving Eq + deriving (Eq, Show) -- ------------------------------------------------------------------------------ -- Haddock support @@ -243,7 +243,12 @@ haddock pkg_descr lbi suffixes flags' = do fromFlagOrDefault ForDevelopment (haddockForHackage flags') libdirArgs <- getGhcLibDir verbosity lbi - let commonArgs = mconcat + -- The haddock-odir flag overrides any other documentation placement concerns. + -- The point is to give the user full freedom over the location if they need it. + let overrideWithOdir args = case haddockOdir flags of + NoFlag -> args + Flag dir -> args { argOutputDir = Dir dir } + let commonArgs = overrideWithOdir $ mconcat [ libdirArgs , fromFlags (haddockTemplateEnv lbi (packageId pkg_descr)) flags , fromPackageDescription haddockTarget pkg_descr ] diff --git a/Cabal/src/Distribution/Simple/Setup/Haddock.hs b/Cabal/src/Distribution/Simple/Setup/Haddock.hs index 0909d523edc..515504fd18b 100644 --- a/Cabal/src/Distribution/Simple/Setup/Haddock.hs +++ b/Cabal/src/Distribution/Simple/Setup/Haddock.hs @@ -94,6 +94,7 @@ data HaddockFlags = HaddockFlags { haddockCabalFilePath :: Flag FilePath, haddockBaseUrl :: Flag String, haddockLib :: Flag String, + haddockOdir :: Flag String, haddockArgs :: [String] } deriving (Show, Generic, Typeable) @@ -123,6 +124,7 @@ defaultHaddockFlags = HaddockFlags { haddockIndex = NoFlag, haddockBaseUrl = NoFlag, haddockLib = NoFlag, + haddockOdir = NoFlag, haddockArgs = mempty } @@ -267,6 +269,11 @@ haddockOptions showOrParseArgs = "location of Haddocks static / auxiliary files" haddockLib (\v flags -> flags { haddockLib = v}) (reqArgFlag "DIR") + + ,option "" ["odir"] + "Generate haddock documentation into this directory." + haddockOdir (\v flags -> flags { haddockOdir = v }) + (reqArgFlag "DIR") ] emptyHaddockFlags :: HaddockFlags @@ -343,7 +350,8 @@ data HaddockProjectFlags = HaddockProjectFlags { haddockProjectKeepTempFiles:: Flag Bool, haddockProjectVerbosity :: Flag Verbosity, -- haddockBaseUrl is not supported, a fixed value is provided - haddockProjectLib :: Flag String + haddockProjectLib :: Flag String, + haddockProjectOdir :: Flag String } deriving (Show, Generic, Typeable) @@ -371,6 +379,7 @@ defaultHaddockProjectFlags = HaddockProjectFlags { haddockProjectKeepTempFiles= Flag False, haddockProjectVerbosity = Flag normal, haddockProjectLib = NoFlag, + haddockProjectOdir = NoFlag, haddockProjectInterfaces = NoFlag } @@ -505,6 +514,11 @@ haddockProjectOptions _showOrParseArgs = "location of Haddocks static / auxiliary files" haddockProjectLib (\v flags -> flags { haddockProjectLib = v}) (reqArgFlag "DIR") + + ,option "" ["odir"] + "Generate haddock documentation into this directory." + haddockProjectOdir (\v flags -> flags { haddockProjectOdir = v}) + (reqArgFlag "DIR") ] diff --git a/cabal-install/src/Distribution/Client/CmdClean.hs b/cabal-install/src/Distribution/Client/CmdClean.hs index 11cb9e2f7d4..f09e7ccb603 100644 --- a/cabal-install/src/Distribution/Client/CmdClean.hs +++ b/cabal-install/src/Distribution/Client/CmdClean.hs @@ -103,7 +103,7 @@ cleanAction CleanFlags{..} extraArgs _ = do projectRoot <- either throwIO return =<< findProjectRoot verbosity mprojectDir mprojectFile - let distLayout = defaultDistDirLayout projectRoot mdistDirectory + let distLayout = defaultDistDirLayout projectRoot mdistDirectory Nothing -- Do not clean a project if just running a script in it's directory when (null extraArgs || isJust mdistDirectory) $ do diff --git a/cabal-install/src/Distribution/Client/CmdHaddock.hs b/cabal-install/src/Distribution/Client/CmdHaddock.hs index bfd2e8baf2b..d1f21271020 100644 --- a/cabal-install/src/Distribution/Client/CmdHaddock.hs +++ b/cabal-install/src/Distribution/Client/CmdHaddock.hs @@ -16,7 +16,10 @@ module Distribution.Client.CmdHaddock ( import Distribution.Client.Compat.Prelude import Prelude () +import System.Directory (makeAbsolute) +import Distribution.Client.ProjectConfig.Types + (PackageConfig (..), ProjectConfig (..)) import Distribution.Client.ProjectOrchestration import Distribution.Client.ProjectPlanning ( ElaboratedSharedConfig(..) ) @@ -43,7 +46,7 @@ import Distribution.Simple.Flag (Flag(..)) import qualified System.Exit (exitSuccess) -newtype ClientHaddockFlags = ClientHaddockFlags { openInBrowser :: Flag Bool } +newtype ClientHaddockFlags = ClientHaddockFlags { openInBrowser :: Flag Bool } deriving Show haddockCommand :: CommandUI (NixStyleFlags ClientHaddockFlags) haddockCommand = CommandUI { @@ -83,20 +86,43 @@ haddockOptions _ = openInBrowser (\v f -> f { openInBrowser = v}) trueArg ] +mkConfigAbsolute :: ProjectConfig -> IO ProjectConfig +mkConfigAbsolute relConfig = do + let relPackageConfig = projectConfigLocalPackages relConfig + absHaddockOdir <- traverse makeAbsolute (packageConfigHaddockOdir relPackageConfig) + return (relConfig { projectConfigLocalPackages = relPackageConfig { packageConfigHaddockOdir = absHaddockOdir } }) + +mkFlagsAbsolute :: NixStyleFlags ClientHaddockFlags -> IO (NixStyleFlags ClientHaddockFlags) +mkFlagsAbsolute relFlags = do + let relHaddockFlags = haddockFlags relFlags + absHaddockOdir <- traverse makeAbsolute (haddockOdir relHaddockFlags) + return (relFlags { haddockFlags = relHaddockFlags { haddockOdir = absHaddockOdir } }) + -- | The @haddock@ command is TODO. -- -- For more details on how this works, see the module -- "Distribution.Client.ProjectOrchestration" -- haddockAction :: NixStyleFlags ClientHaddockFlags -> [String] -> GlobalFlags -> IO () -haddockAction flags@NixStyleFlags {..} targetStrings globalFlags = do +haddockAction relFlags targetStrings globalFlags = do + -- It's important to make --haddock-odir absolute since we change the working directory later. + flags@NixStyleFlags {..} <- mkFlagsAbsolute relFlags + + let + verbosity = fromFlagOrDefault normal (configVerbosity configFlags) + installDoc = fromFlagOrDefault True (installDocumentation installFlags) + flags' = flags { installFlags = installFlags { installDocumentation = Flag installDoc } } + cliConfig = commandLineFlagsToProjectConfig globalFlags flags' mempty -- ClientInstallFlags, not needed here + projCtx <- establishProjectBaseContext verbosity cliConfig HaddockCommand - let baseCtx + let relBaseCtx@ProjectBaseContext { projectConfig = relProjectConfig } | fromFlagOrDefault False (openInBrowser extraFlags) = projCtx { buildSettings = (buildSettings projCtx) { buildSettingHaddockOpen = True } } | otherwise = projCtx + absProjectConfig <- mkConfigAbsolute relProjectConfig + let baseCtx = relBaseCtx { projectConfig = absProjectConfig } targetSelectors <- either (reportTargetSelectorProblems verbosity) return =<< readTargetSelectors (localPackages baseCtx) Nothing targetStrings @@ -141,11 +167,6 @@ haddockAction flags@NixStyleFlags {..} targetStrings globalFlags = do buildOutcomes <- runProjectBuildPhase verbosity baseCtx buildCtx' runProjectPostBuildPhase verbosity baseCtx buildCtx' buildOutcomes - where - verbosity = fromFlagOrDefault normal (configVerbosity configFlags) - installDoc = fromFlagOrDefault True (installDocumentation installFlags) - flags' = flags { installFlags = installFlags { installDocumentation = Flag installDoc } } - cliConfig = commandLineFlagsToProjectConfig globalFlags flags' mempty -- ClientInstallFlags, not needed here -- | This defines what a 'TargetSelector' means for the @haddock@ command. -- It selects the 'AvailableTarget's that the 'TargetSelector' refers to, diff --git a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs index c9e160ca52e..a9ae2b38a49 100644 --- a/cabal-install/src/Distribution/Client/CmdHaddockProject.hs +++ b/cabal-install/src/Distribution/Client/CmdHaddockProject.hs @@ -129,6 +129,7 @@ haddockProjectAction flags _extraArgs globalFlags = do , haddockKeepTempFiles= haddockProjectKeepTempFiles flags , haddockVerbosity = haddockProjectVerbosity flags , haddockLib = haddockProjectLib flags + , haddockOdir = haddockProjectOdir flags } nixFlags = (commandDefaultFlags CmdHaddock.haddockCommand) { NixStyleOptions.haddockFlags = haddockFlags diff --git a/cabal-install/src/Distribution/Client/CmdOutdated.hs b/cabal-install/src/Distribution/Client/CmdOutdated.hs index cacd57c0513..1c98abd937e 100644 --- a/cabal-install/src/Distribution/Client/CmdOutdated.hs +++ b/cabal-install/src/Distribution/Client/CmdOutdated.hs @@ -304,7 +304,7 @@ depsFromNewFreezeFile verbosity httpTransport compiler (Platform arch os) mproje projectRoot <- either throwIO return =<< findProjectRoot verbosity mprojectDir mprojectFile let distDirLayout = defaultDistDirLayout projectRoot - {- TODO: Support dist dir override -} Nothing + {- TODO: Support dist dir override -} Nothing Nothing projectConfig <- runRebuild (distProjectRootDirectory distDirLayout) $ do pcs <- readProjectLocalFreezeConfig verbosity httpTransport distDirLayout pure $ instantiateProjectConfigSkeletonWithCompiler os arch (compilerInfo compiler) mempty pcs diff --git a/cabal-install/src/Distribution/Client/Config.hs b/cabal-install/src/Distribution/Client/Config.hs index 33793657282..6a890f109a0 100644 --- a/cabal-install/src/Distribution/Client/Config.hs +++ b/cabal-install/src/Distribution/Client/Config.hs @@ -494,6 +494,7 @@ instance Semigroup SavedConfig where haddockIndex = combine haddockIndex, haddockBaseUrl = combine haddockBaseUrl, haddockLib = combine haddockLib, + haddockOdir = combine haddockOdir, haddockArgs = lastNonEmpty haddockArgs } where diff --git a/cabal-install/src/Distribution/Client/DistDirLayout.hs b/cabal-install/src/Distribution/Client/DistDirLayout.hs index 2413c3acf90..b135cd1501b 100644 --- a/cabal-install/src/Distribution/Client/DistDirLayout.hs +++ b/cabal-install/src/Distribution/Client/DistDirLayout.hs @@ -123,7 +123,10 @@ data DistDirLayout = DistDirLayout { distTempDirectory :: FilePath, distBinDirectory :: FilePath, - distPackageDB :: CompilerId -> PackageDB + distPackageDB :: CompilerId -> PackageDB, + + -- | Is needed when `--haddock-odir` flag is used. + distHaddockOdir :: Maybe FilePath } @@ -180,14 +183,15 @@ defaultProjectFile :: FilePath defaultProjectFile = "cabal.project" -- | Make the default 'DistDirLayout' based on the project root dir and --- optional overrides for the location of the @dist@ directory and the --- @cabal.project@ file. +-- optional overrides for the location of the @dist@ directory, the +-- @cabal.project@ file and the documentation directory. -- defaultDistDirLayout :: ProjectRoot -- ^ the project root -> Maybe FilePath -- ^ the @dist@ directory or default -- (absolute or relative to the root) + -> Maybe FilePath -- ^ the documentation directory -> DistDirLayout -defaultDistDirLayout projectRoot mdistDirectory = +defaultDistDirLayout projectRoot mdistDirectory haddockOdir = DistDirLayout {..} where (projectRootDir, projectFile) = case projectRoot of @@ -272,6 +276,8 @@ defaultDistDirLayout projectRoot mdistDirectory = distPackageDB :: CompilerId -> PackageDB distPackageDB = SpecificPackageDB . distPackageDBPath + distHaddockOdir :: Maybe FilePath + distHaddockOdir = haddockOdir defaultStoreDirLayout :: FilePath -> StoreDirLayout defaultStoreDirLayout storeRoot = diff --git a/cabal-install/src/Distribution/Client/NixStyleOptions.hs b/cabal-install/src/Distribution/Client/NixStyleOptions.hs index 3fbcada5679..4d304632927 100644 --- a/cabal-install/src/Distribution/Client/NixStyleOptions.hs +++ b/cabal-install/src/Distribution/Client/NixStyleOptions.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE StandaloneDeriving #-} + -- | Command line options for nix-style / v2 commands. -- -- The commands take a lot of the same options, which affect how install plan @@ -31,6 +33,7 @@ data NixStyleFlags a = NixStyleFlags , projectFlags :: ProjectFlags , extraFlags :: a } +deriving instance Show a => Show (NixStyleFlags a) nixStyleOptions :: (ShowOrParseArgs -> [OptionField a]) diff --git a/cabal-install/src/Distribution/Client/PackageHash.hs b/cabal-install/src/Distribution/Client/PackageHash.hs index 30e495dbdf3..52419e69b93 100644 --- a/cabal-install/src/Distribution/Client/PackageHash.hs +++ b/cabal-install/src/Distribution/Client/PackageHash.hs @@ -219,7 +219,8 @@ data PackageHashConfigInputs = PackageHashConfigInputs { pkgHashHaddockContents :: Maybe PathTemplate, pkgHashHaddockIndex :: Maybe PathTemplate, pkgHashHaddockBaseUrl :: Maybe String, - pkgHashHaddockLib :: Maybe String + pkgHashHaddockLib :: Maybe String, + pkgHashHaddockOdir :: Maybe String -- TODO: [required eventually] pkgHashToolsVersions ? -- TODO: [required eventually] pkgHashToolsExtraOptions ? @@ -317,6 +318,7 @@ renderPackageHashInputs PackageHashInputs{ , opt "haddock-index-location" Nothing (maybe "" fromPathTemplate) pkgHashHaddockIndex , opt "haddock-base-url" Nothing (fromMaybe "") pkgHashHaddockBaseUrl , opt "haddock-lib" Nothing (fromMaybe "") pkgHashHaddockLib + , opt "haddock-odir" Nothing (fromMaybe "") pkgHashHaddockOdir ] ++ Map.foldrWithKey (\prog args acc -> opt (prog ++ "-options") [] unwords args : acc) [] pkgHashProgramArgs where diff --git a/cabal-install/src/Distribution/Client/ProjectBuilding.hs b/cabal-install/src/Distribution/Client/ProjectBuilding.hs index 8a60718ede0..c3027f7e216 100644 --- a/cabal-install/src/Distribution/Client/ProjectBuilding.hs +++ b/cabal-install/src/Distribution/Client/ProjectBuilding.hs @@ -1266,7 +1266,8 @@ buildInplaceUnpackedPackage verbosity distDirLayout@DistDirLayout { distTempDirectory, distPackageCacheDirectory, - distDirectory + distDirectory, + distHaddockOdir } BuildTimeSettings{buildSettingNumJobs, buildSettingHaddockOpen} registerLock cacheLock @@ -1390,10 +1391,11 @@ buildInplaceUnpackedPackage verbosity notice verbosity $ "Documentation tarball created: " ++ dest when (buildSettingHaddockOpen && haddockTarget /= Cabal.ForHackage) $ do - let dest = docDir name "index.html" + let dest = docDir "index.html" name = haddockDirName haddockTarget (elabPkgDescription pkg) - docDir = distBuildDirectory distDirLayout dparams - "doc" "html" + docDir = case distHaddockOdir of + Nothing -> distBuildDirectory distDirLayout dparams "doc" "html" name + Just dir -> dir exe <- findOpenProgramLocation platform case exe of Right open -> runProgramInvocation verbosity (simpleProgramInvocation open [dest]) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index 6d157e25d60..dcc75c45590 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -618,7 +618,8 @@ convertLegacyPerPackageFlags configFlags installFlags haddockContents = packageConfigHaddockContents, haddockIndex = packageConfigHaddockIndex, haddockBaseUrl = packageConfigHaddockBaseUrl, - haddockLib = packageConfigHaddockLib + haddockLib = packageConfigHaddockLib, + haddockOdir = packageConfigHaddockOdir } = haddockFlags TestFlags { @@ -985,6 +986,7 @@ convertToLegacyPerPackageConfig PackageConfig {..} = haddockIndex = packageConfigHaddockIndex, haddockBaseUrl = packageConfigHaddockBaseUrl, haddockLib = packageConfigHaddockLib, + haddockOdir = packageConfigHaddockOdir, haddockArgs = mempty } @@ -1305,7 +1307,7 @@ legacyPackageConfigFieldDescrs = , "executables", "tests", "benchmarks", "all", "internal", "css" , "hyperlink-source", "quickjump", "hscolour-css" , "contents-location", "index-location", "keep-temp-files", "base-url" - , "lib" + , "lib", "odir" ] . commandOptionsToFields ) (haddockOptions ParseArgs) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs index 71956702589..dd71712ae17 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs @@ -291,6 +291,7 @@ data PackageConfig packageConfigHaddockIndex :: Flag PathTemplate, --TODO: [required eventually] use this packageConfigHaddockBaseUrl :: Flag String, --TODO: [required eventually] use this packageConfigHaddockLib :: Flag String, --TODO: [required eventually] use this + packageConfigHaddockOdir :: Flag String, --TODO: [required eventually] use this packageConfigHaddockForHackage :: Flag HaddockTarget, -- Test options packageConfigTestHumanLog :: Flag PathTemplate, diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index 5b7e48fb229..fc81089dcb9 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -223,7 +223,8 @@ establishProjectBaseContextWithRoot -> CurrentCommand -> IO ProjectBaseContext establishProjectBaseContextWithRoot verbosity cliConfig projectRoot currentCommand = do - let distDirLayout = defaultDistDirLayout projectRoot mdistDirectory + let haddockOdir = flagToMaybe (packageConfigHaddockOdir (projectConfigLocalPackages cliConfig)) + let distDirLayout = defaultDistDirLayout projectRoot mdistDirectory haddockOdir httpTransport <- configureTransport verbosity (fromNubList . projectConfigProgPathExtra $ projectConfigShared cliConfig) @@ -1359,7 +1360,7 @@ establishDummyProjectBaseContext verbosity projectConfig distDirLayout localPack establishDummyDistDirLayout :: Verbosity -> ProjectConfig -> FilePath -> IO DistDirLayout establishDummyDistDirLayout verbosity cliConfig tmpDir = do - let distDirLayout = defaultDistDirLayout projectRoot mdistDirectory + let distDirLayout = defaultDistDirLayout projectRoot mdistDirectory Nothing -- Create the dist directories createDirectoryIfMissingVerbose verbosity True $ distDirectory distDirLayout diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index fa1f2d88792..788cec78136 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -1983,6 +1983,7 @@ elaborateInstallPlan verbosity platform compiler compilerprogdb pkgConfigDB elabHaddockIndex = perPkgOptionMaybe pkgid packageConfigHaddockIndex elabHaddockBaseUrl = perPkgOptionMaybe pkgid packageConfigHaddockBaseUrl elabHaddockLib = perPkgOptionMaybe pkgid packageConfigHaddockLib + elabHaddockOdir = perPkgOptionMaybe pkgid packageConfigHaddockOdir elabTestMachineLog = perPkgOptionMaybe pkgid packageConfigTestMachineLog elabTestHumanLog = perPkgOptionMaybe pkgid packageConfigTestHumanLog @@ -3797,6 +3798,7 @@ setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) (ElaboratedSharedConfig{.. haddockIndex = maybe mempty toFlag elabHaddockIndex, haddockBaseUrl = maybe mempty toFlag elabHaddockBaseUrl, haddockLib = maybe mempty toFlag elabHaddockLib, + haddockOdir = maybe mempty toFlag elabHaddockOdir, haddockArgs = mempty } @@ -3953,7 +3955,8 @@ packageHashConfigInputs shared@ElaboratedSharedConfig{..} pkg = pkgHashHaddockContents = elabHaddockContents, pkgHashHaddockIndex = elabHaddockIndex, pkgHashHaddockBaseUrl = elabHaddockBaseUrl, - pkgHashHaddockLib = elabHaddockLib + pkgHashHaddockLib = elabHaddockLib, + pkgHashHaddockOdir = elabHaddockOdir } where ElaboratedConfiguredPackage{..} = normaliseConfiguredPackage shared pkg diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs index bda338897e4..08220b07b00 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning/Types.hs @@ -295,6 +295,7 @@ data ElaboratedConfiguredPackage elabHaddockIndex :: Maybe PathTemplate, elabHaddockBaseUrl :: Maybe String, elabHaddockLib :: Maybe String, + elabHaddockOdir :: Maybe String, elabTestMachineLog :: Maybe PathTemplate, elabTestHumanLog :: Maybe PathTemplate, diff --git a/cabal-install/src/Distribution/Client/Setup.hs b/cabal-install/src/Distribution/Client/Setup.hs index 6db91d9cf98..ca3608fce19 100644 --- a/cabal-install/src/Distribution/Client/Setup.hs +++ b/cabal-install/src/Distribution/Client/Setup.hs @@ -1779,7 +1779,7 @@ haddockOptions showOrParseArgs , name `elem` ["hoogle", "html", "html-location" ,"executables", "tests", "benchmarks", "all", "internal", "css" ,"hyperlink-source", "quickjump", "hscolour-css" - ,"contents-location", "use-index", "for-hackage", "base-url", "lib"] + ,"contents-location", "use-index", "for-hackage", "base-url", "lib", "odir"] ] testOptions :: ShowOrParseArgs -> [OptionField TestFlags] diff --git a/cabal-install/tests/IntegrationTests2.hs b/cabal-install/tests/IntegrationTests2.hs index 09155706da3..65278bc12d1 100644 --- a/cabal-install/tests/IntegrationTests2.hs +++ b/cabal-install/tests/IntegrationTests2.hs @@ -1665,7 +1665,7 @@ configureProject testdir cliConfig = do let projectRoot | isexplict = ProjectRootExplicit projectRootDir defaultProjectFile | otherwise = ProjectRootImplicit projectRootDir - distDirLayout = defaultDistDirLayout projectRoot Nothing + distDirLayout = defaultDistDirLayout projectRoot Nothing Nothing -- Clear state between test runs. The state remains if the previous run -- ended in an exception (as we leave the files to help with debugging). @@ -1758,7 +1758,7 @@ cleanProject testdir = do when alreadyExists $ removePathForcibly distDir where projectRoot = ProjectRootImplicit (basedir testdir) - distDirLayout = defaultDistDirLayout projectRoot Nothing + distDirLayout = defaultDistDirLayout projectRoot Nothing Nothing distDir = distDirectory distDirLayout diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs index 840845b34e0..7a730b91098 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs @@ -660,6 +660,7 @@ instance Arbitrary PackageConfig where <*> arbitrary <*> arbitraryFlag arbitraryShortToken <*> arbitraryFlag arbitraryShortToken + <*> arbitraryFlag arbitraryShortToken <*> arbitrary <*> arbitrary <*> arbitrary @@ -727,6 +728,7 @@ instance Arbitrary PackageConfig where , packageConfigHaddockIndex = x54 , packageConfigHaddockBaseUrl = x55 , packageConfigHaddockLib = x56 + , packageConfigHaddockOdir = x57 , packageConfigTestHumanLog = x44 , packageConfigTestMachineLog = x45 , packageConfigTestShowDetails = x46 @@ -787,6 +789,7 @@ instance Arbitrary PackageConfig where , packageConfigHaddockIndex = x54' , packageConfigHaddockBaseUrl = x55' , packageConfigHaddockLib = x56' + , packageConfigHaddockOdir = x57' , packageConfigTestHumanLog = x44' , packageConfigTestMachineLog = x45' , packageConfigTestShowDetails = x46' @@ -805,7 +808,7 @@ instance Arbitrary PackageConfig where (x35', x36', x37', x38', x43', x39'), (x40', x41'), (x44', x45', x46', x47', x48', x49', x51', x52', x54', x55'), - x56')) + x56', x57')) <- shrink (((preShrink_Paths x00, preShrink_Args x01, x02, x03, x04), (x05, x42, x06, x50, x07, x08, x09), @@ -819,7 +822,7 @@ instance Arbitrary PackageConfig where (x30, x31, x32, (x33, x33_1), x34), (x35, x36, fmap NonEmpty x37, x38, x43, fmap NonEmpty x39), (x40, x41), - (x44, x45, x46, x47, x48, x49, x51, x52, x54, x55), x56)) + (x44, x45, x46, x47, x48, x49, x51, x52, x54, x55), x56, x57)) ] where preShrink_Paths = Map.map NonEmpty diff --git a/cabal-testsuite/.gitignore b/cabal-testsuite/.gitignore index eca4b1cdb12..6c794bb5754 100644 --- a/cabal-testsuite/.gitignore +++ b/cabal-testsuite/.gitignore @@ -1,2 +1,3 @@ *.dist Setup +**/HaddockOdir/**/docs/ diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.cabal b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.cabal new file mode 100644 index 00000000000..53500f574cd --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.cabal @@ -0,0 +1,10 @@ +cabal-version: 3.8 +name: A +synopsis: A minimal test package for testing haddock. +version: 0.0.0 + +library + build-depends: base + default-language: Haskell2010 + exposed-modules: A + hs-source-dirs: . diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.hs new file mode 100644 index 00000000000..d34efe10291 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/A/A.hs @@ -0,0 +1,6 @@ +-- | A minimal test module for testing haddock. +module A (a) where + +-- | a is zero. +a :: Int +a = 0 diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.out new file mode 100644 index 00000000000..2e99c52260a --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.out @@ -0,0 +1,11 @@ +# cabal v2-update +Downloading the latest package list from test-local-repo +# cabal haddock +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - A-0.0.0 (lib) (first run) +Configuring library for A-0.0.0.. +Preprocessing library for A-0.0.0.. +Running Haddock on library for A-0.0.0.. +Documentation created: /docs/index.html diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.project b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.project new file mode 100644 index 00000000000..421457f944c --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.project @@ -0,0 +1 @@ +packages: A diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.test.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.test.hs new file mode 100644 index 00000000000..c92e78d1003 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/cabal.test.hs @@ -0,0 +1,11 @@ +import Control.Monad.IO.Class (MonadIO (..)) +import System.Directory (removePathForcibly) +import Test.Cabal.Prelude + +-- Test that `cabal haddock --haddock-odir` works from the command line. +main = cabalTest . withRepo "repo" $ do + testDir <- testSourceDir <$> getTestEnv + let docsDir = testDir "docs" + liftIO (removePathForcibly docsDir) + r <- cabal' "haddock" ["--haddock-odir=docs", "A"] + assertFindInFile "A minimal test package for testing haddock." (docsDir "index.html") diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/repo/Dummy.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/repo/Dummy.hs new file mode 100644 index 00000000000..d76e30b2f44 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirCmd/repo/Dummy.hs @@ -0,0 +1 @@ +module Dummy () where diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.cabal b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.cabal new file mode 100644 index 00000000000..53500f574cd --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.cabal @@ -0,0 +1,10 @@ +cabal-version: 3.8 +name: A +synopsis: A minimal test package for testing haddock. +version: 0.0.0 + +library + build-depends: base + default-language: Haskell2010 + exposed-modules: A + hs-source-dirs: . diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.hs new file mode 100644 index 00000000000..d34efe10291 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/A/A.hs @@ -0,0 +1,6 @@ +-- | A minimal test module for testing haddock. +module A (a) where + +-- | a is zero. +a :: Int +a = 0 diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.out b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.out new file mode 100644 index 00000000000..2e99c52260a --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.out @@ -0,0 +1,11 @@ +# cabal v2-update +Downloading the latest package list from test-local-repo +# cabal haddock +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - A-0.0.0 (lib) (first run) +Configuring library for A-0.0.0.. +Preprocessing library for A-0.0.0.. +Running Haddock on library for A-0.0.0.. +Documentation created: /docs/index.html diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.project b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.project new file mode 100644 index 00000000000..055a6e58da1 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.project @@ -0,0 +1,3 @@ +packages: A + +haddock-odir: docs diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.test.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.test.hs new file mode 100644 index 00000000000..cda0d9c4453 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/cabal.test.hs @@ -0,0 +1,11 @@ +import Control.Monad.IO.Class (MonadIO (..)) +import System.Directory (removePathForcibly) +import Test.Cabal.Prelude + +-- Test that `cabal haddock --haddock-odir` works from the config file. +main = cabalTest . withRepo "repo" $ do + testDir <- testSourceDir <$> getTestEnv + let docsDir = testDir "docs" + liftIO (removePathForcibly docsDir) + r <- cabal' "haddock" ["A"] + assertFindInFile "A minimal test package for testing haddock." (docsDir "index.html") diff --git a/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/repo/Dummy.hs b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/repo/Dummy.hs new file mode 100644 index 00000000000..d76e30b2f44 --- /dev/null +++ b/cabal-testsuite/PackageTests/NewHaddock/HaddockOdir/HaddockOdirConfig/repo/Dummy.hs @@ -0,0 +1 @@ +module Dummy () where diff --git a/changelog.d/issue-8270 b/changelog.d/issue-8270 new file mode 100644 index 00000000000..5698794d9f0 --- /dev/null +++ b/changelog.d/issue-8270 @@ -0,0 +1,4 @@ +synopsis: Add --haddock-odir flag to cabal haddock. +packages: Cabal cabal-install +prs: #8788 +issues: #8720