From e33a57c6ebbc2c736e43e98d616edd3a4b9e6725 Mon Sep 17 00:00:00 2001 From: Martin Dahl Date: Wed, 4 Oct 2023 08:09:55 +0200 Subject: [PATCH] Remove special cases from bindgen path management --- r2r_cargo.cmake | 42 ++++-------- r2r_common/Cargo.toml | 1 - r2r_common/src/lib.rs | 154 +++++++++++++----------------------------- 3 files changed, 61 insertions(+), 136 deletions(-) diff --git a/r2r_cargo.cmake b/r2r_cargo.cmake index d6c5a1d..02fbd04 100644 --- a/r2r_cargo.cmake +++ b/r2r_cargo.cmake @@ -50,58 +50,46 @@ function(r2r_cargo) list(APPEND CMAKE_IDL_PACKAGES "${REC_PKG_DIRS}") endforeach() - # On OSX colcon eats the DYLD_LIBRARY_PATH... so we need to add the rpaths + list(REMOVE_DUPLICATES CMAKE_IDL_PACKAGES) + string (REPLACE ";" ":" CMAKE_IDL_PACKAGES_STR "${CMAKE_IDL_PACKAGES}") + set(ENV{CMAKE_IDL_PACKAGES} ${CMAKE_IDL_PACKAGES_STR}) + + # On OSX colcon eats the DYLD_LIBRARY_PATH... so we need to add the rpaths # manually... set(RUSTFLAGS "") # get imported libs get_property(importTargets DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY IMPORTED_TARGETS) - # get include paths - get_property(includeDirs DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY INCLUDE_DIRECTORIES) - set(CMAKE_LIBRARIES "") foreach(p ${importTargets}) - get_property(fancy_lib_location TARGET "${p}" PROPERTY LOCATION) - if(DEFINED fancy_lib_location) - list(APPEND CMAKE_LIBRARIES "${fancy_lib_location}") - get_filename_component(_parent "${fancy_lib_location}" DIRECTORY) - if(IS_DIRECTORY ${_parent}) - list(APPEND RUSTFLAGS "-C link-arg=-Wl,-rpath,${_parent}") + get_property(_LIBLOC TARGET "${p}" PROPERTY LOCATION) + if(DEFINED _LIBLOC) + list(APPEND CMAKE_LIBRARIES "${_LIBLOC}") + get_filename_component(_PARENT "${_LIBLOC}" DIRECTORY) + if(IS_DIRECTORY ${_PARENT}) + list(APPEND RUSTFLAGS "-C link-arg=-Wl,-rpath,${_PARENT}") endif() endif() endforeach() - list(REMOVE_DUPLICATES RUSTFLAGS) - list(REMOVE_DUPLICATES CMAKE_LIBRARIES) + list(REMOVE_DUPLICATES RUSTFLAGS) string (REPLACE ";" " " RUSTFLAGS_STR "${RUSTFLAGS}") set(ENV{RUSTFLAGS} ${RUSTFLAGS_STR}) - string (REPLACE ";" ":" CMAKE_LIBRARIES_STR "${CMAKE_LIBRARIES}") - set(ENV{CMAKE_LIBRARIES} "${CMAKE_LIBRARIES_STR}") - - list(REMOVE_DUPLICATES includeDirs) - string (REPLACE ";" ":" CMAKE_INCLUDE_DIRS_STR "${includeDirs}") - set(ENV{CMAKE_INCLUDE_DIRS} ${CMAKE_INCLUDE_DIRS_STR}) - list(REMOVE_DUPLICATES CMAKE_LIBRARIES) - - list(REMOVE_DUPLICATES CMAKE_IDL_PACKAGES) - string (REPLACE ";" ":" CMAKE_IDL_PACKAGES_STR "${CMAKE_IDL_PACKAGES}") - set(ENV{CMAKE_IDL_PACKAGES} ${CMAKE_IDL_PACKAGES_STR}) - # custom target for building using cargo option(CARGO_CLEAN "Invoke cargo clean before building" OFF) if(CARGO_CLEAN) add_custom_target(cargo_target ALL COMMAND ${CMAKE_COMMAND} "-E" "env" "cargo" "clean" "--profile" "colcon" - COMMAND ${CMAKE_COMMAND} "-E" "env" "RUSTFLAGS=$ENV{RUSTFLAGS}" "CMAKE_INCLUDE_DIRS=$ENV{CMAKE_INCLUDE_DIRS}" "CMAKE_LIBRARIES=$ENV{CMAKE_LIBRARIES}" "CMAKE_IDL_PACKAGES=$ENV{CMAKE_IDL_PACKAGES}" "cargo" "build" "--profile" "colcon" + COMMAND ${CMAKE_COMMAND} "-E" "env" "RUSTFLAGS=$ENV{RUSTFLAGS}" "CMAKE_IDL_PACKAGES=$ENV{CMAKE_IDL_PACKAGES}" "cargo" "build" "--profile" "colcon" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) else() add_custom_target(cargo_target ALL - COMMAND ${CMAKE_COMMAND} "-E" "env" "RUSTFLAGS=$ENV{RUSTFLAGS}" "CMAKE_INCLUDE_DIRS=$ENV{CMAKE_INCLUDE_DIRS}" "CMAKE_LIBRARIES=$ENV{CMAKE_LIBRARIES}" "CMAKE_IDL_PACKAGES=$ENV{CMAKE_IDL_PACKAGES}" "cargo" "build" "--profile" "colcon" + COMMAND ${CMAKE_COMMAND} "-E" "env" "RUSTFLAGS=$ENV{RUSTFLAGS}" "CMAKE_IDL_PACKAGES=$ENV{CMAKE_IDL_PACKAGES}" "cargo" "build" "--profile" "colcon" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) - endif(CARGO_CLEAN) + endif() unset(CARGO_CLEAN CACHE) endfunction() diff --git a/r2r_common/Cargo.toml b/r2r_common/Cargo.toml index 75bc855..409f3d2 100644 --- a/r2r_common/Cargo.toml +++ b/r2r_common/Cargo.toml @@ -12,7 +12,6 @@ documentation = "https://docs.rs/r2r/latest/r2r" [dependencies] bindgen = "0.63.0" -itertools = "0.10.5" sha2 = "0.10.6" os_str_bytes = "6.5.1" regex = "1.8.4" diff --git a/r2r_common/src/lib.rs b/r2r_common/src/lib.rs index b0c64b7..a1ef910 100644 --- a/r2r_common/src/lib.rs +++ b/r2r_common/src/lib.rs @@ -1,4 +1,3 @@ -use itertools::Itertools; use os_str_bytes::RawOsString; use regex::*; use sha2::{Digest, Sha256}; @@ -14,8 +13,6 @@ const SUPPORTED_ROS_DISTROS: &[&str] = &["foxy", "galactic", "humble", "rolling" const WATCHED_ENV_VARS: &[&str] = &[ "AMENT_PREFIX_PATH", "CMAKE_PREFIX_PATH", - "CMAKE_INCLUDE_DIRS", - "CMAKE_LIBRARIES", "CMAKE_IDL_PACKAGES", "IDL_PACKAGE_FILTER", "ROS_DISTRO", @@ -50,22 +47,9 @@ pub fn setup_bindgen_builder() -> bindgen::Builder { .default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: false, }); - if let Ok(cmake_includes) = env::var("CMAKE_INCLUDE_DIRS") { - // we are running from cmake, do special thing. - let mut includes = cmake_includes.split(':').collect::>(); - includes.sort_unstable(); - includes.dedup(); - - for x in &includes { - let clang_arg = format!("-I{}", x); - println!("adding clang arg: {}", clang_arg); - builder = builder.clang_arg(clang_arg); - } - } else if !cfg!(feature = "doc-only") { + if !cfg!(feature = "doc-only") { let ament_prefix_var_name = "AMENT_PREFIX_PATH"; - let ament_prefix_var = if !cfg!(target_os = "windows") { - RawOsString::new(env::var_os(ament_prefix_var_name).expect("Source your ROS!")) - } else { + let ament_prefix_var = { let mut ament_str = env::var_os(ament_prefix_var_name).expect("Source your ROS!"); if let Some(cmake_prefix_var) = env::var_os("CMAKE_PREFIX_PATH") { ament_str.push(";"); @@ -150,67 +134,34 @@ pub fn print_cargo_ros_distro() { } pub fn print_cargo_link_search() { - if env::var_os("CMAKE_INCLUDE_DIRS").is_some() { - if let Some(paths) = env::var_os("CMAKE_LIBRARIES") { - let paths = RawOsString::new(paths); - paths - .split(':') - .filter(|s| { - s.contains(".so") - || s.contains(".dylib") - || s.contains(".dll") - || s.contains(".lib") - }) - .filter_map(|l| { - let is_dll = l.contains(".dll"); - let l = l.to_os_str(); - let parent = if is_dll { - // Hack to replace /bin with /lib on windows - // (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() - .for_each(|pp| println!("cargo:rustc-link-search=native={}", pp)); - } - } else { - let ament_prefix_var_name = "AMENT_PREFIX_PATH"; - if let Some(paths) = env::var_os(ament_prefix_var_name) { - let paths = if !cfg!(target_os = "windows") { - RawOsString::new(paths) - } else if let Some(cmake_prefix_var) = env::var_os("CMAKE_PREFIX_PATH") { - let mut cmake_paths = paths; - cmake_paths.push(";"); - cmake_paths.push(cmake_prefix_var); - RawOsString::new(cmake_paths) + let ament_prefix_var_name = "AMENT_PREFIX_PATH"; + if let Some(paths) = env::var_os(ament_prefix_var_name) { + let split_char = if cfg!(target_os = "windows") { + ';' + } else { + ':' + }; + let paths = if let Some(cmake_prefix_var) = env::var_os("CMAKE_PREFIX_PATH") { + let mut cmake_paths = paths; + cmake_paths.push(split_char.to_string()); + cmake_paths.push(cmake_prefix_var); + RawOsString::new(cmake_paths) + } else { + RawOsString::new(paths) + }; + for path in paths.split(split_char) { + if cfg!(target_os = "windows") { + let lib_path = Path::new(&path.to_os_str()).join("Lib"); + if !lib_path.exists() { + continue; + } + if let Some(s) = lib_path.to_str() { + println!("cargo:rustc-link-search={}", s); + } } else { - RawOsString::new(paths) - }; - let split_char = if cfg!(target_os = "windows") { - ';' - } else { - ':' - }; - for path in paths.split(split_char) { - if cfg!(target_os = "windows") { - let lib_path = Path::new(&path.to_os_str()).join("Lib"); - if !lib_path.exists() { - continue; - } - if let Some(s) = lib_path.to_str() { - println!("cargo:rustc-link-search={}", s); - } - } else { - let lib_path = Path::new(&path.to_os_str()).join("lib"); - if let Some(s) = lib_path.to_str() { - println!("cargo:rustc-link-search=native={}", s) - } + let lib_path = Path::new(&path.to_os_str()).join("lib"); + if let Some(s) = lib_path.to_str() { + println!("cargo:rustc-link-search=native={}", s) } } } @@ -235,43 +186,30 @@ pub fn get_wanted_messages() -> Vec { } else { ':' }; - if !cfg!(target_os = "windows") { - if let Ok(ament_prefix_var) = env::var("AMENT_PREFIX_PATH") { + match (env::var("AMENT_PREFIX_PATH"), env::var("CMAKE_PREFIX_PATH")) { + (Ok(ament_prefix_var), Ok(cmake_prefix_var)) => { + let mut paths = ament_prefix_var + .split(split_char) + .map(Path::new) + .collect::>(); + paths.extend(cmake_prefix_var.split(split_char).map(Path::new)); + get_ros_msgs(&paths) + } + (Ok(ament_prefix_var), _) => { let paths = ament_prefix_var .split(split_char) .map(Path::new) .collect::>(); - get_ros_msgs(&paths) - } else { - vec![] } - } else { - match (env::var("AMENT_PREFIX_PATH"), env::var("CMAKE_PREFIX_PATH")) { - (Ok(ament_prefix_var), Ok(cmake_prefix_var)) => { - let mut paths = ament_prefix_var - .split(split_char) - .map(Path::new) - .collect::>(); - paths.extend(cmake_prefix_var.split(split_char).map(Path::new)); - get_ros_msgs(&paths) - } - (Ok(ament_prefix_var), _) => { - let paths = ament_prefix_var - .split(split_char) - .map(Path::new) - .collect::>(); - get_ros_msgs(&paths) - } - (_, Ok(cmake_prefix_var)) => { - let paths = cmake_prefix_var - .split(split_char) - .map(Path::new) - .collect::>(); - get_ros_msgs(&paths) - } - _ => vec![], + (_, Ok(cmake_prefix_var)) => { + let paths = cmake_prefix_var + .split(split_char) + .map(Path::new) + .collect::>(); + get_ros_msgs(&paths) } + _ => vec![], } };