diff --git a/build.rs b/build.rs index f9912ce57..a81e1d07a 100644 --- a/build.rs +++ b/build.rs @@ -36,6 +36,12 @@ fn main() { std::env::set_var("FISH_BUILD_VERSION", version); + #[cfg(feature = "installable")] + { + let cman = std::fs::canonicalize(env!("CARGO_MANIFEST_DIR")).unwrap(); + let targetman = cman.as_path().join("target").join("man"); + build_man(&targetman); + } rsconf::rebuild_if_path_changed("src/libc.c"); cc::Build::new() .file("src/libc.c") @@ -307,3 +313,50 @@ fn get_version(src_dir: &Path) -> String { panic!("Could not get a version. Either set $FISH_BUILD_VERSION or install git."); } + +#[cfg(feature = "installable")] +fn build_man(build_dir: &Path) { + use std::process::Command; + let mandir = build_dir; + let sec1dir = mandir.join("man1"); + let docsrc_path = std::fs::canonicalize(env!("CARGO_MANIFEST_DIR")) + .unwrap() + .as_path() + .join("doc_src"); + let docsrc = docsrc_path.to_str().unwrap(); + let args = &[ + "-j", + "auto", + "-q", + "-b", + "man", + "-c", + docsrc, + // doctree path - put this *above* the man1 dir to exclude it. + // this is ~6M + "-d", + mandir.to_str().unwrap(), + docsrc, + sec1dir.to_str().unwrap(), + ]; + let _ = std::fs::create_dir_all(sec1dir.to_str().unwrap()); + + match Command::new("sphinx-build").args(args).output() { + Err(x) => { + println!("cargo:warning=Could not build man pages: {:?}", x); + } + Ok(x) => { + if !x.status.success() { + println!( + "cargo:warning=Could not build man pages: {:?}", + std::str::from_utf8(&x.stdout).unwrap() + ); + println!( + "cargo:warning=Could not build man pages: {:?}", + std::str::from_utf8(&x.stderr).unwrap() + ); + panic!("Building docs failed"); + } + } + } +} diff --git a/src/bin/fish.rs b/src/bin/fish.rs index a48e2af93..1a04ed236 100644 --- a/src/bin/fish.rs +++ b/src/bin/fish.rs @@ -85,6 +85,11 @@ fn install(confirm: bool) { #[folder = "share/"] struct Asset; + #[derive(RustEmbed)] + #[folder = "target/man/man1"] + #[prefix = "man/man1/"] + struct Docs; + use std::fs; use std::io::ErrorKind; use std::io::Write; @@ -132,6 +137,8 @@ fn install(confirm: bool) { } } + // TODO: These are duplicated, no idea how to extract + // them into a function for file in Asset::iter() { let path = dir.join(file.as_ref()); let Ok(_) = fs::create_dir_all(path.parent().unwrap()) else { @@ -153,6 +160,29 @@ fn install(confirm: bool) { std::process::exit(1); } } + + for file in Docs::iter() { + let path = dir.join(file.as_ref()); + let Ok(_) = fs::create_dir_all(path.parent().unwrap()) else { + eprintln!( + "Creating directory '{}' failed", + path.parent().unwrap().display() + ); + std::process::exit(1); + }; + let res = File::create(&path); + let Ok(mut f) = res else { + eprintln!("Creating file '{}' failed", path.display()); + continue; + }; + // This should be impossible. + let d = Docs::get(&file).expect("File was somehow not included???"); + if let Err(error) = f.write_all(&d.data) { + eprintln!("error: {error}"); + std::process::exit(1); + } + } + let verfile = dir.join("fish-install-version"); let res = File::create(&verfile); if let Ok(mut f) = res {