Build man pages into installable fish

This calls sphinx-build from build.rs to include the man pages in the binary.

We don't abort if sphinx doesn't exist, but we do if it failed.
This commit is contained in:
Fabian Boehm 2024-11-18 21:41:55 +01:00
parent 2343a6b1f1
commit 1599293796
2 changed files with 83 additions and 0 deletions

View file

@ -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");
}
}
}
}

View file

@ -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 {