# MIT License # # Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # ############################################################################## # jsoncpp file(GLOB JSONCPP_SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/include/json/*.h ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/src/lib_json/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/src/lib_json/*.h) add_library(jsoncpp STATIC ${JSONCPP_SRC_LIST}) target_compile_options(jsoncpp PRIVATE ${COMPILE_OPTIONS_DEFAULT}) target_include_directories(jsoncpp PRIVATE "$/jsoncpp/include" PUBLIC "$/jsoncpp/include") update_cached_list(MK_LINK_LIBRARIES jsoncpp) ############################################################################## # media-server set(MediaServer_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/media-server") # TODO: 补一个函数处理各种库 # 添加 mov、flv 库用于 MP4 录制 if (ENABLE_MP4) # MOV set(MediaServer_MOV_ROOT ${MediaServer_ROOT}/libmov) aux_source_directory(${MediaServer_MOV_ROOT}/include MOV_SRC_LIST) aux_source_directory(${MediaServer_MOV_ROOT}/source MOV_SRC_LIST) add_library(mov STATIC ${MOV_SRC_LIST}) add_library(MediaServer::mov ALIAS mov) target_compile_options(mov PRIVATE ${COMPILE_OPTIONS_DEFAULT}) target_include_directories(mov PRIVATE "$" PUBLIC "$") # FLV set(MediaServer_FLV_ROOT ${MediaServer_ROOT}/libflv) aux_source_directory(${MediaServer_FLV_ROOT}/include FLV_SRC_LIST) aux_source_directory(${MediaServer_FLV_ROOT}/source FLV_SRC_LIST) add_library(flv STATIC ${FLV_SRC_LIST}) add_library(MediaServer::flv ALIAS flv) target_compile_options(flv PRIVATE ${COMPILE_OPTIONS_DEFAULT}) target_include_directories(flv PRIVATE "$" PUBLIC "$") update_cached_list(MK_LINK_LIBRARIES MediaServer::flv MediaServer::mov) if (ENABLE_MP4) message(STATUS "ENABLE_MP4 defined") update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_MP4) endif () endif () # 添加 mpeg 用于支持 ts 生成 if(ENABLE_RTPPROXY OR ENABLE_HLS) # mpeg set(MediaServer_MPEG_ROOT ${MediaServer_ROOT}/libmpeg) aux_source_directory(${MediaServer_MPEG_ROOT}/include MPEG_SRC_LIST) aux_source_directory(${MediaServer_MPEG_ROOT}/source MPEG_SRC_LIST) add_library(mpeg STATIC ${MPEG_SRC_LIST}) add_library(MediaServer::mpeg ALIAS mpeg) # media-server库相关编译宏 # MPEG_H26X_VERIFY - 视频流类型识别 # MPEG_ZERO_PAYLOAD_LENGTH - 兼容hik流 # MPEG_DAHUA_AAC_FROM_G711 - 兼容dahua流 target_compile_options(mpeg PRIVATE ${COMPILE_OPTIONS_DEFAULT} -DMPEG_H26X_VERIFY -DMPEG_ZERO_PAYLOAD_LENGTH -DMPEG_DAHUA_AAC_FROM_G711) target_include_directories(mpeg PRIVATE "$" PUBLIC "$") update_cached_list(MK_LINK_LIBRARIES MediaServer::mpeg) if(ENABLE_RTPPROXY) message(STATUS "ENABLE_RTPPROXY defined") update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_RTPPROXY) endif() if(ENABLE_HLS) message(STATUS "ENABLE_HLS defined") update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_HLS) endif() endif() ############################################################################## # toolkit # TODO: 改造 toolkit 以便直接引用 include(CheckStructHasMember) include(CheckSymbolExists) # 检查 sendmmsg 相关依赖并设置对应的宏, 配置 _GNU_SOURCE 以启用 GNU 扩展特性 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) set(COMPILE_DEFINITIONS) # ToolKit 依赖 ENABLE_OPENSSL 以及 ENABLE_MYSQL list(FIND MK_COMPILE_DEFINITIONS ENABLE_OPENSSL ENABLE_OPENSSL_INDEX) if(NOT ENABLE_OPENSSL_INDEX EQUAL -1) list(APPEND COMPILE_DEFINITIONS ENABLE_OPENSSL) endif() list(FIND MK_COMPILE_DEFINITIONS ENABLE_MYSQL ENABLE_MYSQL_INDEX) if(NOT ENABLE_MYSQL_INDEX EQUAL -1) list(APPEND COMPILE_DEFINITIONS ENABLE_MYSQL) endif() if(HAVE_MMSG_HDR) list(APPEND COMPILE_DEFINITIONS HAVE_MMSG_HDR) endif() if(HAVE_SENDMMSG_API) list(APPEND COMPILE_DEFINITIONS HAVE_SENDMMSG_API) endif() if(HAVE_RECVMMSG_API) list(APPEND 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 () add_definitions(-DSOCKET_DEFAULT_BUF_SIZE=${SOCKET_DEFAULT_BUF_SIZE}) endif() set(ToolKit_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/ZLToolKit) # 收集源代码 file(GLOB ToolKit_SRC_LIST ${ToolKit_ROOT}/src/*/*.cpp ${ToolKit_ROOT}/src/*/*.h ${ToolKit_ROOT}/src/*/*.c) if(IOS) list(APPEND ToolKit_SRC_LIST ${ToolKit_ROOT}/src/Network/Socket_ios.mm) endif() ################################################################### #使用wepoll windows iocp 模拟 epoll if(ENABLE_WEPOLL) if(WIN32) message(STATUS "Enable wepoll") #增加wepoll源文件及api参数兼容文件 list(APPEND ToolKit_SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/wepoll/wepoll.c ${CMAKE_CURRENT_SOURCE_DIR}/wepoll/sys/epoll.cpp) #增加wepoll头文件目录 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/wepoll) #开启epoll add_definitions(-DHAS_EPOLL) endif() endif() ################################################################### # 去除 win32 的适配代码 if(NOT WIN32) list(REMOVE_ITEM ToolKit_SRC_LIST ${ToolKit_ROOT}/win32/getopt.c) else() # 防止 Windows.h 包含 Winsock.h list(APPEND COMPILE_DEFINITIONS WIN32_LEAN_AND_MEAN MP4V2_NO_STDINT_DEFS # 禁用警告 _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS) endif() if(ENABLE_CXX_API) # 在 Windows 下启用导出所有符号的选项 if(WIN32) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) endif() # 添加动态库 add_library(zltoolkit SHARED ${ToolKit_SRC_LIST}) add_library(ZLMediaKit::ToolKit ALIAS zltoolkit) # 设置生成的导出库文件 .lib(对于 Windows) set_target_properties(zltoolkit PROPERTIES OUTPUT_NAME zltoolkit # 输出的 DLL 文件名 ) target_link_libraries(zltoolkit PUBLIC ${MK_LINK_LIBRARIES}) else () # 添加库 add_library(zltoolkit STATIC ${ToolKit_SRC_LIST}) add_library(ZLMediaKit::ToolKit ALIAS zltoolkit) endif () target_compile_definitions(zltoolkit PUBLIC ${COMPILE_DEFINITIONS}) target_compile_options(zltoolkit PRIVATE ${COMPILE_OPTIONS_DEFAULT}) target_include_directories(zltoolkit PRIVATE "$" PUBLIC "$/src") update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::ToolKit) if(USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER)) # 在 IDE 中对文件进行分组, 源文件和头文件分开 set_file_group(${ToolKit_ROOT}/src ${ToolKit_SRC_LIST}) endif() # 未在使用 if(ENABLE_CXX_API) # 保留目录结构 #install(DIRECTORY ${ToolKit_ROOT}/ # DESTINATION ${INSTALL_PATH_INCLUDE}/ZLToolKit # REGEX "(.*[.](md|cpp)|win32)$" EXCLUDE) #install(TARGETS zltoolkit # DESTINATION ${INSTALL_PATH_LIB}) endif()