diff options
-rw-r--r-- | cabal-helper.cabal | 1 | ||||
-rw-r--r-- | src/CabalHelper/Compiletime/Compat/Parsec.hs | 41 | ||||
-rw-r--r-- | src/CabalHelper/Runtime/Compat.hs | 25 | ||||
-rw-r--r-- | tests/CompileTest.hs | 14 |
4 files changed, 67 insertions, 14 deletions
diff --git a/cabal-helper.cabal b/cabal-helper.cabal index 6d51c7b..53bb093 100644 --- a/cabal-helper.cabal +++ b/cabal-helper.cabal @@ -109,6 +109,7 @@ library c-h-internal CabalHelper.Compiletime.Compat.Environment CabalHelper.Compiletime.Compat.ProgramDb CabalHelper.Compiletime.Compat.Version + CabalHelper.Compiletime.Compat.Parsec CabalHelper.Compiletime.Compile CabalHelper.Compiletime.Data CabalHelper.Compiletime.Log diff --git a/src/CabalHelper/Compiletime/Compat/Parsec.hs b/src/CabalHelper/Compiletime/Compat/Parsec.hs new file mode 100644 index 0000000..cab877a --- /dev/null +++ b/src/CabalHelper/Compiletime/Compat/Parsec.hs @@ -0,0 +1,41 @@ +-- cabal-helper: Simple interface to Cabal's configuration state +-- Copyright (C) 2018 Daniel Gröber <cabal-helper@dxld.at> +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. + +{-# LANGUAGE CPP #-} +module CabalHelper.Compiletime.Compat.Parsec + ( absorbParsecFailure + , eitherParsec + ) where + +#if MIN_VERSION_Cabal(2,5,0) +import Distribution.Parsec.Class +#else +import qualified Distribution.Compat.ReadP as Dist +import Distribution.Text +#endif + +absorbParsecFailure :: String -> Either String a -> a +absorbParsecFailure _ (Right x) = x +absorbParsecFailure ctx (Left err) = + error $ "Error parsing in '"++ctx++"': " ++ err + +#if !MIN_VERSION_Cabal(2,5,0) +eitherParsec :: Text t => String -> Either String t +eitherParsec i = + case filter ((=="") . snd) $ Dist.readP_to_S parse i of + (a,""):[] -> Right a + _ -> Left $ show i +#endif diff --git a/src/CabalHelper/Runtime/Compat.hs b/src/CabalHelper/Runtime/Compat.hs index eb87163..21d4efd 100644 --- a/src/CabalHelper/Runtime/Compat.hs +++ b/src/CabalHelper/Runtime/Compat.hs @@ -133,6 +133,12 @@ import Distribution.Types.GenericPackageDescription ) #endif +#if CH_MIN_VERSION_Cabal(2,5,0) +import Distribution.Types.LibraryName + ( LibraryName (..) + ) +#endif + import CabalHelper.Shared.Common import CabalHelper.Shared.InterfaceTypes @@ -150,9 +156,16 @@ type UnitId = InstalledPackageId componentNameToCh :: ComponentName -> ChComponentName +#if CH_MIN_VERSION_Cabal(2,5,0) +componentNameToCh (CLibName LMainLibName) = ChLibName ChMainLibName +componentNameToCh (CLibName (LSubLibName n)) = ChLibName $ ChSubLibName (unUnqualComponentName' n) +#elif CH_MIN_VERSION_Cabal(2,0,0) componentNameToCh CLibName = ChLibName ChMainLibName -#if CH_MIN_VERSION_Cabal(2,0,0) componentNameToCh (CSubLibName n) = ChLibName $ ChSubLibName (unUnqualComponentName' n) +#else +componentNameToCh CLibName = ChLibName ChMainLibName +#endif +#if CH_MIN_VERSION_Cabal(2,0,0) componentNameToCh (CFLibName n) = ChFLibName (unUnqualComponentName' n) #endif componentNameToCh (CExeName n) = ChExeName (unUnqualComponentName' n) @@ -171,14 +184,18 @@ unUnqualComponentName' = id componentNameFromComponent :: Component -> ComponentName -#if !CH_MIN_VERSION_Cabal(1,25,0) --- CPP < 1.25 -componentNameFromComponent (CLib Library {}) = CLibName +#if CH_MIN_VERSION_Cabal(2,5,0) +componentNameFromComponent (CLib Library { libName = Nothing }) = CLibName LMainLibName +componentNameFromComponent (CLib Library { libName = Just n }) = CLibName $ LSubLibName n +componentNameFromComponent (CFLib ForeignLib {..}) = CFLibName foreignLibName #elif CH_MIN_VERSION_Cabal(1,25,0) -- CPP >= 1.25 (redundant) componentNameFromComponent (CLib Library { libName = Nothing }) = CLibName componentNameFromComponent (CLib Library { libName = Just n }) = CSubLibName n componentNameFromComponent (CFLib ForeignLib {..}) = CFLibName foreignLibName +#else +-- CPP < 1.25 +componentNameFromComponent (CLib Library {}) = CLibName #endif componentNameFromComponent (CExe Executable {..}) = CExeName exeName componentNameFromComponent (CTest TestSuite {..}) = CTestName testName diff --git a/tests/CompileTest.hs b/tests/CompileTest.hs index b5d9003..3be4dc2 100644 --- a/tests/CompileTest.hs +++ b/tests/CompileTest.hs @@ -17,15 +17,14 @@ import Data.Maybe import Data.Version import Data.Functor import Data.Function -import qualified Distribution.Compat.ReadP as Dist import Distribution.Version (VersionRange, withinRange) -import Distribution.Text import Control.Arrow import Control.Monad import Prelude import CabalHelper.Compiletime.Compat.Environment import CabalHelper.Compiletime.Compat.Version +import CabalHelper.Compiletime.Compat.Parsec import CabalHelper.Compiletime.Cabal import CabalHelper.Compiletime.Compile import CabalHelper.Compiletime.Program.CabalInstall @@ -33,11 +32,6 @@ import CabalHelper.Compiletime.Program.GHC import CabalHelper.Compiletime.Types import CabalHelper.Shared.Common -runReadP'Dist :: Dist.ReadP t t -> String -> t -runReadP'Dist p i = case filter ((=="") . snd) $ Dist.readP_to_S p i of - (a,""):[] -> a - _ -> error $ "Error parsing: " ++ show i - withinRange'CH :: Version -> VersionRange -> Bool withinRange'CH v r = withinRange (fromDataVersion v) r @@ -123,14 +117,14 @@ allCabalVersions ghc_ver = let ] constraint :: VersionRange - constraint = - fromMaybe (snd $ last constraint_table) $ + Just constraint = fmap snd $ find (and . (zipWith (==) `on` versionBranch) ghc_ver . fst) $ constraint_table + constraint_table :: [(Version, VersionRange)] constraint_table = - map (parseVer *** runReadP'Dist parse) $ + map (parseVer *** (absorbParsecFailure "constraint_table" . eitherParsec)) $ -- , ("7.8" , ">= 1.18 && < 2") [ ("7.10" , ">= 1.22.2 && < 2") , ("8.0.1", ">= 1.24 ") |