third_party/rust/README.md
This directory contains third-party Rust libraries from https://crates.io (and sometimes thin wrappers around them for Chromium interop).
[TOC]
Third-party libraries from crates.io,
depend on Cargo as a build system.
Chromium uses gnrt tool to automate
BUILD.gn and README.chromium files
based on crate's Cargo.toml.The tool can be found in //tools/crates/gnrt
and is typically invoked using //tools/crates/run_gnrt.py.
The directory structure for a crate "foo" version 3.4.2 is:
//third_party/
rust/
foo/
wrapper/ (optional FFI glue or Chromium integration)
v3/ (version 3.4.2 maps to the v3 epoch)
BUILD.gn (generated by gnrt gen)
README.chromium (generated by gnrt vendor)
chromium_crates_io/
vendor/
foo-v3/ (sources downloaded from crates.io by gnrt vendor)
patches/
foo-v3/ (patches automatically applied during gnrt vendor)
0001-Some-changes.diff
0002-Other-changes.diff
Cargo.toml (version and enabled features of "foo")
Cargo.lock
gnrt_config.toml (additional configuration of "foo")
TODO(https://crbug.com/417250983): Patch directory should be epoch-specific.
Most of the files above are managed automatically by gnrt.
The only "foo"-specific manually-authored files and directories are:
//third_party/rust/Cargo.toml//third_party/rust/gnrt_config.toml//third_party/rust/chromium_crates_io/patches/
(see also
//third_party/rust/chromium_crates_io/patches/README.md)There are also other, non-crate-specific files such as:
//third_party/rust:
.md - this doc and other docsOWNERS, PRESUBMIT.py//third_party/rust/chromium_crates_io:
BUILD.gn.hbs - template for BUILD.gn filesREADME.chromium.hbs - template for README.chromium filesPRESUBMIT.py.py helper scripts used by PRESUBMIT.py and by //tools/crates.cargo vet-support items - we keep
supply-chain/audits.toml to preserve Chromium audits that are imported
into https://github.com/google/rust-crate-audits/blob/main/sources.list).gitattributes, .rustfmt.toml, .style.yapf, etc.)See
//third_party/rust/README-importing-new-crates.md
for instructions on how to import a crate from https://crates.io into Chromium.
Third-party crates will get updated semi-automatically through the process
described in
../tools/crates/create_update_cl.md.
If you nevertheless need to manually update a crate to its latest minor or major
version, then follow the steps below. To facilitate easier review, we recommend
uploading separate patchsets for 1) manual changes, and 2) tool-driven,
automated changes.
src/ dir of Chromium.//third_party/rust/chromium_crates_io/Cargo.toml.
vpython3 ./tools/crates/run_gnrt.py update <crate name>.cargo update and accepts the same
command line parameters.
In particular, you may need to specify --breaking when working on
major version updates../tools/crates/run_gnrt.py vendorgit add -f third_party/rust/chromium_crates_io/vendor-f is important, as files may be skipped otherwise from a
.gitignore inside the crate.BUILD.gn files
vpython3 ./tools/crates/run_gnrt.py gencargo run --release --manifest-path tools/crates/gnrt/Cargo.toml --target-dir out/gnrt gengit add third_party/rustMost Rust libraries will need a more C++-friendly API written on top of them in
order to generate C++ bindings to them. The wrapper library can be placed
in //third_party/rust/<cratename>/wrapper or at another single place
that all C++ goes through to access the library. The CXX is
used to generate bindings between C++ and Rust.
See
//third_party/rust/serde_json_lenient/v0_1/wrapper/
and
//components/qr_code_generator
for examples.
See
//docs/rust-ffi.md
for information on C++/Rust FFI.