]> git.sesse.net Git - casparcg/blob - CMakeLists.txt
Fix a few Clang warnings.
[casparcg] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.6)
2 project ("CasparCG Server")
3
4 find_package(Git)
5
6 set(GIT_REV "0")
7 set(GIT_HASH "N/A")
8
9 if (GIT_FOUND)
10         exec_program("${GIT_EXECUTABLE}" "${PROJECT_SOURCE_DIR}"
11                         ARGS rev-list --all --count
12                         OUTPUT_VARIABLE GIT_REV)
13         exec_program("${GIT_EXECUTABLE}" "${PROJECT_SOURCE_DIR}"
14                         ARGS rev-parse --verify --short HEAD
15                         OUTPUT_VARIABLE GIT_HASH)
16 endif ()
17
18 include(CMakeDependentOption)
19 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/")
20
21 CMAKE_DEPENDENT_OPTION(BUILD_MODULE_BLUEFISH "Build Bluefish module" ON "MSVC" OFF)
22 option(BUILD_MODULE_DECKLINK "Build Decklink module" ON)
23 option(BUILD_MODULE_HTML "Build HTML module" ON)
24 option(BUILD_MODULE_PSD "Build PSD module" ON)
25 CMAKE_DEPENDENT_OPTION(BUILD_MODULE_FLASH "Build Flash module" ON "MSVC" OFF)
26 CMAKE_DEPENDENT_OPTION(BUILD_MODULE_NEWTEK "Build Newtek module" ON "MSVC" OFF)
27
28 option(USE_SYSTEM_BOOST     "Compile against system boost instead of bundled one" OFF)
29 option(USE_SYSTEM_FFMPEG    "Compile against system FFmpeg instead of bundled one" OFF)
30 option(USE_SYSTEM_TBB       "Compile against system TBB instead of bundled one" OFF)
31 option(USE_SYSTEM_GLEW      "Compile against system GLEW instead of bundled one" OFF)
32 option(USE_SYSTEM_FREETYPE  "Compile against system FreeType instead of bundled one" OFF)
33 option(USE_SYSTEM_FREEIMAGE "Compile against system FreeImage instead of bundled one" OFF)
34 option(USE_SYSTEM_OPENAL    "Compile against system OpenAL instead of bundled one" OFF)
35 option(USE_SYSTEM_SFML      "Compile against system SFML instead of bundled one" OFF)
36 option(USE_COMPILED_GTEST   "Compile GTest from sources (see COMPILED_GTEST_DIR)" OFF)
37 set(COMPILED_GTEST_DIR "/usr/src/googletest" CACHE STRING "If USE_COMPILED_GTEST=ON, where to get Google Test from")
38 option(USE_SYSTEM_GTEST     "Compile against system GTest instead of bundled one" OFF)
39 option(USE_SYSTEM_FONTS     "Compile against system fonts instead of bundled ones" OFF)
40
41 configure_file("${PROJECT_SOURCE_DIR}/version.tmpl" "${PROJECT_SOURCE_DIR}/version.h")
42
43 set(DEPENDENCIES_FOLDER                 "${PROJECT_SOURCE_DIR}/dependencies64")
44
45 if (MSVC)
46         set(PLATFORM_FOLDER_NAME        "win32")
47 elseif (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
48         set(PLATFORM_FOLDER_NAME        "linux")
49 endif ()
50
51 ## boost ##
52 if(USE_SYSTEM_BOOST)
53         find_package(Boost 1.56 REQUIRED COMPONENTS chrono date_time filesystem locale log regex system thread)
54         add_definitions(-DBOOST_ALL_DYN_LINK)
55 else()
56         set(Boost_INCLUDE_DIRS          "${DEPENDENCIES_FOLDER}/boost")
57         set(Boost_LIBRARIES boost_system boost_thread boost_chrono boost_filesystem boost_log boost_locale boost_regex boost_date_time)
58         link_directories("${DEPENDENCIES_FOLDER}/boost/stage/lib/${PLATFORM_FOLDER_NAME}")
59 endif()
60 add_definitions( -DBOOST_THREAD_VERSION=4 )
61 add_definitions( "-DBOOST_ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept(true)" ) # Workaround macro redefinition in boost
62
63 ## TBB ##
64 if(USE_SYSTEM_TBB)
65         find_package(TBB REQUIRED)
66 else()
67         set(TBB_INCLUDE_DIRS            "${DEPENDENCIES_FOLDER}/tbb/include")
68         if(MSVC)
69                 set(TBB_LIBRARIES optimized tbb debug tbb_debug)
70         else()
71                 set(TBB_LIBRARIES tbb)
72         endif()
73         set(TBB_BIN_DIR                         "${DEPENDENCIES_FOLDER}/tbb/bin/${PLATFORM_FOLDER_NAME}")
74         link_directories("${DEPENDENCIES_FOLDER}/tbb/lib/${PLATFORM_FOLDER_NAME}")
75 endif()
76 add_definitions( -DTBB_USE_CAPTURED_EXCEPTION=0 )
77
78 ## GLEW ##
79 if(USE_SYSTEM_GLEW)
80         find_package(GLEW REQUIRED)
81         find_package(OpenGL REQUIRED)
82 else()
83         set(GLEW_INCLUDE_DIRS           "${DEPENDENCIES_FOLDER}/glew/include")
84         if(MSVC)
85                 set(GLEW_LIBRARIES glew32)
86                 set(OPENGL_gl_LIBRARY OpenGL32)
87         else()
88                 set(GLEW_LIBRARIES GLEW)
89                 set(OPENGL_gl_LIBRARY GL)
90         endif()
91         set(GLEW_BIN_DIR                        "${DEPENDENCIES_FOLDER}/glew/bin/${PLATFORM_FOLDER_NAME}")
92         link_directories("${DEPENDENCIES_FOLDER}/glew/lib/${PLATFORM_FOLDER_NAME}")
93 endif()
94 add_definitions( -DGLEW_NO_GLU )
95
96 set(RXCPP_INCLUDE_DIRS                  "${DEPENDENCIES_FOLDER}/RxCpp/include")
97
98 ## SFML ##
99 if(USE_SYSTEM_SFML)
100         find_package(SFML REQUIRED COMPONENTS graphics window system)
101 else()
102         set(SFML_INCLUDE_DIR            "${DEPENDENCIES_FOLDER}/sfml/include")
103         if(MSVC)
104                 set(SFML_LIBRARIES
105                         optimized sfml-system-2   debug sfml-system-d-2
106                         optimized sfml-window-2   debug sfml-window-d-2
107                         optimized sfml-graphics-2 debug sfml-graphics-d-2
108                 )
109         else()
110                 set(SFML_LIBRARIES
111                         sfml-graphics-s
112                         sfml-window-s
113                         sfml-system-s
114                 )
115         endif()
116         link_directories("${DEPENDENCIES_FOLDER}/sfml/lib/${PLATFORM_FOLDER_NAME}")
117         link_directories("${DEPENDENCIES_FOLDER}/sfml/extlibs/lib")
118         add_definitions( -DSFML_STATIC )
119 endif()
120
121 ## FreeType ##
122 if(USE_SYSTEM_FREETYPE)
123         find_package(Freetype REQUIRED)
124 else()
125         set(FREETYPE_INCLUDE_DIRS       "${DEPENDENCIES_FOLDER}/freetype/include")
126         set(FREETYPE_LIBRARIES freetype)
127         link_directories("${DEPENDENCIES_FOLDER}/freetype/objs/win32/vc2010")
128 endif()
129
130 ## FFmpeg ##
131 if(USE_SYSTEM_FFMPEG)
132         find_package(FFmpeg REQUIRED COMPONENTS
133                 avcodec
134                 avdevice
135                 avfilter
136                 avformat
137                 avutil
138                 postproc
139                 swresample
140                 swscale)
141 else()
142         set(FFmpeg_INCLUDE_DIRS         "${DEPENDENCIES_FOLDER}/ffmpeg/include")
143         if (MSVC)
144                 list(APPEND FFmpeg_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/ffmpeg/include-win32")
145         endif ()
146         set(FFmpeg_BIN_DIR                      "${DEPENDENCIES_FOLDER}/ffmpeg/bin/${PLATFORM_FOLDER_NAME}")
147         link_directories("${DEPENDENCIES_FOLDER}/ffmpeg/lib/${PLATFORM_FOLDER_NAME}")
148 endif()
149
150 ## FreeImage ##
151 if(USE_SYSTEM_FREEIMAGE)
152         find_package(FreeImage REQUIRED)
153 else()
154         set(FREEIMAGE_INCLUDE_DIRS      "${DEPENDENCIES_FOLDER}/freeimage/include")
155         if(MSVC)
156                 set(FREEIMAGE_LIBRARIES optimized FreeImage debug FreeImaged)
157         else()
158                 set(FREEIMAGE_LIBRARIES freeimage)
159         endif()
160         set(FREEIMAGE_BIN_DIR           "${DEPENDENCIES_FOLDER}/freeimage/bin/${PLATFORM_FOLDER_NAME}")
161         link_directories("${DEPENDENCIES_FOLDER}/freeimage/lib/${PLATFORM_FOLDER_NAME}")
162 endif()
163
164 ## OpenAL ##
165 if(USE_SYSTEM_OPENAL)
166         find_package(OpenAL REQUIRED)
167 else()
168         set(OPENAL_INCLUDE_DIR          "${DEPENDENCIES_FOLDER}/openal/include")
169         if(MSVC)
170                 set(OPENAL_LIBRARY OpenAL32)
171         else()
172                 set(OPENAL_LIBRARY openal)
173         endif()
174         set(OPENAL_BIN_DIR                      "${DEPENDENCIES_FOLDER}/openal/bin/${PLATFORM_FOLDER_NAME}")
175         link_directories("${DEPENDENCIES_FOLDER}/openal/lib/${PLATFORM_FOLDER_NAME}")
176 endif()
177
178 ## Bluefish ##
179 set(BLUEFISH_INCLUDE_DIRS               "${DEPENDENCIES_FOLDER}/bluefish/include")
180 link_directories("${DEPENDENCIES_FOLDER}/bluefish/lib")
181
182 ## CEF ##
183 set(CEF_INCLUDE_DIRS                    "${DEPENDENCIES_FOLDER}/cef/${PLATFORM_FOLDER_NAME}/include")
184 if(MSVC)
185         set(CEF_LIBRARIES
186                 optimized release/libcef
187                 optimized release/libcef_dll_wrapper
188                 debug debug/libcef
189                 debug debug/libcef_dll_wrapper
190         )
191 else()
192         set(CEF_LIBRARIES cef libcef_dll_wrapper)
193 endif()
194 set(CEF_PATH                                    "${DEPENDENCIES_FOLDER}/cef/${PLATFORM_FOLDER_NAME}")
195 set(CEF_BIN_PATH                                "${DEPENDENCIES_FOLDER}/cef/${PLATFORM_FOLDER_NAME}/Release")
196 set(CEF_RESOURCE_PATH                           "${DEPENDENCIES_FOLDER}/cef/${PLATFORM_FOLDER_NAME}/Resources")
197 link_directories("${CEF_BIN_PATH}")
198
199 ## GTest ##
200 if(USE_COMPILED_GTEST)
201         add_subdirectory(${COMPILED_GTEST_DIR} gtest)
202         set(GTEST_LIBRARIES gtest)
203 elseif(USE_SYSTEM_GTEST)
204         find_package(GTest REQUIRED)
205 else()
206         set(GTEST_INCLUDE_DIRS          "${DEPENDENCIES_FOLDER}/gtest/include")
207         if(MSVC)
208                 set(GTEST_LIBRARIES optimized gtest debug gtestd)
209         else()
210                 set(GTEST_LIBRARIES gtest)
211         endif()
212         link_directories("${DEPENDENCIES_FOLDER}/gtest/lib/${PLATFORM_FOLDER_NAME}")
213 endif()
214
215 ## fonts ##
216 if(NOT USE_SYSTEM_FONTS)
217         set(LIBERATION_FONTS_BIN_DIR    "${DEPENDENCIES_FOLDER}/liberation-fonts")
218 endif()
219
220 link_directories("${DEPENDENCIES_FOLDER}/zlib/lib")
221
222 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
223
224 add_definitions( -DUNICODE )
225 add_definitions( -D_UNICODE )
226 add_definitions( -DCASPAR_SOURCE_PREFIX="${CMAKE_CURRENT_SOURCE_DIR}" )
227
228 if (MSVC)
229         set(CMAKE_CXX_FLAGS                                     "${CMAKE_CXX_FLAGS}                                     /EHa /Zi /W4 /WX /MP /fp:fast /Zm192 /FIcommon/compiler/vs/disable_silly_warnings.h")
230         set(CMAKE_CXX_FLAGS_DEBUG                       "${CMAKE_CXX_FLAGS_DEBUG}                       /D TBB_USE_ASSERT=1 /D TBB_USE_DEBUG /bigobj")
231         set(CMAKE_CXX_FLAGS_RELEASE                     "${CMAKE_CXX_FLAGS_RELEASE}                     /Oi /Ot /Gy /bigobj")
232         set(CMAKE_CXX_FLAGS_RELWITHDEBINFO      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}      /Oi /Ot /Gy /bigobj /Ob2")
233 elseif (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
234         set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -std=c++11")
235         if (CMAKE_C_COMPILER_ID MATCHES "Clang")
236                 # Needed to compile CEF.
237                 add_compile_options( -Wno-undefined-var-template )
238         endif ()
239         add_compile_options( -msse3 )
240         add_compile_options( -mssse3 )
241         add_compile_options( -msse4.1 )
242         add_compile_options( -pthread )
243         add_compile_options( -fPIC )
244         add_compile_options( -fnon-call-exceptions ) # Allow signal handler to throw exception
245         add_definitions( -DBOOST_NO_SWPRINTF ) # swprintf on Linux seems to always use , as decimal point regardless of C-locale or C++-locale
246 endif ()
247
248 if (POLICY CMP0045)
249         cmake_policy(SET CMP0045 OLD)
250 endif ()
251
252 include(CMake/PrecompiledHeader.cmake)
253
254 set(CASPARCG_MODULE_INCLUDE_STATEMENTS                                                  "" CACHE INTERNAL "")
255 set(CASPARCG_MODULE_INIT_STATEMENTS                                                             "" CACHE INTERNAL "")
256 set(CASPARCG_MODULE_UNINIT_STATEMENTS                                                   "" CACHE INTERNAL "")
257 set(CASPARCG_MODULE_COMMAND_LINE_ARG_INTERCEPTORS_STATEMENTS    "" CACHE INTERNAL "")
258 set(CASPARCG_MODULE_PROJECTS                                                                    "" CACHE INTERNAL "")
259 set(CASPARCG_RUNTIME_DEPENDENCIES                                                               "" CACHE INTERNAL "")
260
261 function(casparcg_add_include_statement HEADER_FILE_TO_INCLUDE)
262         set(CASPARCG_MODULE_INCLUDE_STATEMENTS "${CASPARCG_MODULE_INCLUDE_STATEMENTS}"
263                         "#include <${HEADER_FILE_TO_INCLUDE}>"
264                         CACHE INTERNAL "")
265 endfunction()
266
267 function(casparcg_add_init_statement INIT_FUNCTION_NAME NAME_TO_LOG)
268         set(CASPARCG_MODULE_INIT_STATEMENTS "${CASPARCG_MODULE_INIT_STATEMENTS}"
269                         "       ${INIT_FUNCTION_NAME}(dependencies)\;"
270                         "       CASPAR_LOG(info) << L\"Initialized ${NAME_TO_LOG} module.\"\;"
271                         ""
272                         CACHE INTERNAL "")
273 endfunction()
274
275 function(casparcg_add_uninit_statement UNINIT_FUNCTION_NAME)
276         set(CASPARCG_MODULE_UNINIT_STATEMENTS
277                         "       ${UNINIT_FUNCTION_NAME}()\;"
278                         "${CASPARCG_MODULE_UNINIT_STATEMENTS}"
279                         CACHE INTERNAL "")
280 endfunction()
281
282 function(casparcg_add_command_line_arg_interceptor INTERCEPTOR_FUNCTION_NAME)
283         set(CASPARCG_MODULE_COMMAND_LINE_ARG_INTERCEPTORS_STATEMENTS "${CASPARCG_MODULE_COMMAND_LINE_ARG_INTERCEPTORS_STATEMENTS}"
284                         "       if (${INTERCEPTOR_FUNCTION_NAME}(argc, argv))"
285                         "               return true\;"
286                         ""
287                         CACHE INTERNAL "")
288 endfunction()
289
290 function(casparcg_add_module_project PROJECT)
291         set(CASPARCG_MODULE_PROJECTS "${CASPARCG_MODULE_PROJECTS}" "${PROJECT}" CACHE INTERNAL "")
292 endfunction()
293
294 # http://stackoverflow.com/questions/7172670/best-shortest-way-to-join-a-list-in-cmake
295 function(join_list VALUES GLUE OUTPUT)
296         string (REGEX REPLACE "([^\\]|^);" "\\1${GLUE}" _TMP_STR "${VALUES}")
297         string (REGEX REPLACE "[\\](.)" "\\1" _TMP_STR "${_TMP_STR}") #fixes escaping
298         set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
299 endfunction()
300
301 function(casparcg_add_runtime_dependency FILE_TO_COPY)
302         set(CASPARCG_RUNTIME_DEPENDENCIES "${CASPARCG_RUNTIME_DEPENDENCIES}" "${FILE_TO_COPY}" CACHE INTERNAL "")
303 endfunction()
304
305 add_subdirectory(accelerator)
306 add_subdirectory(common)
307 add_subdirectory(core)
308 add_subdirectory(modules)
309
310 add_subdirectory(protocol)
311 add_subdirectory(shell)
312 add_subdirectory(unit-test)