CMakeLists.txt 10.8 KB
Newer Older
1
project(ZLMediaKit)
xiongziliang committed
2
cmake_minimum_required(VERSION 3.1.3)
3
#使能c++11
xiongziliang committed
4
set(CMAKE_CXX_STANDARD 11)
xiongziliang committed
5
#加载自定义模块
xiongziliang committed
6
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
7

Johnny committed
8 9 10 11 12 13
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)

14
#set(CMAKE_BUILD_TYPE "Release")
15
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
16 17 18
    set(CMAKE_BUILD_TYPE "Debug")
endif ()

ziyue committed
19
message(STATUS "编译类型:${CMAKE_BUILD_TYPE}")
20 21

#设置bin和lib库目录
xiongziliang committed
22
set(RELEASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/release)
ziyue committed
23

24
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
ziyue committed
25 26
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${CMAKE_BUILD_TYPE})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${CMAKE_BUILD_TYPE})
27
    add_compile_options(-fPIC -Wall -Wno-unused-variable -Wno-unused-value)
28
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
ziyue committed
29 30 31 32 33 34 35
    if (CMAKE_CL_64)
        set(CL_32_64 64)
    else ()
        set(CL_32_64 32)
    endif ()
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/windows${CL_32_64}/${CMAKE_BUILD_TYPE})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/windows${CL_32_64}/${CMAKE_BUILD_TYPE})
36
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
ziyue committed
37 38
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/mac/${CMAKE_BUILD_TYPE})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/mac/${CMAKE_BUILD_TYPE})
39
    add_compile_options(-Wall -Wno-unused-variable -Wno-unused-value)
40 41 42 43
endif ()

LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})

44
#设置工程源码根目录
xiongziliang committed
45 46
set(ToolKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/ZLToolKit/src)
set(MediaKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/src)
47 48
set(MediaServer_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/media-server)

49 50 51
#设置头文件目录
INCLUDE_DIRECTORIES(${ToolKit_Root})
INCLUDE_DIRECTORIES(${MediaKit_Root})
52
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/3rdpart)
53

54 55 56 57 58 59 60
option(ENABLE_HLS "Enable HLS" true)
option(ENABLE_OPENSSL "Enable OpenSSL" true)
option(ENABLE_MYSQL "Enable MySQL" false)
option(ENABLE_FAAC "Enable FAAC" false)
option(ENABLE_X264 "Enable x264" false)
option(ENABLE_MP4 "Enable MP4" true)
option(ENABLE_RTPPROXY "Enable RTPPROXY" true)
61
option(ENABLE_API "Enable C API SDK" true)
wxf committed
62
option(ENABLE_CXX_API "Enable C++ API SDK" false)
63 64
option(ENABLE_TESTS "Enable Tests" true)
option(ENABLE_SERVER "Enable Server" true)
65 66
option(ENABLE_MEM_DEBUG "Enable Memory Debug" false)
option(ENABLE_ASAN "Enable Address Sanitize" false)
ziyue committed
67
option(ENABLE_WEBRTC "Enable WebRTC" true)
68
option(ENABLE_PLAYER "Enable Player" true)
ziyue committed
69
option(ENABLE_MSVC_MT "Enable MSVC Mt/Mtd lib" true)
70
option(ENABLE_API_STATIC_LIB "Enable mk_api static lib" false)
71

ziyue committed
72
if (MSVC AND ENABLE_MSVC_MT)
73 74 75 76 77 78 79 80 81 82 83 84
    set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
        )
    foreach(CompilerFlag ${CompilerFlags})
        string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
    endforeach()
endif()
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
# 添加git版本信息
set(COMMIT_HASH "Git_NotFound_Unkown_commit")
set(BRANCH_NAME "Git_NotFound_Unkown_branch")
set(BUILD_TIME "")

string(TIMESTAMP BUILD_TIME "%Y/%m/%d-%H:%M:%S")

