packages feed

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