@@ -924,17 +924,29 @@ def build_bootstrap_cmd(self, env):
924
924
# default toolchain is not nightly.
925
925
#
926
926
# But that setting has the collateral effect of rust-analyzer also
927
- # passing RUSTC_BOOTSTRAP=1 to all x.py invocations too (the various overrideCommand).
928
- # For compiling bootstrap that can cause spurious rebuilding of bootstrap when
929
- # rust-analyzer x.py invocations are interleaved with handwritten ones on the
930
- # command line.
927
+ # passing RUSTC_BOOTSTRAP=1 to all x.py invocations too (the various
928
+ # overrideCommand).
931
929
#
932
- # Set RUSTC_BOOTSTRAP=1 consistently.
930
+ # Set a consistent RUSTC_BOOTSTRAP=1 here to prevent spurious rebuilds
931
+ # of bootstrap when rust-analyzer x.py invocations are interleaved with
932
+ # handwritten ones on the command line.
933
933
env["RUSTC_BOOTSTRAP"] = "1"
934
934
935
- default_rustflags = "" if env.get("RUSTFLAGS_BOOTSTRAP", "") else "-Zallow-features="
936
-
937
- env.setdefault("RUSTFLAGS", default_rustflags)
935
+ # If any of RUSTFLAGS or RUSTFLAGS_BOOTSTRAP are present and nonempty,
936
+ # we allow arbitrary compiler flags in there, including unstable ones
937
+ # such as `-Zthreads=8`.
938
+ #
939
+ # But if there aren't custom flags being passed to bootstrap, then we
940
+ # cancel the RUSTC_BOOTSTRAP=1 from above by passing `-Zallow-features=`
941
+ # to ensure unstable language or library features do not accidentally
942
+ # get introduced into bootstrap over time. Distros rely on being able to
943
+ # compile bootstrap with a variety of their toolchains, not necessarily
944
+ # the same as Rust's CI uses.
945
+ if env.get("RUSTFLAGS", "") or env.get("RUSTFLAGS_BOOTSTRAP", ""):
946
+ # Preserve existing RUSTFLAGS.
947
+ env.setdefault("RUSTFLAGS", "")
948
+ else:
949
+ env["RUSTFLAGS"] = "-Zallow-features="
938
950
939
951
target_features = []
940
952
if self.get_toml("crt-static", build_section) == "true":
0 commit comments