Restore old cmake integration functionality on windows

This commit is contained in:
Martin Dahl 2023-09-26 15:41:46 +02:00
parent 45e862b79e
commit 0a6e0f571a
1 changed files with 30 additions and 21 deletions

View File

@ -50,14 +50,9 @@ pub fn setup_bindgen_builder() -> bindgen::Builder {
.default_enum_style(bindgen::EnumVariation::Rust { .default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: false, non_exhaustive: false,
}); });
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
if let Ok(cmake_includes) = env::var("CMAKE_INCLUDE_DIRS") { if let Ok(cmake_includes) = env::var("CMAKE_INCLUDE_DIRS") {
// we are running from cmake, do special thing. // we are running from cmake, do special thing.
let mut includes = cmake_includes.split(split_char).collect::<Vec<_>>(); let mut includes = cmake_includes.split(':').collect::<Vec<_>>();
includes.sort_unstable(); includes.sort_unstable();
includes.dedup(); includes.dedup();
@ -78,6 +73,11 @@ pub fn setup_bindgen_builder() -> bindgen::Builder {
} }
RawOsString::new(ament_str) RawOsString::new(ament_str)
}; };
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
for p in ament_prefix_var.split(split_char) { for p in ament_prefix_var.split(split_char) {
let path = Path::new(&p.to_os_str()).join("include"); let path = Path::new(&p.to_os_str()).join("include");
@ -150,16 +150,11 @@ pub fn print_cargo_ros_distro() {
} }
pub fn print_cargo_link_search() { pub fn print_cargo_link_search() {
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
if env::var_os("CMAKE_INCLUDE_DIRS").is_some() { if env::var_os("CMAKE_INCLUDE_DIRS").is_some() {
if let Some(paths) = env::var_os("CMAKE_LIBRARIES") { if let Some(paths) = env::var_os("CMAKE_LIBRARIES") {
let paths = RawOsString::new(paths); let paths = RawOsString::new(paths);
paths paths
.split(split_char) .split(':')
.filter(|s| { .filter(|s| {
s.contains(".so") s.contains(".so")
|| s.contains(".dylib") || s.contains(".dylib")
@ -167,10 +162,19 @@ pub fn print_cargo_link_search() {
|| s.contains(".lib") || s.contains(".lib")
}) })
.filter_map(|l| { .filter_map(|l| {
let is_dll = l.contains(".dll");
let l = l.to_os_str(); let l = l.to_os_str();
let parent = Path::new(&l).parent()?; let parent = if is_dll {
let parent = parent.to_str()?; // Hack to replace /bin with /lib on windows
Some(parent.to_string()) // (may not work in all cases)
// Should really be fixed in cmake integration
// but annoying to replace that file in all
// repos that use it.
Path::new(&l).parent()?.parent()?.join("lib").to_str()?.to_string()
} else {
Path::new(&l).parent()?.to_str()?.to_string()
};
Some(parent)
}) })
.unique() .unique()
.for_each(|pp| println!("cargo:rustc-link-search=native={}", pp)); .for_each(|pp| println!("cargo:rustc-link-search=native={}", pp));
@ -188,6 +192,11 @@ pub fn print_cargo_link_search() {
} else { } else {
RawOsString::new(paths) RawOsString::new(paths)
}; };
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
for path in paths.split(split_char) { for path in paths.split(split_char) {
if cfg!(target_os = "windows") { if cfg!(target_os = "windows") {
let lib_path = Path::new(&path.to_os_str()).join("Lib"); let lib_path = Path::new(&path.to_os_str()).join("Lib");
@ -209,23 +218,23 @@ pub fn print_cargo_link_search() {
} }
pub fn get_wanted_messages() -> Vec<RosMsg> { pub fn get_wanted_messages() -> Vec<RosMsg> {
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
let msgs = if let Ok(cmake_package_dirs) = env::var("CMAKE_IDL_PACKAGES") { let msgs = if let Ok(cmake_package_dirs) = env::var("CMAKE_IDL_PACKAGES") {
// CMAKE_PACKAGE_DIRS should be a (cmake) list of "cmake" dirs // CMAKE_PACKAGE_DIRS should be a (cmake) list of "cmake" dirs
// e.g. For each dir install/r2r_minimal_node_msgs/share/r2r_minimal_node_msgs/cmake // e.g. For each dir install/r2r_minimal_node_msgs/share/r2r_minimal_node_msgs/cmake
// we can traverse back and then look for .msg files in msg/ srv/ action/ // we can traverse back and then look for .msg files in msg/ srv/ action/
let dirs = cmake_package_dirs let dirs = cmake_package_dirs
.split(split_char) .split(':')
.flat_map(|i| Path::new(i).parent()) .flat_map(|i| Path::new(i).parent())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
get_ros_msgs_files(&dirs) get_ros_msgs_files(&dirs)
} else { } else {
// Else we look for all msgs we can find using the ament prefix path. // Else we look for all msgs we can find using the ament prefix path.
let split_char = if cfg!(target_os = "windows") {
';'
} else {
':'
};
if !cfg!(target_os = "windows") { if !cfg!(target_os = "windows") {
if let Ok(ament_prefix_var) = env::var("AMENT_PREFIX_PATH") { if let Ok(ament_prefix_var) = env::var("AMENT_PREFIX_PATH") {
let paths = ament_prefix_var let paths = ament_prefix_var