Skip to content

Commit

Permalink
conditionally include Rust/WASM targets
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszcz committed Oct 15, 2024
1 parent 30fb8a6 commit 53cb70d
Show file tree
Hide file tree
Showing 16 changed files with 125 additions and 78 deletions.
7 changes: 4 additions & 3 deletions app/Commands/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Commands.Compile.Vampir.Options
import Commands.Compile.Wasi.Options
import Commands.Extra.NewCompile
import CommonOptions
import Juvix.Config qualified as Config

data CompileCommand
= Native (NativeOptions 'InputMain)
Expand All @@ -29,7 +30,7 @@ supportedTargets =
[ (AppTargetVampIR, Vampir <$> parseVampir),
(AppTargetAnoma, Anoma <$> parseAnoma),
(AppTargetCairo, Cairo <$> parseCairo),
(AppTargetWasm32Wasi, Wasi <$> parseWasi),
(AppTargetNative64, Native <$> parseNative),
(AppTargetRiscZeroRust, RiscZeroRust <$> parseRiscZeroRust)
(AppTargetNative64, Native <$> parseNative)
]
<> [(AppTargetWasm32Wasi, Wasi <$> parseWasi) | Config.config ^. Config.configWasm]
<> [(AppTargetRiscZeroRust, RiscZeroRust <$> parseRiscZeroRust) | Config.config ^. Config.configRust]
34 changes: 3 additions & 31 deletions app/Commands/Compile/RiscZeroRust.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,11 @@ module Commands.Compile.RiscZeroRust where

import Commands.Base
import Commands.Compile.RiscZeroRust.Options
import Commands.Extra.NewCompile
import Data.FileEmbed qualified as FE
import Commands.Compile.RiscZeroRust.Rust
import Juvix.Compiler.Backend.Rust.Data.Result

runCommand :: forall r. (Members AppEffects r) => RiscZeroRustOptions 'InputMain -> Sem r ()
runCommand opts = do
let opts' = opts ^. riscZeroRustCompileCommonOptions
inputFile = opts' ^. compileInputFile
moutputDir = opts ^. riscZeroRustOutputDir
outDir :: Path Abs Dir <- getOutputDir FileExtRiscZero inputFile moutputDir
writeDirFiles riscZeroDir outDir
let outJuvixSourceDir :: Path Abs Dir = outDir <//> $(mkRelDir "juvix") <//> $(mkRelDir "src")
writeDirFiles rustRuntimeSourceDir outJuvixSourceDir
writeFile (outDir <//> $(mkRelDir "juvix") <//> $(mkRelFile "Cargo.toml")) rustRuntimeToml
let outFile :: Path Abs File =
outDir
<//> $(mkRelDir "methods")
<//> $(mkRelDir "guest")
<//> $(mkRelDir "src")
<//> $(mkRelFile "main.rs")
let inputFile = opts ^. riscZeroRustCompileCommonOptions . compileInputFile
Result {..} <- runPipeline opts inputFile upToRiscZeroRust
writeFileEnsureLn outFile _resultRustCode
where
riscZeroDir :: [(FilePath, ByteString)]
riscZeroDir = $(FE.makeRelativeToProject "runtime/rust/risc0" >>= FE.embedDir)

rustRuntimeSourceDir :: [(FilePath, ByteString)]
rustRuntimeSourceDir = $(FE.makeRelativeToProject "runtime/rust/juvix/src" >>= FE.embedDir)

rustRuntimeToml :: ByteString
rustRuntimeToml = $(FE.makeRelativeToProject "runtime/rust/juvix/Cargo.toml" >>= FE.embedFile)

writeDirFiles :: [(FilePath, ByteString)] -> Path Abs Dir -> Sem r ()
writeDirFiles fs outDir = do
let fs' = map (first relFile) fs
forM_ (first (outDir <//>) <$> fs') (uncurry writeFile)
compileRustCode opts inputFile _resultRustCode
36 changes: 36 additions & 0 deletions app/Commands/Compile/RiscZeroRust/Rust.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module Commands.Compile.RiscZeroRust.Rust where

import Commands.Base
import Commands.Compile.RiscZeroRust.Options
import Commands.Extra.NewCompile
import Data.FileEmbed qualified as FE

compileRustCode :: forall k r. (Members '[App, TaggedLock, EmbedIO] r) => RiscZeroRustOptions k -> Maybe (AppPath File) -> Text -> Sem r ()
compileRustCode opts inputFile code = do
let moutputDir = opts ^. riscZeroRustOutputDir
outDir :: Path Abs Dir <- getOutputDir FileExtRiscZero inputFile moutputDir
writeDirFiles riscZeroDir outDir
let outJuvixSourceDir :: Path Abs Dir = outDir <//> $(mkRelDir "juvix") <//> $(mkRelDir "src")
writeDirFiles rustRuntimeSourceDir outJuvixSourceDir
writeFile (outDir <//> $(mkRelDir "juvix") <//> $(mkRelFile "Cargo.toml")) rustRuntimeToml
let outFile :: Path Abs File =
outDir
<//> $(mkRelDir "methods")
<//> $(mkRelDir "guest")
<//> $(mkRelDir "src")
<//> $(mkRelFile "main.rs")
writeFileEnsureLn outFile code
where
riscZeroDir :: [(FilePath, ByteString)]
riscZeroDir = $(FE.makeRelativeToProject "runtime/rust/risc0" >>= FE.embedDir)

rustRuntimeSourceDir :: [(FilePath, ByteString)]
rustRuntimeSourceDir = $(FE.makeRelativeToProject "runtime/rust/juvix/src" >>= FE.embedDir)

rustRuntimeToml :: ByteString
rustRuntimeToml = $(FE.makeRelativeToProject "runtime/rust/juvix/Cargo.toml" >>= FE.embedFile)

writeDirFiles :: [(FilePath, ByteString)] -> Path Abs Dir -> Sem r ()
writeDirFiles fs outDir = do
let fs' = map (first relFile) fs
forM_ (first (outDir <//>) <$> fs') (uncurry writeFile)
12 changes: 6 additions & 6 deletions app/Commands/Compile/Wasi/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,18 @@ wasiHelperOptions opts =
forall s.
(Members '[App, EmbedIO] s) =>
Sem s ()
prepareRuntime = writeRuntime runtime
prepareRuntime = writeRuntime (fromJust runtime)
where
runtime :: BS.ByteString
runtime :: Maybe BS.ByteString
runtime
| opts ^. wasiCompileCommonOptions . compileDebug = wasiDebugRuntime
| otherwise = wasiReleaseRuntime
where
wasiReleaseRuntime :: BS.ByteString
wasiReleaseRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi/libjuvix.a" >>= FE.embedFile)
wasiReleaseRuntime :: Maybe BS.ByteString
wasiReleaseRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi/libjuvix.a" >>= FE.embedFileIfExists)

wasiDebugRuntime :: BS.ByteString
wasiDebugRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi-debug/libjuvix.a" >>= FE.embedFile)
wasiDebugRuntime :: Maybe BS.ByteString
wasiDebugRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi-debug/libjuvix.a" >>= FE.embedFileIfExists)

wasiDefaultOutputFile :: Path Abs File -> Path Abs File -> Path Abs File
wasiDefaultOutputFile inputFile baseOutputFile =
Expand Down
8 changes: 5 additions & 3 deletions app/Commands/Dev/Asm/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@ where

import Commands.Extra.Compile.Options
import CommonOptions
import Juvix.Config qualified as Config

type AsmCompileOptions = CompileOptions

asmSupportedTargets :: NonEmpty CompileTarget
asmSupportedTargets =
AppTargetWasm32Wasi
:| [ AppTargetNative64,
AppTargetReg,
AppTargetNative64
:| [ AppTargetReg,
AppTargetCasm,
AppTargetCairo
]
<> [AppTargetWasm32Wasi | Config.config ^. Config.configWasm]
<> [AppTargetRiscZeroRust | Config.config ^. Config.configRust]

parseAsmCompileOptions :: Parser AsmCompileOptions
parseAsmCompileOptions =
Expand Down
9 changes: 5 additions & 4 deletions app/Commands/Dev/Core/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,23 @@ where
import Commands.Extra.Compile.Options
import CommonOptions
import Data.List.NonEmpty qualified as NonEmpty
import Juvix.Config qualified as Config

type CoreCompileOptions = CompileOptions

coreSupportedTargets :: NonEmpty CompileTarget
coreSupportedTargets =
NonEmpty.fromList
NonEmpty.fromList $
[ AppTargetNative64,
AppTargetWasm32Wasi,
AppTargetVampIR,
AppTargetTree,
AppTargetAsm,
AppTargetReg,
AppTargetCasm,
AppTargetCairo,
AppTargetRiscZeroRust
AppTargetCairo
]
<> [AppTargetWasm32Wasi | Config.config ^. Config.configWasm]
<> [AppTargetRiscZeroRust | Config.config ^. Config.configRust]

parseCoreCompileOptions :: Parser CoreCompileOptions
parseCoreCompileOptions =
Expand Down
12 changes: 6 additions & 6 deletions app/Commands/Dev/DevCompile/NativeRust.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,18 @@ runCommand opts = do
forall s.
(Members '[App, EmbedIO] s) =>
Sem s ()
prepareRuntime = writeRuntime runtime
prepareRuntime = writeRuntime (fromJust runtime)
where
runtime :: BS.ByteString
runtime :: Maybe BS.ByteString
runtime
| opts ^. nativeRustCompileCommonOptions . compileDebug = rustDebugRuntime
| otherwise = rustReleaseRuntime
where
rustReleaseRuntime :: BS.ByteString
rustReleaseRuntime = $(FE.makeRelativeToProject "runtime/rust/juvix/target/release/libjuvix.rlib" >>= FE.embedFile)
rustReleaseRuntime :: Maybe BS.ByteString
rustReleaseRuntime = $(FE.makeRelativeToProject "runtime/rust/juvix/target/release/libjuvix.rlib" >>= FE.embedFileIfExists)

rustDebugRuntime :: BS.ByteString
rustDebugRuntime = $(FE.makeRelativeToProject "runtime/rust/juvix/target/debug/libjuvix.rlib" >>= FE.embedFile)
rustDebugRuntime :: Maybe BS.ByteString
rustDebugRuntime = $(FE.makeRelativeToProject "runtime/rust/juvix/target/debug/libjuvix.rlib" >>= FE.embedFileIfExists)

inputRustFile :: (Members '[App, EmbedIO] r) => Path Abs File -> Sem r (Path Abs File)
inputRustFile inputFileCompile = do
Expand Down
6 changes: 4 additions & 2 deletions app/Commands/Dev/Reg/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ where

import Commands.Extra.Compile.Options
import CommonOptions
import Juvix.Config qualified as Config

regSupportedTargets :: NonEmpty CompileTarget
regSupportedTargets =
AppTargetNative64
:| [ AppTargetWasm32Wasi,
AppTargetCasm,
:| [ AppTargetCasm,
AppTargetCairo
]
<> [AppTargetWasm32Wasi | Config.config ^. Config.configWasm]
<> [AppTargetRiscZeroRust | Config.config ^. Config.configRust]

parseRegCompileOptions :: Parser CompileOptions
parseRegCompileOptions =
Expand Down
4 changes: 2 additions & 2 deletions app/Commands/Dev/Runtime/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module Commands.Dev.Runtime.Options where

import Commands.Dev.Runtime.Compile.Options
import CommonOptions
import Juvix.Config qualified as Config

newtype RuntimeCommand
= Compile CompileOptions
Expand All @@ -10,8 +11,7 @@ newtype RuntimeCommand
runtimeSupportedTargets :: NonEmpty CompileTarget
runtimeSupportedTargets =
AppTargetNative64
:| [ AppTargetWasm32Wasi
]
:| [AppTargetWasm32Wasi | Config.config ^. Config.configWasm]

parseRuntimeOptions :: Parser CompileOptions
parseRuntimeOptions =
Expand Down
2 changes: 2 additions & 0 deletions app/Commands/Dev/Tree/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Commands.Dev.Tree.Compile.Casm qualified as Casm
import Commands.Dev.Tree.Compile.Native qualified as Native
import Commands.Dev.Tree.Compile.Options
import Commands.Dev.Tree.Compile.Reg qualified as Reg
import Commands.Dev.Tree.Compile.RiscZeroRust qualified as RiscZeroRust
import Commands.Dev.Tree.Compile.Wasi qualified as Wasi

runCommand ::
Expand All @@ -23,3 +24,4 @@ runCommand = \case
Reg opts -> Reg.runCommand opts
Anoma opts -> Anoma.runCommand opts
Cairo opts -> Cairo.runCommand opts
RiscZeroRust opts -> RiscZeroRust.runCommand opts
17 changes: 5 additions & 12 deletions app/Commands/Dev/Tree/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ where
import Commands.Compile.Anoma.Options
import Commands.Compile.Cairo.Options
import Commands.Compile.Native.Options
import Commands.Compile.RiscZeroRust.Options
import Commands.Compile.Wasi.Options
import Commands.Dev.DevCompile.Asm.Options
import Commands.Dev.DevCompile.Casm.Options
import Commands.Dev.DevCompile.Reg.Options
import Commands.Extra.Compile.Options
import Commands.Extra.NewCompile
import CommonOptions
import Juvix.Config qualified as Config

data CompileCommand
= Native (NativeOptions ('InputExtension 'FileExtJuvixTree))
Expand All @@ -22,29 +24,20 @@ data CompileCommand
| Casm (CasmOptions ('InputExtension 'FileExtJuvixTree))
| Anoma (AnomaOptions ('InputExtension 'FileExtJuvixTree))
| Cairo (CairoOptions ('InputExtension 'FileExtJuvixTree))
| RiscZeroRust (RiscZeroRustOptions ('InputExtension 'FileExtJuvixTree))
deriving stock (Data)

treeSupportedTargets :: SupportedTargets
treeSupportedTargets =
AppTargetNative64
:| [ AppTargetWasm32Wasi,
AppTargetAsm,
AppTargetReg,
AppTargetCasm,
AppTargetCairo,
AppTargetAnoma
]

supportedTargets :: [(CompileTarget, Parser CompileCommand)]
supportedTargets =
[ (AppTargetNative64, Native <$> parseNative),
(AppTargetWasm32Wasi, Wasi <$> parseWasi),
(AppTargetAsm, Asm <$> parseAsm),
(AppTargetReg, Reg <$> parseReg),
(AppTargetCasm, Casm <$> parseCasm),
(AppTargetAnoma, Anoma <$> parseAnoma),
(AppTargetCairo, Cairo <$> parseCairo)
]
<> [(AppTargetWasm32Wasi, Wasi <$> parseWasi) | Config.config ^. Config.configWasm]
<> [(AppTargetRiscZeroRust, RiscZeroRust <$> parseRiscZeroRust) | Config.config ^. Config.configRust]

parseCompileCommand :: Parser CompileCommand
parseCompileCommand = commandTargetsHelper supportedTargets
27 changes: 27 additions & 0 deletions app/Commands/Dev/Tree/Compile/RiscZeroRust.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module Commands.Dev.Tree.Compile.RiscZeroRust where

import Commands.Base
import Commands.Compile.RiscZeroRust.Options
import Commands.Compile.RiscZeroRust.Rust
import Juvix.Compiler.Backend.Rust.Data.Result
import Juvix.Compiler.Tree.Data.InfoTable
import Juvix.Compiler.Tree.Translation.FromSource qualified as Tree

runCommand ::
(Members '[App, TaggedLock, EmbedIO] r) =>
RiscZeroRustOptions ('InputExtension 'FileExtJuvixTree) ->
Sem r ()
runCommand opts = do
let inputFile = Just $ opts ^. riscZeroRustCompileCommonOptions . compileInputFile
mainFile <- getMainFile inputFile
tab :: InfoTable <- readFile mainFile >>= getRight . Tree.runParser mainFile
entrypoint <-
applyOptions opts
<$> getEntryPoint inputFile
Result {..} <-
getRight
. run
. runError @JuvixError
. runReader entrypoint
$ treeToRiscZeroRust tab
compileRustCode opts inputFile _resultRustCode
6 changes: 4 additions & 2 deletions app/Commands/Dev/Tree/CompileOld/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@ where

import Commands.Extra.Compile.Options
import CommonOptions
import Juvix.Config qualified as Config

treeSupportedTargets :: SupportedTargets
treeSupportedTargets =
AppTargetNative64
:| [ AppTargetWasm32Wasi,
AppTargetAsm,
:| [ AppTargetAsm,
AppTargetReg,
AppTargetCasm,
AppTargetCairo,
AppTargetAnoma
]
<> [AppTargetWasm32Wasi | Config.config ^. Config.configWasm]
<> [AppTargetRiscZeroRust | Config.config ^. Config.configRust]

parseTreeCompileOptions :: Parser CompileOptions
parseTreeCompileOptions =
Expand Down
12 changes: 6 additions & 6 deletions app/Commands/Extra/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ prepareRuntime buildDir o = do
mapM_ writeHeader headersDir
case o ^. compileTarget of
AppTargetWasm32Wasi
| o ^. compileDebug -> writeRuntime wasiDebugRuntime
AppTargetWasm32Wasi -> writeRuntime wasiReleaseRuntime
| o ^. compileDebug -> writeRuntime (fromJust wasiDebugRuntime)
AppTargetWasm32Wasi -> writeRuntime (fromJust wasiReleaseRuntime)
AppTargetNative64
| o ^. compileDebug -> writeRuntime nativeDebugRuntime
AppTargetNative64 -> writeRuntime nativeReleaseRuntime
Expand All @@ -57,14 +57,14 @@ prepareRuntime buildDir o = do
AppTargetCairo -> return ()
AppTargetRiscZeroRust -> return ()
where
wasiReleaseRuntime :: BS.ByteString
wasiReleaseRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi/libjuvix.a" >>= FE.embedFile)
wasiReleaseRuntime :: Maybe BS.ByteString
wasiReleaseRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi/libjuvix.a" >>= FE.embedFileIfExists)

nativeReleaseRuntime :: BS.ByteString
nativeReleaseRuntime = $(FE.makeRelativeToProject "runtime/c/_build.native64/libjuvix.a" >>= FE.embedFile)

wasiDebugRuntime :: BS.ByteString
wasiDebugRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi-debug/libjuvix.a" >>= FE.embedFile)
wasiDebugRuntime :: Maybe BS.ByteString
wasiDebugRuntime = $(FE.makeRelativeToProject "runtime/c/_build.wasm32-wasi-debug/libjuvix.a" >>= FE.embedFileIfExists)

nativeDebugRuntime :: BS.ByteString
nativeDebugRuntime = $(FE.makeRelativeToProject "runtime/c/_build.native64-debug/libjuvix.a" >>= FE.embedFile)
Expand Down
2 changes: 1 addition & 1 deletion runtime/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ juvix_c_native:

.PHONY: juvix_c_wasm
juvix_c_wasm:
if grep -q '"wasm": true' ../config/config.json; then cd c && $(MAKE) -s wasm32 wasm32-wasi-debug; fi
if grep -q '"wasm": true' ../config/config.json; then cd c && $(MAKE) -s wasm32-wasi wasm32-wasi-debug; fi

.PHONY: juvix_rust
juvix_rust:
Expand Down
Loading

0 comments on commit 53cb70d

Please sign in to comment.