diff --git a/Cabal/Distribution/Simple/Build.hs b/Cabal/Distribution/Simple/Build.hs index e6916b8e9a6..09242854152 100644 --- a/Cabal/Distribution/Simple/Build.hs +++ b/Cabal/Distribution/Simple/Build.hs @@ -53,15 +53,12 @@ import qualified Distribution.Simple.UHC as UHC import qualified Distribution.Simple.HaskellSuite as HaskellSuite import qualified Distribution.Simple.PackageIndex as Index -import Distribution.Simple.Build.Macros (generateCabalMacrosHeader) -import Distribution.Simple.Build.PathsModule (generatePathsModule) import qualified Distribution.Simple.Program.HcPkg as HcPkg import Distribution.Simple.Compiler hiding (Flag) import Distribution.PackageDescription hiding (Flag) import qualified Distribution.InstalledPackageInfo as IPI import Distribution.InstalledPackageInfo (InstalledPackageInfo) -import qualified Distribution.ModuleName as ModuleName import Distribution.Simple.Setup import Distribution.Simple.BuildTarget @@ -86,7 +83,7 @@ import Distribution.Compat.Graph (IsNode(..)) import Control.Monad import qualified Data.Set as Set -import System.FilePath ( (), (<.>), takeDirectory ) +import System.FilePath ( (), (<.>) ) import System.Directory ( getCurrentDirectory ) -- ----------------------------------------------------------------------------- @@ -687,42 +684,3 @@ componentInitialBuildSteps _distPref pkg_descr lbi clbi verbosity = do createDirectoryIfMissingVerbose verbosity True (componentBuildDir lbi clbi) writeAutogenFiles verbosity pkg_descr lbi clbi - --- | Generate and write out the Paths_.hs and cabal_macros.h files --- -writeAutogenFiles :: Verbosity - -> PackageDescription - -> LocalBuildInfo - -> ComponentLocalBuildInfo - -> IO () -writeAutogenFiles verbosity pkg lbi clbi = do - createDirectoryIfMissingVerbose verbosity True (autogenComponentModulesDir lbi clbi) - - let pathsModulePath = autogenComponentModulesDir lbi clbi - ModuleName.toFilePath (autogenPathsModuleName pkg) <.> "hs" - pathsModuleDir = takeDirectory pathsModulePath - -- Ensure that the directory exists! - createDirectoryIfMissingVerbose verbosity True pathsModuleDir - rewriteFileEx verbosity pathsModulePath (generatePathsModule pkg lbi clbi) - - --TODO: document what we're doing here, and move it to its own function - case clbi of - LibComponentLocalBuildInfo { componentInstantiatedWith = insts } -> - -- Write out empty hsig files for all requirements, so that GHC - -- has a source file to look at it when it needs to typecheck - -- a signature. It's harmless to write these out even when - -- there is a real hsig file written by the user, since - -- include path ordering ensures that the real hsig file - -- will always be picked up before the autogenerated one. - for_ (map fst insts) $ \mod_name -> do - let sigPath = autogenComponentModulesDir lbi clbi - ModuleName.toFilePath mod_name <.> "hsig" - createDirectoryIfMissingVerbose verbosity True (takeDirectory sigPath) - rewriteFileEx verbosity sigPath $ - "{-# OPTIONS_GHC -w #-}\n" ++ - "{-# LANGUAGE NoImplicitPrelude #-}\n" ++ - "signature " ++ prettyShow mod_name ++ " where" - _ -> return () - - let cppHeaderPath = autogenComponentModulesDir lbi clbi cppHeaderName - rewriteFileEx verbosity cppHeaderPath (generateCabalMacrosHeader pkg lbi clbi) diff --git a/Cabal/Distribution/Simple/Configure.hs b/Cabal/Distribution/Simple/Configure.hs index ab77115837a..9cef3daaa7d 100644 --- a/Cabal/Distribution/Simple/Configure.hs +++ b/Cabal/Distribution/Simple/Configure.hs @@ -31,6 +31,7 @@ module Distribution.Simple.Configure ( configure , writePersistBuildConfig + , writeAutogenFiles , getConfigStateFile , getPersistBuildConfig , checkPersistBuildConfigOutdated @@ -72,6 +73,10 @@ import Distribution.Types.PackageDescription as PD import Distribution.PackageDescription.PrettyPrint import Distribution.PackageDescription.Configuration import Distribution.PackageDescription.Check hiding (doesFileExist) +import qualified Distribution.ModuleName as ModuleName +import Distribution.Simple.BuildPaths +import Distribution.Simple.Build.Macros (generateCabalMacrosHeader) +import Distribution.Simple.Build.PathsModule (generatePathsModule) import Distribution.Simple.BuildToolDepends import Distribution.Simple.Program import Distribution.Simple.Setup as Setup @@ -128,7 +133,7 @@ import System.Directory ( canonicalizePath, createDirectoryIfMissing, doesFileExist , getTemporaryDirectory, removeFile) import System.FilePath - ( (), isAbsolute, takeDirectory ) + ( (), (<.>), isAbsolute, takeDirectory ) import Distribution.Compat.Directory ( doesPathExist ) import qualified System.Info @@ -828,9 +833,13 @@ configure (pkg_descr0, pbi) cfg = do dirinfo "Documentation" (docdir dirs) (docdir relative) dirinfo "Configuration files" (sysconfdir dirs) (sysconfdir relative) + forM_ buildComponents $ \bc -> writeAutogenFiles verbosity pkg_descr lbi bc + sequence_ [ reportProgram verbosity prog configuredProg | (prog, configuredProg) <- knownPrograms programDb'' ] + + return lbi where @@ -967,7 +976,7 @@ dependencySatisfiable installedPackageSet pn vr cn where cn | pn == depName - = LMainLibName + = LMainLibName | otherwise -- Reinterpret the "package name" as an unqualified component -- name @@ -2116,3 +2125,42 @@ checkForeignLibSupported comp platform flib = go (compilerFlavor comp) unsupported :: [String] -> Maybe String unsupported = Just . concat + +-- | Generate and write out the Paths_.hs and cabal_macros.h files +-- +writeAutogenFiles :: Verbosity + -> PackageDescription + -> LocalBuildInfo + -> ComponentLocalBuildInfo + -> IO () +writeAutogenFiles verbosity pkg lbi clbi = do + createDirectoryIfMissingVerbose verbosity True (autogenComponentModulesDir lbi clbi) + + let pathsModulePath = autogenComponentModulesDir lbi clbi + ModuleName.toFilePath (autogenPathsModuleName pkg) <.> "hs" + pathsModuleDir = takeDirectory pathsModulePath + -- Ensure that the directory exists! + createDirectoryIfMissingVerbose verbosity True pathsModuleDir + rewriteFileEx verbosity pathsModulePath (generatePathsModule pkg lbi clbi) + + --TODO: document what we're doing here, and move it to its own function + case clbi of + LibComponentLocalBuildInfo { componentInstantiatedWith = insts } -> + -- Write out empty hsig files for all requirements, so that GHC + -- has a source file to look at it when it needs to typecheck + -- a signature. It's harmless to write these out even when + -- there is a real hsig file written by the user, since + -- include path ordering ensures that the real hsig file + -- will always be picked up before the autogenerated one. + for_ (map fst insts) $ \mod_name -> do + let sigPath = autogenComponentModulesDir lbi clbi + ModuleName.toFilePath mod_name <.> "hsig" + createDirectoryIfMissingVerbose verbosity True (takeDirectory sigPath) + rewriteFileEx verbosity sigPath $ + "{-# OPTIONS_GHC -w #-}\n" ++ + "{-# LANGUAGE NoImplicitPrelude #-}\n" ++ + "signature " ++ prettyShow mod_name ++ " where" + _ -> return () + + let cppHeaderPath = autogenComponentModulesDir lbi clbi cppHeaderName + rewriteFileEx verbosity cppHeaderPath (generateCabalMacrosHeader pkg lbi clbi)