Add num_enum dependency for libafl crate usage Due to the size of crrev.com/c/7564051, this CL works to split all of the unsafe dependencies into separate CLs for individual review. The end goal is to have all unsafe transitive dependencies for libafl imported and reviewed prior to importing the remaining dependencies (including libafl). We have approval for importing libafl by Chrome TSCs/ATLs (see https://groups.google.com/a/google.com/g/chrome-tsc-discuss/c/jvyNkbHOLhM). The num_enum crate has also been marked as `group = test` and `allow_first_party_usage = false`. Bug: 495772162 Change-Id: I6a486efa915ffedc115a163b6b8988b6bb6aaaf9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7698012 Reviewed-by: Liza Burakova <[email protected]> Commit-Queue: Antonio Alphonse <[email protected]> Reviewed-by: Titouan Rigoudy <[email protected]> Cr-Commit-Position: refs/heads/main@{#1619975} NOKEYCHECK=True GitOrigin-RevId: df23efb886f36dff99e0b94d4e29e1d4e18353d1
This directory contains third-party Rust libraries from https://crates.io (and sometimes thin wrappers around them for Chromium interop).
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 filesvpython3 ./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.