Skip to content

Commit 8528796

Browse files
committed
Add support for -Zbuild-std
- Update to a version of rustwide that supports `fetch_build_std_targets` - Don't try to download rust-std for tier 3 targets - Add a local test - Don't try to make API calls to crates.io for local crates This shaves 16 seconds off the build, and also avoids some unnecessary network calls. Note that this calls `cargo fetch -Zbuild-std` unconditionally just because it was easier; I doubt it'll cause any trouble but I can change it if you like.
1 parent 77eaf07 commit 8528796

File tree

6 files changed

+93
-36
lines changed

6 files changed

+93
-36
lines changed

Cargo.lock

+1-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ edition = "2021"
1111
[workspace]
1212
exclude = [
1313
"ignored",
14+
"tests",
1415
".workspace",
1516
".rustwide-docker",
1617
]
@@ -51,7 +52,8 @@ toml = "0.7.2"
5152
schemamama = "0.3"
5253
schemamama_postgres = "0.3"
5354
prometheus = { version = "0.13.0", default-features = false }
54-
rustwide = { version = "0.15.0", features = ["unstable-toolchain-ci"] }
55+
# rustwide = { version = "0.15.0", features = ["unstable-toolchain-ci"] }
56+
rustwide = { git = "https://github.com/jyn514/rustwide", branch = "build-std", features = ["unstable", "unstable-toolchain-ci"] }
5557
mime_guess = "2"
5658
zstd = "0.12.0"
5759
hostname = "0.3.1"

src/docbuilder/rustwide_builder.rs

