diff --git a/CMakeLists.txt b/CMakeLists.txt index 62b8acb..db5cc44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,67 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) + +# ======================================================== +# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake +# ======================================================== + +# Detect if building with Catkin +if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) + set(BUILDING_WITH_CATKIN TRUE) + message(STATUS "Building robot_xmlrpcpp with Catkin") +else() + set(BUILDING_WITH_CATKIN FALSE) + message(STATUS "Building robot_xmlrpcpp with Standalone CMake") +endif() + project(robot_xmlrpcpp) +## Compile as C++17 +add_compile_options(-std=c++17) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wall -Wextra -Wpedantic -fPIC) +# ======================================================== +# Find Packages +# ======================================================== + +if(BUILDING_WITH_CATKIN) + ## Find catkin macros and libraries + find_package(catkin REQUIRED) endif() +## System dependencies are found with CMake's conventions +find_package(console_bridge REQUIRED) + +# ======================================================== +# Catkin specific configuration +# ======================================================== + +if(BUILDING_WITH_CATKIN) + ## The catkin_package macro generates cmake config files for your package + catkin_package( + INCLUDE_DIRS include + LIBRARIES robot_xmlrpcpp + CATKIN_DEPENDS + DEPENDS console_bridge + ) +endif() + +########### +## Build ## +########### + +## Specify additional locations of header files +include_directories( + include + ${console_bridge_INCLUDE_DIRS} +) + +if(BUILDING_WITH_CATKIN) + include_directories(${catkin_INCLUDE_DIRS}) +endif() + +## Declare a C++ library add_library(robot_xmlrpcpp src/XmlRpcClient.cpp src/XmlRpcDispatch.cpp @@ -21,33 +74,54 @@ add_library(robot_xmlrpcpp src/XmlRpcValue.cpp ) +## Target include directories target_include_directories(robot_xmlrpcpp PUBLIC $ - $ + $ ) -# --- Cài đặt thư viện vào hệ thống khi chạy make install --- -install(TARGETS robot_xmlrpcpp - EXPORT robot_xmlrpcpp-targets - ARCHIVE DESTINATION lib # Thư viện tĩnh .a - LIBRARY DESTINATION lib # Thư viện động .so - RUNTIME DESTINATION bin # File thực thi (nếu có) - INCLUDES DESTINATION include # Cài đặt include +## Add cmake target dependencies of the library +if(BUILDING_WITH_CATKIN) + add_dependencies(robot_xmlrpcpp ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +endif() + +## Specify libraries to link a library or executable target against +target_link_libraries(robot_xmlrpcpp + ${console_bridge_LIBRARIES} ) -install( +if(BUILDING_WITH_CATKIN) + target_link_libraries(robot_xmlrpcpp ${catkin_LIBRARIES}) +endif() + +## Compiler flags +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options(robot_xmlrpcpp PRIVATE -Wall -Wextra -Wpedantic -fPIC -Wno-unused-parameter) +endif() + +# ======================================================== +# Installation (Standalone CMake only) +# ======================================================== + +if(NOT BUILDING_WITH_CATKIN) + install(TARGETS robot_xmlrpcpp + EXPORT robot_xmlrpcpp-targets + ARCHIVE DESTINATION lib # Thư viện tĩnh .a + LIBRARY DESTINATION lib # Thư viện động .so + RUNTIME DESTINATION bin # File thực thi (nếu có) + INCLUDES DESTINATION include # Cài đặt include + ) + + install( DIRECTORY include/ DESTINATION include/ -) + ) -# --- Xuất export set robot_xmlrpcpp-targets thành file CMake module --- -# --- Tạo file lib/cmake/robot_xmlrpcpp/robot_xmlrpcpp-targets.cmake --- -# --- File này chứa cấu hình giúp project khác có thể dùng --- -# --- Find_package(robot_xmlrpcpp REQUIRED) --- -# --- Target_link_libraries(my_app PRIVATE robot_xmlrpcpp::robot_xmlrpcpp) --- -install(EXPORT robot_xmlrpcpp-targets - FILE robot_xmlrpcpp-targets.cmake - NAMESPACE robot_xmlrpcpp:: - DESTINATION lib/cmake/robot_xmlrpcpp -) + # --- Xuất export set robot_xmlrpcpp-targets thành file CMake module --- + install(EXPORT robot_xmlrpcpp-targets + FILE robot_xmlrpcpp-targets.cmake + NAMESPACE robot_xmlrpcpp:: + DESTINATION lib/cmake/robot_xmlrpcpp + ) +endif() diff --git a/include/robot_xmlrpcpp/XmlRpc.h b/include/robot_xmlrpcpp/XmlRpc.h index cb73d2c..a8b346e 100644 --- a/include/robot_xmlrpcpp/XmlRpc.h +++ b/include/robot_xmlrpcpp/XmlRpc.h @@ -32,8 +32,7 @@ #include "XmlRpcValue.h" #include "XmlRpcUtil.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! An interface allowing custom handling of error message reporting. @@ -90,7 +89,6 @@ namespace XmlRpc { //! Version identifier extern const char XMLRPC_VERSION[]; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPC_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcClient.h b/include/robot_xmlrpcpp/XmlRpcClient.h index 2e22197..c34bf66 100644 --- a/include/robot_xmlrpcpp/XmlRpcClient.h +++ b/include/robot_xmlrpcpp/XmlRpcClient.h @@ -16,8 +16,7 @@ #include "robot_xmlrpcpp/XmlRpcDispatch.h" #include "robot_xmlrpcpp/XmlRpcSource.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { // Arguments and results are represented by XmlRpcValues class XmlRpcValue; @@ -124,7 +123,6 @@ namespace XmlRpc { }; // class XmlRpcClient -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCCLIENT_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcDispatch.h b/include/robot_xmlrpcpp/XmlRpcDispatch.h index 8bb7974..ea61812 100644 --- a/include/robot_xmlrpcpp/XmlRpcDispatch.h +++ b/include/robot_xmlrpcpp/XmlRpcDispatch.h @@ -12,8 +12,7 @@ # include #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { // An RPC source represents a file descriptor to monitor class XmlRpcSource; @@ -84,7 +83,6 @@ namespace XmlRpc { bool _inWork; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCDISPATCH_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcException.h b/include/robot_xmlrpcpp/XmlRpcException.h index 8a871cb..1298091 100644 --- a/include/robot_xmlrpcpp/XmlRpcException.h +++ b/include/robot_xmlrpcpp/XmlRpcException.h @@ -13,8 +13,7 @@ #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! A class representing an error. //! If server methods throw this exception, a fault response is returned @@ -38,7 +37,6 @@ namespace XmlRpc { int _code; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCEXCEPTION_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcServer.h b/include/robot_xmlrpcpp/XmlRpcServer.h index 9f93dd6..50d11c6 100644 --- a/include/robot_xmlrpcpp/XmlRpcServer.h +++ b/include/robot_xmlrpcpp/XmlRpcServer.h @@ -16,8 +16,7 @@ #include "robot_xmlrpcpp/XmlRpcDispatch.h" #include "robot_xmlrpcpp/XmlRpcSource.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { // An abstract class supporting XML RPC methods @@ -100,7 +99,6 @@ namespace XmlRpc { XmlRpcServerMethod* _methodHelp; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif //_XMLRPCSERVER_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcServerConnection.h b/include/robot_xmlrpcpp/XmlRpcServerConnection.h index a0c187a..952e839 100644 --- a/include/robot_xmlrpcpp/XmlRpcServerConnection.h +++ b/include/robot_xmlrpcpp/XmlRpcServerConnection.h @@ -14,8 +14,7 @@ #include "robot_xmlrpcpp/XmlRpcValue.h" #include "robot_xmlrpcpp/XmlRpcSource.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { // The server waits for client connections and provides methods @@ -98,7 +97,6 @@ namespace XmlRpc { // Whether to keep the current client connection open for further requests bool _keepAlive; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCSERVERCONNECTION_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcServerMethod.h b/include/robot_xmlrpcpp/XmlRpcServerMethod.h index c7f1a17..e93ec5d 100644 --- a/include/robot_xmlrpcpp/XmlRpcServerMethod.h +++ b/include/robot_xmlrpcpp/XmlRpcServerMethod.h @@ -12,8 +12,7 @@ # include #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { // Representation of a parameter or result value class XmlRpcValue; @@ -43,7 +42,6 @@ namespace XmlRpc { std::string _name; XmlRpcServer* _server; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCSERVERMETHOD_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcSocket.h b/include/robot_xmlrpcpp/XmlRpcSocket.h index 017389a..d9edbf0 100644 --- a/include/robot_xmlrpcpp/XmlRpcSocket.h +++ b/include/robot_xmlrpcpp/XmlRpcSocket.h @@ -11,8 +11,7 @@ # include #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! A platform-independent socket API. class XmlRpcSocket { @@ -65,7 +64,6 @@ namespace XmlRpc { static std::string getErrorMsg(int error); }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif diff --git a/include/robot_xmlrpcpp/XmlRpcSource.h b/include/robot_xmlrpcpp/XmlRpcSource.h index f4321e0..b54f9f5 100644 --- a/include/robot_xmlrpcpp/XmlRpcSource.h +++ b/include/robot_xmlrpcpp/XmlRpcSource.h @@ -8,8 +8,7 @@ # pragma warning(disable:4786) // identifier was truncated in debug info #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! An RPC source represents a file descriptor to monitor class XmlRpcSource { @@ -51,7 +50,6 @@ namespace XmlRpc { // In the client, keep connections open if you intend to make multiple calls. bool _keepOpen; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif //_XMLRPCSOURCE_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcUtil.h b/include/robot_xmlrpcpp/XmlRpcUtil.h index f857f0a..b0d2281 100644 --- a/include/robot_xmlrpcpp/XmlRpcUtil.h +++ b/include/robot_xmlrpcpp/XmlRpcUtil.h @@ -21,8 +21,7 @@ # define strncasecmp strnicmp #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! Utilities for XML parsing, encoding, and decoding and message handlers. class XmlRpcUtil { @@ -57,7 +56,6 @@ namespace XmlRpc { static void error(const char* fmt, ...); }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp #endif // _XMLRPCUTIL_H_ diff --git a/include/robot_xmlrpcpp/XmlRpcValue.h b/include/robot_xmlrpcpp/XmlRpcValue.h index 0a1bb56..8839dbf 100644 --- a/include/robot_xmlrpcpp/XmlRpcValue.h +++ b/include/robot_xmlrpcpp/XmlRpcValue.h @@ -15,8 +15,7 @@ # include #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { //! RPC method arguments and results are represented by Values // should probably refcount them... @@ -181,11 +180,10 @@ namespace XmlRpc { } _value; }; -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp -std::ostream& operator<<(std::ostream& os, robot::XmlRpc::XmlRpcValue& v); +std::ostream& operator<<(std::ostream& os, robot_xmlrpcpp::XmlRpcValue& v); #endif // _XMLRPCVALUE_H_ diff --git a/src/XmlRpcClient.cpp b/src/XmlRpcClient.cpp index ea53646..659fb60 100644 --- a/src/XmlRpcClient.cpp +++ b/src/XmlRpcClient.cpp @@ -11,7 +11,7 @@ -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; // Static data const char XmlRpcClient::REQUEST_BEGIN[] = @@ -397,7 +397,7 @@ XmlRpcClient::parseResponse(XmlRpcValue& result) // Expect either ... or ... if ((XmlRpcUtil::nextTagIs(PARAMS_TAG,_response,&offset) && XmlRpcUtil::nextTagIs(PARAM_TAG,_response,&offset)) || - XmlRpcUtil::nextTagIs(FAULT_TAG,_response,&offset) && (_isFault = true)) + (XmlRpcUtil::nextTagIs(FAULT_TAG,_response,&offset) && (_isFault = true))) { if ( ! result.fromXml(_response, &offset)) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response value. Response:\n%s", _response.c_str()); diff --git a/src/XmlRpcDispatch.cpp b/src/XmlRpcDispatch.cpp index 5f72bbf..7e857e6 100644 --- a/src/XmlRpcDispatch.cpp +++ b/src/XmlRpcDispatch.cpp @@ -19,7 +19,7 @@ #endif // _WINDOWS -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; XmlRpcDispatch::XmlRpcDispatch() diff --git a/src/XmlRpcServer.cpp b/src/XmlRpcServer.cpp index 6f9a238..bf17b4e 100644 --- a/src/XmlRpcServer.cpp +++ b/src/XmlRpcServer.cpp @@ -7,7 +7,7 @@ #include "robot_xmlrpcpp/XmlRpcException.h" -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; XmlRpcServer::XmlRpcServer() diff --git a/src/XmlRpcServerConnection.cpp b/src/XmlRpcServerConnection.cpp index 515a199..e77b165 100644 --- a/src/XmlRpcServerConnection.cpp +++ b/src/XmlRpcServerConnection.cpp @@ -11,7 +11,7 @@ #endif -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; // Static data const char XmlRpcServerConnection::METHODNAME_TAG[] = ""; diff --git a/src/XmlRpcServerMethod.cpp b/src/XmlRpcServerMethod.cpp index 23aba8b..dd44d42 100644 --- a/src/XmlRpcServerMethod.cpp +++ b/src/XmlRpcServerMethod.cpp @@ -2,8 +2,7 @@ #include "robot_xmlrpcpp/XmlRpcServerMethod.h" #include "robot_xmlrpcpp/XmlRpcServer.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { XmlRpcServerMethod::XmlRpcServerMethod(std::string const& name, XmlRpcServer* server) @@ -19,5 +18,4 @@ namespace XmlRpc { } -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp diff --git a/src/XmlRpcSocket.cpp b/src/XmlRpcSocket.cpp index a47d8bd..a81be1b 100644 --- a/src/XmlRpcSocket.cpp +++ b/src/XmlRpcSocket.cpp @@ -30,7 +30,7 @@ extern "C" { #endif // MAKEDEPEND -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; diff --git a/src/XmlRpcSource.cpp b/src/XmlRpcSource.cpp index 0977e41..9de5592 100644 --- a/src/XmlRpcSource.cpp +++ b/src/XmlRpcSource.cpp @@ -3,8 +3,7 @@ #include "robot_xmlrpcpp/XmlRpcSocket.h" #include "robot_xmlrpcpp/XmlRpcUtil.h" -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { XmlRpcSource::XmlRpcSource(int fd /*= -1*/, bool deleteOnClose /*= false*/) @@ -33,5 +32,4 @@ namespace XmlRpc { } } -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp diff --git a/src/XmlRpcUtil.cpp b/src/XmlRpcUtil.cpp index c9566e5..dad38e2 100644 --- a/src/XmlRpcUtil.cpp +++ b/src/XmlRpcUtil.cpp @@ -11,7 +11,7 @@ #include "robot_xmlrpcpp/XmlRpc.h" -using namespace robot::XmlRpc; +using namespace robot_xmlrpcpp; //#define USE_WINDOWS_DEBUG // To make the error and log messages go to VC++ debug output @@ -21,7 +21,7 @@ using namespace robot::XmlRpc; #endif // Version id -const char robot::XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.7"; +const char robot_xmlrpcpp::XMLRPC_VERSION[] = "XMLRPC++ 0.7"; // Default log verbosity: 0 for no messages through 5 (writes everything) int XmlRpcLogHandler::_verbosity = 0; @@ -63,8 +63,8 @@ XmlRpcErrorHandler* XmlRpcErrorHandler::_errorHandler = &defaultErrorHandler; // Easy API for log verbosity -int robot::XmlRpc::getVerbosity() { return XmlRpcLogHandler::getVerbosity(); } -void robot::XmlRpc::setVerbosity(int level) { XmlRpcLogHandler::setVerbosity(level); } +int robot_xmlrpcpp::getVerbosity() { return XmlRpcLogHandler::getVerbosity(); } +void robot_xmlrpcpp::setVerbosity(int level) { XmlRpcLogHandler::setVerbosity(level); } diff --git a/src/XmlRpcValue.cpp b/src/XmlRpcValue.cpp index e3ca4e6..ca92a6d 100644 --- a/src/XmlRpcValue.cpp +++ b/src/XmlRpcValue.cpp @@ -11,8 +11,7 @@ # include #endif -namespace robot { -namespace XmlRpc { +namespace robot_xmlrpcpp { static const char VALUE_TAG[] = ""; @@ -598,12 +597,11 @@ namespace XmlRpc { return os; } -} // namespace XmlRpc -} // namespace robot +} // namespace robot_xmlrpcpp // ostream -std::ostream& operator<<(std::ostream& os, robot::XmlRpc::XmlRpcValue& v) +std::ostream& operator<<(std::ostream& os, robot_xmlrpcpp::XmlRpcValue& v) { // If you want to output in xml format: //return os << v.toXml();