Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
272 changes: 272 additions & 0 deletions macos_fixes.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 00cbad3..7523d87 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,8 +22,8 @@ else()
message(FATAL_ERROR "C++ standard must C++14 or higher")
endif()

-# Find third-party library
-find_package(Boost REQUIRED)
+# --- MODIFIED: 使用现代化的 CONFIG 模式查找 Boost,并移除了写死的版本号 ---
+find_package(Boost REQUIRED CONFIG COMPONENTS system thread)
find_package(libssh)
if(libssh_FOUND)
set(THIRDPARTY_LIB ${THIRDPARTY_LIB} ssh)
@@ -76,168 +76,92 @@ set(
${PROJECT_BINARY_DIR}/include/
)

-# Head file list
set(
ELITE_HEADER_FILES
- Elite/DataType.hpp
- Elite/VersionInfo.hpp
- Dashboard/DashboardClient.hpp
- Rtsi/RtsiClientInterface.hpp
- Rtsi/RtsiIOInterface.hpp
- Rtsi/RtsiRecipe.hpp
- Primary/PrimaryPackage.hpp
- Primary/RobotConfPackage.hpp
- Primary/PrimaryPortInterface.hpp
- EliteException.hpp
- Elite/EliteDriver.hpp
- Elite/Log.hpp
- Elite/RemoteUpgrade.hpp
- Elite/ControllerLog.hpp
- Elite/RobotException.hpp
- Common/RtUtils.hpp
+ Elite/DataType.hpp Elite/VersionInfo.hpp Dashboard/DashboardClient.hpp
+ Rtsi/RtsiClientInterface.hpp Rtsi/RtsiIOInterface.hpp Rtsi/RtsiRecipe.hpp
+ Primary/PrimaryPackage.hpp Primary/RobotConfPackage.hpp Primary/PrimaryPortInterface.hpp
+ EliteException.hpp Elite/EliteDriver.hpp Elite/Log.hpp Elite/RemoteUpgrade.hpp
+ Elite/ControllerLog.hpp Elite/RobotException.hpp Common/RtUtils.hpp
)

-# Set output library default name
set(SDK_STATIC_LIB_OUTPUT_NAME "${PROJECT_NAME}")
set(SDK_SHARED_LIB_OUTPUT_NAME "${PROJECT_NAME}")

-# Configure accordingly based on the operating system.
+# --- MODIFIED: 增加对 macOS (APPLE) 的支持 ---
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
message(STATUS "SYSTEM: Windows")
- add_definitions(
- -D_WIN32_WINNT=0x0601
- -DELITE_EXPORT_LIBRARY
- )
+ add_definitions(-D_WIN32_WINNT=0x0601)
set(SDK_STATIC_LIB_OUTPUT_NAME "${PROJECT_NAME}_static")
set(SDK_SHARED_LIB_OUTPUT_NAME "${PROJECT_NAME}")
-elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
- message(STATUS "SYSTEM: Linux")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE)
+ if(APPLE)
+ message(STATUS "SYSTEM: macOS")
+ else()
+ message(STATUS "SYSTEM: Linux")
+ endif()
set(SYSTEM_LIB pthread)
else()
message(FATAL_ERROR "Unsupport operating system")
endif()

+add_library(${PROJECT_NAME}_SHARED SHARED ${ELITE_LIB_SOURCE_FILE})
+add_library(${PROJECT_NAME}_STATIC STATIC ${ELITE_LIB_SOURCE_FILE})
+
+# --- MODIFIED: 使用现代化的方式为目标添加 ELITE_EXPORT_LIBRARY 编译定义 ---
+if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ target_compile_definitions(${PROJECT_NAME}_SHARED PRIVATE ELITE_EXPORT_LIBRARY)
+ target_compile_definitions(${PROJECT_NAME}_STATIC PRIVATE ELITE_EXPORT_LIBRARY)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE)
+ target_compile_definitions(${PROJECT_NAME}_SHARED PRIVATE ELITE_EXPORT_LIBRARY)
+ target_compile_definitions(${PROJECT_NAME}_STATIC PRIVATE ELITE_EXPORT_LIBRARY)
+endif()

