{-# LANGUAGE MultiWayIf #-}
module GHC.Runtime.Interpreter.C
( generateIservC
)
where
import GHC.Prelude
import GHC.Platform
import GHC.Data.FastString
import GHC.Utils.Logger
import GHC.Utils.TmpFs
import GHC.Unit.Types
import GHC.Unit.Env
import GHC.Unit.Info
import GHC.Unit.State
import GHC.Utils.Panic.Plain
import GHC.Linker.Executable
import GHC.Linker.Config
import GHC.Utils.CliOption
generateIservC :: Logger -> TmpFs -> ExecutableLinkOpts -> UnitEnv -> IO FilePath
generateIservC :: Logger -> TmpFs -> ExecutableLinkOpts -> UnitEnv -> IO FilePath
generateIservC Logger
logger TmpFs
tmpfs ExecutableLinkOpts
opts UnitEnv
unit_env = do
let unit_state :: UnitState
unit_state = HasDebugCallStack => UnitEnv -> UnitState
UnitEnv -> UnitState
ue_homeUnitState UnitEnv
unit_env
ghci_unit_id <- case UnitState -> PackageName -> Maybe UnitId
lookupPackageName UnitState
unit_state (FastString -> PackageName
PackageName (FilePath -> FastString
fsLit FilePath
"ghci")) of
Maybe UnitId
Nothing -> FilePath -> IO UnitId
forall a. FilePath -> IO a
cmdLineErrorIO FilePath
"C interpreter: couldn't find \"ghci\" package"
Just UnitId
i -> UnitId -> IO UnitId
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure UnitId
i
let tmpdir = ExecutableLinkOpts -> TempDir
leTempDir ExecutableLinkOpts
opts
exe_file <- newTempName logger tmpfs tmpdir TFL_GhcSession "iserv"
let platform = UnitEnv -> Platform
ue_platform UnitEnv
unit_env
let os = Platform -> OS
platformOS Platform
platform
let opts' = ExecutableLinkOpts
opts
{
leOutputFile = Just exe_file
, leNoHsMain = False
, leMainSymbol = zString (zEncodeFS (unitIdFS ghci_unit_id)) ++ "_GHCiziServer_defaultServer"
, leInputs = []
, leKeepCafs = True
, leRtsOptsEnabled = RtsOptsAll
, leLinkerConfig = if
| osElfTarget os
, os /= OSFreeBSD
, os /= OSSolaris2
-> (leLinkerConfig opts)
{ linkerOptionsPost = linkerOptionsPost (leLinkerConfig opts) ++ [Option "-Wl,--export-dynamic"]
}
| otherwise
-> leLinkerConfig opts
}
linkExecutable logger tmpfs opts' unit_env [] [ghci_unit_id]
pure exe_file