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 std::path::PathBuf;
|
||||||
|
|
||||||
use crate::core::build_steps::compile::{
|
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::build_steps::tool::{prepare_tool_cargo, SourceType};
|
||||||
use crate::core::builder::{
|
use crate::core::builder::{
|
||||||
@ -49,7 +49,7 @@ impl Step for Std {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn make_run(run: RunConfig<'_>) {
|
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 });
|
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::tool::{prepare_tool_cargo, SourceType};
|
||||||
use super::{check, compile};
|
use super::{check, compile};
|
||||||
use crate::builder::{Builder, ShouldRun};
|
use crate::builder::{Builder, ShouldRun};
|
||||||
|
use crate::core::build_steps::compile::std_crates_for_run_make;
|
||||||
use crate::core::builder;
|
use crate::core::builder;
|
||||||
use crate::core::builder::{crate_description, Alias, Kind, RunConfig, Step};
|
use crate::core::builder::{crate_description, Alias, Kind, RunConfig, Step};
|
||||||
use crate::{Mode, Subcommand, TargetSelection};
|
use crate::{Mode, Subcommand, TargetSelection};
|
||||||
@ -106,7 +107,7 @@ impl Step for Std {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn make_run(run: RunConfig<'_>) {
|
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 });
|
run.builder.ensure(Std { target: run.target, crates });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,11 +123,7 @@ impl Step for Std {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn make_run(run: RunConfig<'_>) {
|
fn make_run(run: RunConfig<'_>) {
|
||||||
// If the paths include "library", build the entire standard library.
|
let crates = std_crates_for_run_make(&run);
|
||||||
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() };
|
|
||||||
|
|
||||||
run.builder.ensure(Std {
|
run.builder.ensure(Std {
|
||||||
compiler: run.builder.compiler(run.builder.top_stage, run.build_triple()),
|
compiler: run.builder.compiler(run.builder.top_stage, run.build_triple()),
|
||||||
target: run.target,
|
target: run.target,
|
||||||
@ -425,6 +421,28 @@ fn copy_self_contained_objects(
|
|||||||
target_deps
|
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
|
/// Configure cargo to compile the standard library, adding appropriate env vars
|
||||||
/// and such.
|
/// and such.
|
||||||
pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, cargo: &mut Cargo) {
|
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.ensure(crate::core::build_steps::doc::Std::new(
|
||||||
builder.top_stage,
|
builder.top_stage,
|
||||||
host,
|
host,
|
||||||
builder,
|
|
||||||
DocumentationFormat::Json,
|
DocumentationFormat::Json,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -564,18 +564,8 @@ pub struct Std {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Std {
|
impl Std {
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(stage: u32, target: TargetSelection, format: DocumentationFormat) -> Self {
|
||||||
stage: u32,
|
Std { stage, target, format, crates: vec![] }
|
||||||
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 }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -589,6 +579,7 @@ impl Step for Std {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn make_run(run: RunConfig<'_>) {
|
fn make_run(run: RunConfig<'_>) {
|
||||||
|
let crates = compile::std_crates_for_run_make(&run);
|
||||||
run.builder.ensure(Std {
|
run.builder.ensure(Std {
|
||||||
stage: run.builder.top_stage,
|
stage: run.builder.top_stage,
|
||||||
target: run.target,
|
target: run.target,
|
||||||
@ -597,7 +588,7 @@ impl Step for Std {
|
|||||||
} else {
|
} else {
|
||||||
DocumentationFormat::Html
|
DocumentationFormat::Html
|
||||||
},
|
},
|
||||||
crates: run.make_run_crates(Alias::Library),
|
crates,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -695,13 +686,6 @@ fn doc_std(
|
|||||||
extra_args: &[&str],
|
extra_args: &[&str],
|
||||||
requested_crates: &[String],
|
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 compiler = builder.compiler(stage, builder.config.build);
|
||||||
|
|
||||||
let target_doc_dir_name = if format == DocumentationFormat::Json { "json-doc" } else { "doc" };
|
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.ensure(crate::core::build_steps::doc::Std::new(
|
||||||
builder.top_stage,
|
builder.top_stage,
|
||||||
self.target,
|
self.target,
|
||||||
builder,
|
|
||||||
DocumentationFormat::Html,
|
DocumentationFormat::Html,
|
||||||
));
|
));
|
||||||
let _guard = builder.msg(
|
let _guard = builder.msg(
|
||||||
|
@ -79,13 +79,9 @@ macro_rules! std {
|
|||||||
|
|
||||||
macro_rules! doc_std {
|
macro_rules! doc_std {
|
||||||
($host:ident => $target:ident, stage = $stage:literal) => {{
|
($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(
|
doc::Std::new(
|
||||||
$stage,
|
$stage,
|
||||||
TargetSelection::from_user(concat!(stringify!($target), "-", stringify!($target))),
|
TargetSelection::from_user(concat!(stringify!($target), "-", stringify!($target))),
|
||||||
&builder,
|
|
||||||
DocumentationFormat::Html,
|
DocumentationFormat::Html,
|
||||||
)
|
)
|
||||||
}};
|
}};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user