module Haste.Environment (
hasteSysDir, jsmodSysDir, hasteInstSysDir, pkgSysDir, pkgSysLibDir, jsDir,
hasteUserDir, jsmodUserDir, hasteInstUserDir, pkgUserDir, pkgUserLibDir,
hostWordSize, ghcLibDir,
ghcBinary, ghcPkgBinary,
hasteBinary, hastePkgBinary, hasteInstHisBinary, hasteInstBinary,
hasteCopyPkgBinary, closureCompiler, portableHaste,
needsReboot, bootFile
) where
import System.IO.Unsafe
import Data.Bits
import Foreign.C.Types (CIntPtr)
import Control.Shell hiding (hClose)
import Paths_haste_compiler
import System.IO
import System.Environment (getExecutablePath)
import Haste.GHCPaths (ghcBinary, ghcPkgBinary, ghcLibDir)
import Haste.Version
#if defined(PORTABLE)
portableHaste :: Bool
portableHaste = True
hasteSysDir :: FilePath
hasteSysDir =
joinPath . init . init . splitPath $ unsafePerformIO getExecutablePath
hasteBinDir :: FilePath
hasteBinDir = hasteSysDir </> "bin"
jsDir :: FilePath
jsDir = hasteSysDir </> "js"
#else
portableHaste :: Bool
portableHaste = False
hasteSysDir :: FilePath
hasteSysDir = hasteUserDir
hasteBinDir :: FilePath
hasteBinDir = unsafePerformIO $ getBinDir
jsDir :: FilePath
jsDir = unsafePerformIO $ getDataDir
#endif
hasteUserDir :: FilePath
Right hasteUserDir =
unsafePerformIO . shell . withAppDirectory "haste" $ \d -> do
return $ d </> showBootVersion bootVersion
jsmodSysDir :: FilePath
jsmodSysDir = hasteSysDir </> "jsmods"
hasteInstSysDir :: FilePath
hasteInstSysDir = hasteSysDir </> "libraries"
pkgSysLibDir :: FilePath
pkgSysLibDir = hasteInstSysDir </> "lib"
pkgSysDir :: FilePath
pkgSysDir = hasteSysDir </> "packages"
jsmodUserDir :: FilePath
jsmodUserDir = hasteUserDir </> "jsmods"
hasteInstUserDir :: FilePath
hasteInstUserDir = hasteUserDir </> "libraries"
pkgUserLibDir :: FilePath
pkgUserLibDir = hasteInstUserDir </> "lib"
pkgUserDir :: FilePath
pkgUserDir = hasteUserDir </> "packages"
hostWordSize :: Int
#if __GLASGOW_HASKELL__ >= 708
hostWordSize = finiteBitSize (undefined :: CIntPtr)
#else
hostWordSize = bitSize (undefined :: CIntPtr)
#endif
hasteBinary :: FilePath
hasteBinary = hasteBinDir </> "hastec"
hastePkgBinary :: FilePath
hastePkgBinary = hasteBinDir </> "haste-pkg"
hasteCopyPkgBinary :: FilePath
hasteCopyPkgBinary = hasteBinDir </> "haste-copy-pkg"
hasteInstBinary :: FilePath
hasteInstBinary = hasteBinDir </> "haste-inst"
hasteInstHisBinary :: FilePath
hasteInstHisBinary = hasteBinDir </> "haste-install-his"
closureCompiler :: FilePath
closureCompiler = hasteBinDir </> "compiler.jar"
bootFile :: FilePath
bootFile = hasteSysDir </> "booted"
needsReboot :: Bool
needsReboot = unsafePerformIO $ do
exists <- shell $ isFile bootFile
case exists of
Right True -> do
fh <- openFile bootFile ReadMode
bootedVerString <- hGetLine fh
hClose fh
case parseBootVersion bootedVerString of
Just (BootVer hasteVer ghcVer) ->
return $ hasteVer /= hasteVersion || ghcVer /= ghcVersion
_ ->
return True
_ -> do
return True