find_package(Git QUIET)
if (GIT_FOUND)
    execute_process(
            COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
            OUTPUT_VARIABLE COMMIT_HASH
            OUTPUT_STRIP_TRAILING_WHITESPACE
            ERROR_QUIET
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    )
    execute_process(
            COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
            OUTPUT_VARIABLE BRANCH_NAME
            OUTPUT_STRIP_TRAILING_WHITESPACE
            ERROR_QUIET
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    )
endif ()

configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/version.h.ini
        ${CMAKE_BINARY_DIR}/Version.h
        @ONLY
)

add_definitions(-DENABLE_VERSION)
include_directories(${CMAKE_BINARY_DIR})
message(STATUS "Git version is ${BRANCH_NAME}:${COMMIT_HASH}:${BUILD_TIME}")

121 122 123 124 125 126 127 128 129 130 131 132
if (ENABLE_MEM_DEBUG)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-wrap,free  -Wl,-wrap,malloc -Wl,-wrap,realloc -Wl,-wrap,calloc")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wl,-wrap,free  -Wl,-wrap,malloc -Wl,-wrap,realloc -Wl,-wrap,calloc")
    add_definitions(-DENABLE_MEM_DEBUG)
    message(STATUS "已启用内存调试功能")
endif ()

if (ENABLE_ASAN)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    message(STATUS "已启用Address Sanitize")
endif ()
133

134
set(LINK_LIB_LIST zlmediakit zltoolkit)
xiongziliang committed
135

xia-chu committed
136 137
#默认链接jemalloc库避免内存碎片
find_package(JEMALLOC QUIET)
138
if (JEMALLOC_FOUND)
xia-chu committed
139 140
    message(STATUS "found library:\"${JEMALLOC_LIBRARIES}\"")
    include_directories(${JEMALLOC_INCLUDE_DIR})
141 142
    list(APPEND LINK_LIB_LIST ${JEMALLOC_LIBRARIES})
endif ()
xia-chu committed
143

xiongziliang committed
144
#查找openssl是否安装
xiongziliang committed
145
find_package(OpenSSL QUIET)
zqsong committed
146
if (OPENSSL_FOUND AND ENABLE_OPENSSL)
147
    message(STATUS "found library:${OPENSSL_LIBRARIES},ENABLE_OPENSSL defined")
zqsong committed
148
    include_directories(${OPENSSL_INCLUDE_DIR})
149
    add_definitions(-DENABLE_OPENSSL)
zqsong committed
150
    list(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES})
151
    if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND OPENSSL_USE_STATIC_LIBS)
152
        list(APPEND LINK_LIB_LIST dl)
153 154
    endif ()
else ()
155
    message(WARNING "openssl未找到,rtmp将不支持flash播放器,https/wss/rtsps/rtmps也将失效")
156
endif ()
xiongziliang committed
157 158 159

#查找mysql是否安装
find_package(MYSQL QUIET)
160 161
if (MYSQL_FOUND AND ENABLE_MYSQL)
    message(STATUS "found library:${MYSQL_LIBRARIES},ENABLE_MYSQL defined")
162
    include_directories(${MYSQL_INCLUDE_DIR})
163
    include_directories(${MYSQL_INCLUDE_DIR}/mysql)
164 165
    add_definitions(-DENABLE_MYSQL)
    list(APPEND LINK_LIB_LIST ${MYSQL_LIBRARIES})
166
endif ()
xiongziliang committed
167 168 169

#查找x264是否安装
find_package(X264 QUIET)
170 171
if (X264_FOUND AND ENABLE_X264)
    message(STATUS "found library:${X264_LIBRARIES},ENABLE_X264 defined")
172 173 174
    include_directories(${X264_INCLUDE_DIRS})
    add_definitions(-DENABLE_X264)
    list(APPEND LINK_LIB_LIST ${X264_LIBRARIES})
175
endif ()
xiongziliang committed
176 177 178

#查找faac是否安装
find_package(FAAC QUIET)
179 180
if (FAAC_FOUND AND ENABLE_FAAC)
    message(STATUS "found library:${FAAC_LIBRARIES},ENABLE_FAAC defined")
181 182 183
    include_directories(${FAAC_INCLUDE_DIR})
    add_definitions(-DENABLE_FAAC)
    list(APPEND LINK_LIB_LIST ${FAAC_LIBRARIES})
184
endif ()
xiongziliang committed
185

186
#set(VS_FALGS "/wd4819 /wd4996 /wd4018 /wd4267 /wd4244 /wd4101 /wd4828 /wd4309 /wd4573 /wd4996" )
187
set(VS_FALGS "/wd4819")
188 189

#添加mpeg用于支持ts生成
190
if (ENABLE_HLS)
191 192 193
    message(STATUS "ENABLE_HLS defined")
    add_definitions(-DENABLE_HLS)

194
    include_directories(${MediaServer_Root}/libmpeg/include)
195 196
    aux_source_directory(${MediaServer_Root}/libmpeg/include src_mpeg)
    aux_source_directory(${MediaServer_Root}/libmpeg/source src_mpeg)
197

198
    add_library(mpeg STATIC ${src_mpeg})
199
    list(APPEND LINK_LIB_LIST mpeg)
200
    list(APPEND CXX_API_TARGETS mpeg)
201

202
    if (MSVC)
203
        set_target_properties(mpeg PROPERTIES COMPILE_FLAGS ${VS_FALGS})
204
    endif ()
205
endif ()
206

207
#添加mov、flv库用于MP4录制
208
if (ENABLE_MP4)
xiongziliang committed
209 210
    message(STATUS "ENABLE_MP4 defined")
    add_definitions(-DENABLE_MP4)
211

212 213 214
    include_directories(${MediaServer_Root}/libmov/include)
    include_directories(${MediaServer_Root}/libflv/include)

zqsong committed
215
    aux_source_directory(${MediaServer_Root}/libmov/include src_mov)
216
    aux_source_directory(${MediaServer_Root}/libmov/source src_mov)
217

zqsong committed
218
    aux_source_directory(${MediaServer_Root}/libflv/include src_flv)
219
    aux_source_directory(${MediaServer_Root}/libflv/source src_flv)
220 221

    add_library(mov STATIC ${src_mov})
222
    add_library(flv STATIC ${src_flv})
223
    list(APPEND LINK_LIB_LIST mov flv)
224
    list(APPEND CXX_API_TARGETS mov flv)
225

226
    if (MSVC)
227
        set_target_properties(mov flv PROPERTIES COMPILE_FLAGS ${VS_FALGS})
228
    endif ()
229
endif ()
zqsong committed
230

xiongziliang committed
231
#添加rtp库用于rtp转ps/ts
232
if (ENABLE_RTPPROXY AND ENABLE_HLS)
xiongziliang committed
233
    message(STATUS "ENABLE_RTPPROXY defined")
234
    add_definitions(-DENABLE_RTPPROXY)
235
endif ()
zqsong committed
236

237 238
#收集源代码
file(GLOB ToolKit_src_list ${ToolKit_Root}/*/*.cpp ${ToolKit_Root}/*/*.h ${ToolKit_Root}/*/*.c)
239
if (IOS)
xiongziliang committed
240
    list(APPEND ToolKit_src_list ${ToolKit_Root}/Network/Socket_ios.mm)
241
endif ()
xiongziliang committed
242

243
file(GLOB MediaKit_src_list ${MediaKit_Root}/*/*.cpp ${MediaKit_Root}/*/*.h ${MediaKit_Root}/*/*.c)
244

245 246 247
#去除win32的适配代码
if (NOT WIN32)
    list(REMOVE_ITEM ToolKit_src_list ${ToolKit_Root}/win32/getopt.c)
248
else ()
249
    #防止Windows.h包含Winsock.h
250
    add_definitions(-DWIN32_LEAN_AND_MEAN -DMP4V2_NO_STDINT_DEFS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
251
endif ()
252 253 254 255

#添加库
add_library(zltoolkit STATIC ${ToolKit_src_list})
add_library(zlmediakit STATIC ${MediaKit_src_list})
256
list(APPEND CXX_API_TARGETS zltoolkit zlmediakit)
257

wxf committed
258 259 260 261 262
#安装目录
if (WIN32)
    set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib)
    set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include)
else ()
wxf committed
263
    set(INSTALL_PATH_LIB lib${LIB_SUFFIX})
wxf committed
264
    set(INSTALL_PATH_INCLUDE include)
wxf committed
265
    set(INSTALL_PATH_EXECUTABLE bin)
wxf committed
266 267
endif ()

268
if (ENABLE_CXX_API)
wxf committed
269
    # 保留目录结构
270
    install(DIRECTORY ${ToolKit_Root}/ DESTINATION ${INSTALL_PATH_INCLUDE}/ZLToolKit REGEX "(.*[.](md|cpp)|win32)$" EXCLUDE)
wxf committed
271
    install(DIRECTORY ${MediaKit_Root}/ DESTINATION ${INSTALL_PATH_INCLUDE}/ZLMediaKit REGEX ".*[.](md|cpp)$" EXCLUDE)
272
    install(TARGETS ${CXX_API_TARGETS} DESTINATION ${INSTALL_PATH_LIB})
273
endif ()
wxf committed
274

xiongziliang committed
275
if (WIN32)
276
    list(APPEND LINK_LIB_LIST WS2_32 Iphlpapi shlwapi)
277 278 279 280
    if (MSVC)
        set_target_properties(zltoolkit PROPERTIES COMPILE_FLAGS ${VS_FALGS})
        set_target_properties(zlmediakit PROPERTIES COMPILE_FLAGS ${VS_FALGS})
    endif ()
281
elseif (NOT ANDROID OR IOS)
xiongziliang committed
282
    list(APPEND LINK_LIB_LIST pthread)
283 284
endif ()

285 286 287 288
#复制文件过来
execute_process(COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/www ${EXECUTABLE_OUTPUT_PATH}/)
execute_process(COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/conf/config.ini ${EXECUTABLE_OUTPUT_PATH}/)

289
#添加c库
290
if (ENABLE_API)
291
    add_subdirectory(api)
292
endif ()
293

ziyue committed
294 295 296 297 298 299 300 301 302 303 304 305
if (ENABLE_WEBRTC)
    #查找srtp是否安装
    find_package(SRTP QUIET)
    if (SRTP_FOUND)
        message(STATUS "found library:${SRTP_LIBRARIES}")
        include_directories(${SRTP_INCLUDE_DIRS})
        list(APPEND LINK_LIB_LIST ${SRTP_LIBRARIES})

        add_definitions(-DENABLE_WEBRTC)
        include_directories(./webrtc)
        file(GLOB SRC_WEBRTC_LIST ./webrtc/*.cpp ./webrtc/*.h ./webrtc/*.hpp)
        add_library(webrtc ${SRC_WEBRTC_LIST})
306
        list(APPEND LINK_LIB_LIST webrtc)
ziyue committed
307
        message(STATUS "webrtc功能已开启")
ziyue committed
308
    else ()
309
        set(ENABLE_WEBRTC off)
ziyue committed
310 311 312
        message(WARNING "srtp未找到, webrtc相关功能打开失败")
    endif ()
endif ()
313

ziyue committed
314 315 316 317
#ios不编译可执行程序
if (IOS)
    return()
endif()
318

ziyue committed
319 320 321 322 323 324 325 326 327 328 329 330 331
#测试程序
if (ENABLE_TESTS)
    add_subdirectory(tests)
endif ()

#主服务器
if (ENABLE_SERVER)
    add_subdirectory(server)
endif ()

#播放器
if (ENABLE_PLAYER)
    add_subdirectory(player)
xiongziliang committed
332
endif ()