diff --git a/Distribution/Compiler.hs b/Distribution/Compiler.hs index 3a4e4421304d84ad1bdc6e286ed1502e51106c5d..dd784057af29f6b112b411966b4ed92717ed0472 100644 --- a/Distribution/Compiler.hs +++ b/Distribution/Compiler.hs @@ -42,21 +42,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -} module Distribution.Compiler ( -- * Compiler flavor CompilerFlavor(..), - showCompilerFlavor, - readCompilerFlavor, buildCompilerFlavor, defaultCompilerFlavor, -- * Compiler id CompilerId(..), - showCompilerId, ) where import Distribution.Version (Version(..)) import qualified System.Info (compilerName) -import qualified Data.Char as Char (toLower) -import Distribution.Text (display) +import Distribution.Text (Text(..), display) +import qualified Distribution.Compat.ReadP as Parse +import qualified Text.PrettyPrint as Disp +import Text.PrettyPrint ((<>)) + +import qualified Data.Char as Char (toLower, isDigit, isAlphaNum) +import Control.Monad (when) data CompilerFlavor = GHC | NHC | YHC | Hugs | HBC | Helium | JHC | OtherCompiler String @@ -65,23 +67,34 @@ data CompilerFlavor = GHC | NHC | YHC | Hugs | HBC | Helium | JHC knownCompilerFlavors :: [CompilerFlavor] knownCompilerFlavors = [GHC, NHC, YHC, Hugs, HBC, Helium, JHC] -showCompilerFlavor :: CompilerFlavor -> String -showCompilerFlavor (OtherCompiler name) = name -showCompilerFlavor NHC = "nhc98" -showCompilerFlavor other = lowercase (show other) +instance Text CompilerFlavor where + disp (OtherCompiler name) = Disp.text name + disp NHC = Disp.text "nhc98" + disp other = Disp.text (lowercase (show other)) + + parse = do + comp <- Parse.munch1 Char.isAlphaNum + when (all Char.isDigit comp) Parse.pfail + return (classifyCompilerFlavor comp) -readCompilerFlavor :: String -> CompilerFlavor -readCompilerFlavor s = +classifyCompilerFlavor :: String -> CompilerFlavor +classifyCompilerFlavor s = case lookup (lowercase s) compilerMap of - Just arch -> arch - Nothing -> OtherCompiler (lowercase s) + Just compiler -> compiler + Nothing -> OtherCompiler (lowercase s) where - compilerMap = [ (showCompilerFlavor compiler, compiler) + compilerMap = [ (display compiler, compiler) | compiler <- knownCompilerFlavors ] buildCompilerFlavor :: CompilerFlavor -buildCompilerFlavor = readCompilerFlavor System.Info.compilerName +buildCompilerFlavor = classifyCompilerFlavor System.Info.compilerName +-- | The default compiler flavour to pick when compiling stuff. This defaults +-- to the compiler used to build the Cabal lib. +-- +-- However if it's not a recognised compiler then it's 'Nothing' and the user +-- will have to specify which compiler they want. +-- defaultCompilerFlavor :: Maybe CompilerFlavor defaultCompilerFlavor = case buildCompilerFlavor of OtherCompiler _ -> Nothing @@ -94,9 +107,14 @@ defaultCompilerFlavor = case buildCompilerFlavor of data CompilerId = CompilerId CompilerFlavor Version deriving (Eq, Ord, Read, Show) -showCompilerId :: CompilerId -> String -showCompilerId (CompilerId f (Version [] _)) = showCompilerFlavor f -showCompilerId (CompilerId f v) = showCompilerFlavor f ++ '-': display v +instance Text CompilerId where + disp (CompilerId f (Version [] _)) = disp f + disp (CompilerId f v) = disp f <> Disp.char '-' <> disp v + + parse = do + flavour <- parse + version <- (Parse.char '-' >> parse) Parse.<++ return (Version [] []) + return (CompilerId flavour version) lowercase :: String -> String lowercase = map Char.toLower diff --git a/Distribution/PackageDescription.hs b/Distribution/PackageDescription.hs index 0fbf646f42b7381c82d2c3e2c7e4e794511a4651..20e8782c99dae665cfaf2872753dae1b598eac13 100644 --- a/Distribution/PackageDescription.hs +++ b/Distribution/PackageDescription.hs @@ -83,7 +83,7 @@ import Distribution.Package ( PackageIdentifier(PackageIdentifier), Dependency, Package(..) ) import Distribution.Version (Version(Version), VersionRange(AnyVersion)) import Distribution.License (License(AllRightsReserved)) -import Distribution.Compiler (CompilerFlavor, showCompilerFlavor) +import Distribution.Compiler (CompilerFlavor) import Distribution.System (OS, Arch) import Distribution.Text ( display ) @@ -469,7 +469,7 @@ instance Show ConfVar where show (OS os) = "os(" ++ display os ++ ")" show (Arch arch) = "arch(" ++ display arch ++ ")" show (Flag (ConfFlag f)) = "flag(" ++ f ++ ")" - show (Impl c v) = "impl(" ++ showCompilerFlavor c + show (Impl c v) = "impl(" ++ display c ++ " " ++ display v ++ ")" -- | A boolean expression parameterized over the variable type used. diff --git a/Distribution/PackageDescription/Configuration.hs b/Distribution/PackageDescription/Configuration.hs index 030ebf78d35a41c0131f7c045e7d50f43686d8d1..1c4a7f9681d3e0a3c1b60cac7e10a6916cf404a2 100644 --- a/Distribution/PackageDescription/Configuration.hs +++ b/Distribution/PackageDescription/Configuration.hs @@ -57,7 +57,7 @@ import Distribution.Simple.PackageIndex (PackageIndex) import qualified Distribution.Simple.PackageIndex as PackageIndex import Distribution.Version ( Version(..), VersionRange(..), withinRange ) -import Distribution.Compiler (CompilerFlavor, readCompilerFlavor) +import Distribution.Compiler (CompilerFlavor) import Distribution.System ( OS, Arch ) import Distribution.Simple.Utils (currentDir) @@ -162,9 +162,9 @@ parseCondition = condOr isIdentChar c = isAlphaNum c || (c `elem` "_-") oper s = sp >> string s >> sp sp = skipSpaces - implIdent = do i <- ident + implIdent = do i <- parse vr <- sp >> option AnyVersion parse - return $ Impl (readCompilerFlavor i) vr + return $ Impl i vr ------------------------------------------------------------------------------ diff --git a/Distribution/Simple/BuildPaths.hs b/Distribution/Simple/BuildPaths.hs index 849452e4a0e43ba6b35a9bbd3ab92f6e1f034f9e..67ba04311a11eadb48b9b17ea7f38dadde3364dd 100644 --- a/Distribution/Simple/BuildPaths.hs +++ b/Distribution/Simple/BuildPaths.hs @@ -65,7 +65,7 @@ import System.FilePath (FilePath, (</>), (<.>)) import Distribution.Package ( PackageIdentifier(pkgName), packageName ) import Distribution.Compiler - ( CompilerId(..), showCompilerFlavor ) + ( CompilerId(..) ) import Distribution.PackageDescription (PackageDescription) import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(buildDir)) import Distribution.Text @@ -118,8 +118,7 @@ mkProfLibName lib = mkLibName lib { pkgName = pkgName lib ++ "_p" } mkSharedLibName :: PackageIdentifier -> CompilerId -> String mkSharedLibName lib (CompilerId compilerFlavor compilerVersion) = "libHS" ++ display lib ++ "-" ++ comp <.> dllExtension - where comp = showCompilerFlavor compilerFlavor - ++ display compilerVersion + where comp = display compilerFlavor ++ display compilerVersion -- ------------------------------------------------------------ -- * Platform file extensions diff --git a/Distribution/Simple/Compiler.hs b/Distribution/Simple/Compiler.hs index 52e617abd85af71ad9b17d129e87191b189e2120..375e0710b2b7f97d99054a408d7d7efbd701d919 100644 --- a/Distribution/Simple/Compiler.hs +++ b/Distribution/Simple/Compiler.hs @@ -58,9 +58,9 @@ module Distribution.Simple.Compiler ( unsupportedExtensions ) where -import Distribution.Compiler hiding (showCompilerId) -import qualified Distribution.Compiler (showCompilerId) +import Distribution.Compiler import Distribution.Version (Version(..)) +import Distribution.Text (display) import Language.Haskell.Extension (Extension(..)) import Data.List (nub) @@ -73,7 +73,7 @@ data Compiler = Compiler { deriving (Show, Read) showCompilerId :: Compiler -> String -showCompilerId = Distribution.Compiler.showCompilerId . compilerId +showCompilerId = display . compilerId compilerFlavor :: Compiler -> CompilerFlavor compilerFlavor = (\(CompilerId f _) -> f) . compilerId diff --git a/Distribution/Simple/InstallDirs.hs b/Distribution/Simple/InstallDirs.hs index a02a97876626205067e0ae213a8362689dc9ca18..4f9a273755d828a3d4ced99da679e07bb7bbc17f 100644 --- a/Distribution/Simple/InstallDirs.hs +++ b/Distribution/Simple/InstallDirs.hs @@ -79,7 +79,7 @@ import Distribution.Package import Distribution.System ( OS(..), buildOS ) import Distribution.Compiler - ( CompilerId, showCompilerId, CompilerFlavor(..) ) + ( CompilerId, CompilerFlavor(..) ) import Distribution.Text ( display ) @@ -411,7 +411,7 @@ initialPathTemplateEnv pkgId compilerId = [(PkgNameVar, packageName pkgId) ,(PkgVerVar, display (packageVersion pkgId)) ,(PkgIdVar, display pkgId) - ,(CompilerVar, showCompilerId compilerId)] + ,(CompilerVar, display compilerId)] -- --------------------------------------------------------------------------- -- Parsing and showing path templates: