diff options
| author | Yerkebulan Tulibergenov <yerkebulan@gmail.com> | 2022-02-05 19:57:02 -0800 |
|---|---|---|
| committer | Yerkebulan Tulibergenov <yerkebulan@gmail.com> | 2022-02-05 19:57:02 -0800 |
| commit | a4112dc7b5c8240f4e9163c1f696426e3899a26d (patch) | |
| tree | 18d858da6da18a383a1f086613e8c3da21adc2f1 | |
| parent | 7cc28c128be0363d83accf318b87b40ba6168384 (diff) | |
| download | rust-a4112dc7b5c8240f4e9163c1f696426e3899a26d.tar.gz rust-a4112dc7b5c8240f4e9163c1f696426e3899a26d.zip | |
fix linking stage1 toolchain in setup
| -rw-r--r-- | src/bootstrap/setup.rs | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/bootstrap/setup.rs b/src/bootstrap/setup.rs index 5bc0a505bf6..a28815d0976 100644 --- a/src/bootstrap/setup.rs +++ b/src/bootstrap/setup.rs @@ -1,7 +1,9 @@ use crate::TargetSelection; use crate::{t, VERSION}; +use std::env::consts::EXE_SUFFIX; use std::fmt::Write as _; -use std::path::{Path, PathBuf}; +use std::fs::File; +use std::path::{Path, PathBuf, MAIN_SEPARATOR}; use std::process::Command; use std::str::FromStr; use std::{ @@ -109,7 +111,8 @@ pub fn setup(src_path: &Path, profile: Profile) { println!("`x.py` will now use the configuration at {}", include_path.display()); let build = TargetSelection::from_user(&env!("BUILD_TRIPLE")); - let stage_path = ["build", build.rustc_target_arg(), "stage1"].join("/"); + let stage_path = + ["build", build.rustc_target_arg(), "stage1"].join(&MAIN_SEPARATOR.to_string()); println!(); @@ -171,6 +174,13 @@ fn attempt_toolchain_link(stage_path: &str) { return; } + if !ensure_stage1_toolchain_placeholder_exists(stage_path) { + println!( + "Failed to create a template for stage 1 toolchain or confirm that it already exists" + ); + return; + } + if try_link_toolchain(&stage_path[..]) { println!( "Added `stage1` rustup toolchain; try `cargo +stage1 build` on a separate rust project to run a newly-built toolchain" @@ -219,6 +229,33 @@ fn try_link_toolchain(stage_path: &str) -> bool { .map_or(false, |output| output.status.success()) } +fn ensure_stage1_toolchain_placeholder_exists(stage_path: &str) -> bool { + let pathbuf = PathBuf::from(stage_path); + + if fs::create_dir_all(pathbuf.join("lib")).is_err() { + return false; + }; + + let pathbuf = pathbuf.join("bin"); + if fs::create_dir_all(&pathbuf).is_err() { + return false; + }; + + let pathbuf = pathbuf.join(format!("rustc{}", EXE_SUFFIX)); + + if pathbuf.exists() { + return true; + } + + // Take care not to overwrite the file + let result = File::options().append(true).create(true).open(&pathbuf); + if result.is_err() { + return false; + } + + return true; +} + // Used to get the path for `Subcommand::Setup` pub fn interactive_path() -> io::Result<Profile> { fn abbrev_all() -> impl Iterator<Item = ((String, String), Profile)> { |
