From 6135fd34af6b3b48b2c779ec6626db7c2147048b Mon Sep 17 00:00:00 2001 From: James Xu Date: Fri, 25 Jan 2019 21:39:17 -0800 Subject: [PATCH] dll import/export visibility macro update (#26) * Enabled Windows Build * Add ROSCONSOLE_BACKEND_DECL for backend functions * Add ROSCONSOLE_LOG4CXX_DECL for log4cxx interface functions * Extract the impl interface to a separate header for impl dll to use (#2) * Add ROSCONSOLE_BACKEND_DECL for backend functions * Add ROSCONSOLE_LOG4CXX_DECL for log4cxx interface functions * Extract the impl interface to a separate header for impl dll to use * Fix bad merge (#3) * add comment about visibility macros (#5) --- include/ros/console_backend.h | 4 +- include/ros/console_impl.h | 82 ++++++++++++++++++++++ src/rosconsole/impl/rosconsole_glog.cpp | 4 +- src/rosconsole/impl/rosconsole_log4cxx.cpp | 3 + src/rosconsole/impl/rosconsole_print.cpp | 2 + src/rosconsole/rosconsole.cpp | 26 +------ 6 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 include/ros/console_impl.h diff --git a/include/ros/console_backend.h b/include/ros/console_backend.h index b041a6bbf..96058241b 100644 --- a/include/ros/console_backend.h +++ b/include/ros/console_backend.h @@ -66,11 +66,11 @@ typedef levels::Level Level; namespace backend { -void notifyLoggerLevelsChanged(); +ROSCONSOLE_BACKEND_DECL void notifyLoggerLevelsChanged(); ROSCONSOLE_BACKEND_DECL extern void (*function_notifyLoggerLevelsChanged)(); -void print(void* logger_handle, ::ros::console::Level level, const char* str, const char* file, const char* function, int line); +ROSCONSOLE_BACKEND_DECL void print(void* logger_handle, ::ros::console::Level level, const char* str, const char* file, const char* function, int line); ROSCONSOLE_BACKEND_DECL extern void (*function_print)(void*, ::ros::console::Level, const char*, const char*, const char*, int); diff --git a/include/ros/console_impl.h b/include/ros/console_impl.h new file mode 100644 index 000000000..e0afb1cca --- /dev/null +++ b/include/ros/console_impl.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2013, Open Source Robotics Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Willow Garage, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ROSCONSOLE_CONSOLE_IMPL_H +#define ROSCONSOLE_CONSOLE_IMPL_H + +#include +#include "ros/console.h" + +// export interface functions shared by all impl instances in one single header +// since CMake would not help define custome flag like ROSCONSOLE_CONSOLE_IMPL_EXPORTS, +// the ROSCONSOLE_CONSOLE_IMPL_EXPORTS macro needs to be defined +// in the impl code (e.g. rosconsole_log4css.cpp) before including this header + +// Import/export for windows dll's and visibility for gcc shared libraries. +#ifdef ROS_BUILD_SHARED_LIBS // ros is being built around shared libraries + #ifdef ROSCONSOLE_CONSOLE_IMPL_EXPORTS // we are building a shared lib/dll + #define ROSCONSOLE_CONSOLE_IMPL_DECL ROS_HELPER_EXPORT + #else // we are using shared lib/dll + #define ROSCONSOLE_CONSOLE_IMPL_DECL ROS_HELPER_IMPORT + #endif +#else // ros is being built around static libraries + #define ROSCONSOLE_CONSOLE_IMPL_DECL +#endif + +// declare interface for rosconsole implementations +namespace ros +{ +namespace console +{ +namespace impl +{ + +ROSCONSOLE_CONSOLE_IMPL_DECL void initialize(); + +ROSCONSOLE_CONSOLE_IMPL_DECL void shutdown(); + +ROSCONSOLE_CONSOLE_IMPL_DECL void register_appender(LogAppender* appender); + +ROSCONSOLE_CONSOLE_IMPL_DECL void print(void* handle, ::ros::console::Level level, const char* str, const char* file, const char* function, int line); + +ROSCONSOLE_CONSOLE_IMPL_DECL bool isEnabledFor(void* handle, ::ros::console::Level level); + +ROSCONSOLE_CONSOLE_IMPL_DECL void* getHandle(const std::string& name); + +ROSCONSOLE_CONSOLE_IMPL_DECL std::string getName(void* handle); + +ROSCONSOLE_CONSOLE_IMPL_DECL bool get_loggers(std::map& loggers); + +ROSCONSOLE_CONSOLE_IMPL_DECL bool set_logger_level(const std::string& name, levels::Level level); + +} // namespace impl +} // namespace console +} // namespace ros + +#endif // ROSCONSOLE_CONSOLE_IMPL_H diff --git a/src/rosconsole/impl/rosconsole_glog.cpp b/src/rosconsole/impl/rosconsole_glog.cpp index 0e642557e..c1f9e6211 100644 --- a/src/rosconsole/impl/rosconsole_glog.cpp +++ b/src/rosconsole/impl/rosconsole_glog.cpp @@ -1,4 +1,6 @@ #include "ros/console.h" +#define ROSCONSOLE_CONSOLE_IMPL_EXPORTS +#include "ros/console_impl.h" #include @@ -17,8 +19,6 @@ void initialize() google::InitGoogleLogging("rosconsole"); } -std::string getName(void* handle); - void print(void* handle, ::ros::console::Level level, const char* str, const char* file, const char* function, int line) { // still printing to console diff --git a/src/rosconsole/impl/rosconsole_log4cxx.cpp b/src/rosconsole/impl/rosconsole_log4cxx.cpp index 149a07b22..bcff3396d 100644 --- a/src/rosconsole/impl/rosconsole_log4cxx.cpp +++ b/src/rosconsole/impl/rosconsole_log4cxx.cpp @@ -36,6 +36,9 @@ #include "ros/console.h" #include "ros/assert.h" #include +#define ROSCONSOLE_CONSOLE_IMPL_EXPORTS +#include "ros/console_impl.h" + #include "log4cxx/appenderskeleton.h" #include "log4cxx/spi/loggingevent.h" #include "log4cxx/level.h" diff --git a/src/rosconsole/impl/rosconsole_print.cpp b/src/rosconsole/impl/rosconsole_print.cpp index 7a1298c1b..67d466ca7 100644 --- a/src/rosconsole/impl/rosconsole_print.cpp +++ b/src/rosconsole/impl/rosconsole_print.cpp @@ -28,6 +28,8 @@ */ #include "ros/console.h" +#define ROSCONSOLE_CONSOLE_IMPL_EXPORTS +#include "ros/console_impl.h" namespace ros { diff --git a/src/rosconsole/rosconsole.cpp b/src/rosconsole/rosconsole.cpp index 95529a410..3eaaca563 100644 --- a/src/rosconsole/rosconsole.cpp +++ b/src/rosconsole/rosconsole.cpp @@ -34,6 +34,7 @@ #endif #include "ros/console.h" +#include "ros/console_impl.h" #include "ros/assert.h" #include @@ -54,31 +55,6 @@ namespace ros { namespace console { -namespace impl -{ - -void initialize(); - -void shutdown(); - -void register_appender(LogAppender* appender); - -void deregister_appender(LogAppender* appender); - -void print(void* handle, ::ros::console::Level level, const char* str, const char* file, const char* function, int line); - -bool isEnabledFor(void* handle, ::ros::console::Level level); - -void* getHandle(const std::string& name); - -std::string getName(void* handle); - -bool get_loggers(std::map& loggers); - -bool set_logger_level(const std::string& name, levels::Level level); - -} // namespace impl - bool g_initialized = false; bool g_shutting_down = false;