Skip to content

Commit bd7819f

Browse files
Add Option to Build As Shared Library With Position Independent Code (#113)
* Initial solution, built on the previous solution. Tested on Windows. * Updated comments, reintroduced previously removed code. * Remove unnecessary comment. * Move 'independent code' line above tinyxml2 code. * Add default-build as 'release' if not specified. * Update to use correct 'tinyxml2_SHARED_LIBS' tag. * Updated CMakeList.txt files so that we can run tests when building as dynamic, also made tinyxml2 always build as static. * Update Windows-specific linking to be less strict so that Clang has access to required code. * Remove tinyxml2 block that should have been removed in merge. * Github actions: Build shared and shared versioned (#119) * Added cmake parameter qualisys_cpp_sdk_OUTPUT_TYPE Replaced qualisys_cpp_sdk_BUILD_SHARED and qualisys_cpp_sdk_BUILD_SHARED_VERSIONED with qualisys_cpp_sdk_OUTPUT_TYPE * Added output_type to build actions * Add quotation marks for the sake of consistency. * Remove if-win32 check, add check to library includes directly. * Remove if-win32 check, add check to library includes directly. --------- Co-authored-by: qjgn <45095781+qjgn@users.noreply.github.com>
1 parent f398d11 commit bd7819f

File tree

3 files changed

+80
-12
lines changed

3 files changed

+80
-12
lines changed

.github/workflows/cmake-multi-platform.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ jobs:
2424
os: [ubuntu-latest, windows-latest]
2525
build_type: [Release]
2626
c_compiler: [gcc, clang, cl]
27+
output_type: [STATIC, SHARED, SHARED_VERSIONED]
2728
include:
2829
# Windows + MSVC
2930
- os: windows-latest
@@ -56,7 +57,7 @@ jobs:
5657

5758
- name: Configure CMake
5859
# Single-line command works on both Windows (PowerShell) & Linux (Bash).
59-
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
60+
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
6061

6162
- name: Build
6263
# On Windows + MSVC (multi-config generator), --config picks Release/Debug.

CMakeLists.txt

+55-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
cmake_minimum_required(VERSION 3.8)
2-
project(qualisys_cpp_sdk)
2+
project(qualisys_cpp_sdk VERSION 1.0.0)
33

44
option(${PROJECT_NAME}_BUILD_EXAMPLES "Build examples" OFF)
55
option(${PROJECT_NAME}_BUILD_TESTS "Build tests" OFF)
66

7+
if(NOT DEFINED ${PROJECT_NAME}_OUTPUT_TYPE)
8+
set(${PROJECT_NAME}_OUTPUT_TYPE "STATIC")
9+
endif()
10+
11+
if(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "STATIC")
12+
message(STATUS "Building a static library.")
13+
set(LIB_TYPE "STATIC")
14+
set(CMAKE_POSITION_INDEPENDENT_CODE OFF)
15+
elseif(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED")
16+
message(STATUS "Building a shared library.")
17+
set(LIB_TYPE "SHARED")
18+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
19+
elseif(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED_VERSIONED")
20+
message(STATUS "Building a versioned shared library.")
21+
set(LIB_TYPE "SHARED")
22+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
23+
else()
24+
message(FATAL_ERROR "Invalid ${PROJECT_NAME}_OUTPUT_TYPE " ${${PROJECT_NAME}_OUTPUT_TYPE})
25+
endif()
26+
727
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
828

9-
add_library(${PROJECT_NAME}
29+
add_library(${PROJECT_NAME} ${LIB_TYPE}
1030
Network.cpp
1131
RTPacket.cpp
1232
RTProtocol.cpp
@@ -26,24 +46,47 @@ target_include_directories(${PROJECT_NAME}
2646
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/External/tinyxml2
2747
)
2848

29-
if(WIN32)
30-
target_link_libraries(${PROJECT_NAME}
31-
PUBLIC
32-
$<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">:ws2_32.lib iphlpapi.lib>
33-
$<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","GNU">:ws2_32 iphlpapi>
34-
)
35-
endif()
36-
49+
target_link_libraries(${PROJECT_NAME}
50+
PUBLIC
51+
$<$<STREQUAL:$<PLATFORM_ID>,Windows>:ws2_32>
52+
$<$<STREQUAL:$<PLATFORM_ID>,Windows>:iphlpapi>
53+
)
3754

3855
# Enable C++14
3956
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_14)
4057
set_target_properties(${PROJECT_NAME}
4158
PROPERTIES
4259
CXX_STANDARD_REQUIRED ON
4360
CXX_EXTENSIONS OFF
44-
DEBUG_POSTFIX "-d"
4561
)
4662

63+
if(LIB_TYPE STREQUAL "SHARED")
64+
if(WIN32)
65+
set_target_properties(${PROJECT_NAME} PROPERTIES
66+
WINDOWS_EXPORT_ALL_SYMBOLS ON
67+
)
68+
endif()
69+
70+
if(NOT MSVC)
71+
set_target_properties(${PROJECT_NAME} PROPERTIES
72+
CMAKE_CXX_VISIBILITY_PRESET hidden
73+
VISIBILITY_INLINES_HIDDEN ON
74+
)
75+
endif()
76+
77+
if (UNIX)
78+
set_target_properties(${PROJECT_NAME} PROPERTIES
79+
BUILD_RPATH "$ORIGIN"
80+
INSTALL_RPATH "$ORIGIN"
81+
)
82+
endif()
83+
endif()
84+
85+
# Apply versioning suffix if shared and requested
86+
if(${PROJECT_NAME}_OUTPUT_TYPE STREQUAL "SHARED_VERSIONED")
87+
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
88+
endif()
89+
4790
# ----------- INSTALL & EXPORT -----------
4891

4992
include(GNUInstallDirs)
@@ -98,4 +141,5 @@ endif ()
98141
if(${PROJECT_NAME}_BUILD_TESTS)
99142
enable_testing()
100143
add_subdirectory(Tests)
144+
set(${PROJECT_NAME}_OUTPUT_TYPE ${qualisys_cpp_sdk_OUTPUT_TYPE} CACHE BOOL "qualisys_cpp_sdk build type")
101145
endif()

Tests/CMakeLists.txt

+23
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,29 @@ target_link_libraries(${PROJECT_NAME}
3737
doctest::doctest
3838
)
3939

40+
# Ensure if shared library, that it's found at runtime
41+
if(NOT qualisys_cpp_sdk_OUTPUT_TYPE STREQUAL "STATIC")
42+
target_compile_definitions(${PROJECT_NAME} PRIVATE QUALISYS_SDK_SHARED)
43+
44+
if (UNIX)
45+
set_target_properties(${PROJECT_NAME} PROPERTIES
46+
BUILD_RPATH "${CMAKE_BINARY_DIR}"
47+
INSTALL_RPATH "$ORIGIN"
48+
)
49+
elseif(WIN32)
50+
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
51+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
52+
"$<TARGET_FILE:qualisys_cpp_sdk>"
53+
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
54+
)
55+
else()
56+
set_target_properties(${PROJECT_NAME} PROPERTIES
57+
BUILD_RPATH "$ORIGIN"
58+
INSTALL_RPATH "$ORIGIN"
59+
)
60+
endif()
61+
endif()
62+
4063
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
4164

4265
if(MSVC)

0 commit comments

Comments
 (0)