content: {-|
  Module      : IRTS.System
  Description : Utilities for interacting with the System.
  
  License     : BSD3
  Maintainer  : The Idris Community.
  -}
  {-# LANGUAGE CPP #-}
  module IRTS.System( getIdrisDataFileByName
                    , getCC
                    , getLibFlags
                    , getIdrisDataDir
                    , getIdrisLibDir
                    , getIdrisDocDir
                    , getIdrisCRTSDir
                    , getIdrisJSRTSDir
                    , getIncFlags
                    , getEnvFlags
                    , version
                    ) where
  
  #ifdef FREESTANDING
  import Paths_idris (version)
  import Target_idris
  #else
  import Paths_idris
  #endif
  import BuildFlags_idris
  
  import Control.Monad (Monad, liftM2)
  import Control.Applicative ((<|>))
  import Data.List.Split
  import Data.Maybe (fromMaybe)
  import System.Environment
  import System.FilePath (addTrailingPathSeparator, dropTrailingPathSeparator,
                          (</>))
  
  
  getIdrisDataDir :: IO String
  getIdrisDataDir = do
    envValue <- lookupEnv "TARGET"
    case envValue of
      Nothing -> do
        ddir <- getDataDir
        return ddir
      Just ddir -> return ddir
  
  getIdrisDataFileByName :: String -> IO FilePath
  getIdrisDataFileByName fn = do
    dir <- getIdrisDataDir
    return $ dir </> fn
  
  overrideIdrisSubDirWith :: String  -- ^ Sub directory in `getDataDir` location.
                          -> String  -- ^ Environment variable to get new location from.
                          -> IO FilePath
  overrideIdrisSubDirWith fp envVar = do
    envValue <- lookupEnv envVar
    case envValue of
      Nothing -> do
        ddir <- getIdrisDataDir
        return (ddir </> fp)
      Just ddir -> return ddir
  
  getCC :: IO String
  getCC = fromMaybe cc <$> liftM2 (<|>) (lookupEnv "IDRIS_CC") (lookupEnv "CC")
    where
  #ifdef mingw32_HOST_OS
      cc = "gcc"
  #else
      cc = "cc"
  #endif
  
  getEnvFlags :: IO [String]
  getEnvFlags = maybe [] (splitOn " ") <$> liftM2 (<|>)
    (lookupEnv "IDRIS_CFLAGS") (lookupEnv "CFLAGS")
  
  
  #if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS)\
      || defined(openbsd_HOST_OS) || defined(netbsd_HOST_OS)
  extraLib = ["-L/usr/local/lib"]
  extraInclude = ["-I/usr/local/include"]
  #else
  extraLib = []
  extraInclude = []
  #endif
  
  #ifdef IDRIS_GMP
  gmpLib = ["-lgmp", "-DIDRIS_GMP"]
  #else
  gmpLib = []
  #endif
  
  extraLibFlags = map ("-L" ++) extraLibDirs
  
  getLibFlags = do dir <- getIdrisCRTSDir
                   return $ extraLibFlags
                     ++ extraLib
                     ++ ["-L" ++ dropTrailingPathSeparator dir, "-lidris_rts"]
                     ++ gmpLib
                     ++ ["-lpthread"]
  
  getIdrisLibDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "libs" "IDRIS_LIBRARY_PATH"
  
  getIdrisDocDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "docs" "IDRIS_DOC_PATH"
  
  getIdrisJSRTSDir = do
    ddir <- getIdrisDataDir
    return $ addTrailingPathSeparator (ddir </> "jsrts")
  
  getIdrisCRTSDir = do
    ddir <- getIdrisDataDir
    return $ addTrailingPathSeparator (ddir </> "rts")
  
  getIncFlags = do dir <- getIdrisCRTSDir
                   return $ ("-I" ++ dropTrailingPathSeparator dir) : extraInclude
  