packages feed

futhark-0.15.7: src/Futhark/CLI/CSOpenCL.hs

{-# LANGUAGE FlexibleContexts #-}
-- | @futhark csopencl@
module Futhark.CLI.CSOpenCL (main) where

import Control.Monad.IO.Class
import Data.Maybe (fromMaybe)
import System.Directory
import System.Environment
import System.Exit
import System.FilePath

import Futhark.Passes
import Futhark.Pipeline
import qualified Futhark.CodeGen.Backends.CSOpenCL as CSOpenCL
import Futhark.Compiler.CLI
import Futhark.Util

-- | Run @futhark csopencl@.
main :: String -> [String] -> IO ()
main = compilerMain () []
       "Compile OpenCL C#" "Generate OpenCL C# code from optimised Futhark program."
       gpuPipeline $ \() mode outpath prog -> do
          mono_libs <- liftIO $ fromMaybe "." <$> lookupEnv "MONO_PATH"

          let class_name =
                case mode of ToLibrary -> Just $ takeBaseName outpath
                             ToExecutable -> Nothing
          csprog <- CSOpenCL.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,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