0

Add a script to generate stdlib GN rules from the Rust src tree

The tools/gnrt_stdlib.py script needs to be run when rolling Rust
in order to generate updated BUILD.gn files whenever the Cargo.toml
files change in the stdlib.

Previously gnrt gen --for-std would generate rules from the Rust
library found in //third_party/rust-toolchain, but that requires
Rust to already be rolled, so this now uses the feature of specifying
the Rust source tree root to --for-std.

Bug: 1401042
Change-Id: Id7c9e9c67687ad53fd5e4e5b469f7c2c18163a1b
Cq-Include-Trybots: luci.chromium.try:android-rust-arm32-rel,android-rust-arm64-rel,android-rust-arm64-dbg,linux-rust-x64-dbg,linux-rust-x64-rel,mac-rust-x64-dbg,win-rust-x64-dbg,win-rust-x64-rel
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4600126
Commit-Queue: danakj <danakj@chromium.org>
Reviewed-by: Hans Wennborg <hans@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1155567}
This commit is contained in:
danakj
2023-06-09 16:33:58 +00:00
committed by Chromium LUCI CQ
parent 6ddde4a299
commit 74bd3f0849
5 changed files with 33 additions and 10 deletions

@ -10,11 +10,9 @@ a CL, triggers Clang Upload try bots, and tells what to do next"""
from __future__ import print_function
import argparse
import fnmatch
import itertools
import os
import re
import shutil
import subprocess
import sys
import urllib.request
@ -303,7 +301,9 @@ def main():
print('Cannot set both --skip-clang and --skip-rust.')
sys.exit(1)
if not args.skip_clang:
if args.skip_clang:
clang_version = '-skipped-'
else:
if args.clang_git_hash:
clang_git_hash = args.clang_git_hash
else:
@ -315,10 +315,10 @@ def main():
clang_version = ClangVersion(GetCommitDescription(clang_git_hash),
args.clang_sub_revision)
os.chdir(CHROMIUM_DIR)
else:
clang_version = '-skipped-'
if not args.skip_rust:
if args.skip_rust:
rust_version = '-skipped-'
else:
if args.rust_git_hash:
rust_git_hash = args.rust_git_hash
else:
@ -326,8 +326,6 @@ def main():
CheckoutGitRepo("Rust", RUST_GIT_URL, rust_git_hash, RUST_SRC_DIR)
rust_version = RustVersion(rust_git_hash, args.rust_sub_revision)
os.chdir(CHROMIUM_DIR)
else:
rust_version = '-skipped-'
print(f'Making a patch for Clang {clang_version} and Rust {rust_version}')
@ -420,6 +418,12 @@ def main():
print('Please, wait until the try bots succeeded '
'and then push the binaries to goma.')
print()
print('To regenerate BUILD.gn rules for Rust stdlib (needed if dep versions '
'in the stdlib change for example), run:\n tools/rust/gnrt_stdlib.py.')
print()
print('To update Abseil .def files, run:\n '
'third_party/abseil-cpp/generate_def_files.py')
if __name__ == '__main__':

@ -106,6 +106,9 @@ fn generate_for_third_party(args: &clap::ArgMatches, paths: &paths::ChromiumPath
if let Some(cargo_path) = args.get_one::<String>("cargo-path") {
command.cargo_path(cargo_path);
}
if let Some(rustc_path) = args.get_one::<String>("rustc-path") {
command.env("RUSTC", rustc_path);
}
command.current_dir(&paths.third_party);
let dependencies = deps::collect_dependencies(&command.exec().unwrap(), None, None);
@ -261,6 +264,9 @@ fn generate_for_std(args: &clap::ArgMatches, paths: &paths::ChromiumPaths) -> Re
if let Some(cargo_path) = args.get_one::<String>("cargo-path") {
command.cargo_path(cargo_path);
}
if let Some(rustc_path) = args.get_one::<String>("rustc-path") {
command.env("RUSTC", rustc_path);
}
command.current_dir(paths.std_fake_root);

@ -37,8 +37,13 @@ impl ChromiumPaths {
Ok(ChromiumPaths {
root: cur_dir.clone(),
third_party: check_path(&cur_dir, RUST_THIRD_PARTY_DIR)?,
// We tolerate the Rust sources being missing, as they are only used to generate
// rules for the stdlib during Clang/Rust rolls, and they are not checked out for
// most machines.
rust_src_vendor_subdir: Path::new(RUST_SRC_VENDOR_SUBDIR),
rust_src_installed: check_path(&cur_dir, RUST_SRC_INSTALLED_DIR)?,
// We tolerate the toolchain package dir being missing, as it's not checked out
// on the bots that generate Clang/Rust rolls.
rust_src_installed: Path::new(RUST_SRC_INSTALLED_DIR),
std_config_file: check_path(&cur_dir, STD_CONFIG_FILE)?,
std_build: check_path(&cur_dir, STD_BUILD_DIR)?,
std_fake_root: check_path(&cur_dir, STD_FAKE_ROOT)?,

@ -36,6 +36,14 @@ fn main() -> Result<()> {
.num_args(1)
.help("Path to the cargo executable"),
)
.arg(
Arg::new("rustc-path")
.long("rustc-path")
.value_name("RUSTC_PATH")
.value_parser(clap::value_parser!(String))
.num_args(1)
.help("Path to the rustc executable"),
)
.arg(
Arg::new("for-std")
.long("for-std")

@ -58,7 +58,7 @@ def main():
RunCommand([
os.path.join(cargo_work_dir, 'release', f'gnrt{EXE}'), 'gen',
f'--for-std={os.path.relpath(args.rust_src_dir, CHROMIUM_DIR)}',
f'--cargo-path={cargo_bin}'
f'--cargo-path={cargo_bin}', f'--rustc-path={rustc_bin}'
])