-# Add library
-add_library(
- ${PROJECT_NAME}_SHARED
- SHARED
- ${ELITE_LIB_SOURCE_FILE}
-)
-add_library(
- ${PROJECT_NAME}_STATIC
- STATIC
- ${ELITE_LIB_SOURCE_FILE}
-)
define_rel_file_macro(${PROJECT_NAME}_SHARED)
define_rel_file_macro(${PROJECT_NAME}_STATIC)
set_target_properties(${PROJECT_NAME}_SHARED PROPERTIES OUTPUT_NAME ${SDK_SHARED_LIB_OUTPUT_NAME})
set_target_properties(${PROJECT_NAME}_STATIC PROPERTIES OUTPUT_NAME ${SDK_STATIC_LIB_OUTPUT_NAME})
-target_include_directories(
- ${PROJECT_NAME}_SHARED
- PRIVATE
- ${ELITE_LIB_INCLUDE_DIR}
-)
-target_include_directories(
- ${PROJECT_NAME}_STATIC
- PRIVATE
- ${ELITE_LIB_INCLUDE_DIR}
-)
-target_link_libraries(
- ${PROJECT_NAME}_SHARED
- PRIVATE
- ${THIRDPARTY_LIB}
-)
-target_link_libraries(
- ${PROJECT_NAME}_STATIC
- PRIVATE
- ${THIRDPARTY_LIB}
-)
+target_include_directories(${PROJECT_NAME}_SHARED PRIVATE ${ELITE_LIB_INCLUDE_DIR})
+target_include_directories(${PROJECT_NAME}_STATIC PRIVATE ${ELITE_LIB_INCLUDE_DIR})
+target_link_libraries(${PROJECT_NAME}_SHARED PRIVATE ${THIRDPARTY_LIB})
+target_link_libraries(${PROJECT_NAME}_STATIC PRIVATE ${THIRDPARTY_LIB})

-# Copy head file
foreach(header ${ELITE_HEADER_FILES})
- file(COPY ${PROJECT_SOURCE_DIR}/include/${header}
- DESTINATION ${PROJECT_BINARY_DIR}/include/Elite)
+ file(COPY ${PROJECT_SOURCE_DIR}/include/${header} DESTINATION ${PROJECT_BINARY_DIR}/include/Elite)
endforeach()

-# Prepare exporting targets
add_library(${PROJECT_NAME}::shared ALIAS ${PROJECT_NAME}_SHARED)
-target_include_directories(
- ${PROJECT_NAME}_SHARED
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
- $<INSTALL_INTERFACE:include>
-)
+target_include_directories(${PROJECT_NAME}_SHARED PUBLIC $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> $<INSTALL_INTERFACE:include>)
add_library(${PROJECT_NAME}::static ALIAS ${PROJECT_NAME}_STATIC)
-target_include_directories(
- ${PROJECT_NAME}_STATIC
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
- $<INSTALL_INTERFACE:include>
-)
+target_include_directories(${PROJECT_NAME}_STATIC PUBLIC $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> $<INSTALL_INTERFACE:include>)

-# Is compile examples
if(ELITE_COMPILE_EXAMPLES)
message(STATUS "Compile the exmaples")
add_subdirectory(example ${CMAKE_BINARY_DIR}/example/)
endif()
-
-# If compile documentation
if(ELITE_COMPILE_DOC)
message(STATUS "Compile the documentation.")
add_subdirectory(doc ${CMAKE_BINARY_DIR}/doc/)
endif()
-
-# If googel test has been foune, compile unit test
if (ELITE_COMPILE_TESTS)
message(STATUS "Compile the tests")
add_subdirectory(test ${CMAKE_BINARY_DIR}/test/)
endif()

-# Disable installation if project imported with FetchContent
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" is_top_level)
option(ELITE_INSTALL "Include packaging rules" "${is_top_level}")

