145 lines
5.2 KiB
CMake
145 lines
5.2 KiB
CMake
|
|
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 ()
|