From 7f469fb2c75b40b9787e5895d1b5bf341e5f65d4 Mon Sep 17 00:00:00 2001 From: Adrian Taylor Date: Mon, 27 Nov 2023 18:21:19 +0000 Subject: [PATCH] Add Chromium section (#1479) This is a contribution of a Chromium section for Comprehensive Rust. --------- Co-authored-by: Nicole L Co-authored-by: Martin Geisler --- README.md | 3 +- src/SUMMARY.md | 36 +++++++++ src/chromium.md | 9 +++ src/chromium/adding-third-party-crates.md | 32 ++++++++ .../adding-third-party-crates/checking-in.md | 23 ++++++ .../configuring-cargo-toml.md | 23 ++++++ .../configuring-gnrt-config-toml.md | 29 +++++++ .../depending-on-a-crate.md | 23 ++++++ .../downloading-crates.md | 30 ++++++++ .../generating-gn-build-rules.md | 25 ++++++ .../keeping-up-to-date.md | 8 ++ .../resolving-problems.md | 21 ++++++ .../build-scripts-which-generate-code.md | 22 ++++++ ...ld-scripts-which-take-arbitrary-actions.md | 24 ++++++ .../reviews-and-audits.md | 33 ++++++++ src/chromium/build-rules.md | 38 ++++++++++ src/chromium/build-rules/depending.md | 22 ++++++ src/chromium/build-rules/unsafe.md | 17 +++++ src/chromium/build-rules/vscode.md | 17 +++++ src/chromium/build-rules/vscode.png | Bin 0 -> 89299 bytes src/chromium/cargo.md | 51 +++++++++++++ src/chromium/interoperability-with-cpp.md | 25 ++++++ .../error-handling.md | 41 ++++++++++ .../example-bindings.md | 23 ++++++ .../limitations-of-cxx.md | 31 ++++++++ .../using-cxx-in-chromium.md | 41 ++++++++++ src/chromium/policy.md | 37 +++++++++ src/chromium/setup.md | 27 +++++++ .../chromium/bringing-it-together.md | 61 +++++++++++++++ src/exercises/chromium/build-rules.md | 58 ++++++++++++++ src/exercises/chromium/chwomium.png | Bin 0 -> 169651 bytes .../chromium/interoperability-with-cpp.md | 71 ++++++++++++++++++ src/exercises/chromium/third-party.md | 22 ++++++ src/glossary.md | 2 + src/index.md | 3 + src/running-the-course/course-structure.md | 11 +++ third_party/cxx/book/snippets.rs | 22 ++++++ 37 files changed, 960 insertions(+), 1 deletion(-) create mode 100644 src/chromium.md create mode 100644 src/chromium/adding-third-party-crates.md create mode 100644 src/chromium/adding-third-party-crates/checking-in.md create mode 100644 src/chromium/adding-third-party-crates/configuring-cargo-toml.md create mode 100644 src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md create mode 100644 src/chromium/adding-third-party-crates/depending-on-a-crate.md create mode 100644 src/chromium/adding-third-party-crates/downloading-crates.md create mode 100644 src/chromium/adding-third-party-crates/generating-gn-build-rules.md create mode 100644 src/chromium/adding-third-party-crates/keeping-up-to-date.md create mode 100644 src/chromium/adding-third-party-crates/resolving-problems.md create mode 100644 src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md create mode 100644 src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md create mode 100644 src/chromium/adding-third-party-crates/reviews-and-audits.md create mode 100644 src/chromium/build-rules.md create mode 100644 src/chromium/build-rules/depending.md create mode 100644 src/chromium/build-rules/unsafe.md create mode 100644 src/chromium/build-rules/vscode.md create mode 100644 src/chromium/build-rules/vscode.png create mode 100644 src/chromium/cargo.md create mode 100644 src/chromium/interoperability-with-cpp.md create mode 100644 src/chromium/interoperability-with-cpp/error-handling.md create mode 100644 src/chromium/interoperability-with-cpp/example-bindings.md create mode 100644 src/chromium/interoperability-with-cpp/limitations-of-cxx.md create mode 100644 src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md create mode 100644 src/chromium/policy.md create mode 100644 src/chromium/setup.md create mode 100644 src/exercises/chromium/bringing-it-together.md create mode 100644 src/exercises/chromium/build-rules.md create mode 100644 src/exercises/chromium/chwomium.png create mode 100644 src/exercises/chromium/interoperability-with-cpp.md create mode 100644 src/exercises/chromium/third-party.md diff --git a/README.md b/README.md index fc1bd802..baaa98dc 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,10 @@ This repository has the source code for Comprehensive Rust 🦀, a multi-day Rust course developed by the Android team. The course covers all aspects of Rust, from basic syntax to generics and error handling. It also includes deep dives on -[Android], [bare-metal], and [concurrency]. +[Android], [Chromium], [bare-metal], and [concurrency]. [Android]: https://google.github.io/comprehensive-rust/android.html +[Chromium]: https://google.github.io/comprehensive-rust/comprehensive.html [bare-metal]: https://google.github.io/comprehensive-rust/bare-metal.html [concurrency]: https://google.github.io/comprehensive-rust/concurrency.html diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ec1fbcb2..e150e236 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -221,6 +221,42 @@ - [Exercises](exercises/android/morning.md) + +# Chromium + +---- + +- [Welcome](chromium.md) +- [Setup](chromium/setup.md) +- [Using cargo for experimental tools](chromium/cargo.md) +- [Policy](chromium/policy.md) +- [Build Rules](chromium/build-rules.md) + - [Unsafe code](chromium/build-rules/unsafe.md) + - [Depending on Rust code from Chromium C++](chromium/build-rules/depending.md) + - [Visual Studio code](chromium/build-rules/vscode.md) + - [Exercise](exercises/chromium/build-rules.md) +- [Interoperability with C++](chromium/interoperability-with-cpp.md) + - [Example bindings](chromium/interoperability-with-cpp/example-bindings.md) + - [Limitations of cxx](chromium/interoperability-with-cpp/limitations-of-cxx.md) + - [cxx error handling](chromium/interoperability-with-cpp/error-handling.md) + - [Using cxx in Chromium](chromium/interoperability-with-cpp/using-cxx-in-chromium.md) + - [Exercise](exercises/chromium/interoperability-with-cpp.md) +- [Adding third party crates](chromium/adding-third-party-crates.md) + - [Configuring Cargo.toml](chromium/adding-third-party-crates/configuring-cargo-toml.md) + - [Configuring gnrt_config.toml](chromium/adding-third-party-crates/configuring-gnrt-config-toml.md) + - [Downloading crates](chromium/adding-third-party-crates/downloading-crates.md) + - [Generating gn build rules](chromium/adding-third-party-crates/generating-gn-build-rules.md) + - [Resolving problems](chromium/adding-third-party-crates/resolving-problems.md) + - [Build scripts which generate code](chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md) + - [Build scripts which build C++ or take arbitrary actions](chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md) + - [Depending on a crate](chromium/adding-third-party-crates/depending-on-a-crate.md) + - [Reviews and audits](chromium/adding-third-party-crates/reviews-and-audits.md) + - [Checking into Chromium source code](chromium/adding-third-party-crates/checking-in.md) + - [Keeping crates up to date](chromium/adding-third-party-crates/keeping-up-to-date.md) + - [Exercise](exercises/chromium/third-party.md) +- [Bringing it together - Exercise](exercises/chromium/bringing-it-together.md) + + # Bare Metal: Morning ---- diff --git a/src/chromium.md b/src/chromium.md new file mode 100644 index 00000000..83926fbd --- /dev/null +++ b/src/chromium.md @@ -0,0 +1,9 @@ +# Welcome to Rust in Chromium + +Rust is supported for third-party libraries in Chromium, with first-party glue +code to connect between Rust and existing Chromium C++ code. + +> Today, we'll call into Rust to do something silly with strings. If you've +> got a corner of the code where you're displaying a UTF8 string to the user, +> feel free to follow this recipe in your part of the codebase instead of +> the exact part we talk about. diff --git a/src/chromium/adding-third-party-crates.md b/src/chromium/adding-third-party-crates.md new file mode 100644 index 00000000..0dbd24e2 --- /dev/null +++ b/src/chromium/adding-third-party-crates.md @@ -0,0 +1,32 @@ +# Adding third party crates + +Rust libraries are called "crates" and are found at [crates.io][0]. It's *very +easy* for Rust crates to depend upon one another. So they do! + +| Property | C++ library | Rust crate | +| --- | --- | --- | +| Build system | Lots | Consistent - `Cargo.toml` | +| Typical library size | Large-ish | Small | +| Transitive dependencies | Few | Lots | + +For a Chromium engineer, this has pros and cons: + +* All crates use a common build system so we can automate their inclusion into + Chromium... +* ... but, crates typically have transitive dependencies, so you will + likely have to bring in multiple libraries. + +We'll discuss: + +* How to put a crate in the Chromium source code tree +* How to make `gn` build rules for it +* How to audit its source code for sufficient safety. + +[0]: https://crates.io + +
+All of the things in the table on this slide are generalizations, and +counter-examples can be found. But in general it's important for students +to understand that most Rust code depends on other Rust libraries, because +it's easy to do so, and that this has both benefits and costs. +
\ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/checking-in.md b/src/chromium/adding-third-party-crates/checking-in.md new file mode 100644 index 00000000..e9fd9f21 --- /dev/null +++ b/src/chromium/adding-third-party-crates/checking-in.md @@ -0,0 +1,23 @@ +# Checking crates into Chromium source code + +`git status` should reveal: +* Crate code in `//third_party/rust/chromium_crates_io` +* Metadata (`BUILD.gn` and `README.chromium`) in `//third_party/rust//` + +Please also add an `OWNERS` file in the latter location. + +You should land all this, along with your `Cargo.toml` and `gnrt_config.toml` changes, into +the Chromium repo. + +**Important**: you need to use `git add -f` because otherwise `.gitignore` files +may result in some files being skipped. + +As you do so, you might find presubmit checks fail because of non-inclusive +language. This is because Rust crate data tends to include names of git branches, +and many projects still use non-inclusive terminology there. So you may need +to run: + +```shell +infra/update_inclusive_language_presubmit_exempt_dirs.sh > infra/inclusive_language_presubmit_exempt_dirs.txt +git add -p infra/inclusive_language_presubmit_exempt_dirs.txt # add whatever changes are yours +``` diff --git a/src/chromium/adding-third-party-crates/configuring-cargo-toml.md b/src/chromium/adding-third-party-crates/configuring-cargo-toml.md new file mode 100644 index 00000000..86aa1764 --- /dev/null +++ b/src/chromium/adding-third-party-crates/configuring-cargo-toml.md @@ -0,0 +1,23 @@ +# Configuring the `Cargo.toml` file to add crates + +Chromium has a single set of centrally-managed direct crate dependencies. +These are managed through a single [`Cargo.toml`][0]: + +```toml +[dependencies] +bitflags = "1" +cfg-if = "1" +cxx = "1" +# lots more... +``` + +As with any other `Cargo.toml`, you can specify [more details about +the dependencies][1] - most commonly, you'll want to specify the `features` that +you wish to enable in the crate. + +When adding a crate to Chromium, you'll often need to provide some extra +information in an additional file, `gnrt_config.toml`, which we'll meet next. + + +[0]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/Cargo.toml +[1]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html diff --git a/src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md b/src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md new file mode 100644 index 00000000..6649786f --- /dev/null +++ b/src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md @@ -0,0 +1,29 @@ +# Configuring `gnrt_config.toml` + +Alongside `Cargo.toml` is [`gnrt_config.toml`][0]. This contains Chromium-specific +extensions to crate handling. + +If you add a new crate, you should specify at least the `group`. +This is one of: + +```toml +# 'safe': The library satisfies the rule-of-2 and can be used in any process. +# 'sandbox': The library does not satisfy the rule-of-2 and must be used in +# a sandboxed process such as the renderer or a utility process. +# 'test': The library is only used in tests. +``` + +For instance, + +```toml +[crate.my-new-crate] +group = 'test' # only used in test code +``` + +Depending on the crate source code layout, you may also need to use this +file to specify where its `LICENSE` file(s) can be found. + +Later, we'll see some other things you will need to configure in this file +to resolve problems. + +[0]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/gnrt_config.toml \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/depending-on-a-crate.md b/src/chromium/adding-third-party-crates/depending-on-a-crate.md new file mode 100644 index 00000000..a8e3439b --- /dev/null +++ b/src/chromium/adding-third-party-crates/depending-on-a-crate.md @@ -0,0 +1,23 @@ +# Depending on a crate + +Once you've added a third-party crate and generated build rules, +depending on a crate is simple. Find your `rust_static_library` target, +and add a `dep` on the `:lib` target within your crate. + +Specifically, + +```bob + +------------+ +----------------------+ +"//third_party/rust" | crate name | "/v" | major semver version | "/:lib" + +------------+ +----------------------+ +``` + +For instance, + +```gn +rust_static_library("my_rust_lib") { + crate_root = "lib.rs" + sources = [ "lib.rs" ] + deps = [ "//third_party/rust/example_rust_crate/v1:lib" ] +} +``` \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/downloading-crates.md b/src/chromium/adding-third-party-crates/downloading-crates.md new file mode 100644 index 00000000..fdae6ca4 --- /dev/null +++ b/src/chromium/adding-third-party-crates/downloading-crates.md @@ -0,0 +1,30 @@ +# Downloading crates + +A tool called `gnrt` knows how to download crates and how to generate `BUILD.gn` +rules. + +To start, download the crate you want like this: + +```shell +cd chromium/src +vpython3 tools/crates/run_gnrt.py -- vendor +``` + +> Although the `gnrt` tool is part of the Chromium source code, +> by running this command you will be downloading and running its dependencies +> from `crates.io`. See [the earlier section][0] discussing this security +> decision. + +This `vendor` command may download: +* Your crate +* Direct and transitive dependencies +* New versions of other crates, as required by `cargo` to resolve + the complete set of crates required by Chromium. + +If a crate in `//third_party/rust/chromium_crates_io/patches` was updated as +part of vendoring, then reapply patches to it by running +`cd third_party/rust/chromium_crates_io; ./apply_patches.sh`. + + + +[0]: ../cargo.md \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/generating-gn-build-rules.md b/src/chromium/adding-third-party-crates/generating-gn-build-rules.md new file mode 100644 index 00000000..9350851d --- /dev/null +++ b/src/chromium/adding-third-party-crates/generating-gn-build-rules.md @@ -0,0 +1,25 @@ +# Generating `gn` build rules + +Once you've downloaded the crate, generate the `BUILD.gn` files like this: + +```shell +vpython3 tools/crates/run_gnrt.py -- gen +``` + +Now run `git status`. You should find: + +* At least one new crate source code in `third_party/rust/chromium_crates_io/vendor` +* At least one new `BUILD.gn` in `third_party/rust//v` +* An appropriate `README.chromium` + +The "major semver version" is a [Rust "semver" version number][0]. + +Take a close look, especially at the things generated in `third_party/rust`. + +
+Talk a little about semver - and specifically the way that in Chromium +it's to allow multiple incompatible versions of a crate, which is discouraged +but sometimes necessary in the cargo ecosystem. + + +[0]: https://doc.rust-lang.org/cargo/reference/semver.html \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/keeping-up-to-date.md b/src/chromium/adding-third-party-crates/keeping-up-to-date.md new file mode 100644 index 00000000..92b2c186 --- /dev/null +++ b/src/chromium/adding-third-party-crates/keeping-up-to-date.md @@ -0,0 +1,8 @@ +# Keeping crates up to date + +As the OWNER of any third party Chromium dependency, you are +[expected to keep it up to date with any security fixes][0]. It is hoped +that we will soon automate this for Rust crates, but for now, it's still +your responsibility just as it is for any other third party dependency. + +[0]: https://chromium.googlesource.com/chromium/src/+/main/docs/adding_to_third_party.md#add-owners \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/resolving-problems.md b/src/chromium/adding-third-party-crates/resolving-problems.md new file mode 100644 index 00000000..88e23fe2 --- /dev/null +++ b/src/chromium/adding-third-party-crates/resolving-problems.md @@ -0,0 +1,21 @@ +# Resolving problems + +If your build fails, it may be because of a `build.rs`: programs which do arbitrary +things at build time. This is fundamentally at odds with the design of `gn` +and `ninja` which aim for static, deterministic, build rules to maximize +parallelism and repeatability of builds. + +Some `build.rs` actions are automatically supported; others require action: + +| build script effect | Supported by our gn templates | Work required by you | +|-----|-----|-----| +| Checking rustc version to configure features on and off | Yes | None | +| Checking platform or CPU to configure features on and off | Yes | None | +| Generating code | Yes | Yes - specify in `gnrt_config.toml` | +| Building C/C++ | No | Patch around it | +| Arbitrary other actions | No | Patch around it | + +Fortunately, most crates don't contain a build script, and fortunately, most +build scripts only do the top two actions. + +[0]: https://doc.rust-lang.org/cargo/reference/build-scripts.html diff --git a/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md b/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md new file mode 100644 index 00000000..b59b46da --- /dev/null +++ b/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md @@ -0,0 +1,22 @@ +# Build scripts which generate code + +If `ninja` complains about missing files, check the `build.rs` to see if it +writes source code files. + +If so, modify [`gnrt_config.toml`][1] to add `build-script-outputs` to the +crate. If this is a transitive dependency, that is, one on which Chromium +code should not directly depend, also add `allow-first-party-usage=false`. +There are several examples already in that file: + +```toml +[crate.unicode-linebreak] +allow-first-party-usage = false +build-script-outputs = [ "tables.rs" ] +``` + +Now rerun [`gnrt.py -- gen`][2] to regenerate `BUILD.gn` files to inform ninja +that this particular output file is input to subsequent build steps. + + +[1]: ../configuring-gnrt-config-toml.md +[2]: ../generating-gn-build-rules.md \ No newline at end of file diff --git a/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md b/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md new file mode 100644 index 00000000..cebfe7fc --- /dev/null +++ b/src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md @@ -0,0 +1,24 @@ +# Build scripts which build C++ or take arbitrary actions + +Some crates use the [`cc`][2] crate to build and link C/C++ libraries. +Other crates parse C/C++ using [`bindgen`][3] within their build scripts. +These actions can't be supported in a Chromium context - our gn, ninja +and LLVM build system is very specific in expressing relationships between +build actions. + +So, your options are: + +* Avoid these crates +* Apply a patch to the crate. + +Patches should be kept in `third_party/rust/chromium_crates_io/patches/` - +see for example the [patches against the cxx crate][4]. There is currently +no automation - [simply create and apply patches manually][5] to remove the +problematic actions from the build script. + +If your patches modify the `Cargo.toml` file, rerun `gnrt gen`. + +[2]: https://crates.io/crates/cc +[3]: https://crates.io/crates/bindgen +[4]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/patches/cxx/ +[5]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/rust.md#patching-third_party-crates diff --git a/src/chromium/adding-third-party-crates/reviews-and-audits.md b/src/chromium/adding-third-party-crates/reviews-and-audits.md new file mode 100644 index 00000000..e69dde23 --- /dev/null +++ b/src/chromium/adding-third-party-crates/reviews-and-audits.md @@ -0,0 +1,33 @@ +# Auditing third party crates + +Adding new libraries is subject to Chromium's standard [policies][0], but of +course also subject to code review. As you may be bringing in not just a single +crate but also transitive dependencies, there may be a lot of code to review. +On the other hand, safe Rust code can have limited negative side effects. +How should you review it? + +Over time Chromium aims to move to a process based around [cargo vet][1]. + +Meanwhile, for each new crate addition, we are checking for the following: + +* Understand why each crate is used. What's the relationship between crates? + If the build system for each crate contains a `build.rs` or procedural + macros, work out what they're for. Are they compatible with the way + Chromium is normally built? +* Check each crate seems to be reasonably well maintained +* Use `cd third-party/rust/chromium_crates_io; cargo audit` to check for + known vulnerabilities (first you'll need to `cargo install cargo-audit`, + which ironically involves downloading lots of dependencies from the internet[2]) +* Ensure any unsafe code is good enough for the [Rule of Two][3] +* Check for any use of `fs` or `net` APIs +* Read all the code at a sufficient level to look for anything out of place + that might have been maliciously inserted. (You can't realistically aim + for 100% perfection here: there's often just too much code.) + +These are just guidelines - work with reviewers from `security@chromium.org` +to work out the right way to become confident of the crate. + +[0]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/rust.md#Third_party-review +[1]: https://mozilla.github.io/cargo-vet/ +[2]: ../cargo.md +[3]: https://chromium.googlesource.com/chromium/src/+/main/docs/security/rule-of-2.md#unsafe-code-in-safe-languages \ No newline at end of file diff --git a/src/chromium/build-rules.md b/src/chromium/build-rules.md new file mode 100644 index 00000000..e0c31daa --- /dev/null +++ b/src/chromium/build-rules.md @@ -0,0 +1,38 @@ +# Build rules + +Rust code is usually built using `cargo`. Chromium builds with `gn` and `ninja` +for efficiency - its static rules allow maximum parallelism. Rust is no exception. + +## Adding Rust code to Chromium + +In some existing Chromium `BUILD.gn` file, declare a `rust_static_library`: + +```gn +import("//build/rust/rust_static_library.gni") + +rust_static_library("my_rust_lib") { + crate_root = "lib.rs" + sources = [ "lib.rs" ] +} +``` + +You can also add `deps` on other Rust targets. Later we'll use this to +depend upon third party code. + +
+You must specify _both_ the crate root, _and_ a full list of sources. +The `crate_root` is the file given to the Rust compiler representing the root +file of the compilation unit - typically `lib.rs`. `sources` is a complete +list of all source files which `ninja` needs in order to determine when rebuilds +are necessary. + +(There's no such thing as a Rust `source_set`, because in Rust, an entire +crate is a compilation unit. A `static_library` is the smallest unit.) + +Students might be wondering why we need a gn template, rather than using +[gn's built-in support for Rust static libraries][0]. +The answer is that this template provides support for cxx interop, Rust features, +and unit tests, some of which we'll use later. +
+ +[0]: https://gn.googlesource.com/gn/+/main/docs/reference.md#func_static_library \ No newline at end of file diff --git a/src/chromium/build-rules/depending.md b/src/chromium/build-rules/depending.md new file mode 100644 index 00000000..d530576e --- /dev/null +++ b/src/chromium/build-rules/depending.md @@ -0,0 +1,22 @@ +# Depending on Rust code from Chromium C++ + +Simply add the above target to the `deps` of some Chromium C++ target. + +```gn +import("//build/rust/rust_static_library.gni") + +rust_static_library("my_rust_lib") { + crate_root = "lib.rs" + sources = [ "lib.rs" ] +} + +# or source_set, static_library etc. +component("preexisting_cpp") { + deps = [ ":my_rust_lib" ] +} +``` + +
+We'll see that this relationship only works if the Rust code exposes plain C APIs +which can be called from C++, or if we use a C++/Rust interop tool. +
\ No newline at end of file diff --git a/src/chromium/build-rules/unsafe.md b/src/chromium/build-rules/unsafe.md new file mode 100644 index 00000000..505d9af8 --- /dev/null +++ b/src/chromium/build-rules/unsafe.md @@ -0,0 +1,17 @@ +# Including `unsafe` Rust code + +Unsafe Rust code is forbidden in `rust_static_library` by default - it won't +compile. If you need unsafe Rust code, add `allow_unsafe = true` to the +gn target. (Later in the course we'll see circumstances where this is necessary.) + +```gn +import("//build/rust/rust_static_library.gni") + +rust_static_library("my_rust_lib") { + crate_root = "lib.rs" + sources = [ + "lib.rs", + "hippopotamus.rs" + ] + allow_unsafe = true +} \ No newline at end of file diff --git a/src/chromium/build-rules/vscode.md b/src/chromium/build-rules/vscode.md new file mode 100644 index 00000000..7cc4c9c6 --- /dev/null +++ b/src/chromium/build-rules/vscode.md @@ -0,0 +1,17 @@ +# Visual Studio code + +Types are elided in Rust code, which makes a good IDE even more useful than +for C++. Visual Studio code works well for Rust in Chromium. To use it, + +* Ensure your VSCode has the `rust-analyzer` extension, not earlier forms + of Rust support +* `gn gen out/Debug --export-rust-project` (or equivalent for your output + directory) +* `ln -s out/Debug/rust-project.json rust-project.json` + +Example screenshot from VSCode + +
+A demo of some of the code annotation and exploration features of rust-analyzer might be +beneficial if the audience are naturally skeptical of IDEs. +
\ No newline at end of file diff --git a/src/chromium/build-rules/vscode.png b/src/chromium/build-rules/vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..4325eadfe36a7b8c48fae1f1393925e5225ec737 GIT binary patch literal 89299 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

3YNpzwl{P%%GrtE{PX)#o2F|LgzP|0`y|6a` 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 en7hInvK{$DM=&MXC` + Low Determinism High +``` + +`cargo` works great for pure-Rust tools, but isn't optimized for large multi- +language projects like Chromium. Chromium uses `gn` and `ninja`. + +When writing a tool in Rust, your choices are: + +* Use `gn` and `ninja` (using the `rust_executable` template we'll meet + later) +* Use `cargo`, but [restrict yourself to Chromium's audited toolchain and crates][0] +* Use `cargo`, trusting a [toolchain][1] and [crates downloaded from the internet][2] + +Your organization's policy, and/or common sense, may prohibit you from doing +these things. + +From here on we'll be focusing on `gn` and `ninja`. + +## Mini exercise + +Discuss in small groups the policies within your own team and organization, +and come to a group agreement about what's an acceptable level of risk. + +
+Explain that it might seem strange to write tools in Rust, but this is +increasingly popular across the industry - Rust tools are quicker and work +more reliably. + +Assuming folks taking the course are physically together, ask them to discuss +in small groups of 3-4 people. Then, ask each table whether they've come +to a consensus on the level of risk. + +Later in the course, we'll be running an actual `cargo`-based tool, `gnrt`. +
+ +[0]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/rust.md#Using-cargo +[1]: https://rustup.rs/ +[2]: https://crates.io/ \ No newline at end of file diff --git a/src/chromium/interoperability-with-cpp.md b/src/chromium/interoperability-with-cpp.md new file mode 100644 index 00000000..7367863b --- /dev/null +++ b/src/chromium/interoperability-with-cpp.md @@ -0,0 +1,25 @@ +# Interoperability with C++ + +The Rust community offers multiple options for C++/Rust interop, with new tools +being developed all the time. At the moment, Chromium uses a tool called "cxx". + +You describe your whole language boundary in an interface definition language +(which looks a lot like Rust) and then cxx tools generate declarations for +functions and types in both Rust and C++. + +Overview diagram of cxx, showing that the same interface definition is used to create both C++ and Rust side code which then communicate via a lowest common denominator C API + +See the [CXX tutorial][1] for a full example of using this. + + +[1]: https://cxx.rs/tutorial.html +[2]: https://cxx.rs/bindings.html + + +
+Talk through the diagram. Explain that behind the scenes, this is doing +just the same as you previously did - but by programmatically ensuring that +the C++ and Rust sides match, cxx can ensure there aren't obvious errors +with object lifetimes, string lengths, etc. It reduces lots of fiddly +boilerplate and the resulting code feels more "natural". +
\ No newline at end of file diff --git a/src/chromium/interoperability-with-cpp/error-handling.md b/src/chromium/interoperability-with-cpp/error-handling.md new file mode 100644 index 00000000..5b13e980 --- /dev/null +++ b/src/chromium/interoperability-with-cpp/error-handling.md @@ -0,0 +1,41 @@ +# cxx error handling + +cxx's support for `Result` relies on C++ exceptions, so we can't use that +in Chromium. Alternatives: + +* Where success can be represented as a simple Boolean, as done in our [QR code generator][1]: + Return a Boolean representing success, and record results using out-parameters: + ```rust,ignore + #[cxx::bridge(namespace = "qr_code_generator")] + mod ffi { + extern "Rust" { + fn generate_qr_code_using_rust( + data: &[u8], + min_version: i16, + out_pixels: Pin<&mut CxxVector>, + out_qr_size: &mut usize, + ) -> bool; + } + } + ``` +* Where success is more complex, provide a Rust + object which can be queried for details of success or failure: + ```rust,ignore + #[cxx::bridge] + mod ffi { + extern "Rust" { + type PngDecoder; + fn create_png_decoder() -> Box; + fn decode(self: &PngDecoder, png: &[u8]) -> bool; // whether successful + fn get_err_code(self: &PngDecoder) -> u32; // or some more complex error type + fn get_decoded_image(self: &PngDecoder) -> &[u8]; + // or some more complex success type + } + } + ``` + + +The best way to learn cxx is by doing, so, another exercise! + +[0]: https://cxx.rs/binding/result.html +[1]: https://source.chromium.org/chromium/chromium/src/+/main:components/qr_code_generator/qr_code_generator_ffi_glue.rs;l=10 \ No newline at end of file diff --git a/src/chromium/interoperability-with-cpp/example-bindings.md b/src/chromium/interoperability-with-cpp/example-bindings.md new file mode 100644 index 00000000..da49de04 --- /dev/null +++ b/src/chromium/interoperability-with-cpp/example-bindings.md @@ -0,0 +1,23 @@ +# Example bindings + +cxx requires you to declare the whole C++/Rust boundary in one of your `.rs` +files. For instance: + +```rust,ignore +{{#include ../../../third_party/cxx/book/snippets.rs:cxx_overview}} +``` + +
+Point out: + +* Native support for C++'s `std::unique_ptr` in Rust +* Native support for Rust slices in C++ +* Calls from C++ to Rust, and Rust types (in the top part) +* Calls from Rust to C++, and C++ types (in the bottom part) +* If the function definitions in C++ or Rust don't match the cxx::bridge, + a compilation failure results. + +**Common misconception**: It _looks_ like a C++ header is being parser by Rust, +but this is misleading. This header is never interpreted by Rust, but simply +`#include`d in the generated C++ code for the benefit of C++ compilers. +
\ No newline at end of file diff --git a/src/chromium/interoperability-with-cpp/limitations-of-cxx.md b/src/chromium/interoperability-with-cpp/limitations-of-cxx.md new file mode 100644 index 00000000..022086d9 --- /dev/null +++ b/src/chromium/interoperability-with-cpp/limitations-of-cxx.md @@ -0,0 +1,31 @@ +## Limitations of cxx + +By far the most useful page when using cxx is the [type reference][1]. + +cxx fundamentally suits cases where: + +* Your Rust-C++ interface is sufficiently simple that you can declare all of it. +* You're using only the types natively supported by cxx already, for example + `std::unique_ptr`, `std::string`, `&[u8]` etc. + +It has many limitations - for example lack of support for Rust's `Option` type. + +These limitations constrain us to using Rust in Chromium only for well isolated +"leaf nodes" rather than for arbitrary Rust-C++ interop. When considering +a use-case for Rust in Chromium, a good starting point is to draft the cxx +bindings for the language boundary to see if it appears simple enough. + + +[1]: https://cxx.rs/bindings.html + +
+In addition, right now, Rust code in one component cannot depend on Rust +code in another, due to linking details in our component build. That's another +reason to restrict Rust to use in leaf nodes. + +You should also discuss some of the other sticky points with cxx, for example: + +* Its error handling is based around C++ exceptions (given on the next slide) +* Function pointers are awkward to use. + +
\ No newline at end of file diff --git a/src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md b/src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md new file mode 100644 index 00000000..8df5fc4f --- /dev/null +++ b/src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md @@ -0,0 +1,41 @@ +## Using cxx in Chromium + +In Chromium, we define an independent `#[cxx::bridge] mod` for each leaf-node +where we want to use Rust. You'd typically have one for each +`rust_static_library`. Just add + +```gn +cxx_bindings = [ "my_rust_file.rs" ] + # list of files containing #[cxx::bridge], not all source files +allow_unsafe = true +``` + +to your existing `rust_static_library` target alongside `crate_root` and +`sources`. + +C++ headers will be generated at a sensible location, so you can just + +```cpp +#include "ui/base/my_rust_file.rs.h" +``` + +You will find some utility functions in `//base` to convert to/from Chromium +C++ types to cxx Rust types - for example [`SpanToRustSlice`][0]. + +
+Students may ask - why do we still need `allow_unsafe = true`? + +The broad answer is that no C/C++ code is "safe" by the normal Rust standards. +Calling back and forth to C/C++ from Rust may do arbitrary things to memory, and +compromise the safety of Rust's own data layouts. Presence of _too many_ +`unsafe` keywords in C/C++ interop can harm the signal-to-noise ratio of +such a keyword, and is [controversial][1], but strictly, bringing any foreign +code into a Rust binary can cause unexpected behavior from Rust's perspective. + +The narrow answer lies in the diagram at the top of this page - behind the +scenes, cxx generates Rust `unsafe` and `extern "C"` functions just like +we did manually in the previous section. +
+ +[0]: https://source.chromium.org/chromium/chromium/src/+/main:base/containers/span_rust.h;l=21 +[1]: https://steveklabnik.com/writing/the-cxx-debate \ No newline at end of file diff --git a/src/chromium/policy.md b/src/chromium/policy.md new file mode 100644 index 00000000..6516446b --- /dev/null +++ b/src/chromium/policy.md @@ -0,0 +1,37 @@ +# Chromium Rust policy + +Chromium does not yet allow first-party Rust except in rare cases as approved +by Chromium's [Area Tech Leads](https://source.chromium.org/chromium/chromium/src/+/main:ATL_OWNERS). + +Chromium's policy on third party libraries is outlined [here](https://chromium.googlesource.com/chromium/src/+/main/docs/adding_to_third_party.md#rust) - +Rust is allowed for third party libraries under various circumstances, including +if they're the best option for performance or for security. + +Very few Rust libraries directly expose a C/C++ API, so that means that nearly +all such libraries will require a small amount of first-party glue code. + +```bob +C++ Rust +.- - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -. +: : : : +: Existing Chromium : : Chromium Rust Existing Rust : +: "C++" : : "wrapper" crate : +: +---------------+ : : +----------------+ +-------------+ : +: | | : : | | | | : +: | o-----+-+-----------+-+-> o-+----------+--> | : +: | | : Language : | | Crate | | : +: +---------------+ : boundary : +----------------+ API +-------------+ : +: : : : +`- - - - - - - - - -' `- - - - - - - - - - - - - - - - - - - - - - -' +``` + +> First-party Rust glue code for a particular third-party crate should +> normally be kept in `third_party/rust///wrapper`. + +Because of this, today's course will be heavily focused on: + +* Bringing in third-party Rust libraries ("crates") +* Writing glue code to be able to use those crates from Chromium C++. + +If this policy changes over time, the course will evolve to keep up. + diff --git a/src/chromium/setup.md b/src/chromium/setup.md new file mode 100644 index 00000000..b9aad989 --- /dev/null +++ b/src/chromium/setup.md @@ -0,0 +1,27 @@ +# Setup + +Make sure you can build and run Chromium. Any platform and set of build flags is +OK, so long as your code is relatively recent (commit position 1223636 onwards, +corresponding to November 2023): + +```shell +gn gen out/Debug +autoninja -C out/Debug chrome +out/Debug/chrome # or on Mac, out/Debug/Chromium.app/Contents/MacOS/Chromium +``` + +(A component, debug build is recommended for quickest iteration time. This +is the default!) + +See [How to build Chromium](https://www.chromium.org/developers/how-tos/get-the-code/) +if you aren't already at that point. Be warned - setting up to build Chromium +takes time. + +It's also recommended that you have Visual Studio code installed. + +# About the exercises + +This part of the course has a series of exercises which build on each other. +We'll be doing them spread throughout the course instead of just at the end. +If you don't have time to complete a certain part, don't worry: you can +catch up in the next slot. \ No newline at end of file diff --git a/src/exercises/chromium/bringing-it-together.md b/src/exercises/chromium/bringing-it-together.md new file mode 100644 index 00000000..0a31009f --- /dev/null +++ b/src/exercises/chromium/bringing-it-together.md @@ -0,0 +1,61 @@ +# Bringing it together - Exercise + +In this exercise, you're going to add a whole new Chromium feature, bringing +together everything you already learned. + +## The brief from Product Management + +A community of pixies has been discovered living in a remote rainforest. +It's important that we get Chromium for Pixies delivered to them as soon +as possible. + +The requirement is to translate all Chromium's UI strings into Pixie language. + +There's not time to wait for proper translations, but fortunately pixie +language is very close to English, and it turns out there's a Rust crate +which does the translation. + +In fact, you already [imported that crate in the previous exercise][0]. + +(Obviously, real translations of Chrome require incredible care and +diligence. Don't ship this!) + +## Steps + +Modify `ResourceBundle::MaybeMangleLocalizedString` so that it uwuifies +all strings before display. In this special build of Chromium, it should +always do this irrespective of the setting of `mangle_localized_strings_`. + +If you've done everything right across all these exercises, congratulations, +you should have created Chrome for pixies! + +Chromium UI screenshot with uwu language + +
+Students will likely need some hints here. Hints include: + +* UTF16 vs UTF8. Students should be aware that Rust strings are always + UTF8, and will probably decide that it's better to do the conversion + on the C++ side using `base::UTF16ToUTF8` and back again. +* If students decide to do the conversion on the Rust side, they'll need to + consider [`std::string::from_utf16`][1], consider error handling, and + consider which [cxx supported types can transfer a lot of u16s][2]. +* Students may design the C++/Rust boundary in several different ways, + e.g. taking and returning strings by value, or taking a mutable reference + to a string. If a mutable reference is used, cxx will likely + tell the student that they need to use [`Pin`][3]. You may need to explain + what `Pin` does, and then explain why `cxx` needs it for mutable references + to C++ data: the answer is that C++ data can't be moved around like Rust + data, because it may contain self-referential pointers. +* The C++ target containing `ResourceBundle::MaybeMangleLocalizedString` + will need to depend on a `rust_static_library` target. The student + probably already did this. +* The `rust_static_library` target will need to depend on + `//third_party/rust/uwuify/v0_2:lib`. + +
+ +[0]: https://crates.io/uwuify +[1]: https://doc.rust-lang.org/std/string/struct.String.html#method.from_utf16 +[2]: https://cxx.rs/binding/slice.html +[3]: https://doc.rust-lang.org/std/pin/ \ No newline at end of file diff --git a/src/exercises/chromium/build-rules.md b/src/exercises/chromium/build-rules.md new file mode 100644 index 00000000..2863cba6 --- /dev/null +++ b/src/exercises/chromium/build-rules.md @@ -0,0 +1,58 @@ +# Build rules exercise + +In your Chromium build, add a new Rust target to `//ui/base/BUILD.gn` containing: + +```rust +#[no_mangle] +pub extern "C" fn hello_from_rust() { + println!("Hello from Rust!") +} +``` +**Important**: note that `no_mangle` here is considered a type of unsafety +by the Rust compiler, so you'll need to to allow unsafe code in your +`gn` target. + +Add this new Rust target as a dependency of `//ui/base:base`. +Declare this function at the top of `ui/base/resource/resource_bundle.cc` +(later, we'll see how this can be automated by bindings generation tools): +```cpp +extern "C" void hello_from_rust(); +``` + +Call this function from somewhere in `ui/base/resource/resource_bundle.cc` - +we suggest the top of `ResourceBundle::MaybeMangleLocalizedString`. +Build and run Chromium, and ensure that "Hello from Rust!" is printed lots of times. + +If you use VSCode, now set up Rust to work well in VSCode. It will be useful +in subsequent exercises. If you've succeeded, you will be able to use +right-click "Go to definition" on `println!`. + +## Where to find help + +* The options available to the [`rust_static_library` gn template][0] +* Information about [`#[no_mangle]`][1] +* Information about [`extern "C"`][2] +* Information about gn's [`--export-rust-project`][3] switch +* [How to install rust-analyzer in VSCode][4] + +
+It's really important that students get this running, because future exercises +will build on it. + +This example is unusual because it boils down to the lowest-common-denominator +interop language, C. Both C++ and Rust can natively declare and call C ABI +functions. Later in the course, we'll connect C++ directly to Rust. + +`allow_unsafe = true` is required here because `#[no_mangle]` might allow Rust +to generate two functions with the same name, and Rust can no longer guarantee +that the right one is called. + +If you need a pure Rust executable, you can also do that using the +`rust_executable` gn template. +
+ +[0]: https://source.chromium.org/chromium/chromium/src/+/main:build/rust/rust_static_library.gni;l=16 +[1]: https://doc.rust-lang.org/beta/reference/abi.html#the-no_mangle-attribute +[2]: https://doc.rust-lang.org/std/keyword.extern.html +[3]: https://gn.googlesource.com/gn/+/main/docs/reference.md#compilation-database +[4]: https://code.visualstudio.com/docs/languages/rust \ No newline at end of file diff --git a/src/exercises/chromium/chwomium.png b/src/exercises/chromium/chwomium.png new file mode 100644 index 0000000000000000000000000000000000000000..00e708c64f51386fea51c60e8920f1ed69c5e0b4 GIT binary patch literal 169651 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 literal 0 HcmV?d00001 diff --git a/src/exercises/chromium/interoperability-with-cpp.md b/src/exercises/chromium/interoperability-with-cpp.md new file mode 100644 index 00000000..5c8394d0 --- /dev/null +++ b/src/exercises/chromium/interoperability-with-cpp.md @@ -0,0 +1,71 @@ +# Exercise: Interoperability with C++ + +## Part one + +* In the Rust file you previously created, add a `#[cxx::bridge]` which specifies a single function, + to be called from C++, called `hello_from_rust`, taking no parameters and returning + no value. +* Modify your previous `hello_from_rust` function to remove `extern "C"` and `#[no_mangle]`. + This is now just a standard Rust function. +* Modify your `gn` target to build these bindings. +* In your C++ code, remove the forward-declaration of `hello_from_rust`. Instead, include + the generated header file. +* Build and run! + +## Part two + +It's a good idea to play with cxx a little. It helps you think about how flexible +Rust in Chromium actually is. + +Some things to try: + +* Call back into C++ from Rust. You will need: + * An additional header file which you can `include!` from your `cxx::bridge`. + You'll need to declare your C++ function in that new header file. + * An `unsafe` block to call such a function, or alternatively specify the `unsafe` + keyword in your `#[cxx::bridge]` [as described here][0]. + * You may also need to `#include "third_party/rust/cxx/v1/crate/include/cxx.h"` +* Pass a C++ string from C++ into Rust. +* Pass a reference to a C++ object into Rust. +* Intentionally get the Rust function signatures mismatched from the `#[cxx::bridge]`, + and get used to the errors you see. +* Intentionally get the C++ function signatures mismatched from the `#[cxx::bridge]`, + and get used to the errors you see. +* Pass a `std::unique_ptr` of some type from C++ into Rust, so that Rust + can own some C++ object. +* Create a Rust object and pass it into C++, so that C++ owns it. (Hint: + you need a `Box`). +* Declare some methods on a C++ type. Call them from Rust. +* Declare some methods on a Rust type. Call them from C++. + +## Part three + +Now you understand the strengths and limitations of cxx interop, think of +a couple of use-cases for Rust in Chromium where the interface would be +sufficiently simple. Sketch how you might define that interface. + +## Where to find help + +* The [cxx binding reference][1] +* The [`rust_static_library` gn template][2] + +
+As students explore Part Two, they're bound to have lots of questions about how +to achieve these things, and also how cxx works behind the scenes. + +Some of the questions you may encounter: +* I'm seeing a problem initializing a variable of type X with type Y, where + X and Y are both function types. + This is because your C++ function doesn't quite match the declaration in your + `cxx::bridge`. +* I seem to be able to freely convert C++ references into Rust references. + Doesn't that risk UB? + For cxx's _opaque_ types, no, because they are zero-sized. For cxx trivial types + yes, it's _possible_ to cause UB, although cxx's design makes it quite + difficult to craft such an example. +
+ + +[0]: https://cxx.rs/extern-c++.html#functions-and-member-functions +[1]: https://cxx.rs/bindings.html +[2]: https://source.chromium.org/chromium/chromium/src/+/main:build/rust/rust_static_library.gni;l=16 \ No newline at end of file diff --git a/src/exercises/chromium/third-party.md b/src/exercises/chromium/third-party.md new file mode 100644 index 00000000..57221ccc --- /dev/null +++ b/src/exercises/chromium/third-party.md @@ -0,0 +1,22 @@ +# Exercise + +Add [uwuify][0] to Chromium, turning off the crate's [default features][1]. +Assume that the crate will be used in shipping Chromium, but won't be used +to handle untrustworthy input. + +(In the next exercise we'll use uwuify from Chromium, but feel free to +skip ahead and do that now if you like. Or, you could create a new +[`rust_executable` target][2] which uses `uwuify`). + +
+Students will need to download lots of transitive dependencies. + +The total crates needed are: uwuify, smallvec, scopeguard, parking_lot, +parking_lot_core, lock_api and instant. If students are downloading even +more than that, they probably forgot to turn off the default features. + + + +[0]: https://crates.io/crates/uwuify +[1]: https://doc.rust-lang.org/cargo/reference/features.html#the-default-feature +[2]: https://source.chromium.org/chromium/chromium/src/+/main:build/rust/rust_executable.gni \ No newline at end of file diff --git a/src/glossary.md b/src/glossary.md index 62a184ce..203c3329 100644 --- a/src/glossary.md +++ b/src/glossary.md @@ -127,6 +127,8 @@ Also, please keep the hard line breaks to ensure a nice formatting. Days 1 to 3 of this course. - Rust in Android:\ See [Rust in Android](android.md). +- Rust in Chromium:\ + See [Rust in Chromium](chromium.md). - safe:\ Refers to code that adheres to Rust's ownership and borrowing rules, preventing memory-related errors. - scope:\ diff --git a/src/index.md b/src/index.md index c301c122..eeca9325 100644 --- a/src/index.md +++ b/src/index.md @@ -25,6 +25,9 @@ Building on this, you're invited to dive into one or more specialized topics: * [Android](android.md): a half-day course on using Rust for Android platform development (AOSP). This includes interoperability with C, C++, and Java. +* [Chromium](chromium.md): a half-day course on using Rust within Chromium + based browsers. This includes interoperability with C++ and how to include + third-party crates in Chromium. * [Bare-metal](bare-metal.md): a whole-day class on using Rust for bare-metal (embedded) development. Both microcontrollers and application processors are covered. diff --git a/src/running-the-course/course-structure.md b/src/running-the-course/course-structure.md index 15c6ff02..522f9c7e 100644 --- a/src/running-the-course/course-structure.md +++ b/src/running-the-course/course-structure.md @@ -34,6 +34,17 @@ commands it runs and make sure they work when you run them by hand. [1]: https://source.android.com/docs/setup/download/downloading [2]: https://github.com/google/comprehensive-rust +### Rust in Chromium + +The [Rust in Chromium](../chromium.md) deep dive is a half-day course on using +Rust as part of the Chromium browser. It includes using Rust in Chromium's +`gn` build system, bringing in third-party libraries ("crates") and C++ +interoperability. + +You will need to be able to build Chromium - a debug, component build is +[recommended](../chromium/setup.md) for speed but any build will work. +Ensure that you can run the Chromium browser that you've built. + ### Bare-Metal Rust The [Bare-Metal Rust](../bare-metal.md) deep dive is a full day class on using Rust for diff --git a/third_party/cxx/book/snippets.rs b/third_party/cxx/book/snippets.rs index 8b7fd0a3..a54e4c72 100644 --- a/third_party/cxx/book/snippets.rs +++ b/third_party/cxx/book/snippets.rs @@ -119,3 +119,25 @@ fn main() { } } // ANCHOR_END: cpp_exception + +// ANCHOR: cxx_overview +#[cxx::bridge] +mod ffi { + extern "Rust" { + type MultiBuf; + + fn next_chunk(buf: &mut MultiBuf) -> &[u8]; + } + + unsafe extern "C++" { + include!("example/include/blobstore.h"); + + type BlobstoreClient; + + fn new_blobstore_client() -> UniquePtr; + fn put(self: &BlobstoreClient, buf: &mut MultiBuf) -> Result; + } +} + +// Definitions of Rust types and functions go here +// ANCHOR_END: cxx_overview \ No newline at end of file