mirror of
https://github.com/anoma/juvix.git
synced 2024-12-15 01:52:11 +03:00
45 lines
1.6 KiB
Haskell
45 lines
1.6 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
|
|
import Juvix.Extra.Paths
|
|
|
|
runCommand :: forall r. Members '[Embed IO, App] r => AsmCompileOptions -> Sem r ()
|
|
runCommand opts = do
|
|
s <- embed (readFile file)
|
|
case Asm.runParser 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
|
|
root <- askRoot
|
|
embed $ createDirectoryIfMissing True (root </> juvixBuildDir)
|
|
let cFile = inputCFile root file
|
|
embed $ TIO.writeFile cFile _resultCCode
|
|
Compile.runCommand opts {_compileInputFile = Path cFile False}
|
|
where
|
|
file :: FilePath
|
|
file = 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
|
|
TargetC -> Backend.TargetCWasm32Wasi
|
|
|
|
inputCFile :: FilePath -> FilePath -> FilePath
|
|
inputCFile projRoot inputFileCompile =
|
|
projRoot </> juvixBuildDir </> outputMiniCFile
|
|
where
|
|
outputMiniCFile :: FilePath
|
|
outputMiniCFile = takeBaseName inputFileCompile <> ".c"
|