-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
192 lines (157 loc) · 5.44 KB
/
CMakeLists.txt
File metadata and controls
192 lines (157 loc) · 5.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
cmake_minimum_required(VERSION 3.25)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
project(slick-socket
VERSION 1.0.6
LANGUAGES C CXX
)
# Options
option(BUILD_SLICK_SOCKET_EXAMPLES "Build tests" ON)
option(BUILD_SLICK_SOCKET_TESTING "Build tests" ON)
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
if(WIN32)
# Find wepoll (vcpkg installation without CMake config)
find_path(WEPOLL_INCLUDE_DIR wepoll.h)
find_library(WEPOLL_LIBRARY NAMES wepoll)
if(WEPOLL_INCLUDE_DIR AND WEPOLL_LIBRARY)
# Create an imported target for wepoll
add_library(wepoll::wepoll STATIC IMPORTED)
set_target_properties(wepoll::wepoll PROPERTIES
IMPORTED_LOCATION "${WEPOLL_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${WEPOLL_INCLUDE_DIR}"
)
message(STATUS "wepoll: found at ${WEPOLL_LIBRARY}")
else()
# Fallback: Fetch wepoll from GitHub and build it
message(STATUS "wepoll not found locally, fetching from GitHub...")
include(FetchContent)
FetchContent_Declare(
wepoll
GIT_REPOSITORY https://github.com/piscisaureus/wepoll.git
GIT_TAG v1.5.8
)
FetchContent_MakeAvailable(wepoll)
# Build wepoll as a static library
add_library(wepoll_lib STATIC ${wepoll_SOURCE_DIR}/wepoll.c)
target_include_directories(wepoll_lib PUBLIC
$<BUILD_INTERFACE:${wepoll_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
# Set export properties
set_target_properties(wepoll_lib PROPERTIES EXPORT_NAME wepoll)
# Create the wepoll::wepoll target
add_library(wepoll::wepoll ALIAS wepoll_lib)
message(STATUS "wepoll: fetched and built from GitHub")
# Mark that we need to install wepoll
set(SLICK_SOCKET_INSTALL_WEPOLL TRUE)
endif()
endif()
# MSVC configuration
if(MSVC)
# Enable policy CMP0091 to allow CMAKE_MSVC_RUNTIME_LIBRARY to be controlled by toolchain/user
cmake_policy(SET CMP0091 NEW)
# Only set default if not already specified by user or toolchain (e.g., vcpkg)
if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
endif()
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
if (CMAKE_BUILD_TYPE MATCHES Debug)
add_definitions(-DDEBUG)
endif()
if (CMAKE_BUILD_TYPE MATCHES Release)
add_definitions(-DNDEBUG)
endif()
if(ENABLE_ASAN)
if(MSVC)
# MSVC AddressSanitizer (requires Visual Studio 2022 17.7+)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.37")
add_compile_options(/fsanitize=address)
add_link_options(/INCREMENTAL:NO)
# Additional MSVC ASan flags for better compatibility
add_compile_definitions(_DISABLE_VECTOR_ANNOTATION)
add_compile_definitions(_DISABLE_STRING_ANNOTATION)
message(STATUS "AddressSanitizer enabled for MSVC ${CMAKE_CXX_COMPILER_VERSION}")
else()
message(WARNING "AddressSanitizer requires Visual Studio 2022 17.7+ (current: ${CMAKE_CXX_COMPILER_VERSION})")
set(ENABLE_ASAN OFF CACHE BOOL "ASan disabled - compiler too old" FORCE)
endif()
else()
# GCC/Clang AddressSanitizer
add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
add_link_options(-fsanitize=address,undefined)
endif()
endif()
if (MSVC)
set(CMAKE_SUPPRESS_REGENERATION true) # supress zero_check project
endif()
# Create header-only INTERFACE library
add_library(slick-socket INTERFACE)
add_library(slick::socket ALIAS slick-socket)
target_include_directories(slick-socket INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Platform-specific dependencies
if(WIN32)
target_compile_definitions(slick-socket INTERFACE _WIN32_WINNT=0x0601)
target_link_libraries(slick-socket INTERFACE ws2_32 wepoll::wepoll)
endif()
set_target_properties(slick-socket PROPERTIES EXPORT_NAME socket)
if (BUILD_SLICK_SOCKET_EXAMPLES)
add_subdirectory(examples)
endif()
# Tests
if(BUILD_SLICK_SOCKET_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
# Install headers
install(DIRECTORY include/ DESTINATION include)
# Install wepoll headers if we fetched it
if(SLICK_SOCKET_INSTALL_WEPOLL)
install(FILES ${wepoll_SOURCE_DIR}/wepoll.h DESTINATION include)
endif()
# Install library targets (header-only INTERFACE library)
install(TARGETS slick-socket
EXPORT slick-socketTargets
)
# Install wepoll_lib if we built it
if(SLICK_SOCKET_INSTALL_WEPOLL)
install(TARGETS wepoll_lib
EXPORT slick-socketTargets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
endif()
# Install CMake package configuration files
include(CMakePackageConfigHelpers)
# Generate the config file from template
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/slick-socketConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/slick-socketConfig.cmake
INSTALL_DESTINATION lib/cmake/slick-socket
)
# Generate version file
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/slick-socketConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
# Install the config and version files
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/slick-socketConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/slick-socketConfigVersion.cmake
DESTINATION lib/cmake/slick-socket
)
# Install the targets file
install(EXPORT slick-socketTargets
FILE slick-socketTargets.cmake
NAMESPACE slick::
DESTINATION lib/cmake/slick-socket
)
message(STATUS "${PROJECT_NAME}: ${PROJECT_VERSION}")