diff options
Diffstat (limited to 'rust-145.patch')
-rw-r--r-- | rust-145.patch | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/rust-145.patch b/rust-145.patch new file mode 100644 index 0000000..dc50625 --- /dev/null +++ b/rust-145.patch @@ -0,0 +1,152 @@ + +# HG changeset patch +# User Mike Hommey <mh+mozilla@glandium.org> +# Date 1595885037 0 +# Node ID e5d2a6d5187b8f1420b65089c4d841ec29a42897 +# Parent 32b46b511b324eed23acae9bfdede2e2ca3d42fa +Bug 1654465 - Set -Cembed-bitcode=yes instead of CARGO_PROFILE_RELEASE_LTO. r=firefox-build-system-reviewers,rstewart + +It turns out setting CARGO_PROFILE_RELEASE_LTO has unwanted side +effects. + +First it's not actually strictly equivalent to using `cargo rustc -- +-Clto`. For instance, it apparently also enables cross-language LTO in +newer versions of cargo. + +Second, it changes the rust computed hash for all the dependencies of +the crate being built with the variable set, which makes them diverge +from when the same dependencies are built through another crate in the +tree that is not LTOed. This effectively makes us build a _lot_ of +crates twice, many of which are not cacheable. + +Since the original problem is that cargo >= 1.45 passes extra flags (`-C +embed-bitcode=no`) to rustc that are incompatible with `-Clto`, and while +it knows to adjust based on the `lto` setting in the build profile +(which CARGO_PROFILE_RELEASE_LTO overrides the default of), cargo +ignores flags passed via `cargo rustc -- ...` when making those +adjustments. + +So, we need to override with `-C embed-bitcode=yes` on our own at the +same time we pass `-Clto`. But doing that through `cargo rustc -- ...` +is not enough because all the dependencies of the crate built with +`-Clto` need to be built with `-C embed-bitcode=yes`. So we need to +override with `RUSTFLAGS`, which will affect all the dependencies. +But we also need to do this consistently across all crates, not only the +dependencies of crates built with `-Clto`, otherwise we'd still end up +building crates twice (once with and once without the override). + +Unfortunately, the `-C embed-bitcode=*` flag is also not supported in +versions older than 1.45, so we have to avoid adding it on older +versions. + +We unfortunately support a large range of versions of rustc (albeit only +for tools/crashreporter), but we actually need to upgrade the smaller +supported version because rustc < 1.38 doesn't support our top-level +Cargo.lock. This makes the version check slightly less awful. + +Differential Revision: https://phabricator.services.mozilla.com/D84652 + +diff --git a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure +--- a/build/moz.configure/rust.configure ++++ b/build/moz.configure/rust.configure +@@ -142,17 +142,17 @@ def rust_compiler(rustc_info, cargo_info + Rust compiler not found. + To compile rust language sources, you must have 'rustc' in your path. + See https://www.rust-lang.org/ for more information. + + You can install rust by running './mach bootstrap' + or by directly running the installer from https://rustup.rs/ + ''')) + if build_project == 'tools/crashreporter': +- rustc_min_version = Version('1.31.0') ++ rustc_min_version = Version('1.38.0') + else: + rustc_min_version = Version(MINIMUM_RUST_VERSION) + cargo_min_version = rustc_min_version + + version = rustc_info.version + if version < rustc_min_version: + die(dedent('''\ + Rust compiler {} is too old. +diff --git a/config/makefiles/rust.mk b/config/makefiles/rust.mk +--- a/config/makefiles/rust.mk ++++ b/config/makefiles/rust.mk +@@ -56,21 +56,22 @@ endif + # These flags are passed via `cargo rustc` and only apply to the final rustc + # invocation (i.e., only the top-level crate, not its dependencies). + cargo_rustc_flags = $(CARGO_RUSTCFLAGS) + ifndef DEVELOPER_OPTIONS + ifndef MOZ_DEBUG_RUST + # Enable link-time optimization for release builds, but not when linking + # gkrust_gtest. + ifeq (,$(findstring gkrust_gtest,$(RUST_LIBRARY_FILE))) +-# Pass -Clto for older versions of rust, and CARGO_PROFILE_RELEASE_LTO=true +-# for newer ones that support it. Combining the latter with -Clto works, so +-# set both everywhere. + cargo_rustc_flags += -Clto +-export CARGO_PROFILE_RELEASE_LTO=true ++endif ++# Versions of rust >= 1.45 need -Cembed-bitcode=yes for all crates when ++# using -Clto. ++ifeq (,$(filter 1.38.% 1.39.% 1.40.% 1.41.% 1.42.% 1.43.% 1.44.%,$(RUSTC_VERSION))) ++RUSTFLAGS += -Cembed-bitcode=yes + endif + endif + endif + + ifdef CARGO_INCREMENTAL + export CARGO_INCREMENTAL + endif + +diff --git a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py +--- a/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py ++++ b/python/mozbuild/mozbuild/test/configure/test_toolchain_configure.py +@@ -1793,23 +1793,16 @@ class RustTest(BaseConfigureTest): + self.assertEqual( + self.get_rust_target('arm-unknown-linux-androideabi', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='neon', thumb2=True, float_abi='softfp')), + 'thumbv7neon-linux-androideabi') + + self.assertEqual( + self.get_rust_target('arm-unknown-linux-androideabi', +- version='1.32.0', +- arm_target=ReadOnlyNamespace( +- arm_arch=7, fpu='neon', thumb2=True, float_abi='softfp')), +- 'armv7-linux-androideabi') +- +- self.assertEqual( +- self.get_rust_target('arm-unknown-linux-androideabi', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='neon', thumb2=False, float_abi='softfp')), + 'armv7-linux-androideabi') + + self.assertEqual( + self.get_rust_target('arm-unknown-linux-androideabi', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='vfpv2', thumb2=True, float_abi='softfp')), +@@ -1818,23 +1811,16 @@ class RustTest(BaseConfigureTest): + self.assertEqual( + self.get_rust_target('armv7-unknown-linux-gnueabihf', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='neon', thumb2=True, float_abi='hard')), + 'thumbv7neon-unknown-linux-gnueabihf') + + self.assertEqual( + self.get_rust_target('armv7-unknown-linux-gnueabihf', +- version='1.32.0', +- arm_target=ReadOnlyNamespace( +- arm_arch=7, fpu='neon', thumb2=True, float_abi='hard')), +- 'armv7-unknown-linux-gnueabihf') +- +- self.assertEqual( +- self.get_rust_target('armv7-unknown-linux-gnueabihf', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='neon', thumb2=False, float_abi='hard')), + 'armv7-unknown-linux-gnueabihf') + + self.assertEqual( + self.get_rust_target('armv7-unknown-linux-gnueabihf', + arm_target=ReadOnlyNamespace( + arm_arch=7, fpu='vfpv2', thumb2=True, float_abi='hard')), + |