提交 03c40788 编写于 作者: L lubinglun

Optimize the description of rust module configuration

Issue:I6JNH

Test:None
Signed-off-by: Nlubinglun <lubinglun@huawei.com>
Change-Id: I02acbc058785ac47065f1946229cfe939893210f
上级 3f3bba19
......@@ -20,7 +20,7 @@
- [HAP编译构建指导](subsys-build-gn-hap-compilation-guide.md)
- Rust编译构建指导
- [Rust模块配置规则和指导](subsys-build-rust-compilation.md)
- [Bindgen、CXX工具使用指导](subsys-build-bindgen-cxx-guide.md)
- [交互工具使用指导](subsys-build-bindgen-cxx-guide.md)
- [Cargo2gn工具操作指导](subsys-build-cargo2gn-guide.md)
- [ 常见问题](subsys-build-FAQ.md)
- [ArkCompiler](subsys-arkcompiler-guide.md)
......
......@@ -326,11 +326,11 @@ ohos_prebuilt_static_library("helloworld") {
### Hap模板
hap模板详见:[ HAP编译构建指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-gn-hap-compilation-guide.md)
hap模板详见:[ HAP编译构建指导](subsys-build-gn-hap-compilation-guide.md)
### Rust模板
rust模板详见:[ Rust模块配置规则和指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-rust-compilation.md)
rust模板详见:[ Rust模块配置规则和指导](subsys-build-rust-compilation.md)
### 其他常用模板
......
......@@ -2,26 +2,24 @@
## 概述
Rust是一门静态和强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。
Rust官方使用了cargo工具创建工程和构建编译,在OpenHarmony中希望通过gn构建Rust源码文件(xxx.rs),增加与C/C++互操作、编译时lint、测试、IDL转换、三方库集成、IDE等功能,扩展gn框架,并增加接口自动化转换,最大程度简化开发。
OpenHarmony拥有集成Rust的先决条件:为了集成OpenHarmony中的C/C++代码,提升编译速度使用了gn+ninja的编译构建系统。gn的构建语言简洁易读,ninja的汇编级编译规则直接高效。
Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。
OpenHarmony为了集成C/C++代码和提升编译速度,使用了GN + Ninja的编译构建系统。GN的构建语言简洁易读,Ninja的汇编级编译规则直接高效。
为了在OpenHarmony中集成Rust代码,并最大程度发挥Rust和OpenHarmony中原有C/C++代码的交互性,采用GN作为统一构建工具,即通过GN构建Rust源码文件(xxx.rs),并增加与C/C++互操作、编译时lint、测试、IDL转换、三方库集成、IDE等功能。同时扩展gn框架,支持接口自动化转换,最大程度简化开发。
### 基本概念
| 术语 | 描述 |
| ----- | ------------------------------------------------------------ |
| Cargo | Cargo是一个工具,允许Rust 项目声明其各种依赖项,并确保您始终获得可重复的构建。 |
| Cargo | Cargo是Rust官方使用的构建工具,允许Rust项目声明其各种依赖项,并确保您始终获得可重复的构建。 |
| crate | crate是一个独立的可编译单元。 |
| lints | lints 是指出常见编程错误、错误、样式错误和可疑结构的工具。可以对程序进行更加广泛的错误分析。 |
## 配置规则
当前OpenHarmony提供了用于Rust代码编译构建的各类型gn模板。包含如下模板
OpenHarmony提供了用于Rust代码编译构建的各类型GN模板,可以用于编译Rust可执行文件,动态库和静态库等。各类型模板说明如下
| gn模板 | 功能 | 输出 |
| GN模板 | 功能 | 输出 |
| ------------------------ | ----------------- | ----------------------------------------------- |
| ohos_rust_executable | rust可执行文件 | rust可执行文件,不带后缀 |
| ohos_rust_shared_library | rust动态库 | rust dylib动态库,默认后缀.dylib.so |
......@@ -36,11 +34,11 @@ OpenHarmony拥有集成Rust的先决条件:为了集成OpenHarmony中的C/C++
## 配置指导
### test_rlib_crate示例
test_rlib_crate是测试对Rust可执行bin文件和静态库rlib文件的编译,以及可执行文件对静态库的依赖。
配置Rust模块与C/C++模块类似,参考[模块配置规则](subsys-build-module.md)。下面是使用不同模板的示例。
### 配置Rust静态库示例
该示例用于测试Rust可执行bin文件和静态库rlib文件的编译,以及可执行文件对静态库的依赖,使用模板ohos_rust_executable和ohos_rust_static_library。操作步骤如下:
1. 创建build/rust/tests/test_rlib_crate/src/simple_printer.rs,示例如下
1. 创建build/rust/tests/test_rlib_crate/src/simple_printer.rs,如下所示
```rust
//! simple_printer
......@@ -60,7 +58,7 @@ test_rlib_crate是测试对Rust可执行bin文件和静态库rlib文件的编译
}
```
2. 创建build/rust/tests/test_rlib_crate/src/main.rs,示例如下
2. 创建build/rust/tests/test_rlib_crate/src/main.rs,如下所示
```rust
//! rlib_crate example for Rust.
......@@ -79,7 +77,7 @@ test_rlib_crate是测试对Rust可执行bin文件和静态库rlib文件的编译
}
```
3. 配置gn脚本build/rust/tests/test_rlib_crate/BUILD.gn,示例如下
3. 配置gn脚本build/rust/tests/test_rlib_crate/BUILD.gn,如下所示
```
import("//build/ohos.gni")
......@@ -97,15 +95,14 @@ test_rlib_crate是测试对Rust可执行bin文件和静态库rlib文件的编译
}
```
4. 运行结果如下:
4. 执行编译得到的可执行文件,运行结果如下:
![test_rlib_crate](./figures/test_rlib_crate.png)
### test_rlib_cargo_crate示例
### 配置三方库示例
该示例用于测试包含预编译文件build.rs的三方静态库rlib文件的编译,使用了模板ohos_rust_executable和ohos_rust_cargo_crate。操作步骤如下:
test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文件的编译。
1. 创建build/rust/tests/test_rlib_cargo_crate/crate/src/lib.rs,示例如下:
1. 创建build/rust/tests/test_rlib_cargo_crate/crate/src/lib.rs,如下所示:
```rust
include!(concat!(env!("OUT_DIR"), "/generated/generated.rs"));
......@@ -151,7 +148,7 @@ test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文
}
```
2. 创建build/rust/tests/test_rlib_cargo_crate/crate/src/main.rs,示例如下
2. 创建build/rust/tests/test_rlib_cargo_crate/crate/src/main.rs,如下所示
```rust
pub fn main() {
......@@ -159,7 +156,7 @@ test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文
}
```
3. 创建build/rust/tests/test_rlib_cargo_crate/crate/build.rs,示例如下
3. 创建build/rust/tests/test_rlib_cargo_crate/crate/build.rs,如下所示
```rust
use std::env;
......@@ -250,7 +247,7 @@ test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文
}
```
4. 配置gn脚本build/rust/tests/test_rlib_cargo_crate/BUILD.gn,示例如下
4. 配置gn脚本build/rust/tests/test_rlib_cargo_crate/BUILD.gn,如下所示
```
import("//build/templates/rust/ohos_cargo_crate.gni")
......@@ -296,11 +293,11 @@ test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文
}
```
5. 运行结果如下:
5. 执行编译得到的可执行文件,运行结果如下:
![test_rlib_cargo_crate](./figures/test_rlib_cargo_crate.png)
### 源码实例
### 其他源码实例
在build/rust/tests目录下有Rust各类型模块的配置实例可供参考:
| 用例目录 | 测试功能 |
| -------------------------------------------- | ------------------------------------------------------------ |
......@@ -316,23 +313,14 @@ test_rlib_cargo_crate是测试包含预编译文件build.rs的静态库rlib文
| build/rust/tests/test_bin_cargo_crate | 测试ohos_cargo_crate对拥有build.rs预编译的可执行文件编译链接和运行,适用于rust三方crate编译依赖 |
| build/rust/tests/test_rlib_cargo_crate | 测试ohos_cargo_crate对拥有build.rs预编译的静态库文件编译链接和运行,适用于rust三方crate编译依赖 |
| build/rust/tests/test_proc_macro_cargo_crate | 测试ohos_cargo_crate对拥有build.rs预编译的过程宏编译链接和运行,适用于rust三方crate编译依赖 |
### 运行验证
当前支持target ohos arm和ohos arm64架构。arm64模拟器编译启动方法:
```shell
./build.sh --product-name qemu-arm64-linux-min
./vendor/ohemu/qemu_arm64_linux_min/qemu_run.sh -e out/qemu-arm-linux/packages/phone/images/
```
## 注意事项
## 参考
### 特性点实例
#### Rust源码依赖调用C/C++库
OpenHarmony上C/C++模块动态库默认用.z.so后缀,但是被Rust依赖部分会转成-l链接,默认只会链接.so后缀的动态库。因此被依赖的C/C++动态库要加上output_externsion = "so"。同理,在Rust源码中如果直接链接动态库,后缀也需要使用".so",使用动态库的中间名,不需要添加lib前缀,例如链接libhilog.so:
OpenHarmony上C/C++模块动态库默认用.z.so后缀,但是Rust的编译命令通过-l链接时,默认只会链接.so后缀的动态库。因此如果要依赖一个C/C++动态库编译模块,需要在该动态库的GN构建文件中添加output_externsion = "so"的声明,这样编译得到的动态库将会以".so"作为后缀,而不是".z.so"。
在Rust源码中如果直接链接动态库,后缀也需要使用".so",这时使用动态库的中间名,不需要添加lib前缀。例如Rust源码中链接libhilog.so:
```rust
#[link(name = "hilog")]
```
......@@ -347,12 +335,10 @@ executable("foo") {
}]
}
```
#### IDE的Rust-project.json编译
```shell
./build.sh --product-name rk3568 --build-target=build/rust:default --export-rust-project
```
### lints规则
OpenHarmony框架支持rustc lints和clippy lints两级lints,分别由模块属性rustc_lints和clippy_lints标识;同时支持三个等级的标准:"openharmony"、"vendor"和"none","openharmony"是系统配置,最为严格。模块无配置时按照路径匹配等级。
OpenHarmony框架支持rustc lints和clippy lints两种lints,每种lints划为三个等级的标准:"openharmony"、"vendor"和"none",严格程度按照"openharmony" -> "vendor" -> "none"逐级递减。
配置Rust模块时可以通过rustc_lints和clippy_lints来指定使用lints的等级。
模块中没有配置rustc_lints或者clippy_lints时会根据模块所在路径来匹配lints等级。不同路径下的Rust代码的语法规范会有不同程度地约束,因此用户在OpenHarmony配置Rust代码编译模块时还应关注模块所在路径。
#### rustc lints和clippy lints的各等级标志
| **lints类型** | **模块属性** | **lints等级** | **lints等级标志** | **lints内容** |
| ------------- | ------------ | ------------- | ----------------- | ------------------------------------------------------------ |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册