Remove special cases from bindgen path management
This commit is contained in:
parent
00d7a3db0b
commit
e33a57c6eb
|
|
@ -50,58 +50,46 @@ function(r2r_cargo)
|
||||||
list(APPEND CMAKE_IDL_PACKAGES "${REC_PKG_DIRS}")
|
list(APPEND CMAKE_IDL_PACKAGES "${REC_PKG_DIRS}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
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
|
# On OSX colcon eats the DYLD_LIBRARY_PATH... so we need to add the rpaths
|
||||||
# manually...
|
# manually...
|
||||||
set(RUSTFLAGS "")
|
set(RUSTFLAGS "")
|
||||||
|
|
||||||
# get imported libs
|
# get imported libs
|
||||||
get_property(importTargets DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY IMPORTED_TARGETS)
|
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})
|
foreach(p ${importTargets})
|
||||||
get_property(fancy_lib_location TARGET "${p}" PROPERTY LOCATION)
|
get_property(_LIBLOC TARGET "${p}" PROPERTY LOCATION)
|
||||||
if(DEFINED fancy_lib_location)
|
if(DEFINED _LIBLOC)
|
||||||
list(APPEND CMAKE_LIBRARIES "${fancy_lib_location}")
|
list(APPEND CMAKE_LIBRARIES "${_LIBLOC}")
|
||||||
get_filename_component(_parent "${fancy_lib_location}" DIRECTORY)
|
get_filename_component(_PARENT "${_LIBLOC}" DIRECTORY)
|
||||||
if(IS_DIRECTORY ${_parent})
|
if(IS_DIRECTORY ${_PARENT})
|
||||||
list(APPEND RUSTFLAGS "-C link-arg=-Wl,-rpath,${_parent}")
|
list(APPEND RUSTFLAGS "-C link-arg=-Wl,-rpath,${_PARENT}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
list(REMOVE_DUPLICATES RUSTFLAGS)
|
|
||||||
list(REMOVE_DUPLICATES CMAKE_LIBRARIES)
|
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES RUSTFLAGS)
|
||||||
string (REPLACE ";" " " RUSTFLAGS_STR "${RUSTFLAGS}")
|
string (REPLACE ";" " " RUSTFLAGS_STR "${RUSTFLAGS}")
|
||||||
set(ENV{RUSTFLAGS} ${RUSTFLAGS_STR})
|
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
|
# custom target for building using cargo
|
||||||
option(CARGO_CLEAN "Invoke cargo clean before building" OFF)
|
option(CARGO_CLEAN "Invoke cargo clean before building" OFF)
|
||||||
if(CARGO_CLEAN)
|
if(CARGO_CLEAN)
|
||||||
add_custom_target(cargo_target ALL
|
add_custom_target(cargo_target ALL
|
||||||
COMMAND ${CMAKE_COMMAND} "-E" "env" "cargo" "clean" "--profile" "colcon"
|
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}
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
add_custom_target(cargo_target ALL
|
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}
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
endif(CARGO_CLEAN)
|
endif()
|
||||||
unset(CARGO_CLEAN CACHE)
|
unset(CARGO_CLEAN CACHE)
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ documentation = "https://docs.rs/r2r/latest/r2r"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bindgen = "0.63.0"
|
bindgen = "0.63.0"
|
||||||
itertools = "0.10.5"
|
|
||||||
sha2 = "0.10.6"
|
sha2 = "0.10.6"
|
||||||
os_str_bytes = "6.5.1"
|
os_str_bytes = "6.5.1"
|
||||||
regex = "1.8.4"
|
regex = "1.8.4"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
use itertools::Itertools;
|
|
||||||
use os_str_bytes::RawOsString;
|
use os_str_bytes::RawOsString;
|
||||||
use regex::*;
|
use regex::*;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
|
|
@ -14,8 +13,6 @@ const SUPPORTED_ROS_DISTROS: &[&str] = &["foxy", "galactic", "humble", "rolling"
|
||||||
const WATCHED_ENV_VARS: &[&str] = &[
|
const WATCHED_ENV_VARS: &[&str] = &[
|
||||||
"AMENT_PREFIX_PATH",
|
"AMENT_PREFIX_PATH",
|
||||||
"CMAKE_PREFIX_PATH",
|
"CMAKE_PREFIX_PATH",
|
||||||
"CMAKE_INCLUDE_DIRS",
|
|
||||||
"CMAKE_LIBRARIES",
|
|
||||||
"CMAKE_IDL_PACKAGES",
|
"CMAKE_IDL_PACKAGES",
|
||||||
"IDL_PACKAGE_FILTER",
|
"IDL_PACKAGE_FILTER",
|
||||||
"ROS_DISTRO",
|
"ROS_DISTRO",
|
||||||
|
|
@ -50,22 +47,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,
|
||||||
});
|
});
|
||||||
if let Ok(cmake_includes) = env::var("CMAKE_INCLUDE_DIRS") {
|
if !cfg!(feature = "doc-only") {
|
||||||
// we are running from cmake, do special thing.
|
|
||||||
let mut includes = cmake_includes.split(':').collect::<Vec<_>>();
|
|
||||||
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") {
|
|
||||||
let ament_prefix_var_name = "AMENT_PREFIX_PATH";
|
let ament_prefix_var_name = "AMENT_PREFIX_PATH";
|
||||||
let ament_prefix_var = if !cfg!(target_os = "windows") {
|
let ament_prefix_var = {
|
||||||
RawOsString::new(env::var_os(ament_prefix_var_name).expect("Source your ROS!"))
|
|
||||||
} else {
|
|
||||||
let mut ament_str = env::var_os(ament_prefix_var_name).expect("Source your ROS!");
|
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") {
|
if let Some(cmake_prefix_var) = env::var_os("CMAKE_PREFIX_PATH") {
|
||||||
ament_str.push(";");
|
ament_str.push(";");
|
||||||
|
|
@ -150,53 +134,21 @@ pub fn print_cargo_ros_distro() {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_cargo_link_search() {
|
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";
|
let ament_prefix_var_name = "AMENT_PREFIX_PATH";
|
||||||
if let Some(paths) = env::var_os(ament_prefix_var_name) {
|
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)
|
|
||||||
} else {
|
|
||||||
RawOsString::new(paths)
|
|
||||||
};
|
|
||||||
let split_char = if cfg!(target_os = "windows") {
|
let split_char = if cfg!(target_os = "windows") {
|
||||||
';'
|
';'
|
||||||
} else {
|
} 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) {
|
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");
|
||||||
|
|
@ -215,7 +167,6 @@ pub fn print_cargo_link_search() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_wanted_messages() -> Vec<RosMsg> {
|
pub fn get_wanted_messages() -> Vec<RosMsg> {
|
||||||
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") {
|
||||||
|
|
@ -235,18 +186,6 @@ pub fn get_wanted_messages() -> Vec<RosMsg> {
|
||||||
} else {
|
} else {
|
||||||
':'
|
':'
|
||||||
};
|
};
|
||||||
if !cfg!(target_os = "windows") {
|
|
||||||
if let Ok(ament_prefix_var) = env::var("AMENT_PREFIX_PATH") {
|
|
||||||
let paths = ament_prefix_var
|
|
||||||
.split(split_char)
|
|
||||||
.map(Path::new)
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
get_ros_msgs(&paths)
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match (env::var("AMENT_PREFIX_PATH"), env::var("CMAKE_PREFIX_PATH")) {
|
match (env::var("AMENT_PREFIX_PATH"), env::var("CMAKE_PREFIX_PATH")) {
|
||||||
(Ok(ament_prefix_var), Ok(cmake_prefix_var)) => {
|
(Ok(ament_prefix_var), Ok(cmake_prefix_var)) => {
|
||||||
let mut paths = ament_prefix_var
|
let mut paths = ament_prefix_var
|
||||||
|
|
@ -272,7 +211,6 @@ pub fn get_wanted_messages() -> Vec<RosMsg> {
|
||||||
}
|
}
|
||||||
_ => vec![],
|
_ => vec![],
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let msgs = parse_msgs(&msgs);
|
let msgs = parse_msgs(&msgs);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue