Skip to content
  • Koute's avatar
    Initial support for building RISC-V runtimes targeting PolkaVM (#3179) · e349fc9e
    Koute authored
    This PR adds initial support for building RISC-V runtimes targeting
    PolkaVM.
    
    - Setting the `SUBSTRATE_RUNTIME_TARGET=riscv` environment variable will
    now build a RISC-V runtime instead of a WASM runtime.
    - This only adds support for *building* runtimes; running them will need
    a PolkaVM-based executor, which I will add in a future PR.
    - Only building the minimal runtime is supported (building the Polkadot
    runtime doesn't work *yet* due to one of the dependencies).
    - The builder now sets a `substrate_runtime` cfg flag when building the
    runtimes, with the idea being that instead of doing `#[cfg(not(feature =
    "std"))]` or `#[cfg(target_arch = "wasm32")]` to detect that we're
    building a runtime you'll do `#[cfg(substrate_runtime)]`. (Switching the
    whole codebase to use this will be done in a future PR; I deliberately
    didn't do this here to keep this PR minimal and reviewable.)
    - Further renaming of things (e.g. types, environment variables and proc
    macro attributes having "wasm" in their name) to be target-agnostic will
    also be done in a future refactoring PR (while keeping backwards
    compatibility where it makes sense; I don't intend to break anyone's
    workflow or create unnecessary churn).
    - This PR also fixes two bugs in the `wasm-builder` crate:
    * The `RUSTC` environment variable is now removed when invoking the
    compiler. This prevents the toolchain version from being overridden when
    called from a `build.rs` script.
    * When parsing the `rustup toolchain list` output the `(default)` is now
    properly stripped and not treated as part of the version.
    - I've also added a minimal CI job that makes sure this doesn't break in
    the future. (cc @paritytech/ci)
    
    cc @athei
    
    
    
    ------
    
    Also, just a fun little tidbit: quickly comparing the size of the built
    runtimes it seems that the PolkaVM runtime is slightly smaller than the
    WASM one. (`production` build, with the `names` section substracted from
    the WASM's size to keep things fair, since for the PolkaVM runtime we're
    currently stripping out everything)
    
    - `.wasm`: 625505 bytes
    - `.wasm` (after wasm-opt -O3): 563205 bytes
    - `.wasm` (after wasm-opt -Os): 562987 bytes
    - `.wasm` (after wasm-opt -Oz): 536852 bytes
    - `.polkavm`: ~~580338 bytes~~ 550476 bytes (after enabling extra target
    features; I'll add those in another PR once we have an executor working)
    
    ---------
    
    Co-authored-by: default avatarBastian Köcher <[email protected]>
    e349fc9e