From 72cca84030f9c146a994af0c213aadc62e00ecbb Mon Sep 17 00:00:00 2001 From: Nikolaos Bezirgiannis Date: Wed, 8 Jan 2025 16:47:52 +0100 Subject: [PATCH] WIP --- .../docs/using-plutus-tx/cli-plutus.md | 378 +++++++++++------- .../static/img/tui_debugger_screenshot.png | Bin 0 -> 70578 bytes .../executables/plutus/AnyProgram/IO.hs | 8 +- .../executables/plutus/Mode/Compile.hs | 2 +- .../executables/plutus/Mode/HelpVersion.hs | 3 +- 5 files changed, 234 insertions(+), 157 deletions(-) create mode 100644 doc/docusaurus/static/img/tui_debugger_screenshot.png diff --git a/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md b/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md index ec391381fc8..f6724e0f070 100644 --- a/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md +++ b/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md @@ -4,70 +4,234 @@ sidebar_position: 40 # CLI tool for Plutus -You can locally (without starting a Cardano Node) [run](#running) or [debug](#debugging) compiled code -by using the `plutus` CLI tool. This tool allows you also to [optimise](#converting) compiled code, [convert](#converting) between code formats, -and [check](#checking) code for common issues. A pre-built version of the `plutus` CLI executable -can be found on the [Latest release](https://github.com/IntersectMBO/plutus/releases/latest) page in the repository. Alternatively, you can build the tool +The `plutus` CLI tool allows you to: + +- **check** your plutus-related (PIR/TPLC/UPLC) program for common issues. +- **compile** (convert) between plutus-derived languages and code formats. +- **optimise** the code. +- **run** or interactively **debug** your program locally (without starting a Cardano Node). + +A pre-built executable of the `plutus` CLI +can be found on the [Latest Release](https://github.com/IntersectMBO/plutus/releases/latest) page in the repository. Alternatively, you can build the tool using Nix, specifically for your platform: ``` shell -$ nix build .#cabalProject.$(nix eval nixpkgs#stdenv.buildPlatform.system).hsPkgs.plutus-core.components.exes.plutus +$ nix build ".#cabalProject.$(nix eval nixpkgs#stdenv.buildPlatform.system).hsPkgs.plutus-core.components.exes.plutus" ``` -To consult the tool's usage you can invoke `plutus --help` in a command line: +To consult the tool's usage you can invoke `plutus --help` in your command line: ``` shell $ plutus --help -USAGE: plutus [FILES...] [--stdin] [-o FILE | --stdout] [--run|--bench|--debug]... - -h --help Show usage - -V --version Show version - -q --quiet Don't print text (error) output; rely only on exit codes - -v --verbose Print more than than the default - --print-builtins Print the Default universe & builtins - --print-cost-model Print the cost model of latest Plutus Version as JSON - --stdin Use stdin - -e[NAME] --example[=NAME] Use example NAME as input. Leave out NAME to see the list of examples' names - -p STYLE --pretty=STYLE Make program's textual-output&error output pretty. Ignored for non-textual output (flat/cbor). Values: `classic`, `readable, `classic-simple`, `readable-simple` - -o FILE Write compiled program to file - --stdout Write compiled program to stdout - -O[INT] Set optimisation level; default: 0 , safe optimisations: 1, >=2: unsafe optimisations - --whole-opt Run an extra optimisation pass after all inputs are applied together. Ignored if only 1 input given. - -x SUFFIX Causes all files following this option on the command line to be processed as if they had the suffix SUFFIX - -n NAMING --nam=NAMING Change naming to `name` (default), `debruijn` or `named-debruijn` - -a ANNOTATION --ann=ANNOTATION Change annotation to `unit` (default) or `srcspan` - --run Compile and run - --bench[=SECS] Compile then run repeatedly up to these number of seconds (default:10) and print statistics - --debug[=INTERFACE] Compile then Debug program after compilation. Uses a `tui` (default) or a `cli` interface. - --debug-dir[=DIR] When `--debug`, try to search for PlutusTx source files in given DIR (default: .) - --budget=INT,INT Set CPU,MEM budget limit. The default is no limit. Only if --run, --bench, or --debug is given +USAGE: plutus [--run|--debug] [-OLEVEL] FILES... +``` + +In general, all *compiler* tools work in a similar manner: + +> 1. Read (Parse or Deserialise) input program(s) of a *source* language +>