+56-33
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use crate::db::{
55
};
66
use crate::docbuilder::{crates::crates_from_path, Limits};
77
use crate::error::Result;
8-
use crate::index::api::ReleaseData;
98
use crate::repositories::RepositoryStatsUpdater;
109
use crate::storage::{rustdoc_archive_path, source_archive_path};
1110
use crate::utils::{
@@ -16,7 +15,7 @@ use crate::RUSTDOC_STATIC_STORAGE_PREFIX;
1615
use crate::{db::blacklist::is_blacklisted, utils::MetadataPackage};
1716
use crate::{Config, Context, Index, Metrics, Storage};
1817
use anyhow::{anyhow, bail, Context as _, Error};
19-
use docsrs_metadata::{Metadata, DEFAULT_TARGETS, HOST_TARGET};
18+
use docsrs_metadata::{BuildTargets, Metadata, DEFAULT_TARGETS, HOST_TARGET};
2019
use failure::Error as FailureError;
2120
use postgres::Client;
2221
use regex::Regex;
@@ -367,6 +366,7 @@ impl RustwideBuilder {
367366
let mut build_dir = self.workspace.build_dir(&format!("{name}-{version}"));
368367
build_dir.purge().map_err(FailureError::compat)?;
369368

369+
let is_local = matches!(kind, PackageKind::Local(_));
370370
let krate = match kind {
371371
PackageKind::Local(path) => Crate::local(path),
372372
PackageKind::CratesIo => Crate::crates_io(name, version),
@@ -383,16 +383,19 @@ impl RustwideBuilder {
383383
let successful = build_dir
384384
.build(&self.toolchain, &krate, self.prepare_sandbox(&limits))
385385
.run(|build| {
386-
(|| -> Result<bool> {
387-
use docsrs_metadata::BuildTargets;
386+
let metadata = Metadata::from_crate_root(build.host_source_dir())?;
387+
let BuildTargets {
388+
default_target,
389+
other_targets,
390+
} = metadata.targets(self.config.include_default_targets);
391+
let mut targets = vec![default_target];
392+
targets.extend(&other_targets);
393+
// Fetch this before we enter the sandbox, so networking isn't blocked.
394+
build.fetch_build_std_dependencies(&targets)?;
388395

396+
(|| -> Result<bool> {
389397
let mut has_docs = false;
390398
let mut successful_targets = Vec::new();
391-
let metadata = Metadata::from_crate_root(build.host_source_dir())?;
392-
let BuildTargets {
393-
default_target,
394-
other_targets,
395-
} = metadata.targets(self.config.include_default_targets);
396399

397400
// Perform an initial build
398401
let mut res =
@@ -488,19 +491,24 @@ impl RustwideBuilder {
488491
self.metrics.non_library_builds.inc();
489492
}
490493

491-
let release_data = match self
492-
.index
493-
.api()
494-
.get_release_data(name, version)
495-
.with_context(|| {
496-
format!("could not fetch releases-data for {name}-{version}")
497-
}) {
498-
Ok(data) => data,
499-
Err(err) => {
500-
report_error(&err);
501-
ReleaseData::default()
494+
let release_data = if !is_local {
495+
match self
496+
.index
497+
.api()
498+
.get_release_data(name, version)
499+
.with_context(|| {
500+
format!("could not fetch releases-data for {name}-{version}")
501+
}) {
502+
Ok(data) => Some(data),
503+
Err(err) => {
504+
report_error(&err);
505+
None
506+
}
502507
}
503-
};
508+
} else {
509+
None
510+
}
511+
.unwrap_or_default();
504512

505513
let cargo_metadata = res.cargo_metadata.root();
506514
let repository = self.get_repo(cargo_metadata)?;
@@ -530,11 +538,13 @@ impl RustwideBuilder {
530538
self.storage.store_one(build_log_path, res.build_log)?;
531539

532540
// Some crates.io crate data is mutable, so we proactively update it during a release
533-
match self.index.api().get_crate_data(name) {
534-
Ok(crate_data) => {
535-
update_crate_data_in_database(&mut conn, name, &crate_data)?
541+
if !is_local {
542+
match self.index.api().get_crate_data(name) {
543+
Ok(crate_data) => {
544+
update_crate_data_in_database(&mut conn, name, &crate_data)?
545+
}
546+
Err(err) => warn!("{:#?}", err),
536547
}
537-
Err(err) => warn!("{:#?}", err),
538548
}
539549

540550
if res.result.successful {
@@ -725,14 +735,6 @@ impl RustwideBuilder {
725735
limits: &Limits,
726736
mut rustdoc_flags_extras: Vec<String>,
727737
) -> Result<Command<'ws, 'pl>> {
728-
// If the explicit target is not a tier one target, we need to install it.
729-
if !docsrs_metadata::DEFAULT_TARGETS.contains(&target) {
730-
// This is a no-op if the target is already installed.
731-
self.toolchain
732-
.add_target(&self.workspace, target)
733-
.map_err(FailureError::compat)?;
734-
}
735-
736738
// Add docs.rs specific arguments
737739
let mut cargo_args = vec![
738740
"--offline".into(),
@@ -781,6 +783,18 @@ impl RustwideBuilder {
781783
rustdoc_flags_extras.extend(UNCONDITIONAL_ARGS.iter().map(|&s| s.to_owned()));
782784
let cargo_args = metadata.cargo_args(&cargo_args, &rustdoc_flags_extras);
783785

786+
// If the explicit target is not a tier one target, we need to install it.
787+
let has_build_std = cargo_args.windows(2).any(|args| {
788+
args[0].starts_with("-Zbuild-std")
789+
|| (args[0] == "-Z" && args[1].starts_with("build-std"))
790+
}) || cargo_args.last().unwrap().starts_with("-Zbuild-std");
791+
if !docsrs_metadata::DEFAULT_TARGETS.contains(&target) && !has_build_std {
792+
// This is a no-op if the target is already installed.
793+
self.toolchain
794+
.add_target(&self.workspace, target)
795+
.map_err(FailureError::compat)?;
796+
}
797+
784798
let mut command = build
785799
.cargo()
786800
.timeout(Some(limits.timeout()))
@@ -1218,4 +1232,13 @@ mod tests {
12181232
Ok(())
12191233
});
12201234
}
1235+
1236+
#[test]
1237+
#[ignore]
1238+
fn test_build_std() {
1239+
wrapper(|env| {
1240+
assert!(RustwideBuilder::init(env)?.build_local_package(Path::new("tests/build-std"))?);
1241+
Ok(())
1242+
})
1243+
}
12211244
}

tests/build-std/Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/build-std/Cargo.toml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "build-std"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
10+
[package.metadata.docs.rs]
11+
targets = ["x86_64-unknown-linux-gnu"]
12+
cargo-args = ["-Zbuild-std=core"]

tests/build-std/src/lib.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
pub fn add(left: usize, right: usize) -> usize {
2+
left + right
3+
}
4+
5+
#[cfg(test)]
6+
mod tests {
7+
use super::*;
8+
9+
#[test]
10+
fn it_works() {
11+
let result = add(2, 2);
12+
assert_eq!(result, 4);
13+
}
14+
}

0 commit comments

Comments
 (0)