diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index 38699ca..319c6fa 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -24,6 +24,7 @@ jobs: os: [ubuntu-latest, windows-latest] build_type: [Release] c_compiler: [gcc, clang, cl] + output_type: [STATIC, SHARED, SHARED_VERSIONED] include: # Windows + MSVC - os: windows-latest @@ -56,7 +57,7 @@ jobs: - name: Configure CMake # Single-line command works on both Windows (PowerShell) & Linux (Bash). - run: cmake -S . -B build -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -Dqualisys_cpp_sdk_BUILD_TESTS=ON + run: cmake -S . -B build -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -Dqualisys_cpp_sdk_OUTPUT_TYPE=${{ matrix.output_type}} -Dqualisys_cpp_sdk_BUILD_TESTS=ON - name: Build # On Windows + MSVC (multi-config generator), --config picks Release/Debug. diff --git a/CMakeLists.txt b/CMakeLists.txt index f97b215..2a2c5f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,32 @@ cmake_minimum_required(VERSION 3.8) -project(qualisys_cpp_sdk) +project(qualisys_cpp_sdk VERSION 1.0.0) option(${PROJECT_NAME}_BUILD_EXAMPLES "Build examples" OFF) option(${PROJECT_NAME}_BUILD_TESTS "Build tests" OFF) +if(NOT DEFINED ${PROJECT_NAME}_OUTPUT_TYPE) + set(${PROJECT_NAME}_OUTPUT_TYPE "STATIC") +endif() + +if(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "STATIC") + message(STATUS "Building a static library.") + set(LIB_TYPE "STATIC") + set(CMAKE_POSITION_INDEPENDENT_CODE OFF) +elseif(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED") + message(STATUS "Building a shared library.") + set(LIB_TYPE "SHARED") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +elseif(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED_VERSIONED") + message(STATUS "Building a versioned shared library.") + set(LIB_TYPE "SHARED") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +else() + message(FATAL_ERROR "Invalid ${PROJECT_NAME}_OUTPUT_TYPE " ${${PROJECT_NAME}_OUTPUT_TYPE}) +endif() + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") -add_library(${PROJECT_NAME} +add_library(${PROJECT_NAME} ${LIB_TYPE} Network.cpp RTPacket.cpp RTProtocol.cpp @@ -26,14 +46,11 @@ target_include_directories(${PROJECT_NAME} $/External/tinyxml2 ) -if(WIN32) - target_link_libraries(${PROJECT_NAME} - PUBLIC - $<$:ws2_32.lib iphlpapi.lib> - $<$:ws2_32 iphlpapi> - ) -endif() - +target_link_libraries(${PROJECT_NAME} + PUBLIC + $<$,Windows>:ws2_32> + $<$,Windows>:iphlpapi> +) # Enable C++14 target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_14) @@ -41,9 +58,35 @@ set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF - DEBUG_POSTFIX "-d" ) +if(LIB_TYPE STREQUAL "SHARED") + if(WIN32) + set_target_properties(${PROJECT_NAME} PROPERTIES + WINDOWS_EXPORT_ALL_SYMBOLS ON + ) + endif() + + if(NOT MSVC) + set_target_properties(${PROJECT_NAME} PROPERTIES + CMAKE_CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + ) + endif() + + if (UNIX) + set_target_properties(${PROJECT_NAME} PROPERTIES + BUILD_RPATH "$ORIGIN" + INSTALL_RPATH "$ORIGIN" + ) + endif() +endif() + +# Apply versioning suffix if shared and requested +if(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED_VERSIONED") + set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") +endif() + # ----------- INSTALL & EXPORT ----------- include(GNUInstallDirs) @@ -98,4 +141,5 @@ endif () if(${PROJECT_NAME}_BUILD_TESTS) enable_testing() add_subdirectory(Tests) + set(${PROJECT_NAME}_OUTPUT_TYPE ${qualisys_cpp_sdk_OUTPUT_TYPE} CACHE BOOL "qualisys_cpp_sdk build type") endif() diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index f708199..aa2ae51 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -37,6 +37,29 @@ target_link_libraries(${PROJECT_NAME} doctest::doctest ) +# Ensure if shared library, that it's found at runtime +if(NOT qualisys_cpp_sdk_OUTPUT_TYPE STREQUAL "STATIC") + target_compile_definitions(${PROJECT_NAME} PRIVATE QUALISYS_SDK_SHARED) + + if (UNIX) + set_target_properties(${PROJECT_NAME} PROPERTIES + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "$ORIGIN" + ) + elseif(WIN32) + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "$" + "$" + ) + else() + set_target_properties(${PROJECT_NAME} PROPERTIES + BUILD_RPATH "$ORIGIN" + INSTALL_RPATH "$ORIGIN" + ) + endif() +endif() + target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17) if(MSVC)