From a7cd3d46f932a3d3df1f1c6c644e3e072e927e5e Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sat, 16 Mar 2024 13:46:43 +0100 Subject: [PATCH] things --- hello | 1 + src/main.rs | 70 +++++++++++++-------------------------------------- src/parse.rs | 13 ---------- src/render.rs | 35 ++++++++++++++++++-------- trace | 57 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 76 deletions(-) create mode 100644 hello create mode 100644 trace diff --git a/hello b/hello new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/hello @@ -0,0 +1 @@ +1 diff --git a/src/main.rs b/src/main.rs index f80467e..af85c4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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::>(); eprintln!("Collecting rustc information"); - let rustc_infos = targets - .iter() - .map(|target| rustc_target_info(&rustc, target)) - .collect::>(); + let rustc_infos = + targets.iter().map(|target| rustc_target_info(&rustc, target)).collect::>(); let targets = targets .into_iter() @@ -79,9 +73,7 @@ fn main() -> Result<()> { .collect::>(); 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::(&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 { diff --git a/src/parse.rs b/src/parse.rs index c09e7ea..e8b93b5 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -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, pub maintainers: Vec, pub sections: Vec<(String, String)>, pub footnotes: HashMap>, @@ -27,7 +16,6 @@ pub struct ParsedTargetInfoFile { #[derive(Deserialize)] #[serde(deny_unknown_fields)] struct Frontmatter { - tier: Option, #[serde(default)] maintainers: Vec, #[serde(default)] @@ -138,7 +126,6 @@ fn parse_file(name: &str, content: &str) -> Result { Ok(ParsedTargetInfoFile { pattern: name.to_owned(), maintainers: frontmatter.maintainers, - tier: frontmatter.tier, sections, footnotes: frontmatter.footnotes, }) diff --git a/src/render.rs b/src/render.rs index 96107ca..9674b8d 100644 --- a/src/render.rs +++ b/src/render.rs @@ -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(" 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::>() .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(()) } diff --git a/trace b/trace new file mode 100644 index 0000000..da5d378 --- /dev/null +++ b/trace @@ -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