futhark-0.7.3: src/futhark-cs.hs
{-# LANGUAGE FlexibleContexts #-}
module Main (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.Util.Pretty (prettyText)
import Futhark.Compiler.CLI
import Futhark.Util
main :: 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 <- either (`internalError` prettyText prog) return =<<
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"] ""
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