+> 2. Check program(s) for certain errors +>

+> 3. Compile to a lower-level *target* language +>

+> 4. Optimise the compiled code (*optional*) +>

+> 5. Write code to output (*optional*) + +In case of `plutus` tool, *Step 1* is more or less straightforward: +the input programs are read from the specified `FILES...` in the CLI and/or from `--stdin` option. + +After reading the input program(s), the tool continues +to run certain static **checks** on those programs (*Step 2*); currently there is no way to turn these static checks off. + +In *Step 3* the tool will try to **compile** (convert) the higher-level source language (PIR,TPLC) of the input program to the lower-level target language (TPLC,UPLC). +In case the source and target languages are the same, this step is a "no-op" (must be for UPLC since it is the lowest-level Plutus language). + +*Step 4* (**Optimising** code) is optional and has to be manually turned on by using the option `-OLEVEL` where `LEVEL` is a number between zero and two. +`-O0` specifies that no optimisations should be run — basically same as ommitting the `-OLEVEL`. `-O1` applies safe optimisations (guarantees no change to the program's semantics), +whereas `-O2` applies aggressive / unsafe optimisations (may alter program's semantics). + +*Step 5* writes the resulting (compiled and/or optimised) code to given output specified with `-o file` or `--stdout`. +This step is optional, i.e. there is no default output when the above options are omitted. This is so that users can use the `plutus` tool as a background checker when developing a Plutus program +or for continuing with an extra *Step 6*: + +> ... +>

+> 5. Write code to output (*optional*) +>

