Distribution/Types/ForeignLibType.hs

    {-# 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"