From ac3a9b0485d940d6189d5653cfa7992d89bd152e Mon Sep 17 00:00:00 2001 From: Martin Dahl Date: Mon, 7 Feb 2022 14:39:15 +0100 Subject: [PATCH] fix rolling compilation issues --- r2r_actions/build.rs | 21 +++++++++---- r2r_common/src/lib.rs | 30 ++++++++++++++++++- r2r_msg_gen/build.rs | 5 +++- r2r_msg_gen/src/lib.rs | 67 +++++++++++++++++++++++++++--------------- r2r_rcl/build.rs | 15 ++++++---- src/msg_types.rs | 5 +--- 6 files changed, 102 insertions(+), 41 deletions(-) diff --git a/r2r_actions/build.rs b/r2r_actions/build.rs index d499ec6..f16b65b 100644 --- a/r2r_actions/build.rs +++ b/r2r_actions/build.rs @@ -42,12 +42,15 @@ fn main() { let ament_prefix_var = env::var(ament_prefix_var_name).expect("Source your ROS!"); for ament_prefix_path in ament_prefix_var.split(':') { - builder = builder.clang_arg(format!("-I{}/include", ament_prefix_path)); - println!( - "added include search dir: {}", - format!("-I{}/include", ament_prefix_path) - ); - println!("cargo:rustc-link-search=native={}/lib", ament_prefix_path); + if let Some(include_path) = r2r_common::guess_cmake_include_path(Path::new(ament_prefix_path)) { + if let Some(s) = include_path.to_str() { + builder = builder.clang_arg(format!("-I{}", s)); + }; + } + let lib_path = Path::new(ament_prefix_path).join("lib"); + lib_path.to_str().map(|s| { + println!("cargo:rustc-link-search=native={}", s); + }); } } @@ -67,15 +70,21 @@ fn main() { .allowlist_type("rcl_action_goal_handle_t") .opaque_type("rcl_action_goal_handle_t") .allowlist_type("rcl_action_cancel_request_t") + .allowlist_type("rcl_action_cancel_request_s") + .opaque_type("rcl_action_cancel_request_s") .allowlist_type("rcl_action_cancel_response_t") + .allowlist_type("rcl_action_cancel_response_s") .allowlist_type("rcl_action_goal_event_t") + .allowlist_type("rcl_action_goal_event_e") .allowlist_type("rcl_action_goal_state_t") .opaque_type("rcl_action_goal_state_t") .allowlist_type("rcl_action_goal_status_array_t") .opaque_type("rcl_action_goal_status_array_t") .allowlist_function("rcl_action_.*") .allowlist_type("rcl_action_client_options_t") + .opaque_type("rcl_action_client_options_t") .allowlist_type("rcl_action_server_options_t") + .opaque_type("rcl_action_server_options_t") .allowlist_var("RCL_RET_ACTION_.*") .generate_comments(false) .generate() diff --git a/r2r_common/src/lib.rs b/r2r_common/src/lib.rs index 0621052..50a3150 100644 --- a/r2r_common/src/lib.rs +++ b/r2r_common/src/lib.rs @@ -1,7 +1,35 @@ use std::collections::HashMap; use std::fs::{self, File}; use std::io::Read; -use std::path::Path; +use std::path::{Path, PathBuf}; + +// Hack to build rolling after https://github.com/ros2/rcl/pull/959 was merged. +// +// The problem is that now we need to use CMAKE to properly find the +// include paths. But we don't want to do that so we hope that the ros +// developers use the same convention everytime they move the include +// files to a subdirectory. +// +// The convention is to put include files in include/${PROJECT_NAME} +// +// So we check if there is a double directory on the form +// include/${PROJECT_NAME}/${PROJECT_NAME}, and if so append it only once. +// +// Should work mostly, and shouldn't really change often, so manual +// intervention could be applied. But yes it is hacky. +pub fn guess_cmake_include_path(path: &Path) -> Option { + if let Some(leaf) = path.file_name() { + let double_include_path = Path::new(path).join("include").join(leaf).join(leaf); + if double_include_path.is_dir() { + // double dir detected, append the package name + return Some(path.to_owned().join("include").join(leaf)); + } else { + // dont append + return Some(path.to_owned().join("include")); + } + } + return None; +} pub fn print_cargo_watches() { println!("cargo:rerun-if-env-changed=AMENT_PREFIX_PATH"); diff --git a/r2r_msg_gen/build.rs b/r2r_msg_gen/build.rs index 98a52db..910d629 100644 --- a/r2r_msg_gen/build.rs +++ b/r2r_msg_gen/build.rs @@ -28,7 +28,10 @@ fn main() { } else { let ament_prefix_var = env::var("AMENT_PREFIX_PATH").expect("Source your ROS!"); for p in ament_prefix_var.split(':') { - builder = builder.clang_arg(format!("-I{}/include", p)); + let path = Path::new(p).join("include"); + if let Some(s) = path.to_str() { + builder = builder.clang_arg(format!("-I{}", s)); + } } let paths = ament_prefix_var .split(':') diff --git a/r2r_msg_gen/src/lib.rs b/r2r_msg_gen/src/lib.rs index d6cac3f..746cc88 100644 --- a/r2r_msg_gen/src/lib.rs +++ b/r2r_msg_gen/src/lib.rs @@ -15,45 +15,66 @@ use std::collections::HashMap; use std::ffi::CStr; +// because the c enum has been named between galactic and the next release, +// we cannot know its name. therefor we use the constants as is and hope we notice +// when they change. +// rosidl_typesupport_introspection_c__ROS_TYPE_FLOAT = 1, +// rosidl_typesupport_introspection_c__ROS_TYPE_DOUBLE = 2, +// rosidl_typesupport_introspection_c__ROS_TYPE_LONG_DOUBLE = 3, +// rosidl_typesupport_introspection_c__ROS_TYPE_CHAR = 4, +// rosidl_typesupport_introspection_c__ROS_TYPE_WCHAR = 5, +// rosidl_typesupport_introspection_c__ROS_TYPE_BOOLEAN = 6, +// rosidl_typesupport_introspection_c__ROS_TYPE_OCTET = 7, +// rosidl_typesupport_introspection_c__ROS_TYPE_UINT8 = 8, +// rosidl_typesupport_introspection_c__ROS_TYPE_INT8 = 9, +// rosidl_typesupport_introspection_c__ROS_TYPE_UINT16 = 10, +// rosidl_typesupport_introspection_c__ROS_TYPE_INT16 = 11, +// rosidl_typesupport_introspection_c__ROS_TYPE_UINT32 = 12, +// rosidl_typesupport_introspection_c__ROS_TYPE_INT32 = 13, +// rosidl_typesupport_introspection_c__ROS_TYPE_UINT64 = 14, +// rosidl_typesupport_introspection_c__ROS_TYPE_INT64 = 15, +// rosidl_typesupport_introspection_c__ROS_TYPE_STRING = 16, +// rosidl_typesupport_introspection_c__ROS_TYPE_WSTRING = 17, +// rosidl_typesupport_introspection_c__ROS_TYPE_MESSAGE = 18, fn field_type(t: u8) -> String { // lovely... // move to common - if t == (rosidl_typesupport_introspection_c__ROS_TYPE_STRING as u8) { + if t == 16 { "std::string::String".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_WSTRING as u8) { + } else if t == 17 { "std::string::String".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_BOOLEAN as u8) { + } else if t == 6 { "bool".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_CHAR as u8) { + } else if t == 4 { "i8".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_WCHAR as u8) { - "u16".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_OCTET as u8) { - "u8".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_UINT8 as u8) { - "u8".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_INT8 as u8) { - "i8".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_UINT16 as u8) { - "u16".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_INT16 as u8) { + } else if t == 5 { "i16".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_UINT32 as u8) { + } else if t == 7 { + "u8".to_owned() + } else if t == 8 { + "u8".to_owned() + } else if t == 9 { + "i8".to_owned() + } else if t == 10 { + "u16".to_owned() + } else if t == 11 { + "i16".to_owned() + } else if t == 12 { "u32".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_INT32 as u8) { + } else if t == 13 { "i32".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_UINT64 as u8) { + } else if t == 14 { "u64".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_INT64 as u8) { + } else if t == 15 { "i64".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_FLOAT as u8) { + } else if t == 1 { "f32".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_DOUBLE as u8) { + } else if t == 2 { "f64".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_LONG_DOUBLE as u8) { + } else if t == 3 { // f128 does not exist in rust "u128".to_owned() - } else if t == (rosidl_typesupport_introspection_c__ROS_TYPE_MESSAGE as u8) { + } else if t == 18 { "message".to_owned() } else { panic!("ros native type not implemented: {}", t); diff --git a/r2r_rcl/build.rs b/r2r_rcl/build.rs index 7587d0e..66c8011 100644 --- a/r2r_rcl/build.rs +++ b/r2r_rcl/build.rs @@ -47,12 +47,15 @@ fn main() { let ament_prefix_var = env::var(ament_prefix_var_name).expect("Source your ROS!"); for ament_prefix_path in ament_prefix_var.split(':') { - builder = builder.clang_arg(format!("-I{}/include", ament_prefix_path)); - println!( - "added include search dir: {}", - format!("-I{}/include", ament_prefix_path) - ); - println!("cargo:rustc-link-search=native={}/lib", ament_prefix_path); + if let Some(include_path) = r2r_common::guess_cmake_include_path(Path::new(ament_prefix_path)) { + if let Some(s) = include_path.to_str() { + builder = builder.clang_arg(format!("-I{}", s)); + }; + } + let lib_path = Path::new(ament_prefix_path).join("lib"); + lib_path.to_str().map(|s| { + println!("cargo:rustc-link-search=native={}", s); + }); } } diff --git a/src/msg_types.rs b/src/msg_types.rs index 263f385..fbb66fc 100644 --- a/src/msg_types.rs +++ b/src/msg_types.rs @@ -460,10 +460,7 @@ mod tests { let type_id = (*member).type_id_; let is_array = (*member).is_array_; assert_eq!(field_name, "data"); - assert_eq!( - type_id, - rosidl_typesupport_introspection_c__ROS_TYPE_STRING as u8 - ); + assert_eq!(type_id, 16u8); // rosidl_typesupport_introspection_c__ROS_TYPE_STRING as u8 assert!(!is_array); } }