mirror of
https://github.com/anoma/juvix.git
synced 2024-12-14 17:32:00 +03:00
3d012cc8fb
- Closes #1993 This pr makes it possible to use `~`, `..` and environment variables in the `juvix.yaml` and all flags / input of the cli. In the CLI, the shell will be responsible for replacing environment variables with their value, so the usual syntax can be used. For the `dependencies` field, I have implemented a parser that has some restrictions: 1. Environment variables are given with the makefile-like syntax `$(VAR)` 2. The three characters `$` `(` `)` are reserved for the environment variables syntax. They cannot be part of the path. 3. `~` is reserved for `$(HOME)`. I.e. the prepath `~~` will expand to `$HOME$HOME`. 4. Nested environment variables are not allowed. Thanks @paulcadman for the feedback. I think we are ready to merge this nightmarish pr 👻 --------- Co-authored-by: Paul Cadman <git@paulcadman.dev>
53 lines
2.1 KiB
Haskell
53 lines
2.1 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.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
|
|
ep <- getEntryPoint (AppPath (preFileFromAbs file) True)
|
|
tgt <- getTarget (opts ^. compileTarget)
|
|
let entryPoint :: EntryPoint
|
|
entryPoint =
|
|
ep
|
|
{ _entryPointTarget = tgt,
|
|
_entryPointDebug = opts ^. compileDebug
|
|
}
|
|
s <- embed (readFile (toFilePath file))
|
|
case Asm.runParser (toFilePath file) s of
|
|
Left err -> exitJuvixError (JuvixError err)
|
|
Right tab -> do
|
|
case run $ runReader entryPoint $ runError $ asmToMiniC 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 (preFileFromAbs cFile) False}
|
|
where
|
|
getFile :: Sem r (Path Abs File)
|
|
getFile = fromAppPathFile (opts ^. compileInputFile)
|
|
|
|
getTarget :: CompileTarget -> Sem r Backend.Target
|
|
getTarget = \case
|
|
TargetWasm32Wasi -> return Backend.TargetCWasm32Wasi
|
|
TargetNative64 -> return Backend.TargetCNative64
|
|
TargetGeb -> exitMsg (ExitFailure 1) "error: GEB target not supported for JuvixAsm"
|
|
TargetCore -> exitMsg (ExitFailure 1) "error: JuvixCore target not supported for JuvixAsm"
|
|
TargetAsm -> exitMsg (ExitFailure 1) "error: JuvixAsm 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)
|