| .. SPDX-License-Identifier: GPL-2.0 |
| |
| Quick Start |
| =========== |
| |
| This document describes how to get started with kernel development in Rust. |
| |
| |
| Requirements: Building |
| ---------------------- |
| |
| This section explains how to fetch the tools needed for building. |
| |
| Some of these requirements might be available from Linux distributions |
| under names like ``rustc``, ``rust-src``, ``rust-bindgen``, etc. However, |
| at the time of writing, they are likely not to be recent enough unless |
| the distribution tracks the latest releases. |
| |
| To easily check whether the requirements are met, the following target |
| can be used:: |
| |
| make LLVM=1 rustavailable |
| |
| This triggers the same logic used by Kconfig to determine whether |
| ``RUST_IS_AVAILABLE`` should be enabled; but it also explains why not |
| if that is the case. |
| |
| |
| rustc |
| ***** |
| |
| A particular version of the Rust compiler is required. Newer versions may or |
| may not work because, for the moment, the kernel depends on some unstable |
| Rust features. |
| |
| If ``rustup`` is being used, enter the kernel build directory (or use |
| ``--path=<build-dir>`` argument to the ``set`` sub-command) and run:: |
| |
| rustup override set $(scripts/min-tool-version.sh rustc) |
| |
| This will configure your working directory to use the correct version of |
| ``rustc`` without affecting your default toolchain. |
| |
| Note that the override applies to the current working directory (and its |
| sub-directories). |
| |
| If you are not using ``rustup``, fetch a standalone installer from: |
| |
| https://forge.rust-lang.org/infra/other-installation-methods.html#standalone |
| |
| |
| Rust standard library source |
| **************************** |
| |
| The Rust standard library source is required because the build system will |
| cross-compile ``core`` and ``alloc``. |
| |
| If ``rustup`` is being used, run:: |
| |
| rustup component add rust-src |
| |
| The components are installed per toolchain, thus upgrading the Rust compiler |
| version later on requires re-adding the component. |
| |
| Otherwise, if a standalone installer is used, the Rust source tree may be |
| downloaded into the toolchain's installation folder:: |
| |
| curl -L "https://static.rust-lang.org/dist/rust-src-$(scripts/min-tool-version.sh rustc).tar.gz" | |
| tar -xzf - -C "$(rustc --print sysroot)/lib" \ |
| "rust-src-$(scripts/min-tool-version.sh rustc)/rust-src/lib/" \ |
| --strip-components=3 |
| |
| In this case, upgrading the Rust compiler version later on requires manually |
| updating the source tree (this can be done by removing ``$(rustc --print |
| sysroot)/lib/rustlib/src/rust`` then rerunning the above command). |
| |
| |
| libclang |
| ******** |
| |
| ``libclang`` (part of LLVM) is used by ``bindgen`` to understand the C code |
| in the kernel, which means LLVM needs to be installed; like when the kernel |
| is compiled with ``LLVM=1``. |
| |
| Linux distributions are likely to have a suitable one available, so it is |
| best to check that first. |
| |
| There are also some binaries for several systems and architectures uploaded at: |
| |
| https://releases.llvm.org/download.html |
| |
| Otherwise, building LLVM takes quite a while, but it is not a complex process: |
| |
| https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm |
| |
| Please see Documentation/kbuild/llvm.rst for more information and further ways |
| to fetch pre-built releases and distribution packages. |
| |
| |
| bindgen |
| ******* |
| |
| The bindings to the C side of the kernel are generated at build time using |
| the ``bindgen`` tool. A particular version is required. |
| |
| Install it via (note that this will download and build the tool from source):: |
| |
| cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen-cli |
| |
| ``bindgen`` needs to find a suitable ``libclang`` in order to work. If it is |
| not found (or a different ``libclang`` than the one found should be used), |
| the process can be tweaked using the environment variables understood by |
| ``clang-sys`` (the Rust bindings crate that ``bindgen`` uses to access |
| ``libclang``): |
| |
| * ``LLVM_CONFIG_PATH`` can be pointed to an ``llvm-config`` executable. |
| |
| * Or ``LIBCLANG_PATH`` can be pointed to a ``libclang`` shared library |
| or to the directory containing it. |
| |
| * Or ``CLANG_PATH`` can be pointed to a ``clang`` executable. |
| |
| For details, please see ``clang-sys``'s documentation at: |
| |
| https://github.com/KyleMayes/clang-sys#environment-variables |
| |
| |
| Requirements: Developing |
| ------------------------ |
| |
| This section explains how to fetch the tools needed for developing. That is, |
| they are not needed when just building the kernel. |
| |
| |
| rustfmt |
| ******* |
| |
| The ``rustfmt`` tool is used to automatically format all the Rust kernel code, |
| including the generated C bindings (for details, please see |
| coding-guidelines.rst). |
| |
| If ``rustup`` is being used, its ``default`` profile already installs the tool, |
| thus nothing needs to be done. If another profile is being used, the component |
| can be installed manually:: |
| |
| rustup component add rustfmt |
| |
| The standalone installers also come with ``rustfmt``. |
| |
| |
| clippy |
| ****** |
| |
| ``clippy`` is a Rust linter. Running it provides extra warnings for Rust code. |
| It can be run by passing ``CLIPPY=1`` to ``make`` (for details, please see |
| general-information.rst). |
| |
| If ``rustup`` is being used, its ``default`` profile already installs the tool, |
| thus nothing needs to be done. If another profile is being used, the component |
| can be installed manually:: |
| |
| rustup component add clippy |
| |
| The standalone installers also come with ``clippy``. |
| |
| |
| cargo |
| ***** |
| |
| ``cargo`` is the Rust native build system. It is currently required to run |
| the tests since it is used to build a custom standard library that contains |
| the facilities provided by the custom ``alloc`` in the kernel. The tests can |
| be run using the ``rusttest`` Make target. |
| |
| If ``rustup`` is being used, all the profiles already install the tool, |
| thus nothing needs to be done. |
| |
| The standalone installers also come with ``cargo``. |
| |
| |
| rustdoc |
| ******* |
| |
| ``rustdoc`` is the documentation tool for Rust. It generates pretty HTML |
| documentation for Rust code (for details, please see |
| general-information.rst). |
| |
| ``rustdoc`` is also used to test the examples provided in documented Rust code |
| (called doctests or documentation tests). The ``rusttest`` Make target uses |
| this feature. |
| |
| If ``rustup`` is being used, all the profiles already install the tool, |
| thus nothing needs to be done. |
| |
| The standalone installers also come with ``rustdoc``. |
| |
| |
| rust-analyzer |
| ************* |
| |
| The `rust-analyzer <https://rust-analyzer.github.io/>`_ language server can |
| be used with many editors to enable syntax highlighting, completion, go to |
| definition, and other features. |
| |
| ``rust-analyzer`` needs a configuration file, ``rust-project.json``, which |
| can be generated by the ``rust-analyzer`` Make target:: |
| |
| make LLVM=1 rust-analyzer |
| |
| |
| Configuration |
| ------------- |
| |
| ``Rust support`` (``CONFIG_RUST``) needs to be enabled in the ``General setup`` |
| menu. The option is only shown if a suitable Rust toolchain is found (see |
| above), as long as the other requirements are met. In turn, this will make |
| visible the rest of options that depend on Rust. |
| |
| Afterwards, go to:: |
| |
| Kernel hacking |
| -> Sample kernel code |
| -> Rust samples |
| |
| And enable some sample modules either as built-in or as loadable. |
| |
| |
| Building |
| -------- |
| |
| Building a kernel with a complete LLVM toolchain is the best supported setup |
| at the moment. That is:: |
| |
| make LLVM=1 |
| |
| Using GCC also works for some configurations, but it is very experimental at |
| the moment. |
| |
| |
| Hacking |
| ------- |
| |
| To dive deeper, take a look at the source code of the samples |
| at ``samples/rust/``, the Rust support code under ``rust/`` and |
| the ``Rust hacking`` menu under ``Kernel hacking``. |
| |
| If GDB/Binutils is used and Rust symbols are not getting demangled, the reason |
| is the toolchain does not support Rust's new v0 mangling scheme yet. |
| There are a few ways out: |
| |
| - Install a newer release (GDB >= 10.2, Binutils >= 2.36). |
| |
| - Some versions of GDB (e.g. vanilla GDB 10.1) are able to use |
| the pre-demangled names embedded in the debug info (``CONFIG_DEBUG_INFO``). |