-
Notifications
You must be signed in to change notification settings - Fork 631
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
145 lines (123 loc) · 5.17 KB
/
CMakeLists.txt
File metadata and controls
145 lines (123 loc) · 5.17 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
cmake_minimum_required(VERSION 3.1.3...3.26)
project(ZLToolKit)
#使能c++11
set(CMAKE_CXX_STANDARD 11)
# -fPIC
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# 打印详情
set(CMAKE_VERBOSE_MAKEFILE ON)
#加载自定义模块
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
option(ENABLE_OPENSSL "enable openssl" ON)
option(ENABLE_MYSQL "enable mysql" ON)
option(ENABLE_WEPOLL "Enable wepoll" ON)
option(ASAN_USE_DELETE "use delele[] or free when asan enabled" OFF)
option(BUILD_SHARED_LIBS "Build all libraries shared" ON)
include(CheckStructHasMember)
include(CheckSymbolExists)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
check_struct_has_member("struct mmsghdr" msg_hdr sys/socket.h HAVE_MMSG_HDR)
check_symbol_exists(sendmmsg sys/socket.h HAVE_SENDMMSG_API)
check_symbol_exists(recvmmsg sys/socket.h HAVE_RECVMMSG_API)
# 方便修改全局变量
function(update_cached name value)
set("${name}" "${value}" CACHE INTERNAL "*** Internal ***" FORCE)
endfunction()
function(update_cached_list name)
set(_tmp_list "${${name}}")
list(APPEND _tmp_list "${ARGN}")
list(REMOVE_DUPLICATES _tmp_list)
update_cached(${name} "${_tmp_list}")
endfunction()
update_cached(TK_INC_PATHS "")
update_cached(TK_LINK_LIBRARIES "")
update_cached(TK_COMPILE_DEFINITIONS "")
update_cached(TK_COMPILE_OPTIONS "")
if (HAVE_MMSG_HDR)
update_cached_list(TK_COMPILE_DEFINITIONS HAVE_MMSG_HDR)
endif ()
if (HAVE_SENDMMSG_API)
update_cached_list(TK_COMPILE_DEFINITIONS HAVE_SENDMMSG_API)
endif ()
if (HAVE_RECVMMSG_API)
update_cached_list(TK_COMPILE_DEFINITIONS HAVE_RECVMMSG_API)
endif ()
# check the socket buffer size set by the upper cmake project, if it is set, use the setting of the upper cmake project, otherwise set it to 256K
# if the socket buffer size is set to 0, it means that the socket buffer size is not set, and the kernel default value is used(just for linux)
if (DEFINED SOCKET_DEFAULT_BUF_SIZE)
if (SOCKET_DEFAULT_BUF_SIZE EQUAL 0)
message(STATUS "Socket default buffer size is not set, use the kernel default value")
else ()
message(STATUS "Socket default buffer size is set to ${SOCKET_DEFAULT_BUF_SIZE}")
endif ()
update_cached_list(TK_COMPILE_DEFINITIONS SOCKET_DEFAULT_BUF_SIZE=${SOCKET_DEFAULT_BUF_SIZE})
endif ()
# 收集源码
file(GLOB SRC_LIST
${CMAKE_CURRENT_SOURCE_DIR}/src/*/*.c
${CMAKE_CURRENT_SOURCE_DIR}/src/*/*.mm
${CMAKE_CURRENT_SOURCE_DIR}/src/*/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/*/*/*.cpp)
if (WIN32)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
if (MSVC)
update_cached_list(TK_COMPILE_OPTIONS "/utf-8")
endif ()
update_cached_list(TK_LINK_LIBRARIES WS2_32 Iphlpapi shlwapi)
#防止Windows.h包含Winsock.h
update_cached_list(TK_COMPILE_DEFINITIONS WIN32_LEAN_AND_MEAN MP4V2_NO_STDINT_DEFS _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
else ()
# 非Windows平台自带getopt api
list(FILTER SRC_LIST EXCLUDE REGEX "getopt.c$")
update_cached_list(TK_COMPILE_OPTIONS "-Wno-comment" "-Wno-deprecated-declarations" "-Wno-predefined-identifier-outside-function")
endif ()
if (NOT WIN32 OR NOT ENABLE_WEPOLL)
# 移除wepoll
list(FILTER SRC_LIST EXCLUDE REGEX "wepoll.c$")
else ()
update_cached_list(TK_COMPILE_DEFINITIONS HAS_EPOLL)
update_cached_list(TK_INC_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/src/win32/)
endif ()
#非苹果平台移除.mm类型的文件
if (NOT APPLE)
list(FILTER SRC_LIST EXCLUDE REGEX "Socket_ios.mm$")
endif ()
#查找openssl是否安装
if (ENABLE_OPENSSL)
find_package(OpenSSL)
if (OPENSSL_FOUND)
update_cached_list(TK_INC_PATHS ${OPENSSL_INCLUDE_DIR})
update_cached_list(TK_LINK_LIBRARIES ${OPENSSL_LIBRARIES})
update_cached_list(TK_COMPILE_DEFINITIONS ENABLE_OPENSSL)
endif ()
endif ()
#查找mysql是否安装
if (ENABLE_MYSQL)
find_package(MYSQL)
if (MYSQL_FOUND)
update_cached_list(TK_INC_PATHS ${MYSQL_INCLUDE_DIR})
update_cached_list(TK_INC_PATHS ${MYSQL_INCLUDE_DIR}/mysql)
update_cached_list(TK_LINK_LIBRARIES ${MYSQL_LIBRARIES})
update_cached_list(TK_COMPILE_DEFINITIONS ENABLE_MYSQL)
endif ()
endif ()
#是否使用delete[]替代free,用于解决开启asan后在MacOS上的卡死问题
if (ASAN_USE_DELETE)
update_cached_list(TK_COMPILE_DEFINITIONS ASAN_USE_DELETE)
endif ()
# 库依赖
add_library(${PROJECT_NAME}_deps INTERFACE)
target_link_libraries(${PROJECT_NAME}_deps INTERFACE ${TK_LINK_LIBRARIES})
#编译库
add_library(${PROJECT_NAME} ${SRC_LIST})
#引用头文件路径
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ${TK_INC_PATHS})
target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_deps)
target_compile_definitions(${PROJECT_NAME} PUBLIC ${TK_COMPILE_DEFINITIONS})
target_compile_options(${PROJECT_NAME} PUBLIC ${TK_COMPILE_OPTIONS})
set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
#本工程为root工程,则添加测试程序
add_subdirectory(tests)
endif ()