+> 6. Run *OR* Debug code (*optional*) + +The user can pass a `--run` *or* `--debug` as an extra option to **run** or **debug** the resulting program of the compilation, +using the tool's built-in interpreter or debugger, respectively. + +## Optimising UPLC with the CLI + +In this section we only focus on UPLC; a prerequisite is that you have already acquired (extracted) the UPLC code corresponding to your high-level source program. +The process to *extract* plutus code varies depending on the source language you are using (Plutus Tx, Aiken, ...); +if Plutus Tx is the source language, you can follow the instructions on [how to inspect compiled code](./inspecting.md#inspecting-the-compiled-code). + +Since UPLC is the lowest-level language, compiling (*Step 3*) is not applicable for UPLC input programs and thus omitted +— for actual compiling (converting) between different intermediate languages (PIR, TPLC) or serialisation formats (e.g. Flat, CBOR) +see the [Advanced section](#converting) on converting between Plutus languages & formats. +Instead, we can use the `plutus` tool to check for certain static errors, as in the example: + +``` shell +$ echo '(program 1.1.0 (lam x (lam y z)))' > const_err.uplc +$ plutus const_err.uplc +Error from the PLC compiler: +Variable 2 is free at () +``` + +After fixing the error: + +``` +$ echo '(program 1.1.0 (lam x (lam y x)))' | plutus --stdin +Compilation succeeded, but no output file was written; use -o or --stdout. +``` + +We can try to turn on the optimisations and write the resulting optimised code to standard output: + +``` shell +# no optimisations by default +$ echo '(program 1.1.0 (force (delay (con unit ()))))' | plutus --stdin --stdout +(program 1.1.0 (force (delay (con unit ())))) + +$ echo '(program 1.1.0 (force (delay (con unit ()))))' | plutus --stdin --stdout -O1 +(program 1.1.0 (con unit ())) +``` + +When multiple input programs (files) are passed to the CLI, the `plutus` tool +will **check**, **compile** (not applicable for UPLC), and optionally **optimise** each program separately. +After this is done for *all* programs, the tool gathers the result of each compilation/optimisation and combines them into a single output program. +This is done by placing (interposing) an `Apply` term between the code of each compiled/optimised program, similar +to Haskell's juxtaposition where a function is applied to a series of arguments. + +``` shell +$ echo '(program 1.1.0 (lam x (lam y x)))' > func.uplc +$ echo '(program 1.1.0 (con string "OK"))' > arg1.uplc +$ echo '(program 1.1.0 (con bool True))' > arg2.uplc +$ plutus func.uplc arg1.uplc arg2.uplc --stdout -O2 +(program 1.1.0 [ [ (lam x (lam y x)) (con string "OK") ] (con bool True) ]) +``` + +In the example above, even with all optimisations turned on (`-O2`), the `plutus` tool will not reduce +the obviously reducible function applications in the output program; this is because the input programs are optimised only *individually* (separately). You can +instruct the tool to perform an **extra** optimisation pass of the whole (combined) program +by passing `--whole-opt` to the CLI — the given `-OLEVEL` will be taken into account also for this final extra pass (`-O2` in this case). + +``` shell +$ plutus func.uplc arg1.uplc arg2.uplc --stdout -O2 --whole-opt +(program 1.1.0 (con string "OK")) ``` -Two interesting sub-commands which can aid during Plutus-based script development (e.g. Aiken, Plutarch, Plutus Tx) are `--print-builtins` and `--print-cost-model` which as their name suggest print detailed lists of currently recognized builtin functions and cost model parameters, respectively. +## Running UPLC with the CLI {#running} -## Converting Code with the CLI {#converting} +Certain errors in `uplc` code cannot be caught by the static checks (*Step 2*) +because the UPLC language is untyped. -Before you can even run or debug your code, you first need to compile and extract the plutus code from the high-level source code. -The steps for extracting plutus code vary depending on the source language you are using (Plutus Tx, Aiken, ...); -if your are using Plutus Tx as source, you can follow the instructions on [how to inspect compiled code](./inspecting.md#inspecting-the-compiled-code). +``` shell +# Behaves likes i++ +$ echo "(program 1.1.0 (lam i [(builtin addInteger) (con integer 1) i]))" > inc.uplc -Although the CLI tool cannot help with compiling high-level code (e.g. Plutus Tx), it can aid with compiling and converting -between formats and intermediate representations of lower-level plutus code (PIR, TPLC, UPLC). +$ echo "(program 1.1.0 (con bool True))" > true.uplc +$ plutus inc.uplc true.uplc +Compilation succeeded, but no output file was written; use -o or --stdout. +``` -In the following example we check a program written in the PIR (Plutus Intermediate Representation) language: +Alternatively we can try to run the program using the tool's built-in *interpreter* and look for any runtime (type) errors. +The `--run` option will invoke the interpreter passing to it the final output program. +An execution that raised an error will show information about the error and in which term +the error happened: ``` shell -$ echo '(program 1.1.0 (lam x (con integer) (lam y (con integer) x)))' > const.pir -$ plutus const.pir -Program passed all static checks. If you want the output result, use -o FILE or --stdout. +$ plutus inc.uplc true.uplc --run +Running the program: An error has occurred: +Could not unlift a value: +Type mismatch: expected: integer; actual: bool +Caused by: addInteger 1 True ``` -Or as a single command: +Other times catching such (type) errors at runtime is not even possible. Consider the following +example program which contains a type error but the execution nevertheless succeeds with the final +evaluated result (term): ``` shell -$ echo '(program 1.1.0 (lam x (con integer) (lam y (con integer) x)))' | plutus -x pir --stdin -Program passed all static checks. If you want the output result, use -o FILE or --stdout. +# Behaves like (if True then "" else unit) +$ echo '(program 1.1.0 [(force (builtin ifThenElse)) (con bool True) (con string "") (con unit ())])' > if.uplc +$ plutus if.uplc --run +Running the program: Execution succeeded, final term: +(con string "") +Used budget: ExBudget {exBudgetCPU = ExCPU 204149, exBudgetMemory = ExMemory 901} ``` +> :pushpin: **NOTE** +> The above example demonstrates that `uplc` — the language which actually *runs on the chain* — +> is low-level and more akin to assembly. Users that are concerned about the safety of their smart contracts +> are advised instead to develop in a higher-level typed language (e.g. Plutus Tx) which compiles down to `uplc`. + +After plutus program's execution is completed (either succeeded or failed), the final used budget will be printed as well. +Because the CLI tool employs the same `uplc` interpreter as the one that the Cardano node runs, we can be sure +that the program's execution result&budget match *precisely* — assuming same program +and cost model — the result&budget computed by the chain. + +You can pass a maximum CPU and/or Memory budget that is allowed to be spent with the `--budget=CPU` or `-budget=,MEM` or `--budget=CPU,MEM` options; if given budget runs out, the execution will fail and stop earlier. +If there is no CPU and/or MEM limit given, the budget is practically unlimited. + +``` shell +$ plutus if.uplc --run --budget=204148,903 +Running the program: An error has occurred: +The machine terminated part way through evaluation due to overspending the budget. +The budget when the machine terminated was: +({cpu: -1 +| mem: 2}) +Negative numbers indicate the overspent budget; note that this only indicates the budget that was needed for the next step, not to run the program to completion. + +$ plutus if.uplc --run --budget=,903 +Running the program: Execution succeeded, final term: +(con string "") +Remaining budget: ExBudget {exBudgetCPU = ExCPU 9223372036854571658, exBudgetMemory = ExMemory 2} +Used budget: ExBudget {exBudgetCPU = ExCPU 204149, exBudgetMemory = ExMemory 901} +``` + +## Debugging UPLC with the CLI *(Experimental)* {#debugging} + +The `plutus` tool's built-in debugger provides a different way to +to execute compiled plutus code (only if you are targeting untyped plutus core, a.k.a `uplc`). +The `--debug` option starts a TUI (Terminal User Interface) in your console: + +``` shell +$ plutus if.uplc --debug +``` + +The debugger will load the program, display its text code on a window, +and wait for a user command to start executing it using the `uplc` interpreter. +The commands available to the user are: + +|Keyboard Shortcut|Command| +|-----|-----| +|?|Show help dialog| +|Esc|Quit help dialog or debugger| +|Ctrl+up/down/left/right|Resize window| +|Tab|Switch focus to other window| +|s|Step once the interpreter| + +Unlike the `--run` option, the `step` command does not execute the program +to completion. Instead, the `uplc` interpreter is moved one "budgeting" step forward — +the smallest step possible that gets accounted for and subtracted from the current budget — +and the screen will be updated to show the remaining budget. +You can still combine `--debug` with the `--budget=CPU,MEM` option to limit the starting total budget. + +Every time an interactive step is taken, the debugger +highlights the code region (sub-term) that the `uplc` interpreter +is about to "step into" (execute) next, in the program's text window. A separate +"Logs" window is kept up-to-date with any printed plutus' `trace`s and debugger's messages. + +![TUI Debugger Screenshot](../../static/img/tui_debugger_screenshot.png) + + +## Advanced: Converting between Plutus Languages & Formats {#converting} + + In the command above, the `-x pir` option is necessary for letting the CLI tool know the format/language of the supplied input. If the `-x` option is not passed, the CLI tool will try to guess the input's format/language by looking at its filename extension `.SUFFIX` — will default to `uplc` for `--stdin` or missing/other suffix. @@ -83,7 +247,7 @@ The following table lists some recognized suffixes and corresponding `-x` values |.data|-x data|Binary|Values of `Data` serialised in CBOR| |.data-txt|-x data-txt|Textual|Values of `Data` in Haskell's `Show` format| |.uplc-flat|-x uplc-flat|Binary|Untyped PlutusCore with NamedDeBruijn serialised in Flat| -|.uplc-cbor|-x uplc-cbor|Binary|Untyped PlutusCore with DeBruijn serialised in CBOR| +|.uplc-cbor|-x uplc-cbor|Binary|Untyped PlutusCore with DeBruijn serialised in CBOR
(the on-chain format)| In case the input format is more complex (contains a non-default variable-naming scheme or annotations), the `-n NAMING` and `-a ANNOTATION` options can be used respectively to override the defaults. @@ -150,9 +314,11 @@ note that the *last occurrence* of `-x`,`-n`,`-a` will be the one that dictates # Checks and compiles PIR to UPLC (the default) $ plutus const.pir --stdout (program 1.1.0 (lam x-256 (lam y-257 x-256))) + # Overrides to pir for both input&output. Can be used for pretty-printing or self-optimising (--whole-opt). $ plutus -x pir const.pir --stdout (program 1.1.0 (lam x-0 (con integer) (lam y-1 (con integer) x-0))) + # Overrides input to be tplc instead of guessed pir (example still works because pir is superset of tplc) # Overrides output to uplc with debruijn naming $ plutus -x tplc const.pir -x uplc -n debruijn --stdout @@ -162,8 +328,8 @@ $ plutus -x tplc const.pir -x uplc -n debruijn --stdout If the output's format type is *textual* (see table above) the compiled code will be printed to the designated output (file or stdout) in a "pretty" format. You can change how this output looks by specifying a different `-p STYLE` style (defaults to `classic`). -Note that *textual output* with pretty style other than the default may not be recognized -back again as *textual input* to the CLI. +Note that textual *output* with pretty style other than the default (classic) may not be recognized +back again as textual *input* by the CLI. ``` shell $ plutus sub.pir -x pir --stdout @@ -186,6 +352,22 @@ program 1.1.0 (\(x : integer) (y : integer) -> subtractInteger x y) |-p readable|Succinct syntax with unique variable names| |-p readable-simple|Succinct syntax with ambiguous (no unique) variable names| + +As shown in [compilation](#converting) section, you are free to mix and match +different input languages (pir/tplc/uplc); as long as the output target at the CLI +is set to `uplc`, their compiled output will be `--run` through the +the local `uplc` interpreter (same interpreter as that on chain). + +> :pushpin: **NOTE** +> Attempting to run a `tplc` target will use a `tplc` interpreter. Although +> the `tplc` interpreter behaves the same as the default `uplc` interpreter (for *type correct* programs), +> it comes with caveats: cannot execute `uplc` code, +> cannot have budget accounting and budget limits, runs way slower and your program must be fully type correct. +> The last point is not necessarily a caveat, but it diverges from the on-chain behavior: +> the `tplc` interpreter accepts less programs than the chain (and the default `uplc` interpreter) would accept. + + + ## Checking Code with the CLI {#checking} Depending on the input and output formats, certain checks will be run by the tool (syntax check, type checking). @@ -239,109 +421,3 @@ Namely, '(con bool True)' ``` -## Running Code with the CLI {#running} - -We saw earlier that certain type errors cannot be caught statically for `uplc` -since the language is untyped. We do have the option, however, to run -the compiled code using the interpreter and look for runtime type errors. -Running the program locally using the CLI tool is simply an extra step which is executed -after [checking](#checking) and [compilation](#converting) have been completed, simply by adding the `--run` option: - -``` shell -$ echo "(program 1.1.0 (con bool True))" | plutus inc.uplc --stdin --run -Program passed all static checks. If you want the output result, use -o FILE or --stdout. -Running the program: An error has occurred: -Could not unlift a value: -Type mismatch: expected: integer; actual: bool -Caused by: addInteger True 1 -``` - -Other times catching such "type errors" at runtime is not even possible; consider for example: - -``` shell -# if True then "" else 5 -$ echo '(program 1.1.0 [(force (builtin ifThenElse)) (con bool True) (con string "") (con integer 5)])' | plutus --stdin --run -Program passed all static checks. If you want the output result, use -o FILE or --stdout. -Running the program: Execution succeeded. Final Term: -(con string "") -Used budget: ExBudget {exBudgetCPU = ExCPU 204149, exBudgetMemory = ExMemory 901} -``` - -> :pushpin: **NOTE** -> The above example shows that `uplc` -- the language which actually *runs on the chain* -- -> is lower-level and more akin to assembly. Users that are concerned about the safety of their smart contracts -> are advised instead to develop in a higher-level typed language (e.g. Plutus Tx) which compiles down to `uplc`. - -After plutus program's execution is completed (succeeded or failed), the final used budget will be printed to `stderr`. -Because the CLI tool employs the same `uplc` interpreter as the one that the Cardano node runs, we can be sure -that the program's execution result&budget match *precisely* — assuming same program -and cost model — the result&budget computed by the chain. - -You can pass a maximum CPU and/or Memory budget that is allowed to be spent with the `--budget=CPU` or `-budget=,MEM` or `--budget=CPU,MEM` options; if given budget runs out, the execution will fail and stop earlier. -If there is no CPU and/or MEM limit given, the budget is practically unlimited. - -``` shell -$ echo "(program 1.1.0 (con integer 1))" | $plutus inc.uplc --stdin --run --budget=229307,903 -Program passed all checks. No output file was written, use -o or --stdout. -An error has occurred: -The machine terminated part way through evaluation due to overspending the budget. -The budget when the machine terminated was: -({cpu: -1 -| mem: 1}) -Negative numbers indicate the overspent budget; note that this only indicates the budget that was needed for the next step, not to run the program to completion. - -$ echo "(program 1.1.0 (con integer 1))" | $plutus inc.uplc --stdin --run --budget=,903 -Program passed all checks. No output file was written, use -o or --stdout. -Execution succeeded. Final Term: -(con integer 2) -Remaining budget: ExBudget {exBudgetCPU = ExCPU 9223372036854546499, exBudgetMemory = ExMemory 1} -Used budget: ExBudget {exBudgetCPU = ExCPU 229308, exBudgetMemory = ExMemory 902} -``` - -As shown in [compilation](#converting) section, you are free to mix and match -different input languages (pir/tplc/uplc); as long as the output target at the CLI -is set to `uplc`, their compiled output will be `--run` through the -the local `uplc` interpreter (same interpreter as that on chain). - -> :pushpin: **NOTE** -> Attempting to run a `tplc` target will use a `tplc` interpreter. Although -> the `tplc` interpreter behaves the same as the default `uplc` interpreter (for *type correct* programs), -> it comes with caveats: cannot execute `uplc` code, -> cannot have budget accounting and budget limits, runs way slower and your program must be fully type correct. -> The last point is not necessarily a caveat, but it diverges from the on-chain behavior: -> the `tplc` interpreter accepts less programs than the chain (and the default `uplc` interpreter) would accept. - -## Debugging Code with the CLI *(Experimental)* - -The `plutus` tool's built-in debugger provides a different way to -to execute compiled plutus code (only if you are targeting untyped plutus core, a.k.a `uplc`). -The `--debug` option starts a TUI (Terminal User Interface) in your console: - -``` shell -$ plutus inc.uplc --debug -``` - -The debugger will load the program, display its text code on a window, -and wait for a user command to start executing it using the `uplc` interpreter. -The commands available to the user are: - -|Keyboard Shortcut|Command| -|-----|-----| -|?|Show help dialog| -|Esc|Quit help dialog or debugger| -|Ctrl+up/down/left/right|Resize window| -|Tab|Switch focus to other window| -|s|Step once the interpreter| - -Unlike the `--run` option, the `step` command does not execute the program -to completion. Instead, the `uplc` interpreter is moved one "budgeting" step forward — -the smallest step possible that gets accounted for and subtracted from the current budget — -and the screen will be updated to show the remaining budget. -You can still combine `--debug` with the `--budget=CPU,MEM` option to limit the initial total budget given. - -Every time an interactive step is taken, the debugger -highlights the code region (sub-term) that the `uplc` interpreter -is about to "step into" (execute) next, in the program's text window. A separate -"Logs" window is kept up-to-date with any printed plutus' `trace`s and debugger's messages. - -FIXME: add screenshot diff --git a/doc/docusaurus/static/img/tui_debugger_screenshot.png b/doc/docusaurus/static/img/tui_debugger_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ea06f93a945a20a1ebcb74280f0f1d173d2869 GIT binary patch literal 70578 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 J<@X;&{vU7X#5n)} literal 0 HcmV?d00001 diff --git a/plutus-core/executables/plutus/AnyProgram/IO.hs b/plutus-core/executables/plutus/AnyProgram/IO.hs index de25acb0563..7fc67ac6ae9 100644 --- a/plutus-core/executables/plutus/AnyProgram/IO.hs +++ b/plutus-core/executables/plutus/AnyProgram/IO.hs @@ -68,8 +68,8 @@ readProgram sngS fileS = Json -> error "FIXME: not implemented yet." writeProgram :: (?opts :: Opts) - => SLang s -> FromLang s -> File s -> IO () -writeProgram sng ast file = + => SLang s -> FromLang s -> File s -> AfterCompile -> IO () +writeProgram sng ast file afterCompile = case file^.fName of Just fn -> do printED $ show $ "Outputting" <+> pretty file @@ -86,7 +86,9 @@ writeProgram sng ast file = Proved Refl -> serialise ast _ -> withLang @Flat sng $ serialise (SerialiseViaFlat ast) Json -> error "FIXME: not implemented yet" - _ -> printE "Program passed all checks. No output file was written, use -o or --stdout." + _ -> case afterCompile of + Exit -> printE "Compilation succeeded, but no output file was written; use -o or --stdout." + _ -> pure () prettyWithStyle :: PP.PrettyPlc a => PrettyStyle -> a -> Doc ann prettyWithStyle = \case diff --git a/plutus-core/executables/plutus/Mode/Compile.hs b/plutus-core/executables/plutus/Mode/Compile.hs index 743be944806..350b5a83031 100644 --- a/plutus-core/executables/plutus/Mode/Compile.hs +++ b/plutus-core/executables/plutus/Mode/Compile.hs @@ -36,7 +36,7 @@ runCompile afterCompile = case ?opts of then compile sngT sngT astT else pure astT - writeProgram sngT optAstT fileT + writeProgram sngT optAstT fileT afterCompile case afterCompile of Exit{} -> exitSuccess -- nothing left to do diff --git a/plutus-core/executables/plutus/Mode/HelpVersion.hs b/plutus-core/executables/plutus/Mode/HelpVersion.hs index e485d9a9dd5..073225cb0fd 100644 --- a/plutus-core/executables/plutus/Mode/HelpVersion.hs +++ b/plutus-core/executables/plutus/Mode/HelpVersion.hs @@ -10,8 +10,7 @@ runHelp = do putStr $ GetOpt.usageInfo usageHeader GetOpt.optDescrs usageHeader :: String -usageHeader = - "USAGE: plutus [FILES...] [--stdin] [-o FILE | --stdout] [--run|--bench|--debug]..." +usageHeader = "USAGE: plutus [--compile|--run|--bench|--debug] FILES..." runVersion :: IO () runVersion = putStrLn "Version 0"