futhark-0.15.7: src/Futhark/CLI/CSharp.hs
{-# LANGUAGE FlexibleContexts #-}
-- | @futhark csharp@
module Futhark.CLI.CSharp (main) where
import Control.Monad.IO.Class
import Data.Maybe (fromMaybe)
import System.FilePath
import System.Directory
import System.Exit
import System.Environment
import Futhark.Pipeline
import Futhark.Passes
import qualified Futhark.CodeGen.Backends.SequentialCSharp as SequentialCS
import Futhark.Compiler.CLI
import Futhark.Util
-- | Run @futhark csharp@
main :: String -> [String] -> IO ()
main = compilerMain () []
"Compile sequential C#" "Generate sequential C# code from optimised Futhark program."
sequentialCpuPipeline $ \() mode outpath prog -> do
mono_libs <- liftIO $ fromMaybe "." <$> lookupEnv "MONO_PATH"
let class_name =
case mode of ToLibrary -> Just $ takeBaseName outpath
ToExecutable -> Nothing
csprog <- SequentialCS.compileProg class_name prog
let cspath = outpath `addExtension` "cs"
liftIO $ writeFile cspath csprog
case mode of
ToLibrary -> return ()
ToExecutable -> do
ret <- liftIO $ runProgramWithExitCode "csc"
["-out:" ++ outpath
, "-lib:"++mono_libs
, "-r:Cloo.clSharp.dll"
, "-r:Mono.Options.dll"
, cspath
, "/unsafe"] mempty
case ret of
Left err ->
externalErrorS $ "Failed to run csc: " ++ show err
Right (ExitFailure code, cscwarn, cscerr) ->
externalErrorS $ "csc failed with code " ++ show code ++ ":\n" ++ cscerr ++ cscwarn
Right (ExitSuccess, _, _) -> liftIO $ do
perms <- liftIO $ getPermissions outpath
setPermissions outpath $ setOwnerExecutable True perms