1 cmake_minimum_required (VERSION 2.6)
2 project ("CasparCG Server")
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)
18 include(CMakeDependentOption)
19 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/")
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)
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)
41 configure_file("${PROJECT_SOURCE_DIR}/version.tmpl" "${PROJECT_SOURCE_DIR}/version.h")
43 set(DEPENDENCIES_FOLDER "${PROJECT_SOURCE_DIR}/dependencies64")
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")
53 find_package(Boost 1.56 REQUIRED COMPONENTS chrono date_time filesystem locale log regex system thread)
54 add_definitions(-DBOOST_ALL_DYN_LINK)
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}")
60 add_definitions( -DBOOST_THREAD_VERSION=4 )
61 add_definitions( "-DBOOST_ASIO_ERROR_CATEGORY_NOEXCEPT=noexcept(true)" ) # Workaround macro redefinition in boost
65 find_package(TBB REQUIRED)
67 set(TBB_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/tbb/include")
69 set(TBB_LIBRARIES optimized tbb debug tbb_debug)
71 set(TBB_LIBRARIES tbb)
73 set(TBB_BIN_DIR "${DEPENDENCIES_FOLDER}/tbb/bin/${PLATFORM_FOLDER_NAME}")
74 link_directories("${DEPENDENCIES_FOLDER}/tbb/lib/${PLATFORM_FOLDER_NAME}")
76 add_definitions( -DTBB_USE_CAPTURED_EXCEPTION=0 )
80 find_package(GLEW REQUIRED)
81 find_package(OpenGL REQUIRED)
83 set(GLEW_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/glew/include")
85 set(GLEW_LIBRARIES glew32)
86 set(OPENGL_gl_LIBRARY OpenGL32)
88 set(GLEW_LIBRARIES GLEW)
89 set(OPENGL_gl_LIBRARY GL)
91 set(GLEW_BIN_DIR "${DEPENDENCIES_FOLDER}/glew/bin/${PLATFORM_FOLDER_NAME}")
92 link_directories("${DEPENDENCIES_FOLDER}/glew/lib/${PLATFORM_FOLDER_NAME}")
94 add_definitions( -DGLEW_NO_GLU )
96 set(RXCPP_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/RxCpp/include")
100 find_package(SFML REQUIRED COMPONENTS graphics window system)
102 set(SFML_INCLUDE_DIR "${DEPENDENCIES_FOLDER}/sfml/include")
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
116 link_directories("${DEPENDENCIES_FOLDER}/sfml/lib/${PLATFORM_FOLDER_NAME}")
117 link_directories("${DEPENDENCIES_FOLDER}/sfml/extlibs/lib")
118 add_definitions( -DSFML_STATIC )
122 if(USE_SYSTEM_FREETYPE)
123 find_package(Freetype REQUIRED)
125 set(FREETYPE_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/freetype/include")
126 set(FREETYPE_LIBRARIES freetype)
127 link_directories("${DEPENDENCIES_FOLDER}/freetype/objs/win32/vc2010")
131 if(USE_SYSTEM_FFMPEG)
132 find_package(FFmpeg REQUIRED COMPONENTS
142 set(FFmpeg_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/ffmpeg/include")
144 list(APPEND FFmpeg_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/ffmpeg/include-win32")
146 set(FFmpeg_BIN_DIR "${DEPENDENCIES_FOLDER}/ffmpeg/bin/${PLATFORM_FOLDER_NAME}")
147 link_directories("${DEPENDENCIES_FOLDER}/ffmpeg/lib/${PLATFORM_FOLDER_NAME}")
151 if(USE_SYSTEM_FREEIMAGE)
152 find_package(FreeImage REQUIRED)
154 set(FREEIMAGE_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/freeimage/include")
156 set(FREEIMAGE_LIBRARIES optimized FreeImage debug FreeImaged)
158 set(FREEIMAGE_LIBRARIES freeimage)
160 set(FREEIMAGE_BIN_DIR "${DEPENDENCIES_FOLDER}/freeimage/bin/${PLATFORM_FOLDER_NAME}")
161 link_directories("${DEPENDENCIES_FOLDER}/freeimage/lib/${PLATFORM_FOLDER_NAME}")
165 if(USE_SYSTEM_OPENAL)
166 find_package(OpenAL REQUIRED)
168 set(OPENAL_INCLUDE_DIR "${DEPENDENCIES_FOLDER}/openal/include")
170 set(OPENAL_LIBRARY OpenAL32)
172 set(OPENAL_LIBRARY openal)
174 set(OPENAL_BIN_DIR "${DEPENDENCIES_FOLDER}/openal/bin/${PLATFORM_FOLDER_NAME}")
175 link_directories("${DEPENDENCIES_FOLDER}/openal/lib/${PLATFORM_FOLDER_NAME}")
179 set(BLUEFISH_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/bluefish/include")
180 link_directories("${DEPENDENCIES_FOLDER}/bluefish/lib")
183 set(CEF_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/cef/${PLATFORM_FOLDER_NAME}/include")
186 optimized release/libcef
187 optimized release/libcef_dll_wrapper
189 debug debug/libcef_dll_wrapper
192 set(CEF_LIBRARIES cef libcef_dll_wrapper)
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}")
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)
206 set(GTEST_INCLUDE_DIRS "${DEPENDENCIES_FOLDER}/gtest/include")
208 set(GTEST_LIBRARIES optimized gtest debug gtestd)
210 set(GTEST_LIBRARIES gtest)
212 link_directories("${DEPENDENCIES_FOLDER}/gtest/lib/${PLATFORM_FOLDER_NAME}")
216 if(NOT USE_SYSTEM_FONTS)
217 set(LIBERATION_FONTS_BIN_DIR "${DEPENDENCIES_FOLDER}/liberation-fonts")
220 link_directories("${DEPENDENCIES_FOLDER}/zlib/lib")
222 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
224 add_definitions( -DUNICODE )
225 add_definitions( -D_UNICODE )
226 add_definitions( -DCASPAR_SOURCE_PREFIX="${CMAKE_CURRENT_SOURCE_DIR}" )
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 )
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
249 cmake_policy(SET CMP0045 OLD)
252 include(CMake/PrecompiledHeader.cmake)
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 "")
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}>"
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.\"\;"
275 function(casparcg_add_uninit_statement UNINIT_FUNCTION_NAME)
276 set(CASPARCG_MODULE_UNINIT_STATEMENTS
277 " ${UNINIT_FUNCTION_NAME}()\;"
278 "${CASPARCG_MODULE_UNINIT_STATEMENTS}"
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))"
290 function(casparcg_add_module_project PROJECT)
291 set(CASPARCG_MODULE_PROJECTS "${CASPARCG_MODULE_PROJECTS}" "${PROJECT}" CACHE INTERNAL "")
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)
301 function(casparcg_add_runtime_dependency FILE_TO_COPY)
302 set(CASPARCG_RUNTIME_DEPENDENCIES "${CASPARCG_RUNTIME_DEPENDENCIES}" "${FILE_TO_COPY}" CACHE INTERNAL "")
305 add_subdirectory(accelerator)
306 add_subdirectory(common)
307 add_subdirectory(core)
308 add_subdirectory(modules)
310 add_subdirectory(protocol)
311 add_subdirectory(shell)
312 add_subdirectory(unit-test)