This commit is contained in:
nora 2024-03-16 13:46:43 +01:00
parent a00ca6ae97
commit a7cd3d46f9
5 changed files with 100 additions and 76 deletions

1
hello Normal file
View file

@ -0,0 +1 @@
1

View file

@ -38,9 +38,12 @@ fn main() -> Result<()> {
let input_dir = args
.get(1)
.ok_or_eyre("first argument must be path to target_infos directory containing target source md files (src/doc/rustc/target_infos/)")?;
let output_src = args
.get(2)
.ok_or_eyre("second argument must be path to `src` output directory (src/doc/rustc/src)")?;
let output_src = args.get(2).ok_or_eyre(
"second argument must be path to `src` output directory (build/$target/md-doc/rustc/src)",
)?;
println!("Loading target info docs from {input_dir}");
println!("Writing output to {output_src}");
let rustc =
PathBuf::from(std::env::var("RUSTC").expect("must pass RUSTC env var pointing to rustc"));
@ -53,24 +56,15 @@ fn main() -> Result<()> {
.wrap_err("failed loading target_info")?
.into_iter()
.map(|info| {
let footnotes_used = info
.footnotes
.iter()
.map(|(target, _)| (target.clone(), false))
.collect();
TargetPatternEntry {
info,
used: false,
footnotes_used,
}
let footnotes_used =
info.footnotes.iter().map(|(target, _)| (target.clone(), false)).collect();
TargetPatternEntry { info, used: false, footnotes_used }
})
.collect::<Vec<_>>();
eprintln!("Collecting rustc information");
let rustc_infos = targets
.iter()
.map(|target| rustc_target_info(&rustc, target))
.collect::<Vec<_>>();
let rustc_infos =
targets.iter().map(|target| rustc_target_info(&rustc, target)).collect::<Vec<_>>();
let targets = targets
.into_iter()
@ -79,9 +73,7 @@ fn main() -> Result<()> {
.collect::<Vec<_>>();
eprintln!("Rendering targets check_only={check_only}");
let targets_dir = Path::new(output_src)
.join("platform-support")
.join("targets");
let targets_dir = Path::new(output_src).join("platform-support").join("targets");
if !check_only {
std::fs::create_dir_all(&targets_dir).wrap_err("creating platform-support/targets dir")?;
}
@ -96,10 +88,7 @@ fn main() -> Result<()> {
for target_pattern in info_patterns {
if !target_pattern.used {
bail!(
"target pattern `{}` was never used",
target_pattern.info.pattern
);
bail!("target pattern `{}` was never used", target_pattern.info.pattern);
}
for footnote_target in target_pattern.info.footnotes.keys() {
@ -127,7 +116,6 @@ struct TargetPatternEntry {
}
fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> TargetDocs {
let mut tier = None;
let mut maintainers = Vec::new();
let mut sections = Vec::new();
@ -140,14 +128,6 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
maintainers.extend_from_slice(&target_pattern.maintainers);
if let Some(pattern_value) = &target_pattern.tier {
if tier.is_some() {
panic!(
"target {target} inherits a tier from multiple patterns, create a more specific pattern and add it there"
);
}
tier = Some(pattern_value.clone());
}
for (section_name, content) in &target_pattern.sections {
if sections.iter().any(|(name, _)| name == section_name) {
@ -159,9 +139,7 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
}
if let Some(target_footnotes) = target_pattern.footnotes.get(target) {
target_pattern_entry
.footnotes_used
.insert(target.to_owned(), true);
target_pattern_entry.footnotes_used.insert(target.to_owned(), true);
if !footnotes.is_empty() {
panic!("target {target} is assigned metadata from more than one pattern");
@ -171,12 +149,7 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
}
}
TargetDocs {
name: target.to_owned(),
maintainers,
sections,
footnotes,
}
TargetDocs { name: target.to_owned(), maintainers, sections, footnotes }
}
/// Information about a target obtained from rustc.
@ -218,21 +191,12 @@ fn rustc_target_info(rustc: &Path, target: &str) -> RustcTargetInfo {
let json_spec = rustc_stdout(
rustc,
&[
"-Zunstable-options",
"--print",
"target-spec-json",
"--target",
target,
],
&["-Zunstable-options", "--print", "target-spec-json", "--target", target],
);
let spec = serde_json::from_str::<TargetJson>(&json_spec)
.expect("parsing --print target-spec-json for metadata");
RustcTargetInfo {
target_cfgs,
metadata: spec.metadata,
}
RustcTargetInfo { target_cfgs, metadata: spec.metadata }
}
fn rustc_stdout(rustc: &Path, args: &[&str]) -> String {

View file

@ -4,20 +4,9 @@ use eyre::{bail, OptionExt, Result, WrapErr};
use serde::Deserialize;
use std::{collections::HashMap, fs::DirEntry, path::Path};
#[derive(Debug, PartialEq, Clone, Deserialize)]
pub enum Tier {
#[serde(rename = "1")]
One,
#[serde(rename = "2")]
Two,
#[serde(rename = "3")]
Three,
}
#[derive(Debug)]
pub struct ParsedTargetInfoFile {
pub pattern: String,
pub tier: Option<Tier>,
pub maintainers: Vec<String>,
pub sections: Vec<(String, String)>,
pub footnotes: HashMap<String, Vec<String>>,
@ -27,7 +16,6 @@ pub struct ParsedTargetInfoFile {
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Frontmatter {
tier: Option<Tier>,
#[serde(default)]
maintainers: Vec<String>,
#[serde(default)]
@ -138,7 +126,6 @@ fn parse_file(name: &str, content: &str) -> Result<ParsedTargetInfoFile> {
Ok(ParsedTargetInfoFile {
pattern: name.to_owned(),
maintainers: frontmatter.maintainers,
tier: frontmatter.tier,
sections,
footnotes: frontmatter.footnotes,
})

View file

@ -5,15 +5,25 @@ use crate::{RustcTargetInfo, TargetDocs};
/// Renders a single target markdown file from the information obtained.
pub fn render_target_md(target: &TargetDocs, rustc_info: &RustcTargetInfo) -> String {
let render_header_option_bool = |bool| {
match bool {
Some(true) => "Yes",
Some(false) => "No",
None => "?",
}
};
let mut doc = format!(
"# {}\n\n**Tier: {}**\n\n",
"# {}\n\n**Tier: {}**\n\n**std: {}**\n\n**host tools: {}**\n\n",
target.name,
match rustc_info.metadata.tier {
Some(1) => "1",
Some(2) => "2",
Some(3) => "3",
_ => "UNKNOWN",
}
},
render_header_option_bool(rustc_info.metadata.std),
render_header_option_bool(rustc_info.metadata.host_tools),
);
let mut section = |name: &str, content: &str| {
@ -52,10 +62,7 @@ pub fn render_target_md(target: &TargetDocs, rustc_info: &RustcTargetInfo) -> St
section("Maintainers", &maintainers_content);
for section_name in crate::SECTIONS {
let value = target
.sections
.iter()
.find(|(name, _)| name == section_name);
let value = target.sections.iter().find(|(name, _)| name == section_name);
let section_content = match value {
Some((_, value)) => value.clone(),
@ -93,9 +100,7 @@ fn replace_section(prev_content: &str, section_name: &str, replacement: &str) ->
.split_once(&magic_summary_end)
.ok_or_eyre("<!-- TARGET SECTION START --> not found")?;
let new = format!(
"{pre_target}{magic_summary_start}\n{replacement}\n{magic_summary_end}{post_target}"
);
let new = format!("{pre_target}{replacement}{post_target}");
Ok(new)
}
@ -110,7 +115,7 @@ pub fn render_static(
let target_list = targets
.iter()
.map(|(target, _)| format!("- [{0}](targets/{0}.md)", target.name))
.map(|(target, _)| format!("- [{0}](platform-support/targets/{0}.md)", target.name))
.collect::<Vec<_>>()
.join("\n");
@ -132,6 +137,16 @@ pub fn render_static(
.wrap_err("writing platform-support.md")?;
}
let summary = src_output.join("SUMMARY.md");
let summary_old = fs::read_to_string(&summary).wrap_err("reading SUMMARY.md")?;
// indent the list
let summary_new =
replace_section(&summary_old, "TARGET_LIST", &target_list.replace("- ", " - "))
.wrap_err("replacig SUMMARY.md")?;
if !check_only {
fs::write(summary, summary_new).wrap_err("writing SUMAMRY.md")?;
}
Ok(())
}

57
trace Normal file
View file

@ -0,0 +1,57 @@
Attaching 3 probes...
@fdpath[1871, 27]: /proc/sys/net/ipv6/conf/enp39s0/mtu
@fdpath[2483, 6]: /etc/passwd
@fdpath[3226, 103]: /proc/135816/cmdline
@fdpath[3842, 82]: /proc/4192/status
@fdpath[4020, 53]: /dev/video0
@fdpath[4020, 56]: /proc/253926/stat
@fdpath[4020, -2]: /dev/video63
@fdpath[5494, 36]: /proc/253923/cmdline
@fdpath[10038, 41]: /proc/154305/cmdline
@fdpath[252060, 7]: /dev/null
@fdpath[253926, 13]: /sys/kernel/debug/tracing/events/syscalls/sys_enter_write/id
@fdpath[253926, 15]: /dev/null
@fdpath[253937, 3]: /etc/localtime
@fdpath[253937, -2]: /.envrc
@fdpath[253943, 3]: .git/packed-refs
@fdpath[253943, -2]: /nix/store/jgrsps4vp9243gbakax7y3mz9pkdfnfk-pcre2-10.43/lib/lib
@fdpath[253944, 3]: .git/refs/heads/master
@fdpath[253944, -2]: /nix/store/jgrsps4vp9243gbakax7y3mz9pkdfnfk-pcre2-10.43/lib/lib
@fdpath[253945, 3]: .git/config
@fdpath[253945, 4]: /nix/store/ksk3rnb0ljx8gngzk19jlmbjyvac4hw6-glibc-2.38-44/lib/g
@fdpath[253945, -2]: /nix/store/ksk3rnb0ljx8gngzk19jlmbjyvac4hw6-glibc-2.38-44/lib/g
@fdpath[253946, 3]: /etc/localtime
@fdpath[253946, -2]: /.envrc
@fdpath[253952, 3]: .git/packed-refs
@fdpath[253952, -2]: /nix/store/jgrsps4vp9243gbakax7y3mz9pkdfnfk-pcre2-10.43/lib/lib
@fdpath[253953, 3]: .git/refs/heads/master
@fdpath[253953, -2]: /nix/store/jgrsps4vp9243gbakax7y3mz9pkdfnfk-pcre2-10.43/lib/lib
@fdpath[253954, 3]: .git/config
@fdpath[253954, 4]: /nix/store/ksk3rnb0ljx8gngzk19jlmbjyvac4hw6-glibc-2.38-44/lib/g
@fdpath[253954, -2]: /nix/store/ksk3rnb0ljx8gngzk19jlmbjyvac4hw6-glibc-2.38-44/lib/g
@openatpaths[1871]: /proc/sys/net/ipv6/conf/enp39s0/mtu
@openatpaths[2485]: /etc/passwd
@openatpaths[2486]: /etc/passwd
@openatpaths[2487]: /etc/passwd
@openatpaths[2488]: /etc/passwd
@openatpaths[2489]: /etc/passwd
@openatpaths[2490]: /etc/passwd
@openatpaths[2491]: /etc/passwd
@openatpaths[2492]: /etc/passwd
@openatpaths[3226]: /proc/135816/cmdline
@openatpaths[3842]: /proc/4192/status
@openatpaths[4137]: /dev/video0
@openatpaths[4149]: /proc/253926/stat
@openatpaths[5494]: /proc/253923/cmdline
@openatpaths[10038]: /proc/154305/cmdline
@openatpaths[252060]: /dev/null
@openatpaths[253926]: /sys/kernel/debug/tracing/events/syscalls/sys_enter_write/id
@openatpaths[253937]: /.envrc
@openatpaths[253943]: .git/packed-refs
@openatpaths[253944]: .git/refs/heads/master
@openatpaths[253945]: .git/config
@openatpaths[253946]: /.envrc
@openatpaths[253952]: .git/packed-refs
@openatpaths[253953]: .git/refs/heads/master
@openatpaths[253954]: .git/config
@writer[fish, 252060]: /home/nils/projects/target-tier-docs-experiment/hello