Rollup merge of #80514 - pietroalbini:fix-install, r=Mark-Simulacrum

Fix broken ./x.py install

During my tarball refactorings in https://github.com/rust-lang/rust/pull/79788 I changed the directory layout used by the tarball generation code, and that broke the other parts of rustbuild which hardcoded the paths of those directories. Namely, `./x.py install` relied on the uncompressed copy of the tarball left behind by `fabricate`/`rust-installer`, causing https://github.com/rust-lang/rust/issues/80494.

While the easy fix for https://github.com/rust-lang/rust/issues/80494 would've been to just update the hardcoded paths to match the new structure, that fix would leave us in the same situation if we were to change the directory layout again in the future. Instead I refactored the code to return a `GeneratedTarball` struct as the output of all the dist steps, and I put all the paths the rest of rustbuild needs to care about in its fields. That way, future changes to `src/bootstrap/tarball.rs` will not break other stuff.

This PR is best reviewed commit-by-commit.
r? `@Mark-Simulacrum`
`@rustbot` modify labels: beta-nominated beta-accepted T-release
This commit is contained in:
Dylan DPC 2020-12-31 22:20:51 +01:00 committed by GitHub
commit 5bffc265b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 110 additions and 136 deletions

View File

@ -19,7 +19,7 @@ use crate::builder::{Builder, RunConfig, ShouldRun, Step};
use crate::cache::{Interned, INTERNER};
use crate::compile;
use crate::config::TargetSelection;
use crate::tarball::{OverlayKind, Tarball};
use crate::tarball::{GeneratedTarball, OverlayKind, Tarball};
use crate::tool::{self, Tool};
use crate::util::{exe, is_dylib, timeit};
use crate::{Compiler, DependencyType, Mode, LLVM_TOOLS};
@ -51,7 +51,7 @@ pub struct Docs {
}
impl Step for Docs {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -63,7 +63,7 @@ impl Step for Docs {
}
/// Builds the `rust-docs` installer component.
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let host = self.host;
if !builder.config.docs {
return None;
@ -86,7 +86,7 @@ pub struct RustcDocs {
}
impl Step for RustcDocs {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -98,7 +98,7 @@ impl Step for RustcDocs {
}
/// Builds the `rustc-docs` installer component.
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let host = self.host;
if !builder.config.compiler_docs {
return None;
@ -267,7 +267,7 @@ pub struct Mingw {
}
impl Step for Mingw {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -282,7 +282,7 @@ impl Step for Mingw {
///
/// This contains all the bits and pieces to run the MinGW Windows targets
/// without any extra installed software (e.g., we bundle gcc, libraries, etc).
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let host = self.host;
if !host.contains("pc-windows-gnu") {
return None;
@ -307,7 +307,7 @@ pub struct Rustc {
}
impl Step for Rustc {
type Output = PathBuf;
type Output = GeneratedTarball;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
@ -321,7 +321,7 @@ impl Step for Rustc {
}
/// Creates the `rustc` installer component.
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let compiler = self.compiler;
let host = self.compiler.host;
@ -555,7 +555,7 @@ pub struct Std {
}
impl Step for Std {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -573,7 +573,7 @@ impl Step for Std {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
@ -601,7 +601,7 @@ pub struct RustcDev {
}
impl Step for RustcDev {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
@ -620,7 +620,7 @@ impl Step for RustcDev {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
if skip_host_target_lib(builder, compiler) {
@ -660,7 +660,7 @@ pub struct Analysis {
}
impl Step for Analysis {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -683,7 +683,7 @@ impl Step for Analysis {
}
/// Creates a tarball of save-analysis metadata, if available.
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
assert!(builder.config.extended);
@ -796,7 +796,7 @@ pub struct Src;
impl Step for Src {
/// The output path of the src installer tarball
type Output = PathBuf;
type Output = GeneratedTarball;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
@ -809,7 +809,7 @@ impl Step for Src {
}
/// Creates the `rust-src` installer component
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let tarball = Tarball::new_targetless(builder, "rust-src");
// A lot of tools expect the rust-src component to be entirely in this directory, so if you
@ -848,7 +848,7 @@ pub struct PlainSourceTarball;
impl Step for PlainSourceTarball {
/// Produces the location of the tarball generated
type Output = PathBuf;
type Output = GeneratedTarball;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
@ -862,7 +862,7 @@ impl Step for PlainSourceTarball {
}
/// Creates the plain source tarball
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let tarball = Tarball::new(builder, "rustc", "src");
let plain_dst_src = tarball.image_dir();
@ -941,7 +941,7 @@ pub struct Cargo {
}
impl Step for Cargo {
type Output = PathBuf;
type Output = GeneratedTarball;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -959,7 +959,7 @@ impl Step for Cargo {
});
}
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let compiler = self.compiler;
let target = self.target;
@ -995,7 +995,7 @@ pub struct Rls {
}
impl Step for Rls {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1013,7 +1013,7 @@ impl Step for Rls {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
assert!(builder.config.extended);
@ -1041,7 +1041,7 @@ pub struct RustAnalyzer {
}
impl Step for RustAnalyzer {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1059,7 +1059,7 @@ impl Step for RustAnalyzer {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
assert!(builder.config.extended);
@ -1090,7 +1090,7 @@ pub struct Clippy {
}
impl Step for Clippy {
type Output = PathBuf;
type Output = GeneratedTarball;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1108,7 +1108,7 @@ impl Step for Clippy {
});
}
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let compiler = self.compiler;
let target = self.target;
assert!(builder.config.extended);
@ -1140,7 +1140,7 @@ pub struct Miri {
}
impl Step for Miri {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1158,7 +1158,7 @@ impl Step for Miri {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
assert!(builder.config.extended);
@ -1193,7 +1193,7 @@ pub struct Rustfmt {
}
impl Step for Rustfmt {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1211,7 +1211,7 @@ impl Step for Rustfmt {
});
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let compiler = self.compiler;
let target = self.target;
@ -1316,11 +1316,11 @@ impl Step for Extended {
tarballs.push(mingw_installer.unwrap());
}
let mut tarball = Tarball::new(builder, "rust", &target.triple);
let work = tarball.persist_work_dir();
tarball.combine(&tarballs);
let tarball = Tarball::new(builder, "rust", &target.triple);
let generated = tarball.combine(&tarballs);
let tmp = tmpdir(builder).join("combined-tarball");
let work = generated.work_dir();
let mut license = String::new();
license += &builder.read(&builder.src.join("COPYRIGHT"));
@ -1870,7 +1870,7 @@ pub struct LlvmTools {
}
impl Step for LlvmTools {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@ -1881,7 +1881,7 @@ impl Step for LlvmTools {
run.builder.ensure(LlvmTools { target: run.target });
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let target = self.target;
assert!(builder.config.extended);
@ -1924,7 +1924,7 @@ pub struct RustDev {
}
impl Step for RustDev {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
@ -1936,7 +1936,7 @@ impl Step for RustDev {
run.builder.ensure(RustDev { target: run.target });
}
fn run(self, builder: &Builder<'_>) -> Option<PathBuf> {
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
let target = self.target;
/* run only if llvm-config isn't used */
@ -1989,7 +1989,7 @@ pub struct BuildManifest {
}
impl Step for BuildManifest {
type Output = PathBuf;
type Output = GeneratedTarball;
const DEFAULT: bool = false;
const ONLY_HOSTS: bool = true;
@ -2001,7 +2001,7 @@ impl Step for BuildManifest {
run.builder.ensure(BuildManifest { target: run.target });
}
fn run(self, builder: &Builder<'_>) -> PathBuf {
fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
let build_manifest = builder.tool_exe(Tool::BuildManifest);
let tarball = Tarball::new(builder, "build-manifest", &self.target.triple);
@ -2021,7 +2021,7 @@ pub struct ReproducibleArtifacts {
}
impl Step for ReproducibleArtifacts {
type Output = Option<PathBuf>;
type Output = Option<GeneratedTarball>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;

View File

@ -10,60 +10,19 @@ use std::process::Command;
use build_helper::t;
use crate::dist::{self, pkgname, sanitize_sh, tmpdir};
use crate::dist::{self, sanitize_sh};
use crate::tarball::GeneratedTarball;
use crate::Compiler;
use crate::builder::{Builder, RunConfig, ShouldRun, Step};
use crate::config::{Config, TargetSelection};
pub fn install_docs(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "docs", "rust-docs", stage, Some(host));
}
pub fn install_std(builder: &Builder<'_>, stage: u32, target: TargetSelection) {
install_sh(builder, "std", "rust-std", stage, Some(target));
}
pub fn install_cargo(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "cargo", "cargo", stage, Some(host));
}
pub fn install_rls(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "rls", "rls", stage, Some(host));
}
pub fn install_rust_analyzer(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "rust-analyzer", "rust-analyzer", stage, Some(host));
}
pub fn install_clippy(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "clippy", "clippy", stage, Some(host));
}
pub fn install_miri(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "miri", "miri", stage, Some(host));
}
pub fn install_rustfmt(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "rustfmt", "rustfmt", stage, Some(host));
}
pub fn install_analysis(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "analysis", "rust-analysis", stage, Some(host));
}
pub fn install_src(builder: &Builder<'_>, stage: u32) {
install_sh(builder, "src", "rust-src", stage, None);
}
pub fn install_rustc(builder: &Builder<'_>, stage: u32, host: TargetSelection) {
install_sh(builder, "rustc", "rustc", stage, Some(host));
}
fn install_sh(
builder: &Builder<'_>,
package: &str,
name: &str,
stage: u32,
host: Option<TargetSelection>,
tarball: &GeneratedTarball,
) {
builder.info(&format!("Install {} stage{} ({:?})", package, stage, host));
@ -108,15 +67,10 @@ fn install_sh(
let empty_dir = builder.out.join("tmp/empty_dir");
t!(fs::create_dir_all(&empty_dir));
let package_name = if let Some(host) = host {
format!("{}-{}", pkgname(builder, name), host.triple)
} else {
pkgname(builder, name)
};
let mut cmd = Command::new("sh");
cmd.current_dir(&empty_dir)
.arg(sanitize_sh(&tmpdir(builder).join(&package_name).join("install.sh")))
.arg(sanitize_sh(&tarball.decompressed_output().join("install.sh")))
.arg(format!("--prefix={}", sanitize_sh(&prefix)))
.arg(format!("--sysconfdir={}", sanitize_sh(&sysconfdir)))
.arg(format!("--datadir={}", sanitize_sh(&datadir)))
@ -191,25 +145,25 @@ macro_rules! install {
install!((self, builder, _config),
Docs, "src/doc", _config.docs, only_hosts: false, {
builder.ensure(dist::Docs { host: self.target });
install_docs(builder, self.compiler.stage, self.target);
let tarball = builder.ensure(dist::Docs { host: self.target }).expect("missing docs");
install_sh(builder, "docs", self.compiler.stage, Some(self.target), &tarball);
};
Std, "library/std", true, only_hosts: false, {
for target in &builder.targets {
builder.ensure(dist::Std {
let tarball = builder.ensure(dist::Std {
compiler: self.compiler,
target: *target
});
install_std(builder, self.compiler.stage, *target);
}).expect("missing std");
install_sh(builder, "std", self.compiler.stage, Some(*target), &tarball);
}
};
Cargo, "cargo", Self::should_build(_config), only_hosts: true, {
builder.ensure(dist::Cargo { compiler: self.compiler, target: self.target });
install_cargo(builder, self.compiler.stage, self.target);
let tarball = builder.ensure(dist::Cargo { compiler: self.compiler, target: self.target });
install_sh(builder, "cargo", self.compiler.stage, Some(self.target), &tarball);
};
Rls, "rls", Self::should_build(_config), only_hosts: true, {
if builder.ensure(dist::Rls { compiler: self.compiler, target: self.target }).is_some() {
install_rls(builder, self.compiler.stage, self.target);
if let Some(tarball) = builder.ensure(dist::Rls { compiler: self.compiler, target: self.target }) {
install_sh(builder, "rls", self.compiler.stage, Some(self.target), &tarball);
} else {
builder.info(
&format!("skipping Install RLS stage{} ({})", self.compiler.stage, self.target),
@ -217,16 +171,18 @@ install!((self, builder, _config),
}
};
RustAnalyzer, "rust-analyzer", Self::should_build(_config), only_hosts: true, {
builder.ensure(dist::RustAnalyzer { compiler: self.compiler, target: self.target });
install_rust_analyzer(builder, self.compiler.stage, self.target);
let tarball = builder
.ensure(dist::RustAnalyzer { compiler: self.compiler, target: self.target })
.expect("missing rust-analyzer");
install_sh(builder, "rust-analyzer", self.compiler.stage, Some(self.target), &tarball);
};
Clippy, "clippy", Self::should_build(_config), only_hosts: true, {
builder.ensure(dist::Clippy { compiler: self.compiler, target: self.target });
install_clippy(builder, self.compiler.stage, self.target);
let tarball = builder.ensure(dist::Clippy { compiler: self.compiler, target: self.target });
install_sh(builder, "clippy", self.compiler.stage, Some(self.target), &tarball);
};
Miri, "miri", Self::should_build(_config), only_hosts: true, {
if builder.ensure(dist::Miri { compiler: self.compiler, target: self.target }).is_some() {
install_miri(builder, self.compiler.stage, self.target);
if let Some(tarball) = builder.ensure(dist::Miri { compiler: self.compiler, target: self.target }) {
install_sh(builder, "miri", self.compiler.stage, Some(self.target), &tarball);
} else {
builder.info(
&format!("skipping Install miri stage{} ({})", self.compiler.stage, self.target),
@ -234,11 +190,11 @@ install!((self, builder, _config),
}
};
Rustfmt, "rustfmt", Self::should_build(_config), only_hosts: true, {
if builder.ensure(dist::Rustfmt {
if let Some(tarball) = builder.ensure(dist::Rustfmt {
compiler: self.compiler,
target: self.target
}).is_some() {
install_rustfmt(builder, self.compiler.stage, self.target);
}) {
install_sh(builder, "rustfmt", self.compiler.stage, Some(self.target), &tarball);
} else {
builder.info(
&format!("skipping Install Rustfmt stage{} ({})", self.compiler.stage, self.target),
@ -246,20 +202,20 @@ install!((self, builder, _config),
}
};
Analysis, "analysis", Self::should_build(_config), only_hosts: false, {
builder.ensure(dist::Analysis {
let tarball = builder.ensure(dist::Analysis {
// Find the actual compiler (handling the full bootstrap option) which
// produced the save-analysis data because that data isn't copied
// through the sysroot uplifting.
compiler: builder.compiler_for(builder.top_stage, builder.config.build, self.target),
target: self.target
});
install_analysis(builder, self.compiler.stage, self.target);
}).expect("missing analysis");
install_sh(builder, "analysis", self.compiler.stage, Some(self.target), &tarball);
};
Rustc, "src/librustc", true, only_hosts: true, {
builder.ensure(dist::Rustc {
let tarball = builder.ensure(dist::Rustc {
compiler: builder.compiler(builder.top_stage, self.target),
});
install_rustc(builder, self.compiler.stage, self.target);
install_sh(builder, "rustc", self.compiler.stage, Some(self.target), &tarball);
};
);
@ -284,7 +240,7 @@ impl Step for Src {
}
fn run(self, builder: &Builder<'_>) {
builder.ensure(dist::Src);
install_src(builder, self.stage);
let tarball = builder.ensure(dist::Src);
install_sh(builder, "src", self.stage, None, &tarball);
}
}

View File

@ -97,7 +97,6 @@ pub(crate) struct Tarball<'a> {
include_target_in_component_name: bool,
is_preview: bool,
delete_temp_dir: bool,
}
impl<'a> Tarball<'a> {
@ -136,7 +135,6 @@ impl<'a> Tarball<'a> {
include_target_in_component_name: false,
is_preview: false,
delete_temp_dir: true,
}
}
@ -198,12 +196,7 @@ impl<'a> Tarball<'a> {
self.builder.cp_r(src.as_ref(), &dest);
}
pub(crate) fn persist_work_dir(&mut self) -> PathBuf {
self.delete_temp_dir = false;
self.temp_dir.clone()
}
pub(crate) fn generate(self) -> PathBuf {
pub(crate) fn generate(self) -> GeneratedTarball {
let mut component_name = self.component.clone();
if self.is_preview {
component_name.push_str("-preview");
@ -227,20 +220,20 @@ impl<'a> Tarball<'a> {
})
}
pub(crate) fn combine(self, tarballs: &[PathBuf]) {
let mut input_tarballs = tarballs[0].as_os_str().to_os_string();
pub(crate) fn combine(self, tarballs: &[GeneratedTarball]) -> GeneratedTarball {
let mut input_tarballs = tarballs[0].path.as_os_str().to_os_string();
for tarball in &tarballs[1..] {
input_tarballs.push(",");
input_tarballs.push(tarball);
input_tarballs.push(&tarball.path);
}
self.run(|this, cmd| {
cmd.arg("combine").arg("--input-tarballs").arg(input_tarballs);
this.non_bare_args(cmd);
});
})
}
pub(crate) fn bare(self) -> PathBuf {
pub(crate) fn bare(self) -> GeneratedTarball {
// Bare tarballs should have the top level directory match the package
// name, not "image". We rename the image directory just before passing
// into rust-installer.
@ -276,7 +269,7 @@ impl<'a> Tarball<'a> {
.arg(crate::dist::distdir(self.builder));
}
fn run(self, build_cli: impl FnOnce(&Tarball<'a>, &mut Command)) -> PathBuf {
fn run(self, build_cli: impl FnOnce(&Tarball<'a>, &mut Command)) -> GeneratedTarball {
t!(std::fs::create_dir_all(&self.overlay_dir));
self.builder.create(&self.overlay_dir.join("version"), &self.overlay.version(self.builder));
if let Some(sha) = self.builder.rust_sha() {
@ -299,9 +292,6 @@ impl<'a> Tarball<'a> {
cmd.arg("--compression-formats").arg(formats.join(","));
}
self.builder.run(&mut cmd);
if self.delete_temp_dir {
t!(std::fs::remove_dir_all(&self.temp_dir));
}
// Use either the first compression format defined, or "gz" as the default.
let ext = self
@ -313,6 +303,31 @@ impl<'a> Tarball<'a> {
.map(|s| s.as_str())
.unwrap_or("gz");
crate::dist::distdir(self.builder).join(format!("{}.tar.{}", package_name, ext))
GeneratedTarball {
path: crate::dist::distdir(self.builder).join(format!("{}.tar.{}", package_name, ext)),
decompressed_output: self.temp_dir.join(package_name),
work: self.temp_dir,
}
}
}
#[derive(Debug, Clone)]
pub struct GeneratedTarball {
path: PathBuf,
decompressed_output: PathBuf,
work: PathBuf,
}
impl GeneratedTarball {
pub(crate) fn tarball(&self) -> &Path {
&self.path
}
pub(crate) fn decompressed_output(&self) -> &Path {
&self.decompressed_output
}
pub(crate) fn work_dir(&self) -> &Path {
&self.work
}
}

View File

@ -1963,7 +1963,7 @@ impl Step for Distcheck {
let mut cmd = Command::new("tar");
cmd.arg("-xf")
.arg(builder.ensure(dist::PlainSourceTarball))
.arg(builder.ensure(dist::PlainSourceTarball).tarball())
.arg("--strip-components=1")
.current_dir(&dir);
builder.run(&mut cmd);
@ -1986,7 +1986,10 @@ impl Step for Distcheck {
t!(fs::create_dir_all(&dir));
let mut cmd = Command::new("tar");
cmd.arg("-xf").arg(builder.ensure(dist::Src)).arg("--strip-components=1").current_dir(&dir);
cmd.arg("-xf")
.arg(builder.ensure(dist::Src).tarball())
.arg("--strip-components=1")
.current_dir(&dir);
builder.run(&mut cmd);
let toml = dir.join("rust-src/lib/rustlib/src/rust/library/std/Cargo.toml");