linux-zen-server/Documentation/translations/zh_CN/rust/quick-start.rst

212 lines
6.3 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/rust/quick-start.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
快速入门
========
本文介绍了如何开始使用Rust进行内核开发。
构建依赖
--------
本节描述了如何获取构建所需的工具。
其中一些依赖也许可以从Linux发行版中获得包名可能是 ``rustc`` , ``rust-src`` ,
``rust-bindgen`` 等。然而,在写这篇文章的时候,它们很可能还不够新,除非发行版跟踪最
新的版本。
为了方便检查是否满足要求,可以使用以下目标::
make LLVM=1 rustavailable
这会触发与Kconfig用来确定是否应该启用 ``RUST_IS_AVAILABLE`` 相同的逻辑;不过,如
果Kconfig认为不该启用它会列出未满足的条件。
rustc
*****
需要一个特定版本的Rust编译器。较新的版本可能会也可能不会工作因为就目前而言内核依赖
于一些不稳定的Rust特性。
如果使用的是 ``rustup`` ,请进入检出的源代码目录并运行::
rustup override set $(scripts/min-tool-version.sh rustc)
或者从以下网址获取一个独立的安装程序或安装 ``rustup``
https://www.rust-lang.org
Rust标准库源代码
****************
Rust标准库的源代码是必需的因为构建系统会交叉编译 ``core````alloc``
如果正在使用 ``rustup`` ,请运行::
rustup component add rust-src
这些组件是按工具链安装的因此以后升级Rust编译器版本需要重新添加组件。
否则如果使用独立的安装程序可以将Rust仓库克隆到工具链的安装文件夹中::
git clone --recurse-submodules \
--branch $(scripts/min-tool-version.sh rustc) \
https://github.com/rust-lang/rust \
$(rustc --print sysroot)/lib/rustlib/src/rust
在这种情况下以后升级Rust编译器版本需要手动更新这个克隆的仓库。
libclang
********
``bindgen`` 使用 ``libclang`` LLVM的一部分来理解内核中的C代码这意味着需要安
装LLVM同在开启 ``CC=clang````LLVM=1`` 时编译内核一样。
Linux发行版中可能会有合适的包所以最好先检查一下。
适用于部分系统和架构的二进制文件也可到以下网址下载:
https://releases.llvm.org/download.html
或者自行构建LLVM这需要相当长的时间但并不是一个复杂的过程
https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm
请参阅 Documentation/kbuild/llvm.rst 了解更多信息,以及获取预构建版本和发行包
的进一步方法。
bindgen
*******
内核的C端绑定是在构建时使用 ``bindgen`` 工具生成的。这需要特定的版本。
通过以下方式安装它(注意,这将从源码下载并构建该工具)::
cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen
开发依赖
--------
本节解释了如何获取开发所需的工具。也就是说,在构建内核时不需要这些工具。
rustfmt
*******
``rustfmt`` 工具被用来自动格式化所有的Rust内核代码包括生成的C绑定详情请见
coding-guidelines.rst )。
如果使用的是 ``rustup`` ,它的 ``默认`` 配置文件已经安装了这个工具,因此不需要做什么。
如果使用的是其他配置文件,可以手动安装该组件::
rustup component add rustfmt
独立的安装程序也带有 ``rustfmt``
clippy
******
``clippy`` 是一个Rust linter。运行它可以为Rust代码提供额外的警告。它可以通过向 ``make``
传递 ``CLIPPY=1`` 来运行(关于细节,详见 general-information.rst )。
如果正在使用 ``rustup`` ,它的 ``默认`` 配置文件已经安装了这个工具,因此不需要做什么。
如果使用的是另一个配置文件,该组件可以被手动安装::
rustup component add clippy
独立的安装程序也带有 ``clippy``
cargo
*****
``cargo`` 是Rust的本地构建系统。目前需要它来运行测试因为它被用来构建一个自定义的标准
库,其中包含了内核中自定义 ``alloc`` 所提供的设施。测试可以使用 ``rusttest`` Make 目标
来运行。
如果使用的是 ``rustup`` ,所有的配置文件都已经安装了该工具,因此不需要再做什么。
独立的安装程序也带有 ``cargo``
rustdoc
*******
``rustdoc`` 是Rust的文档工具。它为Rust代码生成漂亮的HTML文档详情请见 general-information.rst )。
``rustdoc`` 也被用来测试文档化的Rust代码中提供的例子称为doctests或文档测试
``rusttest`` 是本功能的Make目标。
如果使用的是 ``rustup`` ,所有的配置文件都已经安装了这个工具,因此不需要做什么。
独立的安装程序也带有 ``rustdoc``
rust-analyzer
*************
`rust-analyzer <https://rust-analyzer.github.io/>`_ 语言服务器可以和许多编辑器
一起使用,以实现语法高亮、补全、转到定义和其他功能。
``rust-analyzer`` 需要一个配置文件, ``rust-project.json``, 它可以由 ``rust-analyzer``
Make 目标生成。
配置
----
Rust支持CONFIG_RUST需要在 ``General setup`` 菜单中启用。在其他要求得到满足的情
况下该选项只有在找到合适的Rust工具链时才会显示见上文。相应的这将使依赖Rust的其
他选项可见。
之后,进入::
Kernel hacking
-> Sample kernel code
-> Rust samples
并启用一些内置或可加载的样例模块。
构建
----
用完整的LLVM工具链构建内核是目前支持的最佳设置。即::
make LLVM=1
对于不支持完整LLVM工具链的架构使用::
make CC=clang
使用GCC对某些配置也是可行的但目前它是非常试验性的。
折腾
----
要想深入了解,请看 ``samples/rust/`` 下的样例源代码、 ``rust/`` 下的Rust支持代码和
``Kernel hacking`` 下的 ``Rust hacking`` 菜单。
如果使用的是GDB/Binutils而Rust符号没有被demangled原因是工具链还不支持Rust的新v0
mangling方案。有几个办法可以解决
- 安装一个较新的版本GDB >= 10.2, Binutils >= 2.36)。
- 一些版本的GDB例如vanilla GDB 10.1)能够使用嵌入在调试信息(``CONFIG_DEBUG_INFO``)
中的pre-demangled的名字。