packages feed

futhask-0.2.0: app/Main.hs

module Main where

import System.IO
import Data.Maybe
import Data.List (intercalate)
import Debug.Trace
import System.Directory
import System.Environment
import CodeBodies
import Conversion
import Headers
import Backends

writeModule backend directory moduleName (subModuleName, headerF, body) 
    = writeFile fn string
    where fn = directory ++ "/" ++ moduleName 
            ++ (case subModuleName of Just n -> "/" ++ n; Nothing -> "") ++ ".hs"
          string = headerF backend moduleName subModuleName ++ body

main :: IO ()
main = do
    args <- getArgs
    [ backendS, headerName, srcDir, moduleName ] <- getArgs >>= \args -> case args of
         [a, b, c, d] -> return args
         _            -> error "futhask takes four arguments:\n - backend (c, opencl, cuda)\n - Futhark header file\n - Haskell source directory\n - module name"
    backend <- case backendS of
        "c"         -> return C
        "opencl"    -> return OpenCL
        "cuda"      -> return Cuda
        "multicore" -> return Multicore
        _           -> error $ "unknown backend: " ++ backendS ++ "\n  available backends: c, opencl, cuda, multicore"
    header <- readHeader headerName
    
    createDirectoryIfMissing False (srcDir ++ "/" ++ moduleName)
    mapM_ (writeModule backend srcDir moduleName)
        [ (Just "Raw", rawHeader, rawImportString header)
        , (Just "Entries", entriesHeader, entryCallString header)
        , (Just "Types", typesHeader, instanceDeclarationString header)
        , (Just "TypeClasses", typeClassesHeader, typeClassesBody)
        , (Just "Context", contextHeader, contextBody)
        , (Just "Config", configHeader, configBody backend)
        , (Just "Fut", futHeader, futBody)
        , (Just "Wrap", wrapHeader, wrapBody)
        , (Just "Utils", utilsHeader, utilsBody)
        , (Nothing, exportsHeader, "") ]