xref: /openbmc/linux/Documentation/translations/zh_CN/rust/quick-start.rst (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*73b63402SYanteng Si.. SPDX-License-Identifier: GPL-2.0
2*73b63402SYanteng Si.. include:: ../disclaimer-zh_CN.rst
3*73b63402SYanteng Si
4*73b63402SYanteng Si:Original: Documentation/rust/quick-start.rst
5*73b63402SYanteng Si
6*73b63402SYanteng Si:翻译:
7*73b63402SYanteng Si
8*73b63402SYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn>
9*73b63402SYanteng Si
10*73b63402SYanteng Si
11*73b63402SYanteng Si快速入门
12*73b63402SYanteng Si========
13*73b63402SYanteng Si
14*73b63402SYanteng Si本文介绍了如何开始使用Rust进行内核开发。
15*73b63402SYanteng Si
16*73b63402SYanteng Si
17*73b63402SYanteng Si构建依赖
18*73b63402SYanteng Si--------
19*73b63402SYanteng Si
20*73b63402SYanteng Si本节描述了如何获取构建所需的工具。
21*73b63402SYanteng Si
22*73b63402SYanteng Si其中一些依赖也许可以从Linux发行版中获得,包名可能是 ``rustc`` , ``rust-src`` ,
23*73b63402SYanteng Si``rust-bindgen`` 等。然而,在写这篇文章的时候,它们很可能还不够新,除非发行版跟踪最
24*73b63402SYanteng Si新的版本。
25*73b63402SYanteng Si
26*73b63402SYanteng Si为了方便检查是否满足要求,可以使用以下目标::
27*73b63402SYanteng Si
28*73b63402SYanteng Si	make LLVM=1 rustavailable
29*73b63402SYanteng Si
30*73b63402SYanteng Si这会触发与Kconfig用来确定是否应该启用 ``RUST_IS_AVAILABLE`` 相同的逻辑;不过,如
31*73b63402SYanteng Si果Kconfig认为不该启用,它会列出未满足的条件。
32*73b63402SYanteng Si
33*73b63402SYanteng Si
34*73b63402SYanteng Sirustc
35*73b63402SYanteng Si*****
36*73b63402SYanteng Si
37*73b63402SYanteng Si需要一个特定版本的Rust编译器。较新的版本可能会也可能不会工作,因为就目前而言,内核依赖
38*73b63402SYanteng Si于一些不稳定的Rust特性。
39*73b63402SYanteng Si
40*73b63402SYanteng Si如果使用的是 ``rustup`` ,请进入检出的源代码目录并运行::
41*73b63402SYanteng Si
42*73b63402SYanteng Si	rustup override set $(scripts/min-tool-version.sh rustc)
43*73b63402SYanteng Si
44*73b63402SYanteng Si或者从以下网址获取一个独立的安装程序或安装 ``rustup`` :
45*73b63402SYanteng Si
46*73b63402SYanteng Si	https://www.rust-lang.org
47*73b63402SYanteng Si
48*73b63402SYanteng Si
49*73b63402SYanteng SiRust标准库源代码
50*73b63402SYanteng Si****************
51*73b63402SYanteng Si
52*73b63402SYanteng SiRust标准库的源代码是必需的,因为构建系统会交叉编译 ``core`` 和 ``alloc`` 。
53*73b63402SYanteng Si
54*73b63402SYanteng Si如果正在使用 ``rustup`` ,请运行::
55*73b63402SYanteng Si
56*73b63402SYanteng Si	rustup component add rust-src
57*73b63402SYanteng Si
58*73b63402SYanteng Si这些组件是按工具链安装的,因此以后升级Rust编译器版本需要重新添加组件。
59*73b63402SYanteng Si
60*73b63402SYanteng Si否则,如果使用独立的安装程序,可以将Rust仓库克隆到工具链的安装文件夹中::
61*73b63402SYanteng Si
62*73b63402SYanteng Si	git clone --recurse-submodules \
63*73b63402SYanteng Si		--branch $(scripts/min-tool-version.sh rustc) \
64*73b63402SYanteng Si		https://github.com/rust-lang/rust \
65*73b63402SYanteng Si		$(rustc --print sysroot)/lib/rustlib/src/rust
66*73b63402SYanteng Si
67*73b63402SYanteng Si在这种情况下,以后升级Rust编译器版本需要手动更新这个克隆的仓库。
68*73b63402SYanteng Si
69*73b63402SYanteng Si
70*73b63402SYanteng Silibclang
71*73b63402SYanteng Si********
72*73b63402SYanteng Si
73*73b63402SYanteng Si``bindgen`` 使用 ``libclang`` (LLVM的一部分)来理解内核中的C代码,这意味着需要安
74*73b63402SYanteng Si装LLVM;同在开启 ``CC=clang`` 或 ``LLVM=1`` 时编译内核一样。
75*73b63402SYanteng Si
76*73b63402SYanteng SiLinux发行版中可能会有合适的包,所以最好先检查一下。
77*73b63402SYanteng Si
78*73b63402SYanteng Si适用于部分系统和架构的二进制文件也可到以下网址下载:
79*73b63402SYanteng Si
80*73b63402SYanteng Si	https://releases.llvm.org/download.html
81*73b63402SYanteng Si
82*73b63402SYanteng Si或者自行构建LLVM,这需要相当长的时间,但并不是一个复杂的过程:
83*73b63402SYanteng Si
84*73b63402SYanteng Si	https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm
85*73b63402SYanteng Si
86*73b63402SYanteng Si请参阅 Documentation/kbuild/llvm.rst 了解更多信息,以及获取预构建版本和发行包
87*73b63402SYanteng Si的进一步方法。
88*73b63402SYanteng Si
89*73b63402SYanteng Si
90*73b63402SYanteng Sibindgen
91*73b63402SYanteng Si*******
92*73b63402SYanteng Si
93*73b63402SYanteng Si内核的C端绑定是在构建时使用 ``bindgen`` 工具生成的。这需要特定的版本。
94*73b63402SYanteng Si
95*73b63402SYanteng Si通过以下方式安装它(注意,这将从源码下载并构建该工具)::
96*73b63402SYanteng Si
97*73b63402SYanteng Si	cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen
98*73b63402SYanteng Si
99*73b63402SYanteng Si
100*73b63402SYanteng Si开发依赖
101*73b63402SYanteng Si--------
102*73b63402SYanteng Si
103*73b63402SYanteng Si本节解释了如何获取开发所需的工具。也就是说,在构建内核时不需要这些工具。
104*73b63402SYanteng Si
105*73b63402SYanteng Si
106*73b63402SYanteng Sirustfmt
107*73b63402SYanteng Si*******
108*73b63402SYanteng Si
109*73b63402SYanteng Si``rustfmt`` 工具被用来自动格式化所有的Rust内核代码,包括生成的C绑定(详情请见
110*73b63402SYanteng Sicoding-guidelines.rst )。
111*73b63402SYanteng Si
112*73b63402SYanteng Si如果使用的是 ``rustup`` ,它的 ``默认`` 配置文件已经安装了这个工具,因此不需要做什么。
113*73b63402SYanteng Si如果使用的是其他配置文件,可以手动安装该组件::
114*73b63402SYanteng Si
115*73b63402SYanteng Si	rustup component add rustfmt
116*73b63402SYanteng Si
117*73b63402SYanteng Si独立的安装程序也带有 ``rustfmt`` 。
118*73b63402SYanteng Si
119*73b63402SYanteng Si
120*73b63402SYanteng Siclippy
121*73b63402SYanteng Si******
122*73b63402SYanteng Si
123*73b63402SYanteng Si``clippy`` 是一个Rust linter。运行它可以为Rust代码提供额外的警告。它可以通过向 ``make``
124*73b63402SYanteng Si传递 ``CLIPPY=1`` 来运行(关于细节,详见 general-information.rst )。
125*73b63402SYanteng Si
126*73b63402SYanteng Si如果正在使用 ``rustup`` ,它的 ``默认`` 配置文件已经安装了这个工具,因此不需要做什么。
127*73b63402SYanteng Si如果使用的是另一个配置文件,该组件可以被手动安装::
128*73b63402SYanteng Si
129*73b63402SYanteng Si	rustup component add clippy
130*73b63402SYanteng Si
131*73b63402SYanteng Si独立的安装程序也带有 ``clippy`` 。
132*73b63402SYanteng Si
133*73b63402SYanteng Si
134*73b63402SYanteng Sicargo
135*73b63402SYanteng Si*****
136*73b63402SYanteng Si
137*73b63402SYanteng Si``cargo`` 是Rust的本地构建系统。目前需要它来运行测试,因为它被用来构建一个自定义的标准
138*73b63402SYanteng Si库,其中包含了内核中自定义 ``alloc`` 所提供的设施。测试可以使用 ``rusttest`` Make 目标
139*73b63402SYanteng Si来运行。
140*73b63402SYanteng Si
141*73b63402SYanteng Si如果使用的是 ``rustup`` ,所有的配置文件都已经安装了该工具,因此不需要再做什么。
142*73b63402SYanteng Si
143*73b63402SYanteng Si独立的安装程序也带有 ``cargo`` 。
144*73b63402SYanteng Si
145*73b63402SYanteng Si
146*73b63402SYanteng Sirustdoc
147*73b63402SYanteng Si*******
148*73b63402SYanteng Si
149*73b63402SYanteng Si``rustdoc`` 是Rust的文档工具。它为Rust代码生成漂亮的HTML文档(详情请见 general-information.rst )。
150*73b63402SYanteng Si
151*73b63402SYanteng Si``rustdoc`` 也被用来测试文档化的Rust代码中提供的例子(称为doctests或文档测试)。
152*73b63402SYanteng Si``rusttest`` 是本功能的Make目标。
153*73b63402SYanteng Si
154*73b63402SYanteng Si如果使用的是 ``rustup`` ,所有的配置文件都已经安装了这个工具,因此不需要做什么。
155*73b63402SYanteng Si
156*73b63402SYanteng Si独立的安装程序也带有 ``rustdoc`` 。
157*73b63402SYanteng Si
158*73b63402SYanteng Si
159*73b63402SYanteng Sirust-analyzer
160*73b63402SYanteng Si*************
161*73b63402SYanteng Si
162*73b63402SYanteng Si`rust-analyzer <https://rust-analyzer.github.io/>`_ 语言服务器可以和许多编辑器
163*73b63402SYanteng Si一起使用,以实现语法高亮、补全、转到定义和其他功能。
164*73b63402SYanteng Si
165*73b63402SYanteng Si``rust-analyzer`` 需要一个配置文件, ``rust-project.json``, 它可以由 ``rust-analyzer``
166*73b63402SYanteng SiMake 目标生成。
167*73b63402SYanteng Si
168*73b63402SYanteng Si
169*73b63402SYanteng Si配置
170*73b63402SYanteng Si----
171*73b63402SYanteng Si
172*73b63402SYanteng SiRust支持(CONFIG_RUST)需要在 ``General setup`` 菜单中启用。在其他要求得到满足的情
173*73b63402SYanteng Si况下,该选项只有在找到合适的Rust工具链时才会显示(见上文)。相应的,这将使依赖Rust的其
174*73b63402SYanteng Si他选项可见。
175*73b63402SYanteng Si
176*73b63402SYanteng Si之后,进入::
177*73b63402SYanteng Si
178*73b63402SYanteng Si	Kernel hacking
179*73b63402SYanteng Si	    -> Sample kernel code
180*73b63402SYanteng Si	        -> Rust samples
181*73b63402SYanteng Si
182*73b63402SYanteng Si并启用一些内置或可加载的样例模块。
183*73b63402SYanteng Si
184*73b63402SYanteng Si
185*73b63402SYanteng Si构建
186*73b63402SYanteng Si----
187*73b63402SYanteng Si
188*73b63402SYanteng Si用完整的LLVM工具链构建内核是目前支持的最佳设置。即::
189*73b63402SYanteng Si
190*73b63402SYanteng Si	make LLVM=1
191*73b63402SYanteng Si
192*73b63402SYanteng Si对于不支持完整LLVM工具链的架构,使用::
193*73b63402SYanteng Si
194*73b63402SYanteng Si	make CC=clang
195*73b63402SYanteng Si
196*73b63402SYanteng Si使用GCC对某些配置也是可行的,但目前它是非常试验性的。
197*73b63402SYanteng Si
198*73b63402SYanteng Si
199*73b63402SYanteng Si折腾
200*73b63402SYanteng Si----
201*73b63402SYanteng Si
202*73b63402SYanteng Si要想深入了解,请看 ``samples/rust/`` 下的样例源代码、 ``rust/`` 下的Rust支持代码和
203*73b63402SYanteng Si``Kernel hacking`` 下的 ``Rust hacking`` 菜单。
204*73b63402SYanteng Si
205*73b63402SYanteng Si如果使用的是GDB/Binutils,而Rust符号没有被demangled,原因是工具链还不支持Rust的新v0
206*73b63402SYanteng Simangling方案。有几个办法可以解决:
207*73b63402SYanteng Si
208*73b63402SYanteng Si  - 安装一个较新的版本(GDB >= 10.2, Binutils >= 2.36)。
209*73b63402SYanteng Si
210*73b63402SYanteng Si  - 一些版本的GDB(例如vanilla GDB 10.1)能够使用嵌入在调试信息(``CONFIG_DEBUG_INFO``)
211*73b63402SYanteng Si    中的pre-demangled的名字。
212