module Distribution.Simple.CCompiler (
CDialect(..),
cSourceExtensions,
cDialectFilenameExtension,
filenameCDialect
) where
import Prelude ()
import Distribution.Compat.Prelude
import System.FilePath
( takeExtension )
data CDialect = C
| ObjectiveC
| CPlusPlus
| ObjectiveCPlusPlus
deriving (CDialect -> CDialect -> Bool
(CDialect -> CDialect -> Bool)
-> (CDialect -> CDialect -> Bool) -> Eq CDialect
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CDialect -> CDialect -> Bool
$c/= :: CDialect -> CDialect -> Bool
== :: CDialect -> CDialect -> Bool
$c== :: CDialect -> CDialect -> Bool
Eq, Int -> CDialect -> ShowS
[CDialect] -> ShowS
CDialect -> String
(Int -> CDialect -> ShowS)
-> (CDialect -> String) -> ([CDialect] -> ShowS) -> Show CDialect
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CDialect] -> ShowS
$cshowList :: [CDialect] -> ShowS
show :: CDialect -> String
$cshow :: CDialect -> String
showsPrec :: Int -> CDialect -> ShowS
$cshowsPrec :: Int -> CDialect -> ShowS
Show)
instance Monoid CDialect where
mempty :: CDialect
mempty = CDialect
C
mappend :: CDialect -> CDialect -> CDialect
mappend = CDialect -> CDialect -> CDialect
forall a. Semigroup a => a -> a -> a
(<>)
instance Semigroup CDialect where
C <> :: CDialect -> CDialect -> CDialect
<> anything :: CDialect
anything = CDialect
anything
ObjectiveC <> CPlusPlus = CDialect
ObjectiveCPlusPlus
CPlusPlus <> ObjectiveC = CDialect
ObjectiveCPlusPlus
_ <> ObjectiveCPlusPlus = CDialect
ObjectiveCPlusPlus
ObjectiveC <> _ = CDialect
ObjectiveC
CPlusPlus <> _ = CDialect
CPlusPlus
ObjectiveCPlusPlus <> _ = CDialect
ObjectiveCPlusPlus
cSourceExtensions :: [String]
cSourceExtensions :: [String]
cSourceExtensions = ["c", "i", "ii", "m", "mi", "mm", "M", "mii", "cc", "cp",
"cxx", "cpp", "CPP", "c++", "C"]
cDialectFilenameExtension :: CDialect -> Bool -> String
cDialectFilenameExtension :: CDialect -> Bool -> String
cDialectFilenameExtension C True = "c"
cDialectFilenameExtension C False = "i"
cDialectFilenameExtension ObjectiveC True = "m"
cDialectFilenameExtension ObjectiveC False = "mi"
cDialectFilenameExtension CPlusPlus True = "cpp"
cDialectFilenameExtension CPlusPlus False = "ii"
cDialectFilenameExtension ObjectiveCPlusPlus True = "mm"
cDialectFilenameExtension ObjectiveCPlusPlus False = "mii"
filenameCDialect :: String -> Maybe (CDialect, Bool)
filenameCDialect :: String -> Maybe (CDialect, Bool)
filenameCDialect filename :: String
filename = do
String
extension <- case ShowS
takeExtension String
filename of
'.':ext :: String
ext -> String -> Maybe String
forall a. a -> Maybe a
Just String
ext
_ -> Maybe String
forall a. Maybe a
Nothing
case String
extension of
"c" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
C, Bool
True)
"i" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
C, Bool
False)
"ii" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
False)
"m" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
ObjectiveC, Bool
True)
"mi" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
ObjectiveC, Bool
False)
"mm" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
ObjectiveCPlusPlus, Bool
True)
"M" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
ObjectiveCPlusPlus, Bool
True)
"mii" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
ObjectiveCPlusPlus, Bool
False)
"cc" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"cp" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"cxx" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"cpp" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"CPP" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"c++" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
"C" -> (CDialect, Bool) -> Maybe (CDialect, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (CDialect
CPlusPlus, Bool
True)
_ -> Maybe (CDialect, Bool)
forall a. Maybe a
Nothing