From 79a03b4299556a67ef7f3f40bda71db52535cf1a Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:49:50 +0800 Subject: Reorganise build script into modules --- Cargo.toml | 2 +- build.rs | 86 ---------------------------------------------------- build/application.rs | 59 +++++++++++++++++++++++++++++++++++ build/main.rs | 10 ++++++ build/util.rs | 21 +++++++++++++ 5 files changed, 91 insertions(+), 87 deletions(-) delete mode 100644 build.rs create mode 100644 build/application.rs create mode 100644 build/main.rs create mode 100644 build/util.rs diff --git a/Cargo.toml b/Cargo.toml index d8e7ffe5..9057fdae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ name = "bat" repository = "https://github.com/sharkdp/bat" version = "0.24.0" exclude = ["assets/syntaxes/*", "assets/themes/*"] -build = "build.rs" +build = "build/main.rs" edition = '2021' rust-version = "1.70" diff --git a/build.rs b/build.rs deleted file mode 100644 index db3cd29c..00000000 --- a/build.rs +++ /dev/null @@ -1,86 +0,0 @@ -use std::{collections::HashMap, fs, path::Path}; - -fn main() -> anyhow::Result<()> { - #[cfg(feature = "application")] - gen_man_and_comp()?; - - Ok(()) -} - -/// Generate manpage and shell completions for the bat application. -#[cfg(feature = "application")] -fn gen_man_and_comp() -> anyhow::Result<()> { - use std::{env, path::PathBuf}; - - // Read environment variables. - let project_name = env::var("PROJECT_NAME").unwrap_or("bat".into()); - let executable_name = env::var("PROJECT_EXECUTABLE").unwrap_or(project_name.clone()); - let executable_name_uppercase = executable_name.to_uppercase(); - let project_version = env::var("CARGO_PKG_VERSION")?; - - let variables = [ - ("PROJECT_NAME", project_name), - ("PROJECT_EXECUTABLE", executable_name), - ("PROJECT_EXECUTABLE_UPPERCASE", executable_name_uppercase), - ("PROJECT_VERSION", project_version), - ] - .into_iter() - .collect(); - - let Some(out_dir) = env::var_os("BAT_ASSETS_GEN_DIR") - .or_else(|| env::var_os("OUT_DIR")) - .map(PathBuf::from) - else { - anyhow::bail!("BAT_ASSETS_GEN_DIR or OUT_DIR should be set for build.rs"); - }; - - fs::create_dir_all(out_dir.join("assets/manual")).unwrap(); - fs::create_dir_all(out_dir.join("assets/completions")).unwrap(); - - render_template( - &variables, - "assets/manual/bat.1.in", - out_dir.join("assets/manual/bat.1"), - )?; - render_template( - &variables, - "assets/completions/bat.bash.in", - out_dir.join("assets/completions/bat.bash"), - )?; - render_template( - &variables, - "assets/completions/bat.fish.in", - out_dir.join("assets/completions/bat.fish"), - )?; - render_template( - &variables, - "assets/completions/_bat.ps1.in", - out_dir.join("assets/completions/_bat.ps1"), - )?; - render_template( - &variables, - "assets/completions/bat.zsh.in", - out_dir.join("assets/completions/bat.zsh"), - )?; - - Ok(()) -} - -/// Generates a file from a template. -#[allow(dead_code)] -fn render_template( - variables: &HashMap<&str, String>, - in_file: &str, - out_file: impl AsRef, -) -> anyhow::Result<()> { - let mut content = fs::read_to_string(in_file)?; - - for (variable_name, value) in variables { - // Replace {{variable_name}} by the value - let pattern = format!("{{{{{variable_name}}}}}"); - content = content.replace(&pattern, value); - } - - fs::write(out_file, content)?; - Ok(()) -} diff --git a/build/application.rs b/build/application.rs new file mode 100644 index 00000000..4a6dc42f --- /dev/null +++ b/build/application.rs @@ -0,0 +1,59 @@ +use std::{env, fs, path::PathBuf}; + +use crate::util::render_template; + +/// Generate manpage and shell completions for the bat application. +pub fn gen_man_and_comp() -> anyhow::Result<()> { + // Read environment variables. + let project_name = env::var("PROJECT_NAME").unwrap_or("bat".into()); + let executable_name = env::var("PROJECT_EXECUTABLE").unwrap_or(project_name.clone()); + let executable_name_uppercase = executable_name.to_uppercase(); + let project_version = env::var("CARGO_PKG_VERSION")?; + + let variables = [ + ("PROJECT_NAME", project_name), + ("PROJECT_EXECUTABLE", executable_name), + ("PROJECT_EXECUTABLE_UPPERCASE", executable_name_uppercase), + ("PROJECT_VERSION", project_version), + ] + .into_iter() + .collect(); + + let Some(out_dir) = env::var_os("BAT_ASSETS_GEN_DIR") + .or_else(|| env::var_os("OUT_DIR")) + .map(PathBuf::from) + else { + anyhow::bail!("BAT_ASSETS_GEN_DIR or OUT_DIR should be set for build.rs"); + }; + + fs::create_dir_all(out_dir.join("assets/manual")).unwrap(); + fs::create_dir_all(out_dir.join("assets/completions")).unwrap(); + + render_template( + &variables, + "assets/manual/bat.1.in", + out_dir.join("assets/manual/bat.1"), + )?; + render_template( + &variables, + "assets/completions/bat.bash.in", + out_dir.join("assets/completions/bat.bash"), + )?; + render_template( + &variables, + "assets/completions/bat.fish.in", + out_dir.join("assets/completions/bat.fish"), + )?; + render_template( + &variables, + "assets/completions/_bat.ps1.in", + out_dir.join("assets/completions/_bat.ps1"), + )?; + render_template( + &variables, + "assets/completions/bat.zsh.in", + out_dir.join("assets/completions/bat.zsh"), + )?; + + Ok(()) +} diff --git a/build/main.rs b/build/main.rs new file mode 100644 index 00000000..5d33418b --- /dev/null +++ b/build/main.rs @@ -0,0 +1,10 @@ +#[cfg(feature = "application")] +mod application; +mod util; + +fn main() -> anyhow::Result<()> { + #[cfg(feature = "application")] + application::gen_man_and_comp()?; + + Ok(()) +} diff --git a/build/util.rs b/build/util.rs new file mode 100644 index 00000000..daae52ba --- /dev/null +++ b/build/util.rs @@ -0,0 +1,21 @@ +#![allow(dead_code)] + +use std::{collections::HashMap, fs, path::Path}; + +/// Generates a file from a template. +pub fn render_template( + variables: &HashMap<&str, String>, + in_file: &str, + out_file: impl AsRef, +) -> anyhow::Result<()> { + let mut content = fs::read_to_string(in_file)?; + + for (variable_name, value) in variables { + // Replace {{variable_name}} by the value + let pattern = format!("{{{{{variable_name}}}}}"); + content = content.replace(&pattern, value); + } + + fs::write(out_file, content)?; + Ok(()) +} -- cgit v1.2.3