diff --git a/Cargo.lock b/Cargo.lock index 52c2e23..9157052 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -418,7 +418,7 @@ checksum = "807800ff3288b621186fe0a8f3392c4652068257302709c24efd918c3dffcdc2" [[package]] name = "depot" -version = "0.16.0" +version = "0.16.1" dependencies = [ "anyhow", "ar", diff --git a/Cargo.toml b/Cargo.toml index 34358c0..d9c2e28 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "depot" -version = "0.16.0" +version = "0.16.1" edition = "2024" [lints.rust] diff --git a/meson.build b/meson.build index bbcf0c3..325e2ab 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project( 'depot', - version: '0.16.0', + version: '0.16.1', meson_version: '>=0.60.0', ) diff --git a/src/builder/cmake.rs b/src/builder/cmake.rs index 7d7890d..f7e3e39 100755 --- a/src/builder/cmake.rs +++ b/src/builder/cmake.rs @@ -317,20 +317,58 @@ fn cmake_cache_entry_value<'a>(flags: &'a [String], variable: &str) -> Option<&' } fn cmake_install_dir_args(flags: &crate::package::BuildFlags) -> Vec { + let prefix = cmake_cache_entry_value(&flags.configure, "CMAKE_INSTALL_PREFIX") + .unwrap_or(flags.prefix.as_str()); let dirs = crate::builder::install_dirs(flags); let defaults = [ - ("CMAKE_INSTALL_BINDIR", dirs.bindir), - ("CMAKE_INSTALL_SBINDIR", dirs.sbindir), - ("CMAKE_INSTALL_LIBDIR", dirs.libdir), - ("CMAKE_INSTALL_LIBEXECDIR", dirs.libexecdir), - ("CMAKE_INSTALL_SYSCONFDIR", dirs.sysconfdir), - ("CMAKE_INSTALL_LOCALSTATEDIR", dirs.localstatedir), - ("CMAKE_INSTALL_SHAREDSTATEDIR", dirs.sharedstatedir), - ("CMAKE_INSTALL_INCLUDEDIR", dirs.includedir), - ("CMAKE_INSTALL_DATAROOTDIR", dirs.datarootdir), - ("CMAKE_INSTALL_DATADIR", dirs.datadir), - ("CMAKE_INSTALL_MANDIR", dirs.mandir), - ("CMAKE_INSTALL_INFODIR", dirs.infodir), + ( + "CMAKE_INSTALL_BINDIR", + cmake_install_dir_value(prefix, &dirs.bindir), + ), + ( + "CMAKE_INSTALL_SBINDIR", + cmake_install_dir_value(prefix, &dirs.sbindir), + ), + ( + "CMAKE_INSTALL_LIBDIR", + cmake_install_dir_value(prefix, &dirs.libdir), + ), + ( + "CMAKE_INSTALL_LIBEXECDIR", + cmake_install_dir_value(prefix, &dirs.libexecdir), + ), + ( + "CMAKE_INSTALL_SYSCONFDIR", + cmake_install_dir_value(prefix, &dirs.sysconfdir), + ), + ( + "CMAKE_INSTALL_LOCALSTATEDIR", + cmake_install_dir_value(prefix, &dirs.localstatedir), + ), + ( + "CMAKE_INSTALL_SHAREDSTATEDIR", + cmake_install_dir_value(prefix, &dirs.sharedstatedir), + ), + ( + "CMAKE_INSTALL_INCLUDEDIR", + cmake_install_dir_value(prefix, &dirs.includedir), + ), + ( + "CMAKE_INSTALL_DATAROOTDIR", + cmake_install_dir_value(prefix, &dirs.datarootdir), + ), + ( + "CMAKE_INSTALL_DATADIR", + cmake_install_dir_value(prefix, &dirs.datadir), + ), + ( + "CMAKE_INSTALL_MANDIR", + cmake_install_dir_value(prefix, &dirs.mandir), + ), + ( + "CMAKE_INSTALL_INFODIR", + cmake_install_dir_value(prefix, &dirs.infodir), + ), ]; defaults @@ -340,6 +378,26 @@ fn cmake_install_dir_args(flags: &crate::package::BuildFlags) -> Vec { .collect() } +fn cmake_install_dir_value(prefix: &str, value: &str) -> String { + let trimmed_prefix = prefix.trim(); + let trimmed_value = value.trim(); + if trimmed_prefix.is_empty() || trimmed_value.is_empty() { + return trimmed_value.to_string(); + } + + let prefix_path = Path::new(trimmed_prefix); + let value_path = Path::new(trimmed_value); + if !prefix_path.is_absolute() || !value_path.is_absolute() { + return trimmed_value.to_string(); + } + + match value_path.strip_prefix(prefix_path) { + Ok(rel) if rel.as_os_str().is_empty() => ".".to_string(), + Ok(rel) => rel.to_string_lossy().replace('\\', "/"), + Err(_) => trimmed_value.to_string(), + } +} + fn num_cpus() -> usize { std::thread::available_parallelism() .map(|n| n.get()) @@ -523,13 +581,10 @@ mod tests { #[test] fn test_cmake_install_dir_args_include_defaults() { let args = cmake_install_dir_args(&BuildFlags::default()); - assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_BINDIR=/usr/bin")); - assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_SBINDIR=/usr/bin")); - assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_LIBDIR=/usr/lib")); - assert!( - args.iter() - .any(|a| a == "-DCMAKE_INSTALL_LIBEXECDIR=/usr/lib") - ); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_BINDIR=bin")); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_SBINDIR=bin")); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_LIBDIR=lib")); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_LIBEXECDIR=lib")); assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_SYSCONFDIR=/etc")); assert!( args.iter() @@ -541,23 +596,17 @@ mod tests { ); assert!( args.iter() - .any(|a| a == "-DCMAKE_INSTALL_INCLUDEDIR=/usr/include") + .any(|a| a == "-DCMAKE_INSTALL_INCLUDEDIR=include") ); assert!( args.iter() - .any(|a| a == "-DCMAKE_INSTALL_DATAROOTDIR=/usr/share") + .any(|a| a == "-DCMAKE_INSTALL_DATAROOTDIR=share") ); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_DATADIR=share")); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_MANDIR=share/man")); assert!( args.iter() - .any(|a| a == "-DCMAKE_INSTALL_DATADIR=/usr/share") - ); - assert!( - args.iter() - .any(|a| a == "-DCMAKE_INSTALL_MANDIR=/usr/share/man") - ); - assert!( - args.iter() - .any(|a| a == "-DCMAKE_INSTALL_INFODIR=/usr/share/info") + .any(|a| a == "-DCMAKE_INSTALL_INFODIR=share/info") ); } @@ -588,7 +637,19 @@ mod tests { .iter() .any(|a| a.starts_with("-DCMAKE_INSTALL_DATADIR=")) ); - assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_BINDIR=/usr/bin")); + assert!(args.iter().any(|a| a == "-DCMAKE_INSTALL_BINDIR=bin")); + } + + #[test] + fn test_cmake_install_dir_value_makes_prefix_children_relative() { + assert_eq!(cmake_install_dir_value("/usr", "/usr/include"), "include"); + assert_eq!(cmake_install_dir_value("/", "/usr/include"), "usr/include"); + assert_eq!( + cmake_install_dir_value("/opt/depot", "/opt/depot/lib64"), + "lib64" + ); + assert_eq!(cmake_install_dir_value("/usr", "/etc"), "/etc"); + assert_eq!(cmake_install_dir_value("/usr", "include"), "include"); } #[test]