feat: add support for customizable installation directories in build flags

This commit is contained in:
2026-03-08 21:11:50 -05:00
parent be0288440a
commit a10c7227be
9 changed files with 648 additions and 26 deletions
+54
View File
@@ -162,10 +162,29 @@ fn meson_setup_args(
env_vars: &[(String, String)],
) -> Vec<String> {
let mut args = Vec::new();
let dirs = crate::builder::install_dirs(flags);
if !has_option(&flags.configure, "--prefix") {
args.push(format!("--prefix={}", flags.prefix));
}
for (option, value) in [
("--bindir", dirs.bindir),
("--sbindir", dirs.sbindir),
("--libdir", dirs.libdir),
("--libexecdir", dirs.libexecdir),
("--sysconfdir", dirs.sysconfdir),
("--localstatedir", dirs.localstatedir),
("--sharedstatedir", dirs.sharedstatedir),
("--includedir", dirs.includedir),
("--datarootdir", dirs.datarootdir),
("--datadir", dirs.datadir),
("--mandir", dirs.mandir),
("--infodir", dirs.infodir),
] {
if !has_option(&flags.configure, option) {
args.push(format!("{option}={value}"));
}
}
if !has_option(&flags.configure, "--buildtype") {
args.push("--buildtype=release".to_string());
}
@@ -275,6 +294,23 @@ mod tests {
assert!(args.iter().any(|a| a == "--buildtype=release"));
}
#[test]
fn test_meson_setup_args_include_install_dirs() {
let args = meson_setup_args(&BuildFlags::default(), None, &[]);
assert!(args.iter().any(|a| a == "--bindir=/usr/bin"));
assert!(args.iter().any(|a| a == "--sbindir=/usr/bin"));
assert!(args.iter().any(|a| a == "--libdir=/usr/lib"));
assert!(args.iter().any(|a| a == "--libexecdir=/usr/lib"));
assert!(args.iter().any(|a| a == "--sysconfdir=/etc"));
assert!(args.iter().any(|a| a == "--localstatedir=/var"));
assert!(args.iter().any(|a| a == "--sharedstatedir=/var/lib"));
assert!(args.iter().any(|a| a == "--includedir=/usr/include"));
assert!(args.iter().any(|a| a == "--datarootdir=/usr/share"));
assert!(args.iter().any(|a| a == "--datadir=/usr/share"));
assert!(args.iter().any(|a| a == "--mandir=/usr/share/man"));
assert!(args.iter().any(|a| a == "--infodir=/usr/share/info"));
}
#[test]
fn test_meson_setup_args_honor_explicit_prefix() {
let flags = BuildFlags {
@@ -288,6 +324,24 @@ mod tests {
assert!(args.iter().any(|a| a == "--prefix=/opt"));
}
#[test]
fn test_meson_setup_args_honor_explicit_install_dirs() {
let flags = BuildFlags {
configure: vec![
"--sbindir=/sbin".to_string(),
"--libdir=/custom/lib".to_string(),
"--datadir=/custom/share".to_string(),
],
..BuildFlags::default()
};
let args = meson_setup_args(&flags, None, &[]);
assert!(!args.iter().any(|a| a == "--sbindir=/usr/bin"));
assert!(!args.iter().any(|a| a == "--libdir=/usr/lib"));
assert!(!args.iter().any(|a| a == "--datadir=/usr/share"));
assert!(args.iter().any(|a| a == "--bindir=/usr/bin"));
}
#[test]
fn test_resolve_build_dir_uses_flag() {
let flags = BuildFlags {