From 2e5050122506a4ae500e389072d2b04fadc703b6 Mon Sep 17 00:00:00 2001 From: Eric Cousineau Date: Mon, 25 Mar 2019 17:08:35 -0400 Subject: [PATCH] Add `rcpputils` for `find_library` Signed-off-by: Eric Cousineau --- rosidl_typesupport_c/CMakeLists.txt | 3 +- rosidl_typesupport_c/package.xml | 1 + .../src/type_support_dispatch.cpp | 87 ------------------- .../src/type_support_dispatch.hpp | 11 +-- rosidl_typesupport_cpp/CMakeLists.txt | 3 +- rosidl_typesupport_cpp/package.xml | 1 + .../src/type_support_dispatch.cpp | 87 ------------------- .../src/type_support_dispatch.hpp | 12 +-- 8 files changed, 10 insertions(+), 195 deletions(-) diff --git a/rosidl_typesupport_c/CMakeLists.txt b/rosidl_typesupport_c/CMakeLists.txt index a925dc7e..54300d31 100644 --- a/rosidl_typesupport_c/CMakeLists.txt +++ b/rosidl_typesupport_c/CMakeLists.txt @@ -19,6 +19,7 @@ find_package(ament_cmake_ros REQUIRED) # provides FindPoco.cmake and Poco on platforms without it find_package(poco_vendor) find_package(Poco COMPONENTS Foundation) +find_package(rcpputils REQUIRED) find_package(rosidl_generator_c REQUIRED) link_directories(${Poco_LIBRARY_DIR}) @@ -47,7 +48,7 @@ target_include_directories(${PROJECT_NAME} include ${Poco_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} ${Poco_LIBRARIES}) -ament_target_dependencies(${PROJECT_NAME} "rosidl_generator_c") +ament_target_dependencies(${PROJECT_NAME} "rcpputils" "rosidl_generator_c") ament_export_libraries(${PROJECT_NAME}) ament_index_register_resource("rosidl_runtime_packages") diff --git a/rosidl_typesupport_c/package.xml b/rosidl_typesupport_c/package.xml index adc21820..c7410482 100644 --- a/rosidl_typesupport_c/package.xml +++ b/rosidl_typesupport_c/package.xml @@ -9,6 +9,7 @@ ament_cmake_ros + rcpputils libpoco-dev poco_vendor rosidl_generator_c diff --git a/rosidl_typesupport_c/src/type_support_dispatch.cpp b/rosidl_typesupport_c/src/type_support_dispatch.cpp index 055aba05..b58f0236 100644 --- a/rosidl_typesupport_c/src/type_support_dispatch.cpp +++ b/rosidl_typesupport_c/src/type_support_dispatch.cpp @@ -13,90 +13,3 @@ // limitations under the License. #include "type_support_dispatch.hpp" - -#include -#include - -#include -#include - -namespace rosidl_typesupport_c -{ - -std::string find_library_path(const std::string & library_name) -{ - const char * env_var; - char separator; - const char * filename_prefix; - const char * filename_extension; -#ifdef _WIN32 - env_var = "PATH"; - separator = ';'; - filename_prefix = ""; - filename_extension = ".dll"; -#elif __APPLE__ - env_var = "DYLD_LIBRARY_PATH"; - separator = ':'; - filename_prefix = "lib"; - filename_extension = ".dylib"; -#else - env_var = "LD_LIBRARY_PATH"; - separator = ':'; - filename_prefix = "lib"; - filename_extension = ".so"; -#endif - std::string search_path = get_env_var(env_var); - std::list search_paths = split(search_path, separator); - - std::string filename = filename_prefix; - filename += library_name + filename_extension; - - for (auto it : search_paths) { - std::string path = it + "/" + filename; - if (is_file_exist(path.c_str())) { - return path; - } - } - return ""; -} - -std::string get_env_var(const char * env_var) -{ - char * value = nullptr; -#ifndef _WIN32 - value = getenv(env_var); -#else - size_t value_size; - _dupenv_s(&value, &value_size, env_var); -#endif - std::string value_str = ""; - if (value) { - value_str = value; -#ifdef _WIN32 - free(value); -#endif - } - // printf("get_env_var(%s) = %s\n", env_var, value_str.c_str()); - return value_str; -} - -std::list split(const std::string & value, const char delimiter) -{ - std::list list; - std::istringstream ss(value); - std::string s; - while (std::getline(ss, s, delimiter)) { - list.push_back(s); - } - // printf("split(%s) = %zu\n", value.c_str(), list.size()); - return list; -} - -bool is_file_exist(const char * filename) -{ - std::ifstream h(filename); - // printf("is_file_exist(%s) = %s\n", filename, h.good() ? "true" : "false"); - return h.good(); -} - -} // namespace rosidl_typesupport_c diff --git a/rosidl_typesupport_c/src/type_support_dispatch.hpp b/rosidl_typesupport_c/src/type_support_dispatch.hpp index f1f168ec..8b90af92 100644 --- a/rosidl_typesupport_c/src/type_support_dispatch.hpp +++ b/rosidl_typesupport_c/src/type_support_dispatch.hpp @@ -26,20 +26,13 @@ #include "Poco/SharedLibrary.h" #endif +#include "rcpputils/find_library.hpp" #include "rosidl_typesupport_c/identifier.h" #include "rosidl_typesupport_c/type_support_map.h" namespace rosidl_typesupport_c { -std::string find_library_path(const std::string & library_name); - -std::string get_env_var(const char * env_var); - -std::list split(const std::string & value, const char delimiter); - -bool is_file_exist(const char * filename); - extern const char * typesupport_identifier; template @@ -65,7 +58,7 @@ get_typesupport_handle_function( snprintf( library_name, 1023, "%s__%s", map->package_name, identifier); - std::string library_path = find_library_path(library_name); + std::string library_path = rcpputils::find_library_path(library_name); if (library_path.empty()) { fprintf(stderr, "Failed to find library '%s'\n", library_name); return nullptr; diff --git a/rosidl_typesupport_cpp/CMakeLists.txt b/rosidl_typesupport_cpp/CMakeLists.txt index 2deab67d..524e1e22 100644 --- a/rosidl_typesupport_cpp/CMakeLists.txt +++ b/rosidl_typesupport_cpp/CMakeLists.txt @@ -15,6 +15,7 @@ find_package(ament_cmake_ros REQUIRED) # provides FindPoco.cmake and Poco on platforms without it find_package(poco_vendor) find_package(Poco COMPONENTS Foundation) +find_package(rcpputils REQUIRED) find_package(rosidl_generator_c REQUIRED) link_directories(${Poco_LIBRARY_DIR}) @@ -44,7 +45,7 @@ target_include_directories(${PROJECT_NAME} include ${Poco_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} ${Poco_LIBRARIES}) -ament_target_dependencies(${PROJECT_NAME} "rosidl_generator_c") +ament_target_dependencies(${PROJECT_NAME} "rcpputils" "rosidl_generator_c") ament_export_libraries(${PROJECT_NAME}) ament_index_register_resource("rosidl_runtime_packages") diff --git a/rosidl_typesupport_cpp/package.xml b/rosidl_typesupport_cpp/package.xml index 7565a4b1..b3360d6d 100644 --- a/rosidl_typesupport_cpp/package.xml +++ b/rosidl_typesupport_cpp/package.xml @@ -9,6 +9,7 @@ ament_cmake_ros + rcpputils libpoco-dev poco_vendor rosidl_generator_c diff --git a/rosidl_typesupport_cpp/src/type_support_dispatch.cpp b/rosidl_typesupport_cpp/src/type_support_dispatch.cpp index 4ae04e1c..b58f0236 100644 --- a/rosidl_typesupport_cpp/src/type_support_dispatch.cpp +++ b/rosidl_typesupport_cpp/src/type_support_dispatch.cpp @@ -13,90 +13,3 @@ // limitations under the License. #include "type_support_dispatch.hpp" - -#include -#include - -#include -#include - -namespace rosidl_typesupport_cpp -{ - -std::string find_library_path(const std::string & library_name) -{ - const char * env_var; - char separator; - const char * filename_prefix; - const char * filename_extension; -#ifdef _WIN32 - env_var = "PATH"; - separator = ';'; - filename_prefix = ""; - filename_extension = ".dll"; -#elif __APPLE__ - env_var = "DYLD_LIBRARY_PATH"; - separator = ':'; - filename_prefix = "lib"; - filename_extension = ".dylib"; -#else - env_var = "LD_LIBRARY_PATH"; - separator = ':'; - filename_prefix = "lib"; - filename_extension = ".so"; -#endif - std::string search_path = get_env_var(env_var); - std::list search_paths = split(search_path, separator); - - std::string filename = filename_prefix; - filename += library_name + filename_extension; - - for (auto it : search_paths) { - std::string path = it + "/" + filename; - if (is_file_exist(path.c_str())) { - return path; - } - } - return ""; -} - -std::string get_env_var(const char * env_var) -{ - char * value = nullptr; -#ifndef _WIN32 - value = getenv(env_var); -#else - size_t value_size; - _dupenv_s(&value, &value_size, env_var); -#endif - std::string value_str = ""; - if (value) { - value_str = value; -#ifdef _WIN32 - free(value); -#endif - } - // printf("get_env_var(%s) = %s\n", env_var, value_str.c_str()); - return value_str; -} - -std::list split(const std::string & value, const char delimiter) -{ - std::list list; - std::istringstream ss(value); - std::string s; - while (std::getline(ss, s, delimiter)) { - list.push_back(s); - } - // printf("split(%s) = %zu\n", value.c_str(), list.size()); - return list; -} - -bool is_file_exist(const char * filename) -{ - std::ifstream h(filename); - // printf("is_file_exist(%s) = %s\n", filename, h.good() ? "true" : "false"); - return h.good(); -} - -} // namespace rosidl_typesupport_cpp diff --git a/rosidl_typesupport_cpp/src/type_support_dispatch.hpp b/rosidl_typesupport_cpp/src/type_support_dispatch.hpp index 4941b3ed..c9f54245 100644 --- a/rosidl_typesupport_cpp/src/type_support_dispatch.hpp +++ b/rosidl_typesupport_cpp/src/type_support_dispatch.hpp @@ -19,26 +19,18 @@ #include #include -#include #include #ifdef ROSIDL_TYPESUPPORT_CPP_USE_POCO #include "Poco/SharedLibrary.h" #endif +#include "rcpputils/find_library.hpp" #include "rosidl_typesupport_cpp/type_support_map.h" namespace rosidl_typesupport_cpp { -std::string find_library_path(const std::string & library_name); - -std::string get_env_var(const char * env_var); - -std::list split(const std::string & value, const char delimiter); - -bool is_file_exist(const char * filename); - extern const char * typesupport_identifier; template @@ -64,7 +56,7 @@ get_typesupport_handle_function( snprintf( library_name, 1023, "%s__%s", map->package_name, identifier); - std::string library_path = find_library_path(library_name); + std::string library_path = rcpputils::find_library_path(library_name); if (library_path.empty()) { fprintf(stderr, "Failed to find library '%s'\n", library_name); return nullptr;