chs-cabal 0.1.1.4 → 1.0.0.0
raw patch · 3 files changed
+22/−119 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Distribution.C2Hs: c2hsBuildHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO ()
- Distribution.C2Hs: c2hsHaddockHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> HaddockFlags -> IO ()
- Distribution.C2Hs: c2hsReplHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> ReplFlags -> [String] -> IO ()
+ Distribution.C2Hs: c2hsSuffixHandler :: PPSuffixHandler
Files
- CHANGELOG.md +6/−0
- chs-cabal.cabal +1/−1
- src/Distribution/C2Hs.hs +15/−118
CHANGELOG.md view
@@ -1,5 +1,11 @@ # chs-cabal +## 1.0.0.0++ * Complete rewrite to use `hookedPreProcessors`+ * Adds `c2hsSuffixHandler`+ * Removes `c2hsBuildHooks`, `c2hsHaddockHooks`, `c2hsReplHooks`+ ## 0.1.1.4 * Update for Cabal 3.14 correctly
chs-cabal.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: chs-cabal-version: 0.1.1.4+version: 1.0.0.0 license: BSD3 license-file: LICENSE copyright: Copyright: (c) 2019, 2021 Vanessa McHale
src/Distribution/C2Hs.hs view
@@ -1,133 +1,30 @@ {-# LANGUAGE DataKinds #-} --- | Everything in this module is slightly morally dubious in that it works by--- considering *all* modules to be @exposed-modules@ in the preprocessor phase.------ This works in practice, but the Cabal API provides no guarantees this will--- continue to be the case in the future. module Distribution.C2Hs ( defaultMainC2Hs -- * User hooks , c2hsUserHooks- -- * Specialized hooks- , c2hsBuildHooks- , c2hsHaddockHooks- , c2hsReplHooks+ , c2hsSuffixHandler ) where -import Control.Applicative (pure)-import Data.Traversable (traverse)+import Control.Applicative (pure)+import Data.Traversable (traverse) import Distribution.C2Hs.TopSort-import Distribution.ModuleName (ModuleName)-import Distribution.Simple (UserHooks (buildHook, haddockHook, replHook),- defaultMainWithHooks,- simpleUserHooks)-import Distribution.Simple.LocalBuildInfo (LocalBuildInfo)-import Distribution.Simple.Setup (BuildFlags, buildCommonFlags,- HaddockFlags, haddockCommonFlags,- ReplFlags, replCommonFlags,- CommonSetupFlags (CommonSetupFlags, setupVerbosity),- fromFlagOrDefault)-import Distribution.Types.Benchmark-import Distribution.Types.BuildInfo-import Distribution.Types.Executable-import Distribution.Types.ForeignLib-import Distribution.Types.Library-import Distribution.Types.PackageDescription-import Distribution.Types.TestSuite-import Distribution.Utils.Path (Pkg, Source, FileOrDir (Dir),- SymbolicPath)-import Distribution.Verbosity (Verbosity, normal)--type CabalFP = SymbolicPath Pkg (Dir Source)+import Distribution.Simple (UserHooks (hookedPreProcessors),+ defaultMainWithHooks,+ simpleUserHooks)+import Distribution.Simple.PreProcess (PPSuffixHandler,+ PreProcessor (ppOrdering),+ Suffix (Suffix), ppC2hs) defaultMainC2Hs :: IO () defaultMainC2Hs = defaultMainWithHooks c2hsUserHooks -- | @since 0.1.1.0 c2hsUserHooks :: UserHooks-c2hsUserHooks = simpleUserHooks { buildHook = c2hsBuildHooks- , haddockHook = c2hsHaddockHooks- , replHook = c2hsReplHooks- }---- | Custom build hooks to be used with @.chs@ files which @{\#import\#}@ one--- another.-c2hsBuildHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO ()-c2hsBuildHooks = \pd lbi hooks bf -> do- let v = getSetupVerbosity (buildCommonFlags bf)- pd' <- mapPackageDescription (reorderC2Hs v) pd- buildHook simpleUserHooks pd' lbi hooks bf--c2hsHaddockHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> HaddockFlags -> IO ()-c2hsHaddockHooks = \pd lbi hooks hf -> do- let v = getSetupVerbosity (haddockCommonFlags hf)- pd' <- mapPackageDescription (reorderC2Hs v) pd- haddockHook simpleUserHooks pd' lbi hooks hf--c2hsReplHooks :: PackageDescription -> LocalBuildInfo -> UserHooks -> ReplFlags -> [String] -> IO ()-c2hsReplHooks = \pd lbi hooks rf ss -> do- let v = getSetupVerbosity (replCommonFlags rf)- pd' <- mapPackageDescription (reorderC2Hs v) pd- replHook simpleUserHooks pd' lbi hooks rf ss--getSetupVerbosity :: CommonSetupFlags -> Verbosity-getSetupVerbosity CommonSetupFlags { setupVerbosity = v } = fromFlagOrDefault normal v--mapPackageDescription :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> PackageDescription -> IO PackageDescription-mapPackageDescription f p@PackageDescription { library = ml- , subLibraries = ls- , executables = es- , foreignLibs = fs- , testSuites = ts- , benchmarks = bs- } = do- ml' <- traverse (mapLibrary f) ml- ls' <- traverse (mapLibrary f) ls- es' <- traverse (mapExecutable f) es- fs' <- traverse (mapForeignLibrary f) fs- ts' <- traverse (mapTestSuite f) ts- bs' <- traverse (mapBenchmark f) bs- pure $ p { library = ml'- , subLibraries = ls'- , executables = es'- , foreignLibs = fs'- , testSuites = ts'- , benchmarks = bs'- }--mapLibrary :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> Library -> IO Library-mapLibrary f lib@Library { exposedModules = es, libBuildInfo = bi } = do- let dirs = hsSourceDirs bi- om = otherModules bi- isOther = (`notElem` es)- newMods <- f dirs (es ++ om)- let om' = filter isOther newMods- bi' = bi { otherModules = om' }- -- This is stupid, but I've tested it and it seems to not do anything- -- egregious- pure $ lib { exposedModules = newMods, libBuildInfo = bi' }--mapBenchmark :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> Benchmark -> IO Benchmark-mapBenchmark f b@Benchmark { benchmarkBuildInfo = bi } = do- bi' <- mapBuildInfo f bi- pure $ b { benchmarkBuildInfo = bi' }--mapExecutable :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> Executable -> IO Executable-mapExecutable f e@Executable { buildInfo = bi } = do- bi' <- mapBuildInfo f bi- pure $ e { buildInfo = bi' }--mapForeignLibrary :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> ForeignLib -> IO ForeignLib-mapForeignLibrary f fl@ForeignLib { foreignLibBuildInfo = bi } = do- bi' <- mapBuildInfo f bi- pure $ fl { foreignLibBuildInfo = bi' }--mapTestSuite :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> TestSuite -> IO TestSuite-mapTestSuite f t@TestSuite { testBuildInfo = bi } = do- bi' <- mapBuildInfo f bi- pure $ t { testBuildInfo = bi' }+c2hsUserHooks = simpleUserHooks { hookedPreProcessors = [c2hsSuffixHandler] } -mapBuildInfo :: ([CabalFP] -> [ModuleName] -> IO [ModuleName]) -> BuildInfo -> IO BuildInfo-mapBuildInfo f bi@BuildInfo { otherModules = om, hsSourceDirs = dirs } = do- om' <- f dirs om- pure $ bi { otherModules = om' }+-- | 'PPSuffixHandler' for @.chs@ files that reorders based on imports+--+-- @since 1.0.0.0+c2hsSuffixHandler :: PPSuffixHandler+c2hsSuffixHandler = (Suffix ".chs", \bi lbi cbi -> (ppC2hs bi lbi cbi) { ppOrdering = reorderC2Hs })