mirror of
https://github.com/anoma/juvix.git
synced 2024-12-14 17:32:00 +03:00
151bba5113
* Closes #1807
46 lines
1.8 KiB
Haskell
46 lines
1.8 KiB
Haskell
module Commands.Dev.Asm.Compile where
|
|
|
|
import Commands.Base
|
|
import Commands.Dev.Asm.Compile.Options
|
|
import Commands.Extra.Compile qualified as Compile
|
|
import Data.Text.IO qualified as TIO
|
|
import Juvix.Compiler.Asm.Options qualified as Asm
|
|
import Juvix.Compiler.Asm.Translation.FromSource qualified as Asm
|
|
import Juvix.Compiler.Backend qualified as Backend
|
|
import Juvix.Compiler.Backend.C qualified as C
|
|
|
|
runCommand :: forall r. (Members '[Embed IO, App] r) => AsmCompileOptions -> Sem r ()
|
|
runCommand opts = do
|
|
file <- getFile
|
|
s <- embed (readFile (toFilePath file))
|
|
case Asm.runParser (toFilePath file) s of
|
|
Left err -> exitJuvixError (JuvixError err)
|
|
Right tab -> case run $ runError $ asmToMiniC asmOpts tab of
|
|
Left err -> exitJuvixError err
|
|
Right C.MiniCResult {..} -> do
|
|
buildDir <- askBuildDir
|
|
ensureDir buildDir
|
|
cFile <- inputCFile file
|
|
embed $ TIO.writeFile (toFilePath cFile) _resultCCode
|
|
Compile.runCommand opts {_compileInputFile = AppPath (Abs cFile) False}
|
|
where
|
|
getFile :: Sem r (Path Abs File)
|
|
getFile = someBaseToAbs' (opts ^. compileInputFile . pathPath)
|
|
|
|
asmOpts :: Asm.Options
|
|
asmOpts = Asm.makeOptions (asmTarget (opts ^. compileTarget)) (opts ^. compileDebug)
|
|
|
|
asmTarget :: CompileTarget -> Backend.Target
|
|
asmTarget = \case
|
|
TargetWasm32Wasi -> Backend.TargetCWasm32Wasi
|
|
TargetNative64 -> Backend.TargetCNative64
|
|
TargetGeb -> error "GEB target not supported for JuvixAsm"
|
|
|
|
inputCFile :: (Members '[App] r) => Path Abs File -> Sem r (Path Abs File)
|
|
inputCFile inputFileCompile = do
|
|
buildDir <- askBuildDir
|
|
return (buildDir <//> outputMiniCFile)
|
|
where
|
|
outputMiniCFile :: Path Rel File
|
|
outputMiniCFile = replaceExtension' ".c" (filename inputFileCompile)
|