CMakeLists.txt 8.04 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 8 9 10 11 12 13 14 15 16 17 18

#set(CMAKE_BUILD_TYPE "Release")

if(${CMAKE_BUILD_TYPE} MATCHES "Release")
    message(STATUS "Release版本")
    set(BuildType "Release")
else()
    set(BuildType "Debug")
    message(STATUS "Debug版本")
endif()

#设置bin和lib库目录
xiongziliang committed
19
set(RELEASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/release)
20 21 22
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
23
    add_compile_options(-fPIC -Wall -Wno-unused-variable -Wno-unused-value)
24
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
25 26
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/windows/${BuildType})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/windows/${BuildType})
27 28 29
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
    SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/mac/${BuildType})
    SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/mac/${BuildType})
30
    add_compile_options(-Wall -Wno-unused-variable -Wno-unused-value)
31 32 33 34
endif ()

LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})

35
#设置工程源码根目录
xiongziliang committed
36 37
set(ToolKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/ZLToolKit/src)
set(MediaKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/src)
38 39
set(MediaServer_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/media-server)

40 41 42
#设置头文件目录
INCLUDE_DIRECTORIES(${ToolKit_Root})
INCLUDE_DIRECTORIES(${MediaKit_Root})
43
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/3rdpart)
44

45 46 47 48 49 50 51
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)
52
option(ENABLE_API "Enable C API SDK" true)
wxf committed
53
option(ENABLE_CXX_API "Enable C++ API SDK" false)
54 55
option(ENABLE_TESTS "Enable Tests" true)
option(ENABLE_SERVER "Enable Server" true)
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
option(ENABLE_MEM_DEBUG "Enable Memory Debug" false)
option(ENABLE_ASAN "Enable Address Sanitize" false)

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 ()
71

72
set(LINK_LIB_LIST zlmediakit zltoolkit)
xiongziliang committed
73

xia-chu committed
74 75 76 77 78 79 80 81
#默认链接jemalloc库避免内存碎片
find_package(JEMALLOC QUIET)
if(JEMALLOC_FOUND)
    message(STATUS "found library:\"${JEMALLOC_LIBRARIES}\"")
    include_directories(${JEMALLOC_INCLUDE_DIR})
    list(APPEND  LINK_LIB_LIST ${JEMALLOC_LIBRARIES})
endif()

xiongziliang committed
82
#查找openssl是否安装
xiongziliang committed
83
find_package(OpenSSL QUIET)
zqsong committed
84
if (OPENSSL_FOUND AND ENABLE_OPENSSL)
85
    message(STATUS "found library:${OPENSSL_LIBRARIES},ENABLE_OPENSSL defined")
zqsong committed
86
    include_directories(${OPENSSL_INCLUDE_DIR})
87
    add_definitions(-DENABLE_OPENSSL)
zqsong committed
88
    list(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES})
89 90
else()
    message(WARNING "openssl未找到,rtmp将不支持flash播放器,https/wss/rtsps/rtmps也将失效")
91
endif ()
xiongziliang committed
92 93 94

#查找mysql是否安装
find_package(MYSQL QUIET)
95 96
if (MYSQL_FOUND AND ENABLE_MYSQL)
    message(STATUS "found library:${MYSQL_LIBRARIES},ENABLE_MYSQL defined")
97
    include_directories(${MYSQL_INCLUDE_DIR})
98
    include_directories(${MYSQL_INCLUDE_DIR}/mysql)
99 100
    add_definitions(-DENABLE_MYSQL)
    list(APPEND LINK_LIB_LIST ${MYSQL_LIBRARIES})
101
endif ()
xiongziliang committed
102 103 104

#查找x264是否安装
find_package(X264 QUIET)
105 106
if (X264_FOUND AND ENABLE_X264)
    message(STATUS "found library:${X264_LIBRARIES},ENABLE_X264 defined")
107 108 109
    include_directories(${X264_INCLUDE_DIRS})
    add_definitions(-DENABLE_X264)
    list(APPEND LINK_LIB_LIST ${X264_LIBRARIES})
110
endif ()
xiongziliang committed
111 112 113

#查找faac是否安装
find_package(FAAC QUIET)
114 115
if (FAAC_FOUND AND ENABLE_FAAC)
    message(STATUS "found library:${FAAC_LIBRARIES},ENABLE_FAAC defined")
116 117 118
    include_directories(${FAAC_INCLUDE_DIR})
    add_definitions(-DENABLE_FAAC)
    list(APPEND LINK_LIB_LIST ${FAAC_LIBRARIES})
119
endif ()
xiongziliang committed
120

121
#set(VS_FALGS "/wd4819 /wd4996 /wd4018 /wd4267 /wd4244 /wd4101 /wd4828 /wd4309 /wd4573 /wd4996" )
122
set(VS_FALGS "/wd4819" )
123 124

