From 7587b9fc76a689285f3efd2b92796902fe8003dd Mon Sep 17 00:00:00 2001 From: tayne3 Date: Sun, 30 Mar 2025 14:19:21 +0800 Subject: [PATCH 1/3] fix(CMakeLists): ensure output directories are set only if not already defined --- CMakeLists.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e88a8a..b56152d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,10 +16,14 @@ cmake_minimum_required(VERSION 2.8.12) project(CSerialPort LANGUAGES CXX) # set output directory -if (CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +endif() +if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +endif() +if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) endif() # set build tpye From 0365efc1125816299099164dfb451075f1811193 Mon Sep 17 00:00:00 2001 From: tayne3 Date: Sun, 30 Mar 2025 14:30:42 +0800 Subject: [PATCH 2/3] fix(CMakeLists): Improve C binding CMakeLists.txt for better component-based support - Add conditional checks for output directories to avoid overriding parent project settings - Optimize source file list format for better readability - Use target_include_directories instead of global include_directories - Add rt library linking based on compiler type (for GNU C compiler) - Make example building optional (CSERIALPORT_BUILD_EXAMPLES) These improvements make it easier to integrate the CSerialPort C binding as a submodule in other projects without source code modifications. --- bindings/c/CMakeLists.txt | 43 +++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/bindings/c/CMakeLists.txt b/bindings/c/CMakeLists.txt index 753f963..da9c202 100644 --- a/bindings/c/CMakeLists.txt +++ b/bindings/c/CMakeLists.txt @@ -19,22 +19,42 @@ add_definitions(-DCSERIALPORT_DEBUG) # CSerialPort Debug Mode add_definitions(-DCSERIALPORT_BINDING_LANGUAGE=C) # CSerialPort Binding Language # set output directory -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +endif() +if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +endif() +if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +endif() # cserialport files set(CSerialPortRootPath "${CMAKE_CURRENT_SOURCE_DIR}/../..") -include_directories(${CSerialPortRootPath}/include) -list(APPEND CSerialPortSourceFiles ${CSerialPortRootPath}/src/SerialPort.cpp ${CSerialPortRootPath}/src/SerialPortBase.cpp ${CSerialPortRootPath}/src/SerialPortInfo.cpp ${CSerialPortRootPath}/src/SerialPortInfoBase.cpp) +list(APPEND CSerialPortSourceFiles + ${CSerialPortRootPath}/src/SerialPort.cpp + ${CSerialPortRootPath}/src/SerialPortBase.cpp + ${CSerialPortRootPath}/src/SerialPortInfo.cpp + ${CSerialPortRootPath}/src/SerialPortInfoBase.cpp +) if (WIN32) - list(APPEND CSerialPortSourceFiles ${CSerialPortRootPath}/src/SerialPortInfoWinBase.cpp ${CSerialPortRootPath}/src/SerialPortWinBase.cpp) - list(APPEND CSerialPortSourceFiles ${CSerialPortRootPath}/lib/version.rc) + list(APPEND CSerialPortSourceFiles + ${CSerialPortRootPath}/src/SerialPortInfoWinBase.cpp + ${CSerialPortRootPath}/src/SerialPortWinBase.cpp + ) + list(APPEND CSerialPortSourceFiles + ${CSerialPortRootPath}/lib/version.rc + ) elseif (UNIX) - list(APPEND CSerialPortSourceFiles ${CSerialPortRootPath}/src/SerialPortInfoUnixBase.cpp ${CSerialPortRootPath}/src/SerialPortUnixBase.cpp) + list(APPEND CSerialPortSourceFiles + ${CSerialPortRootPath}/src/SerialPortInfoUnixBase.cpp + ${CSerialPortRootPath}/src/SerialPortUnixBase.cpp + ) endif () add_library(${PROJECT_NAME} SHARED cserialport.cpp ${CSerialPortSourceFiles}) +target_include_directories(cserialport PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(cserialport PRIVATE ${CSerialPortRootPath}/include) if (WIN32) target_link_libraries(${PROJECT_NAME} user32 advapi32 setupapi) @@ -44,7 +64,12 @@ elseif (APPLE) target_link_libraries(${PROJECT_NAME} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY}) elseif (UNIX) target_link_libraries(${PROJECT_NAME} pthread) + if(CMAKE_COMPILER_IS_GNUCC) + target_link_libraries(${PROJECT_NAME} rt) + endif() endif () # example -add_subdirectory(example) \ No newline at end of file +if (CSERIALPORT_BUILD_EXAMPLES) + add_subdirectory(example) +endif () From 4dda709a56fbcf964b66e23bc9a329850567d40b Mon Sep 17 00:00:00 2001 From: tayne3 Date: Sun, 30 Mar 2025 14:36:08 +0800 Subject: [PATCH 3/3] fix(bindings): standardize C binding header and source implementation - Change empty parameter lists to void in C header, conforming to C standard - Replace NULL with nullptr in C++ source, using modern C++ style --- bindings/c/cserialport.cpp | 8 ++++---- bindings/c/cserialport.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bindings/c/cserialport.cpp b/bindings/c/cserialport.cpp index 3ce249a..c5d32ba 100644 --- a/bindings/c/cserialport.cpp +++ b/bindings/c/cserialport.cpp @@ -68,7 +68,7 @@ void CSerialPortAvailablePortInfosMalloc(SerialPortInfoArray *portInfoArray) } else { - portInfoArray->portInfo = NULL; + portInfoArray->portInfo = nullptr; } } @@ -77,12 +77,12 @@ void CSerialPortAvailablePortInfosFree(struct SerialPortInfoArray *portInfoArray if (portInfoArray) { delete[] portInfoArray->portInfo; - portInfoArray->portInfo = NULL; + portInfoArray->portInfo = nullptr; portInfoArray->size = 0; } } -i_handle_t CSerialPortMalloc() +i_handle_t CSerialPortMalloc(void) { return reinterpret_cast(new itas109::CSerialPort()); } @@ -93,7 +93,7 @@ void CSerialPortFree(i_handle_t handle) if (pCSP) { delete pCSP; - pCSP = NULL; + pCSP = nullptr; } } diff --git a/bindings/c/cserialport.h b/bindings/c/cserialport.h index 6ada791..37f86e0 100644 --- a/bindings/c/cserialport.h +++ b/bindings/c/cserialport.h @@ -81,7 +81,7 @@ extern "C" C_DLL_EXPORT void CSerialPortAvailablePortInfosFree(struct SerialPortInfoArray *portInfoArray); - C_DLL_EXPORT i_handle_t CSerialPortMalloc(); + C_DLL_EXPORT i_handle_t CSerialPortMalloc(void); C_DLL_EXPORT void CSerialPortFree(i_handle_t handle);