on master help sign in
Idris-dev/src/IRTS/System.hs
113 lines 3.0 kB history raw
1{-|
2Module : IRTS.System
3Description : Utilities for interacting with the System.
5License : BSD3
6Maintainer : The Idris Community.
7-}
8{-# LANGUAGE CPP #-}
9module IRTS.System( getIdrisDataFileByName
10 , getCC
11 , getLibFlags
12 , getIdrisDataDir
13 , getIdrisLibDir
14 , getIdrisDocDir
15 , getIdrisCRTSDir
16 , getIdrisJSRTSDir
17 , getIncFlags
18 , getEnvFlags
19 , version
20 ) where
22#ifdef FREESTANDING
23import Paths_idris (version)
24import Target_idris
25#else
26import Paths_idris
27#endif
28import BuildFlags_idris
30import Control.Applicative ((<$>))
31import Data.List.Split
32import Data.Maybe (fromMaybe)
33import System.Environment
34import System.FilePath (addTrailingPathSeparator, dropTrailingPathSeparator,
35 (</>))
38getIdrisDataDir :: IO String
39getIdrisDataDir = do
40 envValue <- lookupEnv "TARGET"
41 case envValue of
42 Nothing -> do
43 ddir <- getDataDir
44 return ddir
45 Just ddir -> return ddir
47getIdrisDataFileByName :: String -> IO FilePath
48getIdrisDataFileByName fn = do
49 dir <- getIdrisDataDir
50 return $ dir </> fn
52overrideIdrisSubDirWith :: String -- ^ Sub directory in `getDataDir` location.
53 -> String -- ^ Environment variable to get new location from.
54 -> IO FilePath
55overrideIdrisSubDirWith fp envVar = do
56 envValue <- lookupEnv envVar
57 case envValue of
58 Nothing -> do
59 ddir <- getIdrisDataDir
60 return (ddir </> fp)
61 Just ddir -> return ddir
63getCC :: IO String
64getCC = fromMaybe cc <$> lookupEnv "IDRIS_CC"
65 where
66#ifdef mingw32_HOST_OS
67 cc = "gcc"
68#else
69 cc = "cc"
70#endif
72getEnvFlags :: IO [String]
73getEnvFlags = maybe [] (splitOn " ") <$> lookupEnv "IDRIS_CFLAGS"
76#if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS)\
77 || defined(openbsd_HOST_OS) || defined(netbsd_HOST_OS)
78extraLib = ["-L/usr/local/lib"]
79extraInclude = ["-I/usr/local/include"]
80#else
81extraLib = []
82extraInclude = []
83#endif
85#ifdef IDRIS_GMP
86gmpLib = ["-lgmp", "-DIDRIS_GMP"]
87#else
88gmpLib = []
89#endif
91extraLibFlags = map ("-L" ++) extraLibDirs
93getLibFlags = do dir <- getIdrisCRTSDir
94 return $ extraLibFlags
95 ++ extraLib
96 ++ ["-L" ++ dropTrailingPathSeparator dir, "-lidris_rts"]
97 ++ gmpLib
98 ++ ["-lpthread"]
100getIdrisLibDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "libs" "IDRIS_LIBRARY_PATH"
102getIdrisDocDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "docs" "IDRIS_DOC_PATH"
104getIdrisJSRTSDir = do
105 ddir <- getIdrisDataDir
106 return $ addTrailingPathSeparator (ddir </> "jsrts")
108getIdrisCRTSDir = do
109 ddir <- getIdrisDataDir
110 return $ addTrailingPathSeparator (ddir </> "rts")
112getIncFlags = do dir <- getIdrisCRTSDir
113 return $ ("-I" ++ dropTrailingPathSeparator dir) : extraInclude