# Build targets in Shodan repository

Here are lists of user-facing targets in Shodan. They are invoked with the
command of `m <target>`.

## Build targets

| Target           | Source                          |  Output                | Description                                                  |
| :----------------| :-------------------------------| :----------------------| :------------------------------------------------------------|
| prereqs          |                                 |                        | Install build prerequisites                                  |
| tools            |                                 | cache                  | Install RISCV compiler and emulator tools,                   |
|                  |                                 | out/host               | including Rust, GCC, CLANG, `verilator`, `qemu`, `renode`    |
| kata             | kata/                           | out/kata               | SMC seL4 and user space applications                         |
| tock             | sw/tock/boards/opentitan-matcha | out/ tock              | The operating system running on the security core,           |
|                  | sw/libtock-rs                   | out/libtock-rs         | and its Rust library                                         |
| multihart_boot_rom | sw/multihart_boot_rom         | out/shodan_boot_rom    | Shodan boot rom                                              |
| springbok        | sw/vec                          | out/springbok          | Vector core BSP and RVV test code                            |
| iree_compiler    |                                 | out/host/iree_compiler | IREE host compiler                                           |
| iree_runtime     | toolchain/iree                  | out/springbok_iree     | IREE runtime applications                                    |
|                  | sw/vec_iree                     |                        |                                                              |
| iree             |                                 |                        | Shorthand for `iree_compiler` and `iree_runtime`             |
| opentitan_sw_all | hw/opentitan                    | out/opentitan          | HW testing binaries                                          |
| qemu             | toolchain/ristv-qemu            | out/host/qemu          | QEMU emulator                                                |
| renode           | sim/renode                      | out/host/renode        | Renode emulator                                              |
| verilator        | sim/verilator                   | out/host/verilator     | System Verilog HW emulator                                   |
| simulate         |                                 |                        | E2E build and launch renode simulation.                      |
|                  |                                 |                        | Targets include `tock`, `kata`, `multihart_boot_rom`, `iree` |
| debug-simulation |                                 |                        | Debug version of `simulate`                                  |

## Clean targets

| Target               | Description                             |
| :--------------------| :---------------------------------------|
| clean                | Remove the whole out directory          |
| qemu_clean           | Remove out/host/qemu                    |
| renode_clean         | Remove out/host/renode                  |
| verilator_clean      | Remove out/host/verilator               |
| toolchain_clean      | Remove cache/toolchain                  |
| toolchain_llvm_clean | Remove cache/toolchain_iree_rv32imf     |
| opentitan_sw_clean   | Remove out/opentitan                    |
| tock_clean           | Clean out/tock (`make clean`)           |

## Optional toolchain targets (Used upon request)

The following targets ***should not*** be called in the typical development.
They should be called by CI and only upon request, i.e., *NOT* be built
regularly.

| Target               | Description                                        |
| :--------------------| :--------------------------------------------------|
| toolchain            | Build GCC toolchain for the security core/SMC      |
| toolchain_llvm       | Build LLVM toolchain for the vector core           |
| toolchain_vp         | (Optional) Build GCC toolchain for the vector core |