-# On the Linux platform, install binary library files, header files, and CMake configuration files.
-if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND ELITE_INSTALL)
+# --- MODIFIED: 增加对 macOS (APPLE) 的支持 ---
+if((CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE) AND ELITE_INSTALL)
include(GNUInstallDirs)
- install(
- TARGETS ${PROJECT_NAME}_SHARED ${PROJECT_NAME}_STATIC
- EXPORT ${PROJECT_NAME}Targets
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- )
- install(
- DIRECTORY ${PROJECT_BINARY_DIR}/include/
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- )
- install(
- DIRECTORY ${PROJECT_SOURCE_DIR}/source/resources/
- DESTINATION share/Elite
- )
-
+ install(TARGETS ${PROJECT_NAME}_SHARED ${PROJECT_NAME}_STATIC EXPORT ${PROJECT_NAME}Targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+ install(DIRECTORY ${PROJECT_BINARY_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+ install(DIRECTORY ${PROJECT_SOURCE_DIR}/source/resources/ DESTINATION share/Elite)
include(CMakePackageConfigHelpers)
- configure_package_config_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
- INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}
- )
- write_basic_package_version_file(
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
- VERSION ${PROJECT_VERSION}
- COMPATIBILITY SameMajorVersion
- )
-
- install(
- EXPORT ${PROJECT_NAME}Targets
- FILE ${PROJECT_NAME}Targets.cmake
- DESTINATION lib/cmake/${PROJECT_NAME}
- )
- install(
- FILES
- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
- DESTINATION lib/cmake/${PROJECT_NAME}
- )
+ configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION lib/cmake/${PROJECT_NAME})
+ write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion)
+ install(EXPORT ${PROJECT_NAME}Targets FILE ${PROJECT_NAME}Targets.cmake DESTINATION lib/cmake/${PROJECT_NAME})
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION lib/cmake/${PROJECT_NAME})
endif()

message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
diff --git a/include/EliteOptions.hpp.in b/include/EliteOptions.hpp.in
index 4c7a060..fa6f90f 100644
--- a/include/EliteOptions.hpp.in
+++ b/include/EliteOptions.hpp.in
@@ -9,7 +9,7 @@
#else
#define ELITE_EXPORT __declspec(dllimport)
#endif
-#elif defined(__linux) || defined(linux) || defined(__linux__)
+#elif defined(__linux) || defined(linux) || defined(__linux__) || defined(__APPLE__)
#define ELITE_EXPORT __attribute__((visibility("default")))
#endif

diff --git a/source/Common/SshUtils.cpp b/source/Common/SshUtils.cpp
index 08f6041..8d23388 100644
--- a/source/Common/SshUtils.cpp
+++ b/source/Common/SshUtils.cpp
@@ -22,6 +22,12 @@
#include <libssh/libssh.h>
#endif

+#ifndef FILE_PERMISSIONS
+#define FILE_PERMISSIONS 0644
+#endif
+
+
+
#include "Common/SshUtils.hpp"
#include "Elite/Log.hpp"

@@ -302,7 +308,7 @@ bool uploadFile(const std::string& server, const std::string& user, const std::s

std::ifstream local_file(local_path, std::ios::binary | std::ios::ate);
if (!local_file) {
- ELITE_LOG_ERROR("Failed to open local file: %s", local_path);
+ ELITE_LOG_ERROR("Failed to open local file: %s", local_path.c_str());
ssh_disconnect(session);
ssh_free(session);
return false;
@@ -329,7 +335,7 @@ bool uploadFile(const std::string& server, const std::string& user, const std::s

#if defined(_WIN32) || defined(_WIN64)
#define FILE_PERMISSIONS (S_IREAD | S_IWRITE)
-#elif defined(__linux) || defined(linux) || defined(__linux__)
+#elif defined(__linux) || defined(linux) || defined(__linux__) || defined(__APPLE__)
#define FILE_PERMISSIONS (S_IRUSR | S_IWUSR)
#endif
// File's infomation