mirror of
https://github.com/anoma/juvix.git
synced 2024-09-20 13:07:20 +03:00
7e71122e7f
* [app] Add compile command The compile command drives the (external) clang compiler to build a WASM binary from a minijuvix file. The intermediate C files are stored in .minijuvix-build directory relative to the directory where the command is executed. The user can specify which runtime (standalone and libc) to build against. The file-embed library is used to embed the runtime files into the minijuvix binary. * TemplateHaskell is a default extension * [app] Add the .minijuvix-build dir in the root of the project * [app] Derive the default output filename from the inputfile * [chore] Add .minijuvix-build to .gitignore
185 lines
5.0 KiB
Haskell
185 lines
5.0 KiB
Haskell
{-# LANGUAGE ApplicativeDo #-}
|
|
|
|
module Command
|
|
( module Command,
|
|
module Commands.Extra,
|
|
module Commands.Html,
|
|
module Commands.MicroJuvix,
|
|
module Commands.MiniC,
|
|
module Commands.MiniHaskell,
|
|
module Commands.MonoJuvix,
|
|
module Commands.Parse,
|
|
module Commands.Scope,
|
|
module Commands.Termination,
|
|
module Commands.Compile,
|
|
)
|
|
where
|
|
|
|
import Commands.Compile
|
|
import Commands.Extra
|
|
import Commands.Html
|
|
import Commands.MicroJuvix
|
|
import Commands.MiniC
|
|
import Commands.MiniHaskell
|
|
import Commands.MonoJuvix
|
|
import Commands.Parse
|
|
import Commands.Scope
|
|
import Commands.Termination
|
|
import GlobalOptions
|
|
import MiniJuvix.Prelude hiding (Doc)
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Pretty qualified as Scoper
|
|
import Options.Applicative
|
|
|
|
data Command
|
|
= Scope ScopeOptions
|
|
| Parse ParseOptions
|
|
| Html HtmlOptions
|
|
| Termination TerminationCommand
|
|
| MiniHaskell MiniHaskellOptions
|
|
| MiniC MiniCOptions
|
|
| Compile CompileOptions
|
|
| MicroJuvix MicroJuvixCommand
|
|
| MonoJuvix MonoJuvixOptions
|
|
| DisplayVersion
|
|
| DisplayRoot
|
|
| Highlight HighlightOptions
|
|
|
|
newtype HighlightOptions = HighlightOptions
|
|
{ _highlightInputFile :: FilePath
|
|
}
|
|
|
|
makeLenses ''HighlightOptions
|
|
|
|
parseHighlight :: Parser HighlightOptions
|
|
parseHighlight = do
|
|
_highlightInputFile <- parserInputFile
|
|
pure HighlightOptions {..}
|
|
|
|
parseDisplayVersion :: Parser Command
|
|
parseDisplayVersion =
|
|
flag'
|
|
DisplayVersion
|
|
(long "version" <> short 'v' <> help "Print the version and exit")
|
|
|
|
parseDisplayRoot :: Parser Command
|
|
parseDisplayRoot =
|
|
flag'
|
|
DisplayRoot
|
|
(long "show-root" <> help "Print the detected root of the project")
|
|
|
|
mkScopePrettyOptions :: GlobalOptions -> ScopeOptions -> Scoper.Options
|
|
mkScopePrettyOptions g ScopeOptions {..} =
|
|
Scoper.defaultOptions
|
|
{ Scoper._optShowNameId = g ^. globalShowNameIds,
|
|
Scoper._optInlineImports = _scopeInlineImports
|
|
}
|
|
|
|
parseCommand :: Parser Command
|
|
parseCommand =
|
|
parseDisplayVersion
|
|
<|> parseDisplayRoot
|
|
<|> hsubparser
|
|
( mconcat
|
|
[ commandParse,
|
|
commandScope,
|
|
commandHtml,
|
|
commandTermination,
|
|
commandMonoJuvix,
|
|
commandMicroJuvix,
|
|
commandMiniHaskell,
|
|
commandMiniC,
|
|
commandCompile,
|
|
commandHighlight
|
|
]
|
|
)
|
|
where
|
|
commandMicroJuvix :: Mod CommandFields Command
|
|
commandMicroJuvix = command "microjuvix" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(MicroJuvix <$> parseMicroJuvixCommand)
|
|
(progDesc "Subcommands related to MicroJuvix")
|
|
|
|
commandMonoJuvix :: Mod CommandFields Command
|
|
commandMonoJuvix = command "monojuvix" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(MonoJuvix <$> parseMonoJuvix)
|
|
(progDesc "Translate a MiniJuvix file to MonoJuvix")
|
|
|
|
commandMiniHaskell :: Mod CommandFields Command
|
|
commandMiniHaskell = command "minihaskell" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(MiniHaskell <$> parseMiniHaskell)
|
|
(progDesc "Translate a MiniJuvix file to MiniHaskell")
|
|
|
|
commandMiniC :: Mod CommandFields Command
|
|
commandMiniC = command "minic" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(MiniC <$> parseMiniC)
|
|
(progDesc "Translate a MiniJuvix file to MiniC")
|
|
|
|
commandCompile :: Mod CommandFields Command
|
|
commandCompile = command "compile" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Compile <$> parseCompile)
|
|
(progDesc "Compile a MiniJuvix file")
|
|
|
|
commandHighlight :: Mod CommandFields Command
|
|
commandHighlight = command "highlight" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Highlight <$> parseHighlight)
|
|
(progDesc "Highlight a MiniJuvix file")
|
|
|
|
commandParse :: Mod CommandFields Command
|
|
commandParse = command "parse" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Parse <$> parseParse)
|
|
(progDesc "Parse a MiniJuvix file")
|
|
|
|
commandHtml :: Mod CommandFields Command
|
|
commandHtml = command "html" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Html <$> parseHtml)
|
|
(progDesc "Generate HTML for a MiniJuvix file")
|
|
|
|
commandScope :: Mod CommandFields Command
|
|
commandScope = command "scope" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Scope <$> parseScope)
|
|
(progDesc "Parse and scope a MiniJuvix file")
|
|
|
|
commandTermination :: Mod CommandFields Command
|
|
commandTermination = command "termination" minfo
|
|
where
|
|
minfo :: ParserInfo Command
|
|
minfo =
|
|
info
|
|
(Termination <$> parseTerminationCommand)
|
|
(progDesc "Subcommands related to termination checking")
|