#添加mpeg用于支持ts生成
125
if(ENABLE_HLS)
126 127 128
    message(STATUS "ENABLE_HLS defined")
    add_definitions(-DENABLE_HLS)

129
    include_directories(${MediaServer_Root}/libmpeg/include)
130 131
    aux_source_directory(${MediaServer_Root}/libmpeg/include src_mpeg)
    aux_source_directory(${MediaServer_Root}/libmpeg/source src_mpeg)
132

133
    add_library(mpeg STATIC ${src_mpeg})
134
    list(APPEND LINK_LIB_LIST mpeg)
135
    list(APPEND CXX_API_TARGETS mpeg)
136

137 138 139
	if(WIN32)
		set_target_properties(mpeg PROPERTIES COMPILE_FLAGS  ${VS_FALGS} )
	endif(WIN32)
140
endif()
141

142
#添加mov、flv库用于MP4录制
xiongziliang committed
143 144 145
if(ENABLE_MP4)
    message(STATUS "ENABLE_MP4 defined")
    add_definitions(-DENABLE_MP4)
146

147 148 149
    include_directories(${MediaServer_Root}/libmov/include)
    include_directories(${MediaServer_Root}/libflv/include)

zqsong committed
150 151
    aux_source_directory(${MediaServer_Root}/libmov/include src_mov)
    aux_source_directory(${MediaServer_Root}/libmov/source src_mov)	
152

zqsong committed
153 154
    aux_source_directory(${MediaServer_Root}/libflv/include src_flv)
    aux_source_directory(${MediaServer_Root}/libflv/source src_flv)	
155 156

    add_library(mov STATIC ${src_mov})
zqsong committed
157
	add_library(flv STATIC ${src_flv})
158
    list(APPEND LINK_LIB_LIST mov flv)
159
    list(APPEND CXX_API_TARGETS mov flv)
160

zqsong committed
161 162 163 164 165
	if(WIN32)
		set_target_properties(mov flv PROPERTIES COMPILE_FLAGS  ${VS_FALGS} )
	endif(WIN32)
endif()

xiongziliang committed
166
#添加rtp库用于rtp转ps/ts
167
if(ENABLE_RTPPROXY AND ENABLE_HLS)
xiongziliang committed
168
    message(STATUS "ENABLE_RTPPROXY defined")
169
    add_definitions(-DENABLE_RTPPROXY)
170
endif()
zqsong committed
171

172 173
#收集源代码
file(GLOB ToolKit_src_list ${ToolKit_Root}/*/*.cpp ${ToolKit_Root}/*/*.h ${ToolKit_Root}/*/*.c)
xiongziliang committed
174 175 176 177
if(IOS)
    list(APPEND ToolKit_src_list ${ToolKit_Root}/Network/Socket_ios.mm)
endif()

178
file(GLOB MediaKit_src_list ${MediaKit_Root}/*/*.cpp ${MediaKit_Root}/*/*.h ${MediaKit_Root}/*/*.c)
179

180 181 182 183 184
#去除win32的适配代码
if (NOT WIN32)
    list(REMOVE_ITEM ToolKit_src_list ${ToolKit_Root}/win32/getopt.c)
else()
    #防止Windows.h包含Winsock.h
185
    add_definitions(-DWIN32_LEAN_AND_MEAN -DMP4V2_NO_STDINT_DEFS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
186
endif ()
187 188 189 190

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

wxf committed
193 194 195 196 197
#安装目录
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
198
    set(INSTALL_PATH_LIB lib${LIB_SUFFIX})
wxf committed
199
    set(INSTALL_PATH_INCLUDE include)
wxf committed
200
    set(INSTALL_PATH_EXECUTABLE bin)
wxf committed
201 202 203 204 205 206
endif ()

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

xiongziliang committed
210
if (WIN32)
211
    list(APPEND LINK_LIB_LIST WS2_32 Iphlpapi shlwapi)
212 213
	set_target_properties(zltoolkit PROPERTIES COMPILE_FLAGS ${VS_FALGS} )
	set_target_properties(zlmediakit PROPERTIES COMPILE_FLAGS ${VS_FALGS} )
xiongziliang committed
214
elseif(NOT ANDROID OR IOS)
xiongziliang committed
215
    list(APPEND LINK_LIB_LIST pthread)
216 217
endif ()

218 219 220 221
#复制文件过来
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}/)

222
#添加c库
223 224 225
if(ENABLE_API)
    add_subdirectory(api)
endif()
226

xiongziliang committed
227 228
if (NOT IOS)
    #测试程序
229 230 231
    if(ENABLE_TESTS)
        add_subdirectory(tests)
    endif()
xiongziliang committed
232
    #主服务器
233 234 235
    if(ENABLE_SERVER)
        add_subdirectory(server)
    endif()
xiongziliang committed
236
endif ()