CMakeLists.txt 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # MIT License
  2. #
  3. # Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
  4. #
  5. # Permission is hereby granted, free of charge, to any person obtaining a copy
  6. # of this software and associated documentation files (the "Software"), to deal
  7. # in the Software without restriction, including without limitation the rights
  8. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. # copies of the Software, and to permit persons to whom the Software is
  10. # furnished to do so, subject to the following conditions:
  11. #
  12. # The above copyright notice and this permission notice shall be included in all
  13. # copies or substantial portions of the Software.
  14. #
  15. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21. # SOFTWARE.
  22. #
  23. ##############################################################################
  24. # jsoncpp
  25. file(GLOB JSONCPP_SRC_LIST
  26. ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/include/json/*.h
  27. ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/src/lib_json/*.cpp
  28. ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp/src/lib_json/*.h)
  29. add_library(jsoncpp STATIC ${JSONCPP_SRC_LIST})
  30. target_compile_options(jsoncpp
  31. PRIVATE ${COMPILE_OPTIONS_DEFAULT})
  32. target_include_directories(jsoncpp
  33. PRIVATE
  34. "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/jsoncpp/include"
  35. PUBLIC
  36. "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/jsoncpp/include")
  37. update_cached_list(MK_LINK_LIBRARIES jsoncpp)
  38. ##############################################################################
  39. # media-server
  40. set(MediaServer_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/media-server")
  41. # TODO: 补一个函数处理各种库
  42. # 添加 mov、flv 库用于 MP4 录制
  43. if (ENABLE_MP4)
  44. # MOV
  45. set(MediaServer_MOV_ROOT ${MediaServer_ROOT}/libmov)
  46. aux_source_directory(${MediaServer_MOV_ROOT}/include MOV_SRC_LIST)
  47. aux_source_directory(${MediaServer_MOV_ROOT}/source MOV_SRC_LIST)
  48. add_library(mov STATIC ${MOV_SRC_LIST})
  49. add_library(MediaServer::mov ALIAS mov)
  50. target_compile_options(mov PRIVATE ${COMPILE_OPTIONS_DEFAULT})
  51. target_include_directories(mov
  52. PRIVATE
  53. "$<BUILD_INTERFACE:${MediaServer_MOV_ROOT}/include>"
  54. PUBLIC
  55. "$<BUILD_INTERFACE:${MediaServer_MOV_ROOT}/include>")
  56. # FLV
  57. set(MediaServer_FLV_ROOT ${MediaServer_ROOT}/libflv)
  58. aux_source_directory(${MediaServer_FLV_ROOT}/include FLV_SRC_LIST)
  59. aux_source_directory(${MediaServer_FLV_ROOT}/source FLV_SRC_LIST)
  60. add_library(flv STATIC ${FLV_SRC_LIST})
  61. add_library(MediaServer::flv ALIAS flv)
  62. target_compile_options(flv PRIVATE ${COMPILE_OPTIONS_DEFAULT})
  63. target_include_directories(flv
  64. PRIVATE
  65. "$<BUILD_INTERFACE:${MediaServer_FLV_ROOT}/include>"
  66. PUBLIC
  67. "$<BUILD_INTERFACE:${MediaServer_FLV_ROOT}/include>")
  68. update_cached_list(MK_LINK_LIBRARIES MediaServer::flv MediaServer::mov)
  69. if (ENABLE_MP4)
  70. message(STATUS "ENABLE_MP4 defined")
  71. update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_MP4)
  72. endif ()
  73. endif ()
  74. # 添加 mpeg 用于支持 ts 生成
  75. if(ENABLE_RTPPROXY OR ENABLE_HLS)
  76. # mpeg
  77. set(MediaServer_MPEG_ROOT ${MediaServer_ROOT}/libmpeg)
  78. aux_source_directory(${MediaServer_MPEG_ROOT}/include MPEG_SRC_LIST)
  79. aux_source_directory(${MediaServer_MPEG_ROOT}/source MPEG_SRC_LIST)
  80. add_library(mpeg STATIC ${MPEG_SRC_LIST})
  81. add_library(MediaServer::mpeg ALIAS mpeg)
  82. # media-server库相关编译宏
  83. # MPEG_H26X_VERIFY - 视频流类型识别
  84. # MPEG_ZERO_PAYLOAD_LENGTH - 兼容hik流
  85. # MPEG_DAHUA_AAC_FROM_G711 - 兼容dahua流
  86. target_compile_options(mpeg
  87. PRIVATE ${COMPILE_OPTIONS_DEFAULT} -DMPEG_H26X_VERIFY -DMPEG_ZERO_PAYLOAD_LENGTH -DMPEG_DAHUA_AAC_FROM_G711)
  88. target_include_directories(mpeg
  89. PRIVATE
  90. "$<BUILD_INTERFACE:${MediaServer_MPEG_ROOT}/include>"
  91. PUBLIC
  92. "$<BUILD_INTERFACE:${MediaServer_MPEG_ROOT}/include>")
  93. update_cached_list(MK_LINK_LIBRARIES MediaServer::mpeg)
  94. if(ENABLE_RTPPROXY)
  95. message(STATUS "ENABLE_RTPPROXY defined")
  96. update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_RTPPROXY)
  97. endif()
  98. if(ENABLE_HLS)
  99. message(STATUS "ENABLE_HLS defined")
  100. update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_HLS)
  101. endif()
  102. endif()
  103. ##############################################################################
  104. # toolkit
  105. # TODO: 改造 toolkit 以便直接引用
  106. include(CheckStructHasMember)
  107. include(CheckSymbolExists)
  108. # 检查 sendmmsg 相关依赖并设置对应的宏, 配置 _GNU_SOURCE 以启用 GNU 扩展特性
  109. list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
  110. check_struct_has_member("struct mmsghdr" msg_hdr sys/socket.h HAVE_MMSG_HDR)
  111. check_symbol_exists(sendmmsg sys/socket.h HAVE_SENDMMSG_API)
  112. check_symbol_exists(recvmmsg sys/socket.h HAVE_RECVMMSG_API)
  113. set(COMPILE_DEFINITIONS)
  114. # ToolKit 依赖 ENABLE_OPENSSL 以及 ENABLE_MYSQL
  115. list(FIND MK_COMPILE_DEFINITIONS ENABLE_OPENSSL ENABLE_OPENSSL_INDEX)
  116. if(NOT ENABLE_OPENSSL_INDEX EQUAL -1)
  117. list(APPEND COMPILE_DEFINITIONS ENABLE_OPENSSL)
  118. endif()
  119. list(FIND MK_COMPILE_DEFINITIONS ENABLE_MYSQL ENABLE_MYSQL_INDEX)
  120. if(NOT ENABLE_MYSQL_INDEX EQUAL -1)
  121. list(APPEND COMPILE_DEFINITIONS ENABLE_MYSQL)
  122. endif()
  123. if(HAVE_MMSG_HDR)
  124. list(APPEND COMPILE_DEFINITIONS HAVE_MMSG_HDR)
  125. endif()
  126. if(HAVE_SENDMMSG_API)
  127. list(APPEND COMPILE_DEFINITIONS HAVE_SENDMMSG_API)
  128. endif()
  129. if(HAVE_RECVMMSG_API)
  130. list(APPEND COMPILE_DEFINITIONS HAVE_RECVMMSG_API)
  131. endif()
  132. # 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
  133. # 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)
  134. if(DEFINED SOCKET_DEFAULT_BUF_SIZE)
  135. if (SOCKET_DEFAULT_BUF_SIZE EQUAL 0)
  136. message(STATUS "Socket default buffer size is not set, use the kernel default value")
  137. else()
  138. message(STATUS "Socket default buffer size is set to ${SOCKET_DEFAULT_BUF_SIZE}")
  139. endif ()
  140. add_definitions(-DSOCKET_DEFAULT_BUF_SIZE=${SOCKET_DEFAULT_BUF_SIZE})
  141. endif()
  142. set(ToolKit_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/ZLToolKit)
  143. # 收集源代码
  144. file(GLOB ToolKit_SRC_LIST
  145. ${ToolKit_ROOT}/src/*/*.cpp
  146. ${ToolKit_ROOT}/src/*/*.h
  147. ${ToolKit_ROOT}/src/*/*.c)
  148. if(IOS)
  149. list(APPEND ToolKit_SRC_LIST
  150. ${ToolKit_ROOT}/src/Network/Socket_ios.mm)
  151. endif()
  152. ###################################################################
  153. #使用wepoll windows iocp 模拟 epoll
  154. if(ENABLE_WEPOLL)
  155. if(WIN32)
  156. message(STATUS "Enable wepoll")
  157. #增加wepoll源文件及api参数兼容文件
  158. list(APPEND ToolKit_SRC_LIST
  159. ${CMAKE_CURRENT_SOURCE_DIR}/wepoll/wepoll.c
  160. ${CMAKE_CURRENT_SOURCE_DIR}/wepoll/sys/epoll.cpp)
  161. #增加wepoll头文件目录
  162. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/wepoll)
  163. #开启epoll
  164. add_definitions(-DHAS_EPOLL)
  165. endif()
  166. endif()
  167. ###################################################################
  168. # 去除 win32 的适配代码
  169. if(NOT WIN32)
  170. list(REMOVE_ITEM ToolKit_SRC_LIST ${ToolKit_ROOT}/win32/getopt.c)
  171. else()
  172. # 防止 Windows.h 包含 Winsock.h
  173. list(APPEND COMPILE_DEFINITIONS
  174. WIN32_LEAN_AND_MEAN MP4V2_NO_STDINT_DEFS
  175. # 禁用警告
  176. _CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
  177. endif()
  178. # 添加库
  179. add_library(zltoolkit STATIC ${ToolKit_SRC_LIST})
  180. add_library(ZLMediaKit::ToolKit ALIAS zltoolkit)
  181. target_compile_definitions(zltoolkit
  182. PUBLIC ${COMPILE_DEFINITIONS})
  183. target_compile_options(zltoolkit
  184. PRIVATE ${COMPILE_OPTIONS_DEFAULT})
  185. target_include_directories(zltoolkit
  186. PRIVATE
  187. "$<BUILD_INTERFACE:${ToolKit_ROOT}/src>"
  188. PUBLIC
  189. "$<BUILD_INTERFACE:${ToolKit_ROOT}>/src")
  190. update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::ToolKit)
  191. if(USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER))
  192. # 在 IDE 中对文件进行分组, 源文件和头文件分开
  193. set_file_group(${ToolKit_ROOT}/src ${ToolKit_SRC_LIST})
  194. endif()
  195. # 未在使用
  196. if(ENABLE_CXX_API)
  197. # 保留目录结构
  198. install(DIRECTORY ${ToolKit_ROOT}/
  199. DESTINATION ${INSTALL_PATH_INCLUDE}/ZLToolKit
  200. REGEX "(.*[.](md|cpp)|win32)$" EXCLUDE)
  201. install(TARGETS zltoolkit
  202. DESTINATION ${INSTALL_PATH_LIB})
  203. endif()