Skip to content

Commit

Permalink
Compile-time configuration (#3102)
Browse files Browse the repository at this point in the history
* Closes #3077 
* Closes #3100 
* Adds a compilation-time configuration script that creates a
`config/config.json` file which is then read by the
`Makefile`/`justfile` and embedded into the Juvix binary.
  • Loading branch information
lukaszcz authored Oct 16, 2024
1 parent 9fcc49f commit c50ad06
Show file tree
Hide file tree
Showing 28 changed files with 344 additions and 190 deletions.
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ STACK?=stack

JUVIXBIN?=juvix

CC=clang

ifeq ($(UNAME), Darwin)
THREADS := $(shell sysctl -n hw.logicalcpu)
else ifeq ($(UNAME), Linux)
Expand Down Expand Up @@ -201,8 +203,12 @@ build: submodules runtime
fast-build: submodules runtime
@${STACK} build --fast ${STACKFLAGS}

.PHONY: configure
configure:
CC=${CC} config/configure.sh

.PHONY: runtime
runtime:
runtime: configure
cd runtime && make

# -- Install
Expand Down
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
9 changes: 5 additions & 4 deletions app/Commands/Dev/DevCompile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Commands.Dev.DevCompile.Reg.Options
import Commands.Dev.DevCompile.Rust.Options
import Commands.Dev.DevCompile.Tree.Options
import CommonOptions
import Juvix.Config qualified as Config

data DevCompileCommand
= Core (CoreOptions 'InputMain)
Expand All @@ -22,15 +23,15 @@ data DevCompileCommand
parseDevCompileCommand :: Parser DevCompileCommand
parseDevCompileCommand =
hsubparser
( mconcat
( mconcat $
[ commandCore,
commandReg,
commandTree,
commandCasm,
commandAsm,
commandRust,
commandNativeRust
commandAsm
]
<> [commandRust | Config.config ^. Config.configRust]
<> [commandNativeRust | Config.config ^. Config.configRust]
)

commandCore :: Mod CommandFields DevCompileCommand
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
Loading

0 comments on commit c50ad06

Please sign in to comment.