Skip to content

Commit

Permalink
Rollup merge of rust-lang#93487 - yerke:yerke/fix-link-toolchain-in-s…
Browse files Browse the repository at this point in the history
…etup, r=Mark-Simulacrum

Fix linking stage1 toolchain in `./x.py setup`

Closes [92319](rust-lang#92319)

Fix linking stage1 toolchain in `./x.py setup`. I guess this can be considered a follow up to rust-lang#89212 by `@Sl1mb0.`

We create 2 directories and 1 file that are required by rustup to [link a custom toolchain from path](https://github.com/rust-lang/rustup/blob/5225e87a5d974ab5f1626bcb2a7b43f76ab883f0/src/toolchain.rs#L479-L497).

cc `@jyn514` and `@Mark-Simulacrum` as they were active in rust-lang#89206
  • Loading branch information
matthiaskrgr authored Feb 6, 2022
2 parents 62c7f1d + a4112dc commit 8a25218
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions src/bootstrap/setup.rs
Original file line number Diff line number Diff line change
@@ -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::{
Expand Down Expand Up @@ -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!();

Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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)> {
Expand Down

0 comments on commit 8a25218

Please sign in to comment.