summaryrefslogtreecommitdiff
path: root/libraries/ghc-boot/GHC/BaseDir.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ghc-boot/GHC/BaseDir.hs')
-rw-r--r--libraries/ghc-boot/GHC/BaseDir.hs37
1 files changed, 25 insertions, 12 deletions
diff --git a/libraries/ghc-boot/GHC/BaseDir.hs b/libraries/ghc-boot/GHC/BaseDir.hs
index 0001837f75..c2fb3bbdae 100644
--- a/libraries/ghc-boot/GHC/BaseDir.hs
+++ b/libraries/ghc-boot/GHC/BaseDir.hs
@@ -12,7 +12,11 @@
-- installation location at build time. ghc-pkg also can expand those variables
-- and so needs the top dir location to do that too.
-module GHC.BaseDir where
+module GHC.BaseDir
+ ( expandTopDir
+ , expandPathVar
+ , getBaseDir
+ ) where
import Prelude -- See Note [Why do we import Prelude here?]
@@ -20,11 +24,9 @@ import Data.List (stripPrefix)
import Data.Maybe (listToMaybe)
import System.FilePath
--- Windows
-#if defined(mingw32_HOST_OS)
-import System.Environment (getExecutablePath)
--- POSIX
-#elif defined(darwin_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(netbsd_HOST_OS)
+#if MIN_VERSION_base(4,17,0)
+import System.Environment (executablePath)
+#else
import System.Environment (getExecutablePath)
#endif
@@ -43,17 +45,27 @@ expandPathVar var value str
expandPathVar var value (x:xs) = x : expandPathVar var value xs
expandPathVar _ _ [] = []
+#if !MIN_VERSION_base(4,17,0)
+-- Polyfill for base-4.17 executablePath
+executablePath :: Maybe (IO (Maybe FilePath))
+executablePath = Just (Just <$> getExecutablePath)
+#elif !MIN_VERSION_base(4,18,0) && defined(js_HOST_ARCH)
+-- executablePath is missing from base < 4.18.0 on js_HOST_ARCH
+executablePath :: Maybe (IO (Maybe FilePath))
+executablePath = Nothing
+#endif
+
-- | Calculate the location of the base dir
getBaseDir :: IO (Maybe String)
#if defined(mingw32_HOST_OS)
-getBaseDir = Just . (\p -> p </> "lib") . rootDir <$> getExecutablePath
+getBaseDir = maybe (pure Nothing) ((((</> "lib") . rootDir) <$>) <$>) executablePath
where
-- locate the "base dir" when given the path
-- to the real ghc executable (as opposed to symlink)
-- that is running this function.
rootDir :: FilePath -> FilePath
rootDir = takeDirectory . takeDirectory . normalise
-#elif defined(darwin_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(netbsd_HOST_OS)
+#else
-- on unix, this is a bit more confusing.
-- The layout right now is something like
--
@@ -65,14 +77,15 @@ getBaseDir = Just . (\p -> p </> "lib") . rootDir <$> getExecutablePath
-- As such, we first need to find the absolute location to the
-- binary.
--
--- getExecutablePath will return (3). One takeDirectory will
+-- executablePath will return (3). One takeDirectory will
-- give use /lib/ghc-X.Y.Z/bin, and another will give us (4).
--
-- This of course only works due to the current layout. If
-- the layout is changed, such that we have ghc-X.Y.Z/{bin,lib}
-- this would need to be changed accordingly.
--
-getBaseDir = Just . (\p -> p </> "lib") . takeDirectory . takeDirectory <$> getExecutablePath
-#else
-getBaseDir = return Nothing
+getBaseDir = maybe (pure Nothing) ((((</> "lib") . rootDir) <$>) <$>) executablePath
+ where
+ rootDir :: FilePath -> FilePath
+ rootDir = takeDirectory . takeDirectory
#endif