{-# LANGUAGE RecordWildCards #-} import Data.List (isPrefixOf) import Control.Monad import Data.Maybe import qualified Distribution.InstalledPackageInfo as IPI import qualified Distribution.ModuleName as MN import Distribution.PackageDescription as PD import Distribution.Simple import Distribution.Simple.BuildPaths import Distribution.Simple.LocalBuildInfo import qualified Distribution.Simple.PackageIndex as PI import Distribution.Simple.Setup import Distribution.Simple.Utils (createDirectoryIfMissingVerbose, die, info, notice, warn, rewriteFile, cabalVersion) import Distribution.Text (display) import System.FilePath (takeDirectory, (<.>), ()) import Data.Version main :: IO () main = defaultMainWithHooks simpleUserHooks { confHook = confHook', buildHook = buildHook' } confHook' :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo confHook' gpd_hbi cflags = do unless (versionBranch cabalVersion < [1,21]) $ die ("base-noprelude cannot be built with Cabal versions newer than 1.20 (`Setup.hs` imported Cabal library version " ++ showVersion cabalVersion ++ ")") lbi <- confHook simpleUserHooks gpd_hbi cflags let pkgver = pkgVersion . PD.package . localPkgDescr $ lbi let (baseVer,baseMods0) = case PI.lookupPackageName (installedPkgs lbi) (PackageName "base") of [(ver', [IPI.InstalledPackageInfo {..}])] -> (ver',map stringlyCoerce exposedModules) -- filter out Prelude module from `base`'s exposed module list baseMods = filter (/= MN.fromString "Prelude") baseMods0 unless (versionBranch baseVer `isPrefixOf` versionBranch pkgver) $ die ("version doesn't match base package version" ++ show (pkgver,baseVer)) return $! (mapLocalPkgDescr . mapLibrary . fmap . mapExposedModules) (const baseMods) lbi where -- needed to make compile w/ Cabal >= 1.22 stringlyCoerce = MN.fromString . display -- pseudo-functors mapLocalPkgDescr f lbi = lbi { localPkgDescr = f (localPkgDescr lbi) } mapLibrary f pd = pd { library = f (library pd) } mapExposedModules f l = l { exposedModules = f (exposedModules l) } verbosity = fromFlag $ configVerbosity cflags -- buildHook' :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO () buildHook' pd lbi uh bflags = do notice verbosity "creating wrapper modules..." forM_ baseMods $ \m -> do info verbosity ("generating wrapper module for " ++ display m) createDirectoryIfMissingVerbose verbosity True (takeDirectory $ apath m) rewriteFile (apath m) (genWrapper m) buildHook simpleUserHooks pd lbi uh bflags where genWrapper mn = unlines [ "module " ++ display mn ++ "(module M) where" , "import \"base\" " ++ display mn ++ " as M" ] apath mn = autogenModulesDir lbi MN.toFilePath mn <.> "hs" baseMods = (exposedModules . fromJust . library) pd verbosity = fromFlag $ buildVerbosity bflags -- postBuild' :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO () postBuild' args bflags pd lbi = do putStrLn "postBuild" postBuild simpleUserHooks args bflags pd lbi