Rollup merge of #128182 - onur-ozkan:fix-no-std-crates, r=Mark-Simulacrum
handle no_std targets on std builds This PR unifies the `Step::run_make` logic and improves it by skipping std specific crates for no_std targets. In addition, since we now handle library crates properly, bootstrap is capable of running `x doc library` even for no_std targets as it is able to generate documentation for `alloc` crate from the standard library. Resolves #128027 cc ``@ChrisDenton``
This commit is contained in:
commit
7e6943d67f
@ -3,7 +3,7 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::core::build_steps::compile::{
|
||||
add_to_sysroot, run_cargo, rustc_cargo, rustc_cargo_env, std_cargo,
|
||||
add_to_sysroot, run_cargo, rustc_cargo, rustc_cargo_env, std_cargo, std_crates_for_run_make,
|
||||
};
|
||||
use crate::core::build_steps::tool::{prepare_tool_cargo, SourceType};
|
||||
use crate::core::builder::{
|
||||
@ -49,7 +49,7 @@ impl Step for Std {
|
||||
}
|
||||
|
||||
fn make_run(run: RunConfig<'_>) {
|
||||
let crates = run.make_run_crates(Alias::Library);
|
||||
let crates = std_crates_for_run_make(&run);
|
||||
run.builder.ensure(Std { target: run.target, crates, override_build_kind: None });
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ use super::compile::{librustc_stamp, libstd_stamp, run_cargo, rustc_cargo, std_c
|
||||
use super::tool::{prepare_tool_cargo, SourceType};
|
||||
use super::{check, compile};
|
||||
use crate::builder::{Builder, ShouldRun};
|
||||
use crate::core::build_steps::compile::std_crates_for_run_make;
|
||||
use crate::core::builder;
|
||||
use crate::core::builder::{crate_description, Alias, Kind, RunConfig, Step};
|
||||
use crate::{Mode, Subcommand, TargetSelection};
|
||||
@ -106,7 +107,7 @@ impl Step for Std {
|
||||
}
|
||||
|
||||
fn make_run(run: RunConfig<'_>) {
|
||||
let crates = run.make_run_crates(Alias::Library);
|
||||
let crates = std_crates_for_run_make(&run);
|
||||
run.builder.ensure(Std { target: run.target, crates });
|
||||
}
|
||||
|
||||
|
@ -123,11 +123,7 @@ impl Step for Std {
|
||||
}
|
||||
|
||||
fn make_run(run: RunConfig<'_>) {
|
||||
// If the paths include "library", build the entire standard library.
|
||||
let has_alias =
|
||||
run.paths.iter().any(|set| set.assert_single_path().path.ends_with("library"));
|
||||
let crates = if has_alias { Default::default() } else { run.cargo_crates_in_set() };
|
||||
|
||||
let crates = std_crates_for_run_make(&run);
|
||||
run.builder.ensure(Std {
|
||||
compiler: run.builder.compiler(run.builder.top_stage, run.build_triple()),
|
||||
target: run.target,
|
||||
@ -425,6 +421,28 @@ fn copy_self_contained_objects(
|
||||
target_deps
|
||||
}
|
||||
|
||||
/// Resolves standard library crates for `Std::run_make` for any build kind (like check, build, clippy, etc.).
|
||||
pub fn std_crates_for_run_make(run: &RunConfig<'_>) -> Vec<String> {
|
||||
// FIXME: Extend builder tests to cover the `crates` field of `Std` instances.
|
||||
if cfg!(feature = "bootstrap-self-test") {
|
||||
return vec![];
|
||||
}
|
||||
|
||||
let has_alias = run.paths.iter().any(|set| set.assert_single_path().path.ends_with("library"));
|
||||
let target_is_no_std = run.builder.no_std(run.target).unwrap_or(false);
|
||||
|
||||
// For no_std targets, do not add any additional crates to the compilation other than what `compile::std_cargo` already adds for no_std targets.
|
||||
if target_is_no_std {
|
||||
vec![]
|
||||
}
|
||||
// If the paths include "library", build the entire standard library.
|
||||
else if has_alias {
|
||||
run.make_run_crates(builder::Alias::Library)
|
||||
} else {
|
||||
run.cargo_crates_in_set()
|
||||
}
|
||||
}
|
||||
|
||||
/// Configure cargo to compile the standard library, adding appropriate env vars
|
||||
/// and such.
|
||||
pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, cargo: &mut Cargo) {
|
||||
|
@ -106,7 +106,6 @@ impl Step for JsonDocs {
|
||||
builder.ensure(crate::core::build_steps::doc::Std::new(
|
||||
builder.top_stage,
|
||||
host,
|
||||
builder,
|
||||
DocumentationFormat::Json,
|
||||
));
|
||||
|
||||
|
@ -564,18 +564,8 @@ pub struct Std {
|
||||
}
|
||||
|
||||
impl Std {
|
||||
pub(crate) fn new(
|
||||
stage: u32,
|
||||
target: TargetSelection,
|
||||
builder: &Builder<'_>,
|
||||
format: DocumentationFormat,
|
||||
) -> Self {
|
||||
let crates = builder
|
||||
.in_tree_crates("sysroot", Some(target))
|
||||
.into_iter()
|
||||
.map(|krate| krate.name.to_string())
|
||||
.collect();
|
||||
Std { stage, target, format, crates }
|
||||
pub(crate) fn new(stage: u32, target: TargetSelection, format: DocumentationFormat) -> Self {
|
||||
Std { stage, target, format, crates: vec![] }
|
||||
}
|
||||
}
|
||||
|
||||
@ -589,6 +579,7 @@ impl Step for Std {
|
||||
}
|
||||
|
||||
fn make_run(run: RunConfig<'_>) {
|
||||
let crates = compile::std_crates_for_run_make(&run);
|
||||
run.builder.ensure(Std {
|
||||
stage: run.builder.top_stage,
|
||||
target: run.target,
|
||||
@ -597,7 +588,7 @@ impl Step for Std {
|
||||
} else {
|
||||
DocumentationFormat::Html
|
||||
},
|
||||
crates: run.make_run_crates(Alias::Library),
|
||||
crates,
|
||||
});
|
||||
}
|
||||
|
||||
@ -695,13 +686,6 @@ fn doc_std(
|
||||
extra_args: &[&str],
|
||||
requested_crates: &[String],
|
||||
) {
|
||||
if builder.no_std(target) == Some(true) {
|
||||
panic!(
|
||||
"building std documentation for no_std target {target} is not supported\n\
|
||||
Set `docs = false` in the config to disable documentation, or pass `--skip library`."
|
||||
);
|
||||
}
|
||||
|
||||
let compiler = builder.compiler(stage, builder.config.build);
|
||||
|
||||
let target_doc_dir_name = if format == DocumentationFormat::Json { "json-doc" } else { "doc" };
|
||||
|
@ -847,7 +847,6 @@ impl Step for RustdocJSStd {
|
||||
builder.ensure(crate::core::build_steps::doc::Std::new(
|
||||
builder.top_stage,
|
||||
self.target,
|
||||
builder,
|
||||
DocumentationFormat::Html,
|
||||
));
|
||||
let _guard = builder.msg(
|
||||
|
@ -79,13 +79,9 @@ macro_rules! std {
|
||||
|
||||
macro_rules! doc_std {
|
||||
($host:ident => $target:ident, stage = $stage:literal) => {{
|
||||
let config = configure("doc", &["A-A"], &["A-A"]);
|
||||
let build = Build::new(config);
|
||||
let builder = Builder::new(&build);
|
||||
doc::Std::new(
|
||||
$stage,
|
||||
TargetSelection::from_user(concat!(stringify!($target), "-", stringify!($target))),
|
||||
&builder,
|
||||
DocumentationFormat::Html,
|
||||
)
|
||||
}};
|
||||
|
Loading…
x
Reference in New Issue
Block a user