blob: 10ffc1a76ea043c876555bbf0fe0abe24446673d [file] [log] [blame] [view] [edit]
# Upgrading the Rust Toolchain on Chrome OS
> **WARNING**: These steps are only general in nature. Sometimes things can go
> wrong, especially with applying patches. This is expected to happen and best
> judgement should be used.
Follow these steps to upgrade the rust ebuild.
```shell
DEL_VERSION=1.33.0 # Previous version (to be deleted)
OLD_VERSION=1.34.0 # Current version
NEW_VERSION=1.35.0 # New version
# Be sure cross-compilers have been emerged.
target_triples=( $(awk '/^RUSTC_TARGET_TRIPLES=\(/ { emit=1; next } /^)/ { if (emit) exit } /-cros-/ { if (emit) { print $1 } }' "rust-${OLD_VERSION}.ebuild") )
for x in "${target_triples[@]}"; do command -v "${x}-clang" >/dev/null || sudo emerge -G "cross-${x}/gcc"; done
# Copy ebuild for the new version.
cp rust-${OLD_VERSION}.ebuild rust-${NEW_VERSION}.ebuild
git add rust-${NEW_VERSION}.ebuild
git rm rust-${DEL_VERSION}.ebuild
# Download Rust's source.
rust_src="$(mktemp)"
src_tarfile_name="rustc-${NEW_VERSION}-src.tar.gz"
curl -f "https://static.rust-lang.org/dist/${src_tarfile_name}" -o "${rust_src}"
# Verify the signature of the source
sig_file="/tmp/rustc_sig.asc"
curl -f "https://static.rust-lang.org/dist/${src_tarfile_name}.asc" -o "${sig_file}"
gpg --verify "${sig_file}" "${rust_src}"
# ^^ If the above fails with:
#
# gpg: Can't check signature: No public key
#
# then you need to import the rustc key:
# curl https://keybase.io/rust/pgp_keys.asc | gpg --import
#
# Once you've done that, please try again.
# Copy source to localmirror.
gsutil cp -n -a public-read "${rust_src}" "gs://chromeos-localmirror/distfiles/${src_tarfile_name}"
# Copy patches for the new version.
for x in files/rust-${OLD_VERSION}-*.patch; do cp $x ${x//${OLD_VERSION}/${NEW_VERSION}}; done
git add files/rust-${NEW_VERSION}-*.patch
git rm files/rust-${DEL_VERSION}-*.patch
# Set `STAGE0_DATE` to date from `https://github.com/rust-lang/rust/blob/${NEW_VERSION}/src/stage0.txt`.
STAGE0_DATE=$(curl https://raw.githubusercontent.com/rust-lang/rust/${NEW_VERSION}/src/stage0.txt | \
grep date: | sed -e 's/date: //')
sed -i -e 's/STAGE0_DATE=.*/STAGE0_DATE="'${STAGE0_DATE}'"/' rust-${NEW_VERSION}.ebuild
git add rust-${NEW_VERSION}.ebuild
# Add mirror to the `RESTRICT` variable.
sed -i -e 's/RESTRICT="\(.*\)"/RESTRICT="\1 mirror"/' rust-${NEW_VERSION}.ebuild
# Update manifest checksums.
ebuild rust-${NEW_VERSION}.ebuild manifest
git add Manifest
# Remove mirror from `RESTRICT` variable.
sed -i -e 's/RESTRICT="\(.*\) mirror"/RESTRICT="\1"/' rust-${NEW_VERSION}.ebuild
# Build the new compiler.
ebuild rust-${NEW_VERSION}.ebuild compile
# Fix patches as needed and add them to git. There is no command for this because there is no fixed
# set of things to do to fix broken patches. One method would be to checkout the rust source to
# `$OLD_VERSION` and `git apply` the broken patch and commit it. Then, checkout `$NEW_VERSION` and
# cherry-pick the commit from the previous step. Now the repo should be in a good position to fix
# merge conflicts as one normally does. Once resolved and committed, generate a patch from that
# commit and copy it to the new patch version.
# Build the new compiler again with the udpated checksums.
ebuild rust-${NEW_VERSION}.ebuild compile
# Install the compiler in the chroot.
sudo ebuild rust-${NEW_VERSION}.ebuild merge
# Upgrade rust package in `profiles/targets/chromeos/package.provided`
sed -i -e "s#dev-lang/rust-${DEL_VERSION}#dev-lang/rust-${NEW_VERSION}#" \
../../profiles/targets/chromeos/package.provided
git add ../../profiles/targets/chromeos/package.provided
# Add a virtual/rust ebuild for the new version.
cp ../../virtual/rust/rust-${OLD_VERSION}.ebuild ../../virtual/rust/rust-${NEW_VERSION}.ebuild
git add ../../virtual/rust/rust-${NEW_VERSION}.ebuild
git rm ../../virtual/rust/rust-${DEL_VERSION}.ebuild
```
- Update this document with additional tips or any steps that have changed.
- Upload change for review. CC reviewers from previous upgrade.
- Remember to add `Cq-Include-Trybots: chromeos/cq:cq-llvm-orchestrator` to
your commit message.
- Kick off try-job: `cros tryjob -g <cl number> chromiumos-sdk-tryjob`.