Skip to content

Use rustc directly instead of cargo#52

Merged
ojeda merged 1 commit intorustfrom
rust-rustc-kbuild
Jan 21, 2021
Merged

Use rustc directly instead of cargo#52
ojeda merged 1 commit intorustfrom
rust-rustc-kbuild

Conversation

@ojeda
Copy link
Copy Markdown
Member

@ojeda ojeda commented Dec 9, 2020

This is a big PR, but most of it is interdependent to the rest.

  • Shared Rust infrastructure: libkernel, libmodule, libcore, liballoc, libcompiler_builtins.

    • The Rust modules are now much smaller since they do not contain several copies of those libraries. Our example .ko on release is just 12 KiB, down from 1.3 MiB. For reference (i.e. the bulk is now shared):
      • vmlinux on release with Rust is 23 MiB (compressed: 2.1 MiB)
      • vmlinux on release without Rust is 22 MiB (compressed: 1.9 MiB)
    • Multiple builtin modules are now supported since their symbols do not collide against each other (fixes Fix building several modules as built-in #9).
    • Faster compilation (less crates to compile & less repetition).
    • We achieve this by compiling all the shared code to .rlibs (and the .so for the proc macro). For loadable modules, we need to rely on the upcoming v0 Rust mangling scheme, plus we need to export the Rust symbols needed by the .kos.
  • Simpler, flat file structure: now a small driver may only need a single file like drivers/char/rust_example.rs, like in C.

    • All the rust/* and driver/char/rust_example/* files moved to fit in the new structure: less files around.
  • Only rust-lang/{rust,rust-bindgen,compiler-builtins} as dependencies.

    • Also helps with the faster compilation.
  • Dependency handling integration with Kbuild/fixdep.

    • Changes to the Rust standard library, kernel headers (bindings), rust/ source files, .rs changes, command-line changes, flag changes, etc. all trigger recompilation as needed.
    • Works as expected with parallel support (-j).
  • Support for custom --sysroot via KRUSTCFLAGS.

  • Proper make clean support.

  • Offline builds by default (there is no "online compilation" anymore; fixes Create a way for offline building #17).

  • No interleaved Cargo output (fixes Makefile ui #29).

  • No nightly dependency on Cargo's build-std; since now we manage the cross-compilation ourselves (should fix Compilation error: can't find crate for std; the x86_64-linux-kernel target may not be installed #27).

  • Since now a kernel can be "Rust-enabled", a new CONFIG_RUST option is added to enable/disable it manually, regardless of whether one has rustc available or not (CONFIG_HAS_RUST).

  • Improved handling of rustc flags (opt-level, debuginfo, etc.), following what the user selected for C (no Cargo profiles).

  • Added Kconfig menu for tweaking relevant rustc options, like overflow checks, debug assertions, optimization level, etc.

  • This rewrite of the Kbuild support is cleaner, i.e. less hacks in general handling paths (e.g. no more shell readlink for O=).

  • Duplicated the example driver 3 times so that we can test in the CI that 2 builtins and 2 loadables work, all at the same time.

  • Updated the quick start guide.

  • Updated CI .configs:

    • Add the new options and test with 2 builtins and 2 loadables. At the same time, remove the matrix test for builtin/loadable.
    • Debug: more things enabled (debuginfo, kgdb, unit testing, etc.) that mimic more what a developer would have. Running the CI will be slightly slower, but should be OK.
    • Release: disabled EXPERT and changed a few things to make it look more like a normal configuration.
    • Also update both configs to v5.9 while I was at it.

    (I could have split a few of these ones off into another PR, but anyway it is for the CI only and I had already done it).

  • Less extern crates needed since we pass it via rustc (closer to idiomatic 2018 edition Rust code).

Things to note:

  • There is two more nightly features used:

    • The new Rust mangling scheme: we know it will be stable (and the default on, later on).
    • The binary dep-info output: if we remove all other nightly features, this one can easily go too.
  • The hack at exports.c to export symbols to loadable modules.

  • The hack at allocator.rs to get the __rust_*() functions.

Signed-off-by: Miguel Ojeda ojeda@kernel.org

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

7 participants