Merge pull request #22109 from CastagnaIT/jsonrpc_audiooffset
[xbmc.git] / CMakeLists.txt
blob19881e47080add65e8d0badad4f09e854343788c
1 cmake_minimum_required(VERSION 3.12)
2 if(WIN32)
3   # Version 3.20 is required for multi-config generator expressions to work
4   cmake_minimum_required(VERSION 3.20)
5 endif()
6 project(kodi LANGUAGES CXX C ASM)
8 if(POLICY CMP0069)
9   set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
10   cmake_policy(SET CMP0069 NEW)
11 endif()
13 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
14 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules/buildtools)
15 if(DEPENDS_DIR)
16   list(APPEND CMAKE_PREFIX_PATH ${DEPENDS_DIR})
17 endif()
19 # Set CORE_BUILD_DIR
20 set(CORE_BUILD_DIR build)
21 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
23 message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}")
24 message(STATUS "Build directory: ${CMAKE_BINARY_DIR}")
25 if(CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR)
26   message(WARNING "In-source build detected. It is recommended to build out-of-source.")
27 endif()
29 # Hide messages from Check*.cmake (e.g. CheckCSourceCompiles)
30 if(NOT VERBOSE)
31   set(CMAKE_REQUIRED_QUIET ON)
32 endif()
34 # Includes
35 include(cmake/modules/extra/ECMEnableSanitizers.cmake)
36 include(cmake/scripts/common/GeneratorSetup.cmake)
37 include(cmake/scripts/common/AddOptions.cmake)
38 include(cmake/scripts/common/Platform.cmake)
39 include(cmake/scripts/common/ArchSetup.cmake)
40 include(cmake/scripts/common/Macros.cmake)
41 include(cmake/scripts/common/ProjectMacros.cmake)
42 core_find_versions()
43 include(cmake/scripts/common/PathSetup.cmake)
44 include(cmake/scripts/common/CompilerSettings.cmake)
45 include(ExternalProject)
46 include(CMakeDependentOption)
47 include(cmake/scripts/common/DependencyOptions.cmake)
49 # general
50 option(VERBOSE            "Enable verbose output?" OFF)
51 option(ENABLE_CLANGTIDY   "Enable clang-tidy support?" OFF)
52 option(ENABLE_CPPCHECK    "Enable cppcheck support?" OFF)
53 option(ENABLE_DVDCSS      "Enable libdvdcss support?" ON)
54 option(ENABLE_INCLUDEWHATYOUUSE "Enable include-what-you-use support?" OFF)
55 option(ENABLE_UPNP        "Enable UPnP support?" ON)
56 option(ENABLE_AIRTUNES    "Enable AirTunes support?" ON)
57 option(ENABLE_OPTICAL     "Enable optical support?" ON)
58 option(ENABLE_PYTHON      "Enable python support?" ON)
59 option(ENABLE_TESTING     "Enable testing support?" ON)
61 # Internal Depends - supported on all platforms
63 # These are required enabled for all CI platforms, and recommended for all builds
64 option(ENABLE_INTERNAL_CROSSGUID "Enable internal crossguid?" ON)
65 option(ENABLE_INTERNAL_RapidJSON "Enable internal rapidjson?" ON)
67 # use ffmpeg from depends or system
68 option(ENABLE_INTERNAL_FFMPEG "Enable internal ffmpeg?" OFF)
70 # These are built for all platforms not using system libs or disabled by user
71 dependent_option(ENABLE_INTERNAL_FLATBUFFERS "Enable internal flatbuffers?")
72 dependent_option(ENABLE_INTERNAL_FMT "Enable internal fmt?")
73 dependent_option(ENABLE_INTERNAL_NFS "Enable internal libnfs?")
74 dependent_option(ENABLE_INTERNAL_PCRE "Enable internal pcre?")
75 dependent_option(ENABLE_INTERNAL_SPDLOG "Enable internal spdlog?")
76 dependent_option(ENABLE_INTERNAL_TAGLIB "Enable internal taglib?")
78 # Internal Depends - supported on UNIX platforms
79 if(UNIX)
80   option(FFMPEG_PATH        "Path to external ffmpeg?" "")
81   option(ENABLE_INTERNAL_FSTRCMP "Enable internal fstrcmp?" OFF)
82   option(ENABLE_INTERNAL_DAV1D "Enable internal dav1d?" OFF)
83   option(ENABLE_INTERNAL_GTEST "Enable internal gtest?" OFF)
84   option(ENABLE_INTERNAL_UDFREAD "Enable internal udfread?" OFF)
85 endif()
86 # prefer kissfft from xbmc/contrib but let use system one on unices
87 cmake_dependent_option(ENABLE_INTERNAL_KISSFFT "Enable internal kissfft?" ON "UNIX" ON)
88 # System options
89 if(NOT WIN32)
90   option(WITH_ARCH              "build with given arch" OFF)
91   option(WITH_CPU               "build with given cpu" OFF)
92 endif()
93 if(CORE_SYSTEM_NAME STREQUAL linux)
94   option(ENABLE_EVENTCLIENTS    "Enable event clients support?" OFF)
95   option(ADDONS_CONFIGURE_AT_STARTUP "Configure binary addons at startup?" ON)
96 endif()
98 # set scope of INTERNAL_DEPS
99 set_property(GLOBAL PROPERTY INTERNAL_DEPS_PROP)
101 # Build static libraries per directory
102 if(NOT CMAKE_GENERATOR MATCHES "Visual Studio" AND NOT CMAKE_GENERATOR STREQUAL Xcode)
103   set(ENABLE_STATIC_LIBS TRUE)
104 else()
105   set(ENABLE_STATIC_LIBS FALSE)
106 endif()
108 core_find_git_rev(APP_SCMID FULL)
110 # Dynamically loaded libraries built with the project
111 add_custom_target(${APP_NAME_LC}-libraries)
112 set(LIBRARY_FILES "" CACHE STRING "" FORCE)
113 mark_as_advanced(LIBRARY_FILES)
115 set(INCLUDES ${CMAKE_SOURCE_DIR}
116              ${CMAKE_SOURCE_DIR}/lib
117              ${CMAKE_SOURCE_DIR}/xbmc
118              ${CMAKE_SOURCE_DIR}/xbmc/${PLATFORM_DIR}
119              ${CMAKE_SOURCE_DIR}/xbmc/cores/VideoPlayer
120              ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}
121              ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/include)
123 if (NOT PLATFORMDEFS_DIR STREQUAL "")
124   list(APPEND INCLUDES ${CMAKE_SOURCE_DIR}/xbmc/${PLATFORMDEFS_DIR})
125 endif()
127 find_package(PkgConfig)
128 set(THREADS_PREFER_PTHREAD_FLAG ON)
129 find_package(Threads REQUIRED QUIET)
130 list(APPEND DEPLIBS ${CMAKE_THREAD_LIBS_INIT})
133 foreach(depspec ${PLATFORM_REQUIRED_DEPS})
134   # We need to specify ENABLE_${PLATFORM_REQUIRED_DEPS} in order for the
135   # optional subdirectory for the specified platform to get built.
136   split_dependency_specification(${depspec} dep version)
137   string(TOUPPER ${dep} depup)
138   if(NOT ${ENABLE_${depup}} STREQUAL AUTO AND NOT ${ENABLE_${depup}})
139     message(WARNING "Your request to disable the dependency ${dep} required on platform ${CORE_PLATFORM_NAME} was ignored. Please choose another platform or add \"-DENABLE_${depup}=ON\" to your CMake command line to resolve this warning.")
140   endif()
141   set(ENABLE_${depup} "ON" CACHE BOOL "Force enabling required ${depup} support" FORCE)
142 endforeach()
144 # Required tools. Keep in alphabetical order please
145 set(required_buildtools FlatC
146                         JsonSchemaBuilder
147                         TexturePacker
150 # Optional build tools
151 set(optional_buildtools CCache
152                         ClangFormat
153                         ClangTidy
154                         Cppcheck
155                         IncludeWhatYouUse)
157 # Find build tools - Optional and required
158 core_optional_dep(${optional_buildtools})
159 core_require_dep(${required_buildtools})
161 # Required dependencies. Keep in alphabetical order please
162 set(required_deps ASS
163                   Cdio
164                   CrossGUID
165                   Curl
166                   FFMPEG
167                   FlatBuffers
168                   Fmt
169                   FreeType
170                   FriBidi
171                   Fstrcmp
172                   HarfBuzz
173                   Iconv
174                   KissFFT
175                   LibDvd
176                   Lzo2
177                   OpenSSL>=1.1.0
178                   PCRE
179                   RapidJSON
180                   Spdlog
181                   Sqlite3
182                   TagLib
183                   TinyXML
184                   ZLIB
185                   ${PLATFORM_REQUIRED_DEPS})
187 # Optional dependencies. Keep in alphabetical order please
188 set(optional_deps Alsa
189                   Avahi
190                   Bluetooth
191                   Bluray
192                   CAP
193                   CEC
194                   Dav1d
195                   DBus
196                   Iso9660pp
197                   LCMS2
198                   LircClient
199                   MDNS
200                   MicroHttpd
201                   NFS
202                   Pipewire
203                   Plist
204                   PulseAudio
205                   Python
206                   SmbClient
207                   Sndio
208                   UDEV
209                   Udfread
210                   XSLT
211                   ${PLATFORM_OPTIONAL_DEPS})
213 # Check optional deps first, since their availability can influence required ones, e.g. ffmpeg
214 core_optional_dep(${optional_deps})
215 core_require_dep(${required_deps})
217 if(ENABLE_MARIADBCLIENT AND NOT ENABLE_MARIADBCLIENT STREQUAL AUTO AND ENABLE_MYSQLCLIENT AND NOT ENABLE_MYSQLCLIENT STREQUAL AUTO)
218   MESSAGE(FATAL_ERROR "You can not use MySql and MariaDB at the same time. Disable one by adding -DENABLE_MYSQLCLIENT=OFF or -DENABLE_MARIADBCLIENT=OFF.")
219 elseif(ENABLE_MYSQLCLIENT AND NOT ENABLE_MYSQLCLIENT STREQUAL AUTO)
220   set(ENABLE_MARIADBCLIENT OFF CACHE BOOL "")
221 endif()
223 core_optional_dep(MariaDBClient)
224 if(NOT MARIADBCLIENT_FOUND)
225   core_optional_dep(MySqlClient)
226 endif()
228 if(NOT UDEV_FOUND)
229   core_optional_dep(LibUSB)
230 endif()
232 if(ENABLE_UPNP)
233   list(APPEND DEP_DEFINES "-DHAS_UPNP=1")
234 endif()
236 if(ENABLE_OPTICAL)
237   list(APPEND DEP_DEFINES -DHAS_DVD_DRIVE -DHAS_CDDA_RIPPER)
238 endif()
240 if(ENABLE_AIRTUNES)
241   find_package(Shairplay)
242   if(SHAIRPLAY_FOUND)
243     core_require_dep(Shairplay)
244   endif()
245 endif()
247 # find all folders containing addon.xml.in
248 # used to define ADDON_XML_OUTPUTS, ADDON_XML_DEPENDS and ADDON_INSTALL_DATA
249 # Function defined in ./cmake/scripts/common/Macros.cmake
250 set(outputFilterRegex "addons/xbmc.json")
251 find_addon_xml_in_files(${outputFilterRegex})
253 # Compile Info
254 add_custom_command(OUTPUT ${CORE_BUILD_DIR}/xbmc/CompileInfo.cpp
255                           ${ADDON_XML_OUTPUTS}
256                    COMMAND ${CMAKE_COMMAND} -DCORE_SOURCE_DIR=${CMAKE_SOURCE_DIR}
257                                             -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME}
258                                             -DCORE_PLATFORM_NAME_LC="${CORE_PLATFORM_NAME_LC}"
259                                             -DCORE_BUILD_DIR=${CORE_BUILD_DIR}
260                                             -DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}
261                                             -DARCH_DEFINES="${ARCH_DEFINES}"
262                                             -DAPP_SCMID=${APP_SCMID}
263                                             -DAPP_COPYRIGHT_YEARS=${APP_COPYRIGHT_YEARS}
264                                             -DAPP_BUILD_DATE=${APP_BUILD_DATE}
265                                             -DAPP_SHARED_LIBRARY_SUFFIX="${APP_SHARED_LIBRARY_SUFFIX}"
266                                             -DPYTHON_VERSION=${PYTHON_VERSION}
267                                             -Dprefix=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}
268                                             -DKODI_WEBSERVER_EXTRA_WHITELIST="${KODI_WEBSERVER_EXTRA_WHITELIST}"
269                                             -P ${CMAKE_SOURCE_DIR}/cmake/scripts/common/GenerateVersionedFiles.cmake
270                    DEPENDS ${CMAKE_SOURCE_DIR}/version.txt
271                            export-files
272                            ${ADDON_XML_DEPENDS}
273                            ${CMAKE_SOURCE_DIR}/xbmc/CompileInfo.cpp.in)
274 list(APPEND install_data ${ADDON_INSTALL_DATA})
275 add_library(compileinfo OBJECT ${CORE_BUILD_DIR}/xbmc/CompileInfo.cpp)
276 set_target_properties(compileinfo PROPERTIES FOLDER "Build Utilities")
277 target_compile_options(compileinfo PRIVATE ${SYSTEM_DEFINES} ${ARCH_DEFINES})
278 add_dependencies(compileinfo fmt::fmt)
280 if(NOT MSVC)
281   target_compile_options(compileinfo PUBLIC ${CORE_COMPILE_OPTIONS})
282 endif()
284 # RC File
285 if(WIN32)
286   configure_file(${CMAKE_SOURCE_DIR}/xbmc/platform/win32/XBMC_PC.rc.in
287                  ${CORE_BUILD_DIR}/xbmc/platform/win32/XBMC_PC.rc @ONLY)
288   add_library(resources OBJECT ${CORE_BUILD_DIR}/xbmc/platform/win32/XBMC_PC.rc)
289   set_target_properties(resources PROPERTIES FOLDER "Build Utilities")
290   target_include_directories(resources PRIVATE ${CMAKE_SOURCE_DIR}/tools/windows/packaging/media)
291   set(RESOURCES $<TARGET_OBJECTS:resources>)
292 endif()
294 # Generate messages
295 core_add_subdirs_from_filelist(${CMAKE_SOURCE_DIR}/cmake/messages/flatbuffers/*.txt)
297 include_directories(${INCLUDES} SYSTEM ${SYSTEM_INCLUDES})
298 add_compile_options(${ARCH_DEFINES} "${SYSTEM_DEFINES}" ${DEP_DEFINES} ${PATH_DEFINES})
300 set(core_DEPENDS "" CACHE STRING "" FORCE)
301 set(test_archives "" CACHE STRING "" FORCE)
302 set(test_sources "" CACHE STRING "" FORCE)
303 mark_as_advanced(core_DEPENDS)
304 mark_as_advanced(test_archives)
305 mark_as_advanced(test_sources)
307 # copy files to build tree
308 copy_files_from_filelist_to_buildtree(${CMAKE_SOURCE_DIR}/cmake/installdata/common/*.txt
309                                       ${CMAKE_SOURCE_DIR}/cmake/installdata/${CORE_SYSTEM_NAME}/*.txt)
311 list(APPEND SKINS "${CMAKE_SOURCE_DIR}/addons/skin.estuary\;${CMAKE_SOURCE_DIR}")
312 list(APPEND SKINS "${CMAKE_SOURCE_DIR}/addons/skin.estouchy\;${CMAKE_SOURCE_DIR}")
314 # These are skins that are copied into place from the source tree
315 foreach(skin ${SKINS})
316   list(GET skin 0 dir)
317   list(GET skin 1 relative)
318   copy_skin_to_buildtree(${dir} ${relative})
319 endforeach()
321 add_custom_target(pack-skins ALL
322                   DEPENDS TexturePacker::TexturePacker::Executable export-files ${XBT_FILES})
323 set_target_properties(pack-skins PROPERTIES FOLDER "Build Utilities")
325 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/system/players/VideoPlayer)
327 set(LIBCEC_SONAME "${CEC_SONAME}")
328 if(NOT CORE_SYSTEM_NAME STREQUAL windows AND NOT CORE_SYSTEM_NAME STREQUAL android AND NOT CORE_SYSTEM_NAME STREQUAL windowsstore)
329   configure_file(${CMAKE_SOURCE_DIR}/xbmc/DllPaths_generated.h.in
330                  ${CORE_BUILD_DIR}/DllPaths_generated.h @ONLY)
331 elseif(CORE_SYSTEM_NAME STREQUAL android)
332   configure_file(${CMAKE_SOURCE_DIR}/xbmc/DllPaths_generated_android.h.in
333                  ${CORE_BUILD_DIR}/DllPaths_generated_android.h @ONLY)
334 endif()
336 get_property(INTERNAL_DEPS GLOBAL PROPERTY INTERNAL_DEPS_PROP)
337 set(GLOBAL_TARGET_DEPS ${INTERNAL_DEPS} ${PLATFORM_GLOBAL_TARGET_DEPS})
339 # main library (used for main binary and tests)
340 if(CMAKE_GENERATOR STREQUAL Xcode)
341   add_library(compileinfo_obj OBJECT IMPORTED)
342   set_property(TARGET compileinfo_obj PROPERTY IMPORTED_OBJECTS
343     "${CMAKE_BINARY_DIR}/$(PROJECT_NAME).build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/compileinfo.build/$(OBJECT_FILE_DIR_normal:base)/$(CURRENT_ARCH)/CompileInfo.o"
344   )
345   add_library(lib${APP_NAME_LC} STATIC)
346   add_dependencies(lib${APP_NAME_LC} compileinfo)
347   target_link_libraries(lib${APP_NAME_LC} PUBLIC compileinfo_obj)
348 else()
349   add_library(lib${APP_NAME_LC} STATIC $<TARGET_OBJECTS:compileinfo>)
350 endif()
351 add_dependencies(lib${APP_NAME_LC} ${GLOBAL_TARGET_DEPS})
352 set_target_properties(lib${APP_NAME_LC} PROPERTIES PREFIX "")
354 # Other files (IDE)
355 set(OTHER_FILES cmake/README.md)
357 # Subdirs
358 foreach(CORE_PLATFORM_LC ${CORE_PLATFORM_NAME_LC})
359   core_add_subdirs_from_filelist(${CMAKE_SOURCE_DIR}/cmake/treedata/common/${CORE_PLATFORM_LC}/*.txt
360                                  ${CMAKE_SOURCE_DIR}/cmake/treedata/${CORE_SYSTEM_NAME}/${CORE_PLATFORM_LC}/*.txt)
361 endforeach()
363 core_add_subdirs_from_filelist(${CMAKE_SOURCE_DIR}/cmake/treedata/common/*.txt
364                                ${CMAKE_SOURCE_DIR}/cmake/treedata/${CORE_SYSTEM_NAME}/*.txt)
365 core_add_optional_subdirs_from_filelist(${CMAKE_SOURCE_DIR}/cmake/treedata/optional/common/*.txt
366                                         ${CMAKE_SOURCE_DIR}/cmake/treedata/optional/${CORE_SYSTEM_NAME}/*.txt)
368 target_link_libraries(lib${APP_NAME_LC} PUBLIC ${core_DEPENDS} ${SYSTEM_LDFLAGS} ${DEPLIBS} ${CMAKE_DL_LIBS})
369 set_target_properties(lib${APP_NAME_LC} PROPERTIES PROJECT_LABEL "xbmc")
370 source_group_by_folder(lib${APP_NAME_LC} RELATIVE ${CMAKE_SOURCE_DIR}/xbmc)
371 if(WIN32)
372   add_precompiled_header(lib${APP_NAME_LC} pch.h ${CMAKE_SOURCE_DIR}/xbmc/platform/win32/pch.cpp)
373   set_language_cxx(lib${APP_NAME_LC})
374 endif()
376 # main binary
377 if(NOT CORE_SYSTEM_NAME STREQUAL android)
378   if(CORE_SYSTEM_NAME STREQUAL windowsstore)
379     winstore_add_target_properties(${APP_NAME_LC})
380   endif()
381   add_executable(${APP_NAME_LC} ${CORE_MAIN_SOURCE} "${RESOURCES}" ${OTHER_FILES})
382   set_target_properties(${APP_NAME_LC} PROPERTIES ENABLE_EXPORTS ON)
383 else()
384   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
385   add_library(${APP_NAME_LC} SHARED ${CORE_MAIN_SOURCE} "${RESOURCES}" ${OTHER_FILES})
387   # Statically resolve global references to shared library (ie. ffmpeg) definitions.
388   # Related to https://stackoverflow.com/questions/46307266/including-objects-to-a-shared-library-from-a-c-archive-a
389   set_target_properties(${APP_NAME_LC} PROPERTIES LINK_FLAGS "-Wl,-Bsymbolic")
390 endif()
391 add_dependencies(${APP_NAME_LC} ${APP_NAME_LC}-libraries export-files pack-skins)
392 whole_archive(_MAIN_LIBRARIES ${FSTRCMP_LIBRARY} ${core_DEPENDS})
393 target_link_libraries(${APP_NAME_LC} ${_MAIN_LIBRARIES} lib${APP_NAME_LC} ${DEPLIBS})
394 unset(_MAIN_LIBRARIES)
396 if(WIN32)
397   set_target_properties(${APP_NAME_LC} PROPERTIES WIN32_EXECUTABLE ON)
398   set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${APP_NAME_LC})
399   if(NOT CORE_SYSTEM_NAME STREQUAL windowsstore)
400     target_sources(${APP_NAME_LC} PRIVATE ${CMAKE_SOURCE_DIR}/xbmc/platform/win32/app.manifest)
401   else()
402     set_target_properties(${APP_NAME_LC} PROPERTIES VS_USER_PROPS ${VCPROJECT_PROPS_FILE}
403                           VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION ${VS_MINIMUM_SDK_VERSION})
404   endif()
405 elseif(CORE_SYSTEM_NAME STREQUAL android)
406   # Nothing
407 elseif(CORE_SYSTEM_NAME STREQUAL darwin_embedded)
408   set_target_properties(${APP_NAME_LC} PROPERTIES OUTPUT_NAME ${APP_NAME}
409                                                   MACOSX_BUNDLE_INFO_PLIST ${PLATFORM_BUNDLE_INFO_PLIST})
410 else()
411   set_target_properties(${APP_NAME_LC} PROPERTIES SUFFIX ${APP_BINARY_SUFFIX})
412 endif()
414 # testing
415 if(HOST_CAN_EXECUTE_TARGET AND ENABLE_TESTING)
416   find_package(Gtest)
418   copy_files_from_filelist_to_buildtree(${CMAKE_SOURCE_DIR}/cmake/installdata/test-reference-data.txt NO_INSTALL)
419   add_executable(${APP_NAME_LC}-test EXCLUDE_FROM_ALL ${CMAKE_SOURCE_DIR}/xbmc/test/xbmc-test.cpp ${test_sources})
421   set_target_properties(PROPERTIES ENABLE_EXPORTS ON)
423   whole_archive(_TEST_LIBRARIES ${core_DEPENDS} ${GTEST_LIBRARY})
424   target_link_libraries(${APP_NAME_LC}-test PRIVATE ${SYSTEM_LDFLAGS} ${_TEST_LIBRARIES} lib${APP_NAME_LC} ${DEPLIBS} ${CMAKE_DL_LIBS})
425   unset(_TEST_LIBRARIES)
427   if (ENABLE_INTERNAL_GTEST)
428     add_dependencies(${APP_NAME_LC}-test ${APP_NAME_LC}-libraries export-files gtest)
429   endif()
431   # Enable unit-test related targets
432   enable_testing()
433   gtest_add_tests(${APP_NAME_LC}-test "" ${test_sources})
434   add_custom_target(check ${CMAKE_CTEST_COMMAND} WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
435   add_dependencies(check ${APP_NAME_LC}-test)
437   # Valgrind (memcheck)
438   find_program(VALGRIND_EXECUTABLE NAMES valgrind)
439   if(VALGRIND_EXECUTABLE)
440     set(CTEST_MEMORYCHECK_COMMAND ${VALGRIND_EXECUTABLE})
441     set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "-q --trace-children=yes --leak-check=yes --track-origins=yes")
442     include(CTest)
443     add_custom_target(check-valgrind ${CMAKE_CTEST_COMMAND} -D ExperimentalMemCheck \${ARGS} WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
444     add_dependencies(check-valgrind ${APP_NAME_LC}-test)
445   endif()
447   # For testing commit series
448   add_custom_target(check-commits ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/scripts/common/CheckCommits.cmake
449                                                    -DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR})
450   set_target_properties(check-commits PROPERTIES FOLDER "Build Utilities")
452   include(${CMAKE_SOURCE_DIR}/cmake/scripts/common/StaticAnalysis.cmake)
454   # code coverage
455   if(CMAKE_BUILD_TYPE STREQUAL Coverage)
456     if(EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/CodeCoverage.cmake)
457       include(${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/CodeCoverage.cmake)
458     else()
459       message(FATAL_ERROR "Code coverage not (yet) implemented for platform ${CORE_SYSTEM_NAME}")
460     endif()
461   endif()
462 endif()
464 # Documentation
465 find_package(Doxygen)
466 if(DOXYGEN_FOUND)
467   add_custom_target(doc
468                     COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.doxy
469                     COMMAND ${CMAKE_COMMAND} -E echo "Documentation built to: file://${CMAKE_SOURCE_DIR}/docs/html/index.html"
470                     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
471                     COMMENT "Generating Doxygen documentation" VERBATIM)
472 endif()
474 # link wrapper
475 if(FFMPEG_LINK_EXECUTABLE)
476   set(CMAKE_CXX_LINK_EXECUTABLE "${FFMPEG_LINK_EXECUTABLE}")
477 endif()
478 if(FFMPEG_CREATE_SHARED_LIBRARY)
479   set(CMAKE_CXX_CREATE_SHARED_LIBRARY "${FFMPEG_CREATE_SHARED_LIBRARY}")
480 endif()
482 # Platform specific additional extra targets
483 if(EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ExtraTargets.cmake)
484   include(${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ExtraTargets.cmake)
485 endif()
487 include(cmake/scripts/${CORE_SYSTEM_NAME}/Install.cmake)
489 # Add uninstall target
490 if(CMAKE_GENERATOR MATCHES Makefile)
491   add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/scripts/common/Uninstall.cmake)
492   set_target_properties(uninstall PROPERTIES FOLDER "Build Utilities")
493 endif()
495 # Create target that allows to build binary-addons.
496 # Use make binary-addons ADDONS="visualization.spectrum" to select the addons to build.
497 if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
498   if(CMAKE_CROSSCOMPILING)
499     set(_cross_args CROSS_COMPILING=yes)
500   endif()
501   if(NOT CORE_SYSTEM_NAME STREQUAL android)
502     set(_prefix ${CMAKE_BINARY_DIR}/addons)
503     set(_extra "CMAKE_EXTRA=-DPACKAGE_ZIP=ON")
504   else()
505     set(_prefix ${CMAKE_INSTALL_PREFIX})
506   endif()
507   add_custom_target(binary-addons
508     COMMAND $(MAKE) -C ${CMAKE_SOURCE_DIR}/tools/depends/target/binary-addons clean
509     COMMAND $(MAKE) -C ${CMAKE_SOURCE_DIR}/tools/depends/target/binary-addons VERBOSE=1 V=99
510                     PREFIX=${_prefix} INSTALL_PREFIX=${_prefix} ${_cross_args} ${_extra})
511   unset(_cross_args)
512   unset(_prefix)
513 endif()
515 # Prepare add-on build env
516 include(${CORE_SOURCE_DIR}/xbmc/addons/AddonBindings.cmake)
517 file(COPY ${CORE_ADDON_BINDINGS_FILES} ${CORE_ADDON_BINDINGS_DIRS}/
518      DESTINATION ${CORE_BUILD_DIR}/include/${APP_NAME_LC}
519      REGEX ".txt" EXCLUDE)
521 set(APP_LIB_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/${APP_NAME_LC})
522 set(APP_INCLUDE_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/include/${APP_NAME_LC})
523 configure_file(${CMAKE_SOURCE_DIR}/cmake/KodiConfig.cmake.in
524                ${CORE_BUILD_DIR}/lib/${APP_NAME_LC}/${APP_NAME}Config.cmake @ONLY)
525 configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/common/AddonHelpers.cmake
526                ${CORE_BUILD_DIR}/lib/${APP_NAME_LC}/AddonHelpers.cmake COPYONLY)
527 configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/common/AddOptions.cmake
528                ${CORE_BUILD_DIR}/lib/${APP_NAME_LC}/AddOptions.cmake COPYONLY)
530 # Status
531 message(STATUS "#---- CONFIGURATION ----#")
532 foreach(msg ${final_message})
533   message(STATUS ${msg})
534 endforeach()
536 if(VERBOSE)
537   message(STATUS "\n#--------------- Internal Variables -------------#")
538   message(STATUS "DEPLIBS: ${DEPLIBS}")
539   message(STATUS "core_DEPENDS: ${core_DEPENDS}")
540   message(STATUS "#---------------------------------------------#")
541   message(STATUS "SYSTEM_LDFLAGS        : ${SYSTEM_LDFLAGS}")
542   message(STATUS "CMAKE_DL_LIBS         : ${CMAKE_DL_LIBS}")
543   message(STATUS "CMAKE_C_FLAGS         : ${CMAKE_C_FLAGS}")
544   message(STATUS "CMAKE_CXX_FLAGS       : ${CMAKE_CXX_FLAGS}")
545   message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
546   message(STATUS "LTO_OPTIMIZATION      : ${CMAKE_INTERPROCEDURAL_OPTIMIZATION}")
547   if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
548     message(STATUS "CMAKE_CXX_COMPILE_OPTIONS_IPO: ${CMAKE_CXX_COMPILE_OPTIONS_IPO}")
549     message(STATUS "CMAKE_C_COMPILE_OPTIONS_IPO  : ${CMAKE_C_COMPILE_OPTIONS_IPO}")
550     message(STATUS "CMAKE_AR                     : ${CMAKE_AR}")
551     message(STATUS "CMAKE_NM                     : ${CMAKE_NM}")
552     message(STATUS "CMAKE_LINKER                 : ${CMAKE_LINKER}")
553   endif()
554   message(STATUS "#---------------------------------------------#")
555   message(STATUS "bindir     : ${bindir}")
556   message(STATUS "includedir : ${includedir}")
557   message(STATUS "libdir     : ${libdir}")
558   message(STATUS "datarootdir: ${datarootdir}")
559   message(STATUS "#---------------------------------------------#")
560   message(STATUS "BINARY: ${APP_NAME_LC}${APP_BINARY_SUFFIX}")
561   message(STATUS "#---------------------------------------------#")
562   message(STATUS "GIT_REV: ${APP_SCMID}")
563   message(STATUS "Build date: ${APP_BUILD_DATE}")
564   message(STATUS "#---------------------------------------------#")
565   message(STATUS "CPACK_GENERATOR       : ${CPACK_GENERATOR}")
566   message(STATUS "CPACK_SOURCE_GENERATOR: ${CPACK_SOURCE_GENERATOR}")
567   message(STATUS "#---------------------------------------------#")
568 endif()