{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Types.ForeignLibType( ForeignLibType(..), knownForeignLibTypes, foreignLibTypeIsShared, ) where import Prelude () import Distribution.Compat.Prelude import Text.PrettyPrint hiding ((<>)) import Distribution.Text import qualified Distribution.Compat.ReadP as Parse import Distribution.PackageDescription.Utils -- | What kind of foreign library is to be built? data ForeignLibType = -- | A native shared library (@.so@ on Linux, @.dylib@ on OSX, or -- @.dll@ on Windows). ForeignLibNativeShared -- | A native static library (not currently supported.) | ForeignLibNativeStatic -- TODO: Maybe this should record a string? | ForeignLibTypeUnknown deriving (Generic, Show, Read, Eq, Typeable, Data) instance Text ForeignLibType where disp ForeignLibNativeShared = text "native-shared" disp ForeignLibNativeStatic = text "native-static" disp ForeignLibTypeUnknown = text "unknown" parse = Parse.choice [ do _ <- Parse.string "native-shared" ; return ForeignLibNativeShared , do _ <- Parse.string "native-static" ; return ForeignLibNativeStatic ] instance Binary ForeignLibType instance Semigroup ForeignLibType where ForeignLibTypeUnknown <> b = b a <> ForeignLibTypeUnknown = a _ <> _ = error "Ambiguous foreign library type" instance Monoid ForeignLibType where mempty = ForeignLibTypeUnknown mappend = (<>) knownForeignLibTypes :: [ForeignLibType] knownForeignLibTypes = [ ForeignLibNativeShared , ForeignLibNativeStatic ] foreignLibTypeIsShared :: ForeignLibType -> Bool foreignLibTypeIsShared t = case t of ForeignLibNativeShared -> True ForeignLibNativeStatic -> False ForeignLibTypeUnknown -> cabalBug "Unknown foreign library type"