From 8cdf8dec703d882b46ca50a769fabb95ffc48e2c Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 24 Nov 2016 21:27:41 +0100 Subject: sync with upstream --- project/cmake/scripts/android/ArchSetup.cmake | 35 ++ project/cmake/scripts/android/Install.cmake | 123 ++++ project/cmake/scripts/android/Macros.cmake | 1 + project/cmake/scripts/android/PathSetup.cmake | 33 ++ project/cmake/scripts/android/archsetup.cmake | 30 - project/cmake/scripts/android/install.cmake | 0 project/cmake/scripts/android/macros.cmake | 1 - project/cmake/scripts/android/pathsetup.cmake | 1 - project/cmake/scripts/common/AddOptions.cmake | 78 +++ project/cmake/scripts/common/AddonHelpers.cmake | 268 +++++++++ project/cmake/scripts/common/ArchSetup.cmake | 150 +++++ project/cmake/scripts/common/CMakeHelpers.cmake | 54 ++ project/cmake/scripts/common/CheckCommits.cmake | 75 +++ .../cmake/scripts/common/CheckTargetPlatform.cmake | 63 +++ .../scripts/common/GenerateVersionedFiles.cmake | 18 + project/cmake/scripts/common/GeneratorSetup.cmake | 49 ++ project/cmake/scripts/common/HandleDepends.cmake | 219 ++++++++ project/cmake/scripts/common/Macros.cmake | 619 +++++++++++++++++++++ project/cmake/scripts/common/PrepareEnv.cmake | 93 ++++ project/cmake/scripts/common/ProjectMacros.cmake | 89 +++ project/cmake/scripts/common/Uninstall.cmake | 22 + project/cmake/scripts/common/addon-helpers.cmake | 171 ------ project/cmake/scripts/common/addoptions.cmake | 82 --- project/cmake/scripts/common/archsetup.cmake | 99 ---- .../scripts/common/check_target_platform.cmake | 61 -- project/cmake/scripts/common/checkcommits.cmake | 75 --- .../scripts/common/generateversionedfiles.cmake | 11 - project/cmake/scripts/common/generatorsetup.cmake | 24 - project/cmake/scripts/common/handle-depends.cmake | 209 ------- project/cmake/scripts/common/macros.cmake | 383 ------------- project/cmake/scripts/common/managestring.cmake | 235 -------- project/cmake/scripts/common/pathsetup.cmake | 3 - project/cmake/scripts/common/prepare-env.cmake | 136 ----- project/cmake/scripts/common/projectmacros.cmake | 87 --- project/cmake/scripts/darwin/archsetup.cmake | 34 -- project/cmake/scripts/darwin/install.cmake | 0 project/cmake/scripts/darwin/macros.cmake | 108 ---- project/cmake/scripts/darwin/pathsetup.cmake | 32 -- project/cmake/scripts/freebsd/ArchSetup.cmake | 16 + project/cmake/scripts/freebsd/Install.cmake | 1 + project/cmake/scripts/freebsd/Macros.cmake | 1 + project/cmake/scripts/freebsd/PathSetup.cmake | 1 + project/cmake/scripts/freebsd/archsetup.cmake | 19 - project/cmake/scripts/freebsd/install.cmake | 60 -- project/cmake/scripts/freebsd/macros.cmake | 1 - project/cmake/scripts/freebsd/pathsetup.cmake | 1 - project/cmake/scripts/ios/ArchSetup.cmake | 36 ++ project/cmake/scripts/ios/Install.cmake | 74 +++ project/cmake/scripts/ios/Macros.cmake | 1 + project/cmake/scripts/ios/PathSetup.cmake | 1 + project/cmake/scripts/ios/archsetup.cmake | 38 -- project/cmake/scripts/ios/install.cmake | 1 - project/cmake/scripts/ios/macros.cmake | 1 - project/cmake/scripts/ios/pathsetup.cmake | 1 - project/cmake/scripts/linux/ArchSetup.cmake | 41 ++ project/cmake/scripts/linux/CodeCoverage.cmake | 97 ++++ project/cmake/scripts/linux/ExtraTargets.cmake | 12 + project/cmake/scripts/linux/Install.cmake | 355 ++++++++++++ project/cmake/scripts/linux/Macros.cmake | 95 ++++ project/cmake/scripts/linux/PathSetup.cmake | 39 ++ project/cmake/scripts/linux/archsetup.cmake | 21 - project/cmake/scripts/linux/install.cmake | 146 ----- project/cmake/scripts/linux/macros.cmake | 79 --- project/cmake/scripts/linux/pathsetup.cmake | 34 -- project/cmake/scripts/osx/ArchSetup.cmake | 34 ++ project/cmake/scripts/osx/ExtraTargets.cmake | 3 + project/cmake/scripts/osx/Install.cmake | 40 ++ project/cmake/scripts/osx/Macros.cmake | 111 ++++ project/cmake/scripts/osx/PathSetup.cmake | 32 ++ project/cmake/scripts/rbpi/ArchSetup.cmake | 28 + project/cmake/scripts/rbpi/Install.cmake | 1 + project/cmake/scripts/rbpi/Macros.cmake | 1 + project/cmake/scripts/rbpi/PathSetup.cmake | 1 + project/cmake/scripts/rbpi/archsetup.cmake | 32 -- project/cmake/scripts/rbpi/install.cmake | 1 - project/cmake/scripts/rbpi/macros.cmake | 1 - project/cmake/scripts/rbpi/pathsetup.cmake | 1 - project/cmake/scripts/windows/ArchSetup.cmake | 89 +++ project/cmake/scripts/windows/CFlagOverrides.cmake | 5 + .../cmake/scripts/windows/CXXFlagOverrides.cmake | 5 + project/cmake/scripts/windows/Install.cmake | 0 project/cmake/scripts/windows/Macros.cmake | 66 +++ project/cmake/scripts/windows/PathSetup.cmake | 34 ++ project/cmake/scripts/windows/archsetup.cmake | 81 --- .../cmake/scripts/windows/c-flag-overrides.cmake | 5 - .../cmake/scripts/windows/cxx-flag-overrides.cmake | 5 - project/cmake/scripts/windows/install.cmake | 0 project/cmake/scripts/windows/macros.cmake | 145 ----- project/cmake/scripts/windows/pathsetup.cmake | 34 -- 89 files changed, 3209 insertions(+), 2489 deletions(-) create mode 100644 project/cmake/scripts/android/ArchSetup.cmake create mode 100644 project/cmake/scripts/android/Install.cmake create mode 120000 project/cmake/scripts/android/Macros.cmake create mode 100644 project/cmake/scripts/android/PathSetup.cmake delete mode 100644 project/cmake/scripts/android/archsetup.cmake delete mode 100644 project/cmake/scripts/android/install.cmake delete mode 120000 project/cmake/scripts/android/macros.cmake delete mode 120000 project/cmake/scripts/android/pathsetup.cmake create mode 100644 project/cmake/scripts/common/AddOptions.cmake create mode 100644 project/cmake/scripts/common/AddonHelpers.cmake create mode 100644 project/cmake/scripts/common/ArchSetup.cmake create mode 100644 project/cmake/scripts/common/CMakeHelpers.cmake create mode 100644 project/cmake/scripts/common/CheckCommits.cmake create mode 100644 project/cmake/scripts/common/CheckTargetPlatform.cmake create mode 100644 project/cmake/scripts/common/GenerateVersionedFiles.cmake create mode 100644 project/cmake/scripts/common/GeneratorSetup.cmake create mode 100644 project/cmake/scripts/common/HandleDepends.cmake create mode 100644 project/cmake/scripts/common/Macros.cmake create mode 100644 project/cmake/scripts/common/PrepareEnv.cmake create mode 100644 project/cmake/scripts/common/ProjectMacros.cmake create mode 100644 project/cmake/scripts/common/Uninstall.cmake delete mode 100644 project/cmake/scripts/common/addon-helpers.cmake delete mode 100644 project/cmake/scripts/common/addoptions.cmake delete mode 100644 project/cmake/scripts/common/archsetup.cmake delete mode 100644 project/cmake/scripts/common/check_target_platform.cmake delete mode 100644 project/cmake/scripts/common/checkcommits.cmake delete mode 100644 project/cmake/scripts/common/generateversionedfiles.cmake delete mode 100644 project/cmake/scripts/common/generatorsetup.cmake delete mode 100644 project/cmake/scripts/common/handle-depends.cmake delete mode 100644 project/cmake/scripts/common/macros.cmake delete mode 100644 project/cmake/scripts/common/managestring.cmake delete mode 100644 project/cmake/scripts/common/pathsetup.cmake delete mode 100644 project/cmake/scripts/common/prepare-env.cmake delete mode 100644 project/cmake/scripts/common/projectmacros.cmake delete mode 100644 project/cmake/scripts/darwin/archsetup.cmake delete mode 100644 project/cmake/scripts/darwin/install.cmake delete mode 100644 project/cmake/scripts/darwin/macros.cmake delete mode 100644 project/cmake/scripts/darwin/pathsetup.cmake create mode 100644 project/cmake/scripts/freebsd/ArchSetup.cmake create mode 120000 project/cmake/scripts/freebsd/Install.cmake create mode 120000 project/cmake/scripts/freebsd/Macros.cmake create mode 120000 project/cmake/scripts/freebsd/PathSetup.cmake delete mode 100644 project/cmake/scripts/freebsd/archsetup.cmake delete mode 100644 project/cmake/scripts/freebsd/install.cmake delete mode 100644 project/cmake/scripts/freebsd/macros.cmake delete mode 100644 project/cmake/scripts/freebsd/pathsetup.cmake create mode 100644 project/cmake/scripts/ios/ArchSetup.cmake create mode 100644 project/cmake/scripts/ios/Install.cmake create mode 120000 project/cmake/scripts/ios/Macros.cmake create mode 120000 project/cmake/scripts/ios/PathSetup.cmake delete mode 100644 project/cmake/scripts/ios/archsetup.cmake delete mode 120000 project/cmake/scripts/ios/install.cmake delete mode 120000 project/cmake/scripts/ios/macros.cmake delete mode 120000 project/cmake/scripts/ios/pathsetup.cmake create mode 100644 project/cmake/scripts/linux/ArchSetup.cmake create mode 100644 project/cmake/scripts/linux/CodeCoverage.cmake create mode 100644 project/cmake/scripts/linux/ExtraTargets.cmake create mode 100644 project/cmake/scripts/linux/Install.cmake create mode 100644 project/cmake/scripts/linux/Macros.cmake create mode 100644 project/cmake/scripts/linux/PathSetup.cmake delete mode 100644 project/cmake/scripts/linux/archsetup.cmake delete mode 100644 project/cmake/scripts/linux/install.cmake delete mode 100644 project/cmake/scripts/linux/macros.cmake delete mode 100644 project/cmake/scripts/linux/pathsetup.cmake create mode 100644 project/cmake/scripts/osx/ArchSetup.cmake create mode 100644 project/cmake/scripts/osx/ExtraTargets.cmake create mode 100644 project/cmake/scripts/osx/Install.cmake create mode 100644 project/cmake/scripts/osx/Macros.cmake create mode 100644 project/cmake/scripts/osx/PathSetup.cmake create mode 100644 project/cmake/scripts/rbpi/ArchSetup.cmake create mode 120000 project/cmake/scripts/rbpi/Install.cmake create mode 120000 project/cmake/scripts/rbpi/Macros.cmake create mode 120000 project/cmake/scripts/rbpi/PathSetup.cmake delete mode 100644 project/cmake/scripts/rbpi/archsetup.cmake delete mode 120000 project/cmake/scripts/rbpi/install.cmake delete mode 120000 project/cmake/scripts/rbpi/macros.cmake delete mode 120000 project/cmake/scripts/rbpi/pathsetup.cmake create mode 100644 project/cmake/scripts/windows/ArchSetup.cmake create mode 100644 project/cmake/scripts/windows/CFlagOverrides.cmake create mode 100644 project/cmake/scripts/windows/CXXFlagOverrides.cmake create mode 100644 project/cmake/scripts/windows/Install.cmake create mode 100644 project/cmake/scripts/windows/Macros.cmake create mode 100644 project/cmake/scripts/windows/PathSetup.cmake delete mode 100644 project/cmake/scripts/windows/archsetup.cmake delete mode 100644 project/cmake/scripts/windows/c-flag-overrides.cmake delete mode 100644 project/cmake/scripts/windows/cxx-flag-overrides.cmake delete mode 100644 project/cmake/scripts/windows/install.cmake delete mode 100644 project/cmake/scripts/windows/macros.cmake delete mode 100644 project/cmake/scripts/windows/pathsetup.cmake (limited to 'project/cmake/scripts') diff --git a/project/cmake/scripts/android/ArchSetup.cmake b/project/cmake/scripts/android/ArchSetup.cmake new file mode 100644 index 0000000..281f94f --- /dev/null +++ b/project/cmake/scripts/android/ArchSetup.cmake @@ -0,0 +1,35 @@ +if(NOT CMAKE_TOOLCHAIN_FILE) + message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for android. See ${PROJECT_SOURCE_DIR}/README.md") +elseif(NOT SDK_PLATFORM) + message(FATAL_ERROR "Toolchain did not define SDK_PLATFORM. Possibly outdated depends.") +endif() + +set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -DTARGET_ANDROID) +set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED + -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) +set(PLATFORM_DIR linux) +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CPU STREQUAL armeabi-v7a) + set(ARCH arm) + set(NEON True) + elseif(CPU STREQUAL arm64-v8a) + set(ARCH aarch64) + elseif(CPU STREQUAL i686) + set(ARCH i486-linux) + set(NEON False) + else() + message(SEND_ERROR "Unknown CPU: ${CPU}") + endif() +endif() + +set(FFMPEG_OPTS --enable-cross-compile --cpu=cortex-a9 --arch=arm --target-os=linux --enable-neon + --disable-vdpau --cc=${CMAKE_C_COMPILER} --host-cc=${CMAKE_C_COMPILER} + --strip=${CMAKE_STRIP}) +set(ENABLE_SDL OFF CACHE BOOL "" FORCE) +set(ENABLE_X11 OFF CACHE BOOL "" FORCE) +set(ENABLE_AML OFF CACHE BOOL "" FORCE) +set(ENABLE_OPTICAL OFF CACHE BOOL "" FORCE) + +list(APPEND DEPLIBS android log jnigraphics) diff --git a/project/cmake/scripts/android/Install.cmake b/project/cmake/scripts/android/Install.cmake new file mode 100644 index 0000000..5c66f41 --- /dev/null +++ b/project/cmake/scripts/android/Install.cmake @@ -0,0 +1,123 @@ +# Android packaging + +find_program(AAPT_EXECUTABLE aapt PATHS ${SDK_BUILDTOOLS_PATH}) +if(NOT AAPT_EXECUTABLE) + message(FATAL_ERROR "Could NOT find aapt executable") +endif() +find_program(DX_EXECUTABLE dx PATHS ${SDK_BUILDTOOLS_PATH}) +if(NOT DX_EXECUTABLE) + message(FATAL_ERROR "Could NOT find dx executable") +endif() +find_program(ZIPALIGN_EXECUTABLE zipalign PATHS ${SDK_BUILDTOOLS_PATH}) +if(NOT ZIPALIGN_EXECUTABLE) + message(FATAL_ERROR "Could NOT find zipalign executable") +endif() + +# Configure files into packaging environment. +configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/Makefile.in + ${CMAKE_BINARY_DIR}/tools/android/packaging/Makefile @ONLY) +configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/apksign + ${CMAKE_BINARY_DIR}/tools/android/packaging/apksign COPYONLY) +configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/make_symbols.sh + ${CMAKE_BINARY_DIR}/tools/android/packaging/make_symbols.sh COPYONLY) +file(WRITE ${CMAKE_BINARY_DIR}/tools/depends/Makefile.include + "$(PREFIX)/lib/${APP_NAME_LC}/lib${APP_NAME_LC}.so: ;\n") + +set(package_files strings.xml + activity_main.xml + AndroidManifest.xml + src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java + src/org/xbmc/kodi/XBMCInputDeviceListener.java + src/org/xbmc/kodi/Main.java + src/org/xbmc/kodi/XBMCSettingsContentObserver.java + src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java + src/org/xbmc/kodi/XBMCVideoView.java + src/org/xbmc/kodi/Splash.java + src/org/xbmc/kodi/XBMCBroadcastReceiver.java) +foreach(file IN LISTS package_files) + configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/xbmc/${file}.in + ${CMAKE_BINARY_DIR}/tools/android/packaging/xbmc/${file} @ONLY) +endforeach() + +# Copy files to the location expected by the Android packaging scripts. +add_custom_target(bundle + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/android/packaging/media + ${CMAKE_BINARY_DIR}/tools/android/packaging/media + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/android/packaging/xbmc/res + ${CMAKE_BINARY_DIR}/tools/android/packaging/xbmc/res + COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDS_PATH}/lib/python2.7 ${libdir}/python2.7 + COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDS_PATH}/share/${APP_NAME_LC} ${datadir}/${APP_NAME_LC} + COMMAND ${CMAKE_COMMAND} -E copy $ + ${libdir}/${APP_NAME_LC}/$) +add_dependencies(bundle ${APP_NAME_LC}) + +# This function is used to prepare a prefix expected by the Android packaging +# scripts. It creates a bundle_files command that is added to the bundle target. +function(add_bundle_file file destination relative) + if(NOT TARGET bundle_files) + file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake) + add_custom_target(bundle_files COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake) + add_dependencies(bundle bundle_files) + endif() + + string(REPLACE "${relative}/" "" outfile ${file}) + get_filename_component(file ${file} REALPATH) + get_filename_component(outdir ${outfile} DIRECTORY) + file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake + "file(COPY \"${file}\" DESTINATION \"${destination}/${outdir}\")\n") + if(file MATCHES "\\.so\\..+$") + get_filename_component(srcfile "${file}" NAME) + string(REGEX REPLACE "\\.so\\..+$" "\.so" destfile ${srcfile}) + file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake + "file(RENAME \"${destination}/${outdir}/${srcfile}\" \"${destination}/${outdir}/${destfile}\")\n") + endif() +endfunction() + +# Copy files into prefix +foreach(file IN LISTS XBT_FILES install_data) + string(REPLACE "${CMAKE_BINARY_DIR}/" "" file ${file}) + add_bundle_file(${CMAKE_BINARY_DIR}/${file} ${datarootdir}/${APP_NAME_LC} ${CMAKE_BINARY_DIR}) +endforeach() + +foreach(library IN LISTS LIBRARY_FILES) + add_bundle_file(${library} ${libdir}/${APP_NAME_LC} ${CMAKE_BINARY_DIR}) +endforeach() + +foreach(lib IN LISTS required_dyload dyload_optional ITEMS Shairplay) + string(TOUPPER ${lib} lib_up) + set(lib_so ${${lib_up}_SONAME}) + if(lib_so AND EXISTS ${DEPENDS_PATH}/lib/${lib_so}) + add_bundle_file(${DEPENDS_PATH}/lib/${lib_so} ${libdir} "") + endif() +endforeach() +add_bundle_file(${SMBCLIENT_LIBRARY} ${libdir} "") +add_bundle_file(${DEPENDS_PATH}/lib/librtmp.so ${libdir} "") + +# Main targets from Makefile.in +if(CPU MATCHES i686) + set(CPU x86) + set(ARCH x86) +endif() +foreach(target apk obb apk-unsigned apk-obb apk-obb-unsigned apk-noobb apk-clean apk-sign) + add_custom_target(${target} + COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} ${CMAKE_MAKE_PROGRAM} + -C ${CMAKE_BINARY_DIR}/tools/android/packaging + CORE_SOURCE_DIR=${CORE_SOURCE_DIR} + CC=${CMAKE_C_COMPILER} + CPU=${CPU} + ARCH=${ARCH} + PREFIX=${prefix} + NDKROOT=${NDKROOT} + SDKROOT=${SDKROOT} + SDK_PLATFORM=${SDK_PLATFORM} + STRIP=${CMAKE_STRIP} + AAPT=${AAPT_EXECUTABLE} + DX=${DX_EXECUTABLE} + ZIPALIGN=${ZIPALIGN_EXECUTABLE} + ${target} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/android/packaging + ) + if(NOT target STREQUAL apk-clean) + add_dependencies(${target} bundle) + endif() +endforeach() diff --git a/project/cmake/scripts/android/Macros.cmake b/project/cmake/scripts/android/Macros.cmake new file mode 120000 index 0000000..2fdbb25 --- /dev/null +++ b/project/cmake/scripts/android/Macros.cmake @@ -0,0 +1 @@ +../linux/Macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/android/PathSetup.cmake b/project/cmake/scripts/android/PathSetup.cmake new file mode 100644 index 0000000..69de883 --- /dev/null +++ b/project/cmake/scripts/android/PathSetup.cmake @@ -0,0 +1,33 @@ +if(NOT prefix) + set(prefix ${CMAKE_BINARY_DIR}/install) +endif() +set(CMAKE_INSTALL_PREFIX ${prefix}) +if(NOT exec_prefix) + set(exec_prefix ${prefix}) +endif() +if(NOT libdir) + set(libdir ${prefix}/lib) +endif() +if(NOT bindir) + set(bindir ${prefix}/bin) +endif() +if(NOT includedir) + set(includedir ${prefix}/include) +endif() +if(NOT datarootdir) + set(datarootdir ${prefix}/share) +endif() +if(NOT datadir) + set(datadir ${datarootdir}) +endif() + +list(APPEND final_message "-- PATH config --") +list(APPEND final_message "Prefix: ${prefix}") +list(APPEND final_message "Libdir: ${libdir}") +list(APPEND final_message "Bindir: ${bindir}") +list(APPEND final_message "Includedir: ${includedir}") +list(APPEND final_message "Datarootdir: ${datarootdir}") +list(APPEND final_message "Datadir: ${datadir}") + +set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" + -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/android/archsetup.cmake b/project/cmake/scripts/android/archsetup.cmake deleted file mode 100644 index 86c0f6a..0000000 --- a/project/cmake/scripts/android/archsetup.cmake +++ /dev/null @@ -1,30 +0,0 @@ -if(NOT CMAKE_TOOLCHAIN_FILE) - message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for android. See ${PROJECT_SOURCE_DIR}/README.md") -endif() - -set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -DTARGET_ANDROID) -set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED - -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) -set(PLATFORM_DIR linux) -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CPU STREQUAL armeabi-v7a) - set(ARCH arm-linux-androideabi) - elseif(CPU STREQUAL i686) - set(ARCH i686-linux-android) - else() - message(SEND_ERROR "Unknown CPU: ${CPU}") - endif() -endif() - -set(FFMPEG_OPTS --enable-cross-compile --cpu=cortex-a9 --arch=arm --target-os=linux --enable-neon - --disable-vdpau --cc=${CMAKE_C_COMPILER} --host-cc=${CMAKE_C_COMPILER} - --strip=${CMAKE_STRIP}) -set(ENABLE_SDL OFF) -set(ENABLE_X11 OFF) -set(ENABLE_EGL ON) -set(ENABLE_AML ON) -set(ENABLE_OPTICAL OFF) - -list(APPEND DEPLIBS android log jnigraphics) diff --git a/project/cmake/scripts/android/install.cmake b/project/cmake/scripts/android/install.cmake deleted file mode 100644 index e69de29..0000000 diff --git a/project/cmake/scripts/android/macros.cmake b/project/cmake/scripts/android/macros.cmake deleted file mode 120000 index 28c77ca..0000000 --- a/project/cmake/scripts/android/macros.cmake +++ /dev/null @@ -1 +0,0 @@ -../linux/macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/android/pathsetup.cmake b/project/cmake/scripts/android/pathsetup.cmake deleted file mode 120000 index 26d7f17..0000000 --- a/project/cmake/scripts/android/pathsetup.cmake +++ /dev/null @@ -1 +0,0 @@ -../linux/pathsetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/common/AddOptions.cmake b/project/cmake/scripts/common/AddOptions.cmake new file mode 100644 index 0000000..96837c1 --- /dev/null +++ b/project/cmake/scripts/common/AddOptions.cmake @@ -0,0 +1,78 @@ +# - Add options without repeating them on the command line +# +# Synopsis: +# +# add_options (lang build opts) +# +# where: +# +# lang Name of the language whose compiler should receive the +# options, e.g. CXX. If a comma-separated list is received +# then the option is added for all those languages. Use the +# special value ALL_LANGUAGES for these languages: CXX, C +# and Fortran +# +# build Kind of build to which this options should apply, +# such as DEBUG and RELEASE. This can also be a comma- +# separated list. Use the special value ALL_BUILDS to apply +# to all builds. +# +# opts List of options to add. Each should be quoted. +# +# Example: +# +# add_options (CXX RELEASE "-O3" "-DNDEBUG" "-Wall") + +function(add_options langs builds) + # special handling of empty language specification + if("${langs}" STREQUAL "ALL_LANGUAGES") + set(langs CXX C Fortran) + endif() + foreach(lang IN LISTS langs) + # prepend underscore if necessary + foreach(build IN LISTS builds) + if(NOT ("${build}" STREQUAL "ALL_BUILDS")) + set(_bld "_${build}") + string(TOUPPER "${_bld}" _bld) + else() + set(_bld "") + endif() + foreach(_opt IN LISTS ARGN) + set(_var "CMAKE_${lang}_FLAGS${_bld}") + #message(STATUS "Adding \"${_opt}\" to \${${_var}}") + # remove it first + string(REPLACE "${_opt}" "" _without "${${_var}}") + string(STRIP "${_without}" _without) + # we need to strip this one as well, so they are comparable + string(STRIP "${${_var}}" _stripped) + # if it wasn't there, then add it at the end + if("${_without}" STREQUAL "${_stripped}") + # don't add any extra spaces if no options yet are set + if(NOT ${_stripped} STREQUAL "") + set(${_var} "${_stripped} ${_opt}") + else() + set(${_var} "${_opt}") + endif() + set(${_var} "${${_var}}" PARENT_SCOPE) + endif() + endforeach() + endforeach() + endforeach() +endfunction() + +# set varname to flag unless user has specified something that matches regex +function(set_default_option varname flag regex) + if(NOT "$ENV{CXXFLAGS}" MATCHES "${regex}" + AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}" + AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}") + set(${varname} ${flag} PARENT_SCOPE) + else() + set(${varname} PARENT_SCOPE) + endif() +endfunction() + +# note: this must be called before project() +macro(no_default_options) + # prevent the platform probe to set options + set(CMAKE_NOT_USING_CONFIG_FLAGS TRUE) +endmacro() diff --git a/project/cmake/scripts/common/AddonHelpers.cmake b/project/cmake/scripts/common/AddonHelpers.cmake new file mode 100644 index 0000000..6680ed1 --- /dev/null +++ b/project/cmake/scripts/common/AddonHelpers.cmake @@ -0,0 +1,268 @@ +# Workaround for the fact that cpack's filenames are not customizable. +# Each add-on is added as a separate component to facilitate zip/tgz packaging. +# The filenames are always of the form basename-component, which is +# incompatible with the addonid-version scheme we want. This hack renames +# the files from the file names generated by the 'package' target. +# Sadly we cannot extend the 'package' target, as it is a builtin target, see +# http://public.kitware.com/Bug/view.php?id=8438 +# Thus, we have to add an 'addon-package' target. +add_custom_target(addon-package + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package) + +macro(add_cpack_workaround target version ext) + if(NOT PACKAGE_DIR) + set(PACKAGE_DIR "${CMAKE_INSTALL_PREFIX}/zips") + endif() + + add_custom_command(TARGET addon-package PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_PACKAGE_DIRECTORY}/addon-${target}-${version}.${ext} ${PACKAGE_DIR}/${target}-${version}.${ext}) +endmacro() + +# Grab the version from a given add-on's addon.xml +macro (addon_version dir prefix) + if(EXISTS ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in) + file(READ ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in ADDONXML) + else() + file(READ ${dir}/addon.xml ADDONXML) + endif() + + string(REGEX MATCH "]*version.?=.?.[0-9\\.]+" VERSION_STRING ${ADDONXML}) + string(REGEX REPLACE ".*version=.([0-9\\.]+).*" "\\1" ${prefix}_VERSION ${VERSION_STRING}) + message(STATUS ${prefix}_VERSION=${${prefix}_VERSION}) +endmacro() + +# Build, link and optionally package an add-on +macro (build_addon target prefix libs) + addon_version(${target} ${prefix}) + if(${prefix}_SOURCES) + add_library(${target} ${${prefix}_SOURCES}) + target_link_libraries(${target} ${${libs}}) + set_target_properties(${target} PROPERTIES VERSION ${${prefix}_VERSION} + SOVERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR} + PREFIX "") + if(OS STREQUAL "android") + set_target_properties(${target} PROPERTIES PREFIX "lib") + endif() + elseif(${prefix}_CUSTOM_BINARY) + add_custom_target(${target} ALL) + endif() + + # get the library's location + if(${prefix}_CUSTOM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 0 LIBRARY_LOCATION) + list(GET ${prefix}_CUSTOM_BINARY 1 LIBRARY_FILENAME) + else() + set(LIBRARY_LOCATION $) + # get the library's filename + if("${CORE_SYSTEM_NAME}" STREQUAL "android") + # for android we need the filename without any version numbers + set(LIBRARY_FILENAME $) + else() + set(LIBRARY_FILENAME $) + endif() + endif() + + # if there's an addon.xml.in we need to generate the addon.xml + if(EXISTS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in) + set(PLATFORM ${CORE_SYSTEM_NAME}) + + file(READ ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in addon_file) + string(CONFIGURE "${addon_file}" addon_file_conf @ONLY) + file(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}") + if(${APP_NAME_UC}_BUILD_DIR) + file(GENERATE OUTPUT ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/addon.xml CONTENT "${addon_file_conf}") + endif() + endif() + + # if there's an settings.xml.in we need to generate the settings.xml + if(EXISTS ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in) + set(PLATFORM ${CORE_SYSTEM_NAME}) + + file(READ ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in settings_file) + string(CONFIGURE "${settings_file}" settings_file_conf @ONLY) + file(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml CONTENT "${settings_file_conf}") + if(${APP_NAME_UC}_BUILD_DIR) + file(GENERATE OUTPUT ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/resources/settings.xml CONTENT "${settings_file_conf}") + endif() + endif() + + # set zip as default if addon-package is called without PACKAGE_XXX + set(CPACK_GENERATOR "ZIP") + set(ext "zip") + if(PACKAGE_ZIP OR PACKAGE_TGZ) + if(PACKAGE_TGZ) + set(CPACK_GENERATOR "TGZ") + set(ext "tar.gz") + endif() + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) + set(CPACK_PACKAGE_FILE_NAME addon) + if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(CPACK_STRIP_FILES TRUE) + endif() + set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) + set(CPACK_COMPONENTS_IGNORE_GROUPS 1) + list(APPEND CPACK_COMPONENTS_ALL ${target}-${${prefix}_VERSION}) + # Pack files together to create an archive + install(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION} PATTERN "xml.in" EXCLUDE) + if(WIN32) + if(NOT CPACK_PACKAGE_DIRECTORY) + # determine the temporary path + file(TO_CMAKE_PATH "$ENV{TEMP}" WIN32_TEMP_PATH) + string(LENGTH "${WIN32_TEMP_PATH}" WIN32_TEMP_PATH_LENGTH) + string(LENGTH "${PROJECT_BINARY_DIR}" PROJECT_BINARY_DIR_LENGTH) + + # check if the temporary path is shorter than the default packaging directory path + if(WIN32_TEMP_PATH_LENGTH GREATER 0 AND WIN32_TEMP_PATH_LENGTH LESS PROJECT_BINARY_DIR_LENGTH) + # set the directory used by CPack for packaging to the temp directory + set(CPACK_PACKAGE_DIRECTORY ${WIN32_TEMP_PATH}) + endif() + endif() + + # in case of a VC++ project the installation location contains a $(Configuration) VS variable + # we replace it with ${CMAKE_BUILD_TYPE} (which doesn't cover the case when the build configuration + # is changed within Visual Studio) + string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" LIBRARY_LOCATION "${LIBRARY_LOCATION}") + + if(${prefix}_SOURCES) + # install the generated DLL file + install(PROGRAMS ${LIBRARY_LOCATION} DESTINATION ${target} + COMPONENT ${target}-${${prefix}_VERSION}) + + if(CMAKE_BUILD_TYPE MATCHES Debug) + # for debug builds also install the PDB file + get_filename_component(LIBRARY_DIR ${LIBRARY_LOCATION} DIRECTORY) + install(FILES $ DESTINATION ${target} + COMPONENT ${target}-${${prefix}_VERSION}) + endif() + endif() + if (${prefix}_CUSTOM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY) + install(FILES ${FROM_BINARY} DESTINATION ${target} RENAME ${TO_BINARY}) + endif() + if(${prefix}_CUSTOM_DATA) + install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${target}/resources) + endif() + else() + if(NOT CPACK_PACKAGE_DIRECTORY) + set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}) + endif() + if(${prefix}_SOURCES) + install(TARGETS ${target} DESTINATION ${target} + COMPONENT ${target}-${${prefix}_VERSION}) + endif() + if (${prefix}_CUSTOM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY) + if(OS STREQUAL "android") + set(TO_BINARY "lib${TO_BINARY}") + endif() + install(FILES ${FROM_BINARY} DESTINATION ${target} RENAME ${TO_BINARY} + COMPONENT ${target}-${${prefix}_VERSION}) + endif() + if(${prefix}_CUSTOM_DATA) + install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${target}/resources) + endif() + endif() + add_cpack_workaround(${target} ${${prefix}_VERSION} ${ext}) + else() + if(CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL rbpi OR CORE_SYSTEM_NAME STREQUAL freebsd) + if(NOT OVERRIDE_PATHS) + if(CMAKE_INSTALL_PREFIX AND NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND NOT CMAKE_INSTALL_PREFIX STREQUAL "${${APP_NAME_UC}_PREFIX}") + message(WARNING "CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} differs from ${APP_NAME} prefix, changing to ${${APP_NAME_UC}_PREFIX}. Please pass -DOVERRIDE_PATHS=1 to skip this check") + endif() + if(CMAKE_INSTALL_LIBDIR AND NOT CMAKE_INSTALL_LIBDIR STREQUAL "${${APP_NAME_UC}_LIB_DIR}") + message(WARNING "CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} differs from ${APP_NAME} libdir, changing to ${${APP_NAME_UC}_LIB_DIR}. Please pass -DOVERRIDE_PATHS=1 to skip this check") + endif() + if(CMAKE_INSTALL_DATADIR AND NOT CMAKE_INSTALL_DATADIR STREQUAL "${${APP_NAME_UC}_DATA_DIR}") + message(WARNING "CMAKE_INSTALL_DATADIR ${CMAKE_INSTALL_DATADIR} differs from ${APP_NAME} datadir, changing to ${${APP_NAME_UC}_DATA_DIR}. Please pass -DOVERRIDE_PATHS=1 to skip this check") + endif() + set(CMAKE_INSTALL_PREFIX "${${APP_NAME_UC}_PREFIX}" CACHE PATH "${APP_NAME} install prefix" FORCE) + set(CMAKE_INSTALL_LIBDIR "${${APP_NAME_UC}_LIB_DIR}" CACHE PATH "${APP_NAME} install libdir" FORCE) + set(CMAKE_INSTALL_DATADIR "${${APP_NAME_UC}_DATA_DIR}" CACHE PATH "${APP_NAME} install datadir" FORCE) + else() + if(NOT CMAKE_INSTALL_LIBDIR) + set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib/${APP_NAME_LC}") + endif() + if(NOT CMAKE_INSTALL_DATADIR) + set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_PREFIX}/share/${APP_NAME_LC}") + endif() + endif() + else() + set(CMAKE_INSTALL_LIBDIR "lib/${APP_NAME_LC}") + set(CMAKE_INSTALL_DATADIR "share/${APP_NAME_LC}") + endif() + if(${prefix}_SOURCES) + install(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) + endif() + if (${prefix}_CUSTOM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY) + list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY) + if(OS STREQUAL "android") + set(TO_BINARY "lib${TO_BINARY}") + endif() + install(FILES ${FROM_BINARY} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target} RENAME ${TO_BINARY}) + endif() + install(DIRECTORY ${target} DESTINATION ${CMAKE_INSTALL_DATADIR}/addons PATTERN "xml.in" EXCLUDE) + if(${prefix}_CUSTOM_DATA) + install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/addons/${target}/resources) + endif() + endif() + if(${APP_NAME_UC}_BUILD_DIR) + file(GLOB_RECURSE files ${CMAKE_CURRENT_SOURCE_DIR}/${target}/*) + if(${prefix}_CUSTOM_DATA) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${${prefix}_CUSTOM_DATA} + ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/resources) + endif() + foreach(file ${files}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/${target}/" "" name "${file}") + # A good way to deal with () in filenames + if(NOT ${file} MATCHES xml.in) + configure_file(${file} ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/${name} COPYONLY) + endif() + endforeach() + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${LIBRARY_LOCATION} + ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/${LIBRARY_FILENAME}) + endif() +endmacro() + +# finds a path to a given file (recursive) +function (kodi_find_path var_name filename search_path strip_file) + file(GLOB_RECURSE PATH_TO_FILE ${search_path} ${filename}) + if(strip_file) + string(REPLACE ${filename} "" PATH_TO_FILE ${PATH_TO_FILE}) + endif() + set (${var_name} ${PATH_TO_FILE} PARENT_SCOPE) +endfunction() + +# Cmake build options +include(AddOptions) +include(TestCXXAcceptsFlag) +option(PACKAGE_ZIP "Package Zip file?" OFF) +option(PACKAGE_TGZ "Package TGZ file?" OFF) +option(BUILD_SHARED_LIBS "Build shared libs?" ON) + +# LTO support? +CHECK_CXX_ACCEPTS_FLAG("-flto" HAVE_LTO) +if(HAVE_LTO) + option(USE_LTO "use link time optimization" OFF) + if(USE_LTO) + add_options(ALL_LANGUAGES ALL_BUILDS "-flto") + endif() +endif() + +# set this to try linking dependencies as static as possible +if(ADDONS_PREFER_STATIC_LIBS) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) +endif() + +if(${APP_NAME_UC}_BUILD_DIR) + list(APPEND CMAKE_PREFIX_PATH ${${APP_NAME_UC}_BUILD_DIR}/build) +endif() diff --git a/project/cmake/scripts/common/ArchSetup.cmake b/project/cmake/scripts/common/ArchSetup.cmake new file mode 100644 index 0000000..438e3bd --- /dev/null +++ b/project/cmake/scripts/common/ArchSetup.cmake @@ -0,0 +1,150 @@ +# This script configures the build for a given architecture. +# Flags and stringified arch is set up. +# General compiler tests belongs here. +# +# On return, the following variables are set: +# CMAKE_SYSTEM_NAME - a lowercased system name +# CPU - the CPU on the target +# ARCH - the system architecture +# ARCH_DEFINES - list of compiler definitions for this architecture +# SYSTEM_DEFINES - list of compiler definitions for this system +# DEP_DEFINES - compiler definitions for system dependencies (e.g. LIRC) +# + the results of compiler tests etc. + +include(CheckCXXSourceCompiles) +include(CheckSymbolExists) +include(CheckFunctionExists) + +# Macro to check if a given type exists in a given header +# Arguments: +# header the header to check +# type the type to check for existence +# var the compiler definition to set if type exists +# On return: +# If type was found, the definition is added to SYSTEM_DEFINES +macro(check_type header type var) + check_cxx_source_compiles("#include <${header}> + int main() + { + ${type} s; + }" ${var}) + if(${var}) + list(APPEND SYSTEM_DEFINES -D${var}=1) + endif() +endmacro() + +# Macro to check if a given builtin function exists +# Arguments: +# func the function to check +# var the compiler definition to set if type exists +# On return: +# If type was found, the definition is added to SYSTEM_DEFINES +macro(check_builtin func var) + check_cxx_source_compiles(" + int main() + { + ${func}; + }" ${var}) + if(${var}) + list(APPEND SYSTEM_DEFINES -D${var}=1) + endif() +endmacro() + + +# -------- Main script --------- +message(STATUS "System type: ${CMAKE_SYSTEM_NAME}") +if(NOT CORE_SYSTEM_NAME) + string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME) +endif() + +if(WITH_CPU) + set(CPU ${WITH_CPU}) +elseif(NOT CMAKE_TOOLCHAIN_FILE) + set(CPU ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +if(CMAKE_TOOLCHAIN_FILE) + if(NOT EXISTS "${CMAKE_TOOLCHAIN_FILE}") + message(FATAL_ERROR "Toolchain file ${CMAKE_TOOLCHAIN_FILE} does not exist.") + elseif(NOT DEPENDS_PATH OR NOT NATIVEPREFIX) + message(FATAL_ERROR "Toolchain did not define DEPENDS_PATH or NATIVEPREFIX. Possibly outdated depends.") + endif() +endif() + +# While CMAKE_CROSSCOMPILING is set unconditionally if there's a toolchain file, +# this variable is set if we can execute build artefacts on the host system (for example unit tests). +if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL CMAKE_SYSTEM_PROCESSOR AND + CMAKE_HOST_SYSTEM_NAME STREQUAL CMAKE_SYSTEM_NAME) + set(CORE_HOST_IS_TARGET TRUE) +else() + set(CORE_HOST_IS_TARGET FALSE) +endif() + +# Main cpp +set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp) + +# system specific arch setup +if(NOT EXISTS ${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake) + message(FATAL_ERROR "Couldn't find configuration for '${CORE_SYSTEM_NAME}' " + "Either the platform is not (yet) supported " + "or a toolchain file has to be specified. " + "Consult ${CMAKE_SOURCE_DIR}/README.md for instructions. " + "Note: Specifying a toolchain requires a clean build directory!") +endif() +include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake) + +message(STATUS "Core system type: ${CORE_SYSTEM_NAME}") +message(STATUS "Platform: ${PLATFORM}") +message(STATUS "CPU: ${CPU}, ARCH: ${ARCH}") +message(STATUS "Cross-Compiling: ${CMAKE_CROSSCOMPILING}") +message(STATUS "Execute build artefacts on host: ${CORE_HOST_IS_TARGET}") + +check_type(string std::u16string HAVE_STD__U16_STRING) +check_type(string std::u32string HAVE_STD__U32_STRING) +check_type(string char16_t HAVE_CHAR16_T) +check_type(string char32_t HAVE_CHAR32_T) +check_type(stdint.h uint_least16_t HAVE_STDINT_H) +check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE) +check_symbol_exists(PRIdMAX inttypes.h HAVE_INTTYPES_H) +check_builtin("long* temp=0; long ret=__sync_add_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_ADD_AND_FETCH) +check_builtin("long* temp=0; long ret=__sync_sub_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_SUB_AND_FETCH) +check_builtin("long* temp=0; long ret=__sync_val_compare_and_swap(temp, 1, 1)" HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP) +if(HAVE_POSIX_FADVISE) + list(APPEND SYSTEM_DEFINES -DHAVE_POSIX_FADVISE=1) +endif() +check_function_exists(localtime_r HAVE_LOCALTIME_R) +if(HAVE_LOCALTIME_R) + list(APPEND SYSTEM_DEFINES -DHAVE_LOCALTIME_R=1) +endif() +if(HAVE_INTTYPES_H) + list(APPEND SYSTEM_DEFINES -DHAVE_INTTYPES_H=1) +endif() + +find_package(SSE) +foreach(_sse SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX AVX2) + if(${${_sse}_FOUND}) + # enable SSE versions up to 4.1 by default, if available + if(NOT ${_sse} MATCHES "AVX" AND NOT ${_sse} STREQUAL "SSE4_2") + option(ENABLE_${_sse} "Enable ${_sse}" ON) + else() + option(ENABLE_${_sse} "Enable ${_sse}" OFF) + endif() + endif() + if(ENABLE_${_sse}) + set(HAVE_${_sse} TRUE CACHE STRING "${_sse} enabled") + list(APPEND ARCH_DEFINES -DHAVE_${_sse}=1) + endif() +endforeach() + +if(NOT DEFINED NEON OR NEON) + option(ENABLE_NEON "Enable NEON optimization" ${NEON}) + if(ENABLE_NEON) + message(STATUS "NEON optimization enabled") + add_options(CXX ALL_BUILDS "-mfpu=neon -mvectorize-with-neon-quad") + endif() +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_options (ALL_LANGUAGES DEBUG "-g" "-D_DEBUG" "-Wall") +endif() + diff --git a/project/cmake/scripts/common/CMakeHelpers.cmake b/project/cmake/scripts/common/CMakeHelpers.cmake new file mode 100644 index 0000000..995c38a --- /dev/null +++ b/project/cmake/scripts/common/CMakeHelpers.cmake @@ -0,0 +1,54 @@ +# This file contains functions that support the debugging of the CMake files. + +# This file shouldn't be included per default in any CMake file. It should be +# included and used only on demand. All functions are prefixed with "debug_". +# +# Usage: +# include(scripts/common/CMakeHelpers.cmake) +# debug_print_variables() + +# Print all CMake variables. +macro(debug_print_variables) + get_cmake_property(_variableNames VARIABLES) + foreach(_variableName ${_variableNames}) + message(STATUS "${_variableName} = ${${_variableName}}") + endforeach() +endmacro() + +# Get all properties that CMake supports and convert them to a list. +function(debug_get_properties VAR) + execute_process(COMMAND cmake --help-property-list + OUTPUT_VARIABLE _properties) + string(REGEX REPLACE ";" "\\\\;" _properties "${_properties}") + string(REGEX REPLACE "\n" ";" _properties "${_properties}") + list(REMOVE_DUPLICATES _properties) + list(REMOVE_ITEM _properties LOCATION) + set(${VAR} ${_properties} PARENT_SCOPE) +endfunction() + +# List all properties. +function(debug_list_properties) + debug_get_properties(_properties) + message("CMake properties = ${_properties}") +endfunction() + +# Print all set properties of a specified target. +function(debug_print_target_properties target) + if(NOT TARGET ${target}) + message(FATAL_ERROR "There is no target named '${target}'") + endif() + + debug_get_properties(_properties) + + # Reading LOCATION property is deprecated and triggers a fatal error. + string(REGEX REPLACE ";LOCATION;|LOCATION" "" _properties "${_properties}") + string(REGEX REPLACE "" "${CMAKE_BUILD_TYPE}" _properties + "${_properties}") + foreach(_property ${_properties}) + get_property(_value TARGET ${target} PROPERTY ${_property} SET) + if(_value) + get_target_property(_value ${target} ${_property}) + message("${target} ${_property} = ${_value}") + endif() + endforeach() +endfunction() diff --git a/project/cmake/scripts/common/CheckCommits.cmake b/project/cmake/scripts/common/CheckCommits.cmake new file mode 100644 index 0000000..304e623 --- /dev/null +++ b/project/cmake/scripts/common/CheckCommits.cmake @@ -0,0 +1,75 @@ +find_package(Git REQUIRED) + +macro(sanity_check message) + if(status_code) + message(FATAL_ERROR "${message}") + endif() +endmacro() + +# Check that there are no changes in working-tree +execute_process(COMMAND ${GIT_EXECUTABLE} diff --quiet + RESULT_VARIABLE status_code) +sanity_check("Cannot run with working tree changes. Commit, stash or drop them.") + +# Setup base of tests +set(check_base $ENV{CHECK_BASE}) +if(NOT check_base) + set(check_base origin/master) +endif() + +# Setup end of tests +set(check_head $ENV{CHECK_HEAD}) +if(NOT check_head) + set(check_head HEAD) +endif() + +# Setup target to build +set(check_target $ENV{CHECK_TARGET}) +if(NOT check_target) + set(check_target check) +endif() + +# Build threads +set(build_threads $ENV{CHECK_THREADS}) +if(NOT build_threads) + if(UNIX) + execute_process(COMMAND nproc + OUTPUT_VARIABLE build_threads) + string(REGEX REPLACE "(\r?\n)+$" "" build_threads "${build_threads}") + endif() +endif() + +# Record current HEAD +execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE current_branch) + +string(REGEX REPLACE "(\r?\n)+$" "" current_branch "${current_branch}") + +# Grab revision list +execute_process(COMMAND ${GIT_EXECUTABLE} rev-list ${check_base}..${check_head} --reverse + OUTPUT_VARIABLE rev_list) + +string(REPLACE "\n" ";" rev_list ${rev_list}) +foreach(rev ${rev_list}) + # Checkout + message("Testing revision ${rev}") + execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${rev} + RESULT_VARIABLE status_code) + sanity_check("Failed to checkout ${rev}") + + # Build + if(build_threads GREATER 2) + execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr" "--" "-j${build_threads}" + RESULT_VARIABLE status_code) + else() + execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr" + RESULT_VARIABLE status_code) + endif() + if(status_code) + execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch}) + endif() + sanity_check("Failed to build target for revision ${rev}") +endforeach() + +message("Everything checks out fine") +execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch}) diff --git a/project/cmake/scripts/common/CheckTargetPlatform.cmake b/project/cmake/scripts/common/CheckTargetPlatform.cmake new file mode 100644 index 0000000..5b5d9a1 --- /dev/null +++ b/project/cmake/scripts/common/CheckTargetPlatform.cmake @@ -0,0 +1,63 @@ +# handle target platforms +function(check_target_platform dir target_platform build) + # param[in] dir path/directory of the addon/dependency + # param[in] target_platform target platform of the build + # param[out] build Result whether the addon/dependency should be built for the specified target platform + + set(${build} FALSE) + # check if the given directory exists and contains a platforms.txt + if(EXISTS ${dir} AND EXISTS ${dir}/platforms.txt) + # get all the specified platforms + file(STRINGS ${dir}/platforms.txt platforms) + string(REPLACE " " ";" platforms ${platforms}) + + # check if the addon/dependency should be built for the current platform + foreach(platform ${platforms}) + if(${platform} STREQUAL "all" OR ${platform} STREQUAL ${target_platform}) + set(${build} TRUE) + else() + # check if the platform is defined as "!" + string(SUBSTRING ${platform} 0 1 platform_first) + if(${platform_first} STREQUAL "!") + # extract the platform + string(LENGTH ${platform} platform_length) + math(EXPR platform_length "${platform_length} - 1") + string(SUBSTRING ${platform} 1 ${platform_length} platform) + + # check if the current platform does not match the extracted platform + if(NOT ${platform} STREQUAL ${target_platform}) + set(${build} TRUE) + endif() + endif() + endif() + endforeach() + else() + set(${build} TRUE) + endif() + + # make the ${build} variable available to the calling script + set(${build} "${${build}}" PARENT_SCOPE) +endfunction() + +function(check_install_permissions install_dir have_perms) + # param[in] install_dir directory to check for write permissions + # param[out] have_perms wether we have permissions to install to install_dir + + set(testfile_lib ${install_dir}/lib/kodi/.cmake-inst-test) + set(testfile_share ${install_dir}/share/kodi/.cmake-inst-test) + get_filename_component(testdir_lib ${testfile_lib} DIRECTORY) + get_filename_component(testdir_share ${testfile_share} DIRECTORY) + + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${testdir_lib}) + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${testdir_share}) + execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${testfile_lib}) + execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${testfile_share}) + + if(EXISTS ${testfile_lib} AND EXISTS ${testfile_share}) + set(${have_perms} True PARENT_SCOPE) + else() + message(STATUS "check_install_permissions ${install_dir}: failed to create files") + set(${have_perms} False PARENT_SCOPE) + endif() + file(REMOVE ${testfile_lib} ${testfile_share}) +endfunction() diff --git a/project/cmake/scripts/common/GenerateVersionedFiles.cmake b/project/cmake/scripts/common/GenerateVersionedFiles.cmake new file mode 100644 index 0000000..e105b27 --- /dev/null +++ b/project/cmake/scripts/common/GenerateVersionedFiles.cmake @@ -0,0 +1,18 @@ +include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake) + +core_find_versions() +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/xbmc.addon) +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/kodi.guilib) + +# configure_file without dependency tracking +# configure_file would register additional file dependencies that interfere +# with the ones from add_custom_command (and the generation would happen twice) +function(generate_versioned_file _SRC _DEST) + file(READ ${CORE_SOURCE_DIR}/${_SRC} file_content) + string(CONFIGURE "${file_content}" file_content @ONLY) + file(WRITE ${CMAKE_BINARY_DIR}/${_DEST} "${file_content}") +endfunction() + +generate_versioned_file(addons/xbmc.addon/addon.xml.in addons/xbmc.addon/addon.xml) +generate_versioned_file(addons/kodi.guilib/addon.xml.in addons/kodi.guilib/addon.xml) +generate_versioned_file(xbmc/CompileInfo.cpp.in ${CORE_BUILD_DIR}/xbmc/CompileInfo.cpp) diff --git a/project/cmake/scripts/common/GeneratorSetup.cmake b/project/cmake/scripts/common/GeneratorSetup.cmake new file mode 100644 index 0000000..304b504 --- /dev/null +++ b/project/cmake/scripts/common/GeneratorSetup.cmake @@ -0,0 +1,49 @@ +# Configure single-/multiconfiguration generators and variables +# +# CORE_BUILD_CONFIG that is set to +# - CMAKE_BUILD_TYPE for single configuration generators such as make, nmake +# - a variable that expands on build time to the current configuration for +# multi configuration generators such as VS or Xcode +if(CMAKE_CONFIGURATION_TYPES) + if(CMAKE_BUILD_TYPE) + message(FATAL_ERROR "CMAKE_BUILD_TYPE must not be defined for multi-configuration generators") + endif() + set(CORE_BUILD_CONFIG ${CMAKE_CFG_INTDIR}) + message(STATUS "Generator: Multi-configuration (${CMAKE_GENERATOR})") +else() + if(CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} + CACHE STRING "Choose build type (${CMAKE_BUILD_TYPES})" FORCE) + else() + # Set default + set(CMAKE_BUILD_TYPE Release + CACHE STRING "Choose build type (${CMAKE_BUILD_TYPES})" FORCE) + endif() + set(CORE_BUILD_CONFIG ${CMAKE_BUILD_TYPE}) + message(STATUS "Generator: Single-configuration: ${CMAKE_BUILD_TYPE} (${CMAKE_GENERATOR})") +endif() + +# Print CMake version +message(STATUS "CMake Version: ${CMAKE_VERSION}") + +# Deal with CMake special cases +if(CMAKE_VERSION VERSION_EQUAL 3.5.1) + message(WARNING "CMake 3.5.1 introduced a crash during configuration. " + "Please consider upgrading to 3.5.2 (cmake.org/Bug/view.php?id=16044)") +endif() + +# Darwin needs CMake 3.4 +if(APPLE AND CMAKE_VERSION VERSION_LESS 3.4) + message(WARNING "Build on Darwin requires CMake 3.4 or later (tdb library support) " + "or the usage of the patched version in depends.") +endif() + +# Windows needs CMake 3.6 (VS_STARTUP_PROJECT) +if(WIN32 AND CMAKE_VERSION VERSION_LESS 3.6) + message(FATAL_ERROR "Build on Windows needs CMake 3.6 or later") +endif() + +# Ninja needs CMake 3.2 due to ExternalProject BUILD_BYPRODUCTS usage +if(CMAKE_GENERATOR STREQUAL Ninja AND CMAKE_VERSION VERSION_LESS 3.2) + message(FATAL_ERROR "Generator: Ninja requires CMake 3.2 or later") +endif() diff --git a/project/cmake/scripts/common/HandleDepends.cmake b/project/cmake/scripts/common/HandleDepends.cmake new file mode 100644 index 0000000..880ccdf --- /dev/null +++ b/project/cmake/scripts/common/HandleDepends.cmake @@ -0,0 +1,219 @@ +include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckTargetPlatform.cmake) + +# handle addon depends +function(add_addon_depends addon searchpath) + # input: string addon string searchpath + + set(OUTPUT_DIR ${ADDON_DEPENDS_PATH}) + # look for platform-specific dependencies + file(GLOB_RECURSE cmake_input_files ${searchpath}/${CORE_SYSTEM_NAME}/*.txt) + file(GLOB_RECURSE cmake_input_files2 ${searchpath}/common/*.txt) + list(APPEND cmake_input_files ${cmake_input_files2}) + + foreach(file ${cmake_input_files}) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${file}) + if(NOT (file MATCHES CMakeLists.txt OR + file MATCHES install.txt OR + file MATCHES noinstall.txt OR + file MATCHES flags.txt OR + file MATCHES deps.txt OR + file MATCHES platforms.txt)) + message(STATUS "Processing ${file}") + file(STRINGS ${file} def) + string(REPLACE " " ";" def ${def}) + list(LENGTH def deflength) + get_filename_component(dir ${file} DIRECTORY) + + # get the id of the dependency + if(NOT "${def}" STREQUAL "") + # read the id from the file + list(GET def 0 id) + else() + # read the id from the filename + get_filename_component(id ${file} NAME_WE) + endif() + + # check if the dependency has a platforms.txt + set(platform_found FALSE) + check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found) + + if(${platform_found} AND NOT TARGET ${id}) + # determine the download URL of the dependency + set(url "") + if(deflength GREATER 1) + list(GET def 1 url) + message(STATUS "${id} url: ${url}") + endif() + + # check if there are any library specific flags that need to be passed on + if(EXISTS ${dir}/flags.txt) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/flags.txt) + file(STRINGS ${dir}/flags.txt extraflags) + string(REPLACE " " ";" extraflags ${extraflags}) + message(STATUS "${id} extraflags: ${extraflags}") + endif() + + set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} + -DOUTPUT_DIR=${OUTPUT_DIR} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE} + -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} + -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR} + -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} + -DENABLE_STATIC=1 + -DBUILD_SHARED_LIBS=0) + # if there are no make rules override files available take care of manually passing on ARCH_DEFINES + if(NOT CMAKE_USER_MAKE_RULES_OVERRIDE AND NOT CMAKE_USER_MAKE_RULES_OVERRIDE_CXX) + # make sure we create strings, not lists + set(TMP_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_DEFINES}") + set(TMP_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_DEFINES}") + list(APPEND BUILD_ARGS -DCMAKE_C_FLAGS=${TMP_C_FLAGS} + -DCMAKE_CXX_FLAGS=${TMP_CXX_FLAGS}) + endif() + + if(CMAKE_TOOLCHAIN_FILE) + list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) + message("toolchain specified") + message(${BUILD_ARGS}) + endif() + + # prepare patchfile. ensure we have a clean file after reconfiguring + set(PATCH_FILE ${BUILD_DIR}/${id}/tmp/patch.cmake) + file(REMOVE ${PATCH_FILE}) + + # if there's a CMakeLists.txt use it to prepare the build + if(EXISTS ${dir}/CMakeLists.txt) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/CMakeLists.txt) + file(APPEND ${PATCH_FILE} + "file(COPY ${dir}/CMakeLists.txt + DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") + endif() + + # check if we have patches to apply + file(GLOB patches ${dir}/*.patch) + list(SORT patches) + foreach(patch ${patches}) + if(NOT PATCH_PROGRAM OR "${PATCH_PROGRAM}" STREQUAL "") + if(NOT PATCH_EXECUTABLE) + # find the path to the patch executable + find_program(PATCH_EXECUTABLE NAMES patch) + + if(NOT PATCH_EXECUTABLE) + message(FATAL_ERROR "Missing patch command (we looked in ${CMAKE_PREFIX_PATH})") + endif() + endif() + + # on windows "patch.exe" can only handle CR-LF line-endings so we + # need to force it to also handle LF-only line endings + set(PATCH_PROGRAM ${PATCH_EXECUTABLE}) + if(WIN32) + set(PATCH_PROGRAM "\"${PATCH_PROGRAM}\" --binary") + endif() + endif() + + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${patch}) + file(APPEND ${PATCH_FILE} + "execute_process(COMMAND ${PATCH_PROGRAM} -p1 -i \"${patch}\")\n") + endforeach() + + + # if there's an install.txt use it to properly install the built files + set(INSTALL_COMMAND "") + if(EXISTS ${dir}/install.txt) + set(INSTALL_COMMAND INSTALL_COMMAND ${CMAKE_COMMAND} + -DINPUTDIR=${BUILD_DIR}/${id}/src/${id}-build/ + -DINPUTFILE=${dir}/install.txt + -DDESTDIR=${OUTPUT_DIR} + -DENABLE_STATIC=1 + "${extraflags}" + -P ${PROJECT_SOURCE_DIR}/install.cmake) + elseif(EXISTS ${dir}/noinstall.txt) + set(INSTALL_COMMAND INSTALL_COMMAND "") + endif() + + # check if there's a deps.txt containing dependencies on other libraries + if(EXISTS ${dir}/deps.txt) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/deps.txt) + file(STRINGS ${dir}/deps.txt deps) + message(STATUS "${id} depends: ${deps}") + else() + set(deps) + endif() + + if(CROSS_AUTOCONF AND AUTOCONF_FILES) + foreach(afile ${AUTOCONF_FILES}) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${afile}) + file(APPEND ${PATCH_FILE} + "message(STATUS \"AUTOCONF: copying ${afile} to ${BUILD_DIR}/${id}/src/${id}\")\n + file(COPY ${afile} DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") + endforeach() + endif() + + # if the patch file exists we need to set the PATCH_COMMAND + set(PATCH_COMMAND "") + if(EXISTS ${PATCH_FILE}) + set(PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_FILE}) + endif() + + # prepare the setup of the call to externalproject_add() + set(EXTERNALPROJECT_SETUP PREFIX ${BUILD_DIR}/${id} + CMAKE_ARGS ${extraflags} ${BUILD_ARGS} + PATCH_COMMAND ${PATCH_COMMAND} + "${INSTALL_COMMAND}") + + # if there's an url defined we need to pass that to externalproject_add() + if(DEFINED url AND NOT "${url}" STREQUAL "") + # check if there's a third parameter in the file + if(deflength GREATER 2) + # the third parameter is considered as a revision of a git repository + list(GET def 2 revision) + + externalproject_add(${id} + GIT_REPOSITORY ${url} + GIT_TAG ${revision} + "${EXTERNALPROJECT_SETUP}") + else() + set(CONFIGURE_COMMAND "") + if(NOT WIN32) + # manually specify the configure command to be able to pass in the custom PKG_CONFIG_PATH + set(CONFIGURE_COMMAND PKG_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig + ${CMAKE_COMMAND} -DCMAKE_LIBRARY_PATH=${OUTPUT_DIR}/lib ${extraflags} ${BUILD_ARGS} + ${BUILD_DIR}/${id}/src/${id} + -DPACKAGE_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DOUTPUT_DIR=${OUTPUT_DIR} + -DCMAKE_PREFIX_PATH=${OUTPUT_DIR} + -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR} + -DCMAKE_EXE_LINKER_FLAGS=-L${OUTPUT_DIR}/lib + -DCMAKE_INCLUDE_PATH=${OUTPUT_DIR}/include) + endif() + + externalproject_add(${id} + URL ${url} + DOWNLOAD_DIR ${BUILD_DIR}/download + CONFIGURE_COMMAND ${CONFIGURE_COMMAND} + "${EXTERNALPROJECT_SETUP}") + endif() + else() + externalproject_add(${id} + SOURCE_DIR ${dir} + "${EXTERNALPROJECT_SETUP}") + endif() + + if(deps) + add_dependencies(${id} ${deps}) + endif() + endif() + + # if the dependency is available for the target platform add it to the list of the addon's dependencies + # (even if the target already exists as it still has to be built before the addon) + if(${platform_found}) + list(APPEND ${addon}_DEPS ${id}) + endif() + endif() + endforeach() + + # make the ${addon}_DEPS variable available to the calling script + set(${addon}_DEPS "${${addon}_DEPS}" PARENT_SCOPE) +endfunction() + diff --git a/project/cmake/scripts/common/Macros.cmake b/project/cmake/scripts/common/Macros.cmake new file mode 100644 index 0000000..71c39ef --- /dev/null +++ b/project/cmake/scripts/common/Macros.cmake @@ -0,0 +1,619 @@ +# This script holds the main functions used to construct the build system + +# include system specific macros +include(${CORE_SOURCE_DIR}/project/cmake/scripts/${CORE_SYSTEM_NAME}/Macros.cmake) + +# IDEs: Group source files in target in folders (file system hierarchy) +# Source: http://blog.audio-tk.com/2015/09/01/sorting-source-files-and-projects-in-folders-with-cmake-and-visual-studioxcode/ +# Arguments: +# target The target that shall be grouped by folders. +# Optional Arguments: +# RELATIVE allows to specify a different reference folder. +function(source_group_by_folder target) + if(NOT TARGET ${target}) + message(FATAL_ERROR "There is no target named '${target}'") + endif() + + set(SOURCE_GROUP_DELIMITER "/") + + cmake_parse_arguments(arg "" "RELATIVE" "" ${ARGN}) + if(arg_RELATIVE) + set(relative_dir ${arg_RELATIVE}) + else() + set(relative_dir ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + + get_property(files TARGET ${target} PROPERTY SOURCES) + if(files) + list(SORT files) + + if(CMAKE_GENERATOR STREQUAL Xcode) + set_target_properties(${target} PROPERTIES SOURCES "${files}") + endif() + endif() + foreach(file ${files}) + if(NOT IS_ABSOLUTE ${file}) + set(file ${CMAKE_CURRENT_SOURCE_DIR}/${file}) + endif() + file(RELATIVE_PATH relative_file ${relative_dir} ${file}) + get_filename_component(dir "${relative_file}" DIRECTORY) + if(NOT dir STREQUAL "${last_dir}") + if(files) + source_group("${last_dir}" FILES ${files}) + endif() + set(files "") + endif() + set(files ${files} ${file}) + set(last_dir "${dir}") + endforeach(file) + if(files) + source_group("${last_dir}" FILES ${files}) + endif() +endfunction() + +# Add sources to main application +# Arguments: +# name name of the library to add +# Implicit arguments: +# ENABLE_STATIC_LIBS Build static libraries per directory +# SOURCES the sources of the library +# HEADERS the headers of the library (only for IDE support) +# OTHERS other library related files (only for IDE support) +# On return: +# Library will be built, optionally added to ${core_DEPENDS} +# Sets CORE_LIBRARY for calls for setting target specific options +function(core_add_library name) + if(ENABLE_STATIC_LIBS) + add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS}) + set_target_properties(${name} PROPERTIES PREFIX "") + set(core_DEPENDS ${name} ${core_DEPENDS} CACHE STRING "" FORCE) + add_dependencies(${name} libcpluff ffmpeg dvdnav crossguid) + set(CORE_LIBRARY ${name} PARENT_SCOPE) + + # Add precompiled headers to Kodi main libraries + if(CORE_SYSTEM_NAME STREQUAL windows) + add_precompiled_header(${name} pch.h ${CORE_SOURCE_DIR}/xbmc/platform/win32/pch.cpp PCH_TARGET kodi) + set_language_cxx(${name}) + target_link_libraries(${name} PUBLIC effects11) + endif() + else() + foreach(src IN LISTS SOURCES HEADERS OTHERS) + get_filename_component(src_path "${src}" ABSOLUTE) + list(APPEND FILES ${src_path}) + endforeach() + target_sources(lib${APP_NAME_LC} PRIVATE ${FILES}) + set(CORE_LIBRARY lib${APP_NAME_LC} PARENT_SCOPE) + endif() +endfunction() + +# Add a test library, and add sources to list for gtest integration macros +function(core_add_test_library name) + if(ENABLE_STATIC_LIBS) + add_library(${name} STATIC ${SOURCES} ${SUPPORTED_SOURCES} ${HEADERS} ${OTHERS}) + set_target_properties(${name} PROPERTIES PREFIX "" + EXCLUDE_FROM_ALL 1 + FOLDER "Build Utilities/tests") + add_dependencies(${name} libcpluff ffmpeg dvdnav crossguid) + set(test_archives ${test_archives} ${name} CACHE STRING "" FORCE) + endif() + foreach(src IN LISTS SOURCES) + get_filename_component(src_path "${src}" ABSOLUTE) + set(test_sources "${src_path}" ${test_sources} CACHE STRING "" FORCE) + endforeach() +endfunction() + +# Add an addon callback library +# Arguments: +# name name of the library to add +# Implicit arguments: +# SOURCES the sources of the library +# HEADERS the headers of the library (only for IDE support) +# OTHERS other library related files (only for IDE support) +# On return: +# Library target is defined and added to LIBRARY_FILES +function(core_add_addon_library name) + get_filename_component(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} NAME) + list(APPEND SOURCES lib${name}.cpp) + core_add_shared_library(${name} OUTPUT_DIRECTORY addons/${DIRECTORY}) + set_target_properties(${name} PROPERTIES FOLDER addons) + target_include_directories(${name} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi + ${CORE_SOURCE_DIR}/xbmc) +endfunction() + +# Add an dl-loaded shared library +# Arguments: +# name name of the library to add +# Optional arguments: +# WRAPPED wrap this library on POSIX platforms to add VFS support for +# libraries that would otherwise not support it. +# OUTPUT_DIRECTORY where to create the library in the build dir +# (default: system) +# Implicit arguments: +# SOURCES the sources of the library +# HEADERS the headers of the library (only for IDE support) +# OTHERS other library related files (only for IDE support) +# On return: +# Library target is defined and added to LIBRARY_FILES +function(core_add_shared_library name) + cmake_parse_arguments(arg "WRAPPED" "OUTPUT_DIRECTORY" "" ${ARGN}) + if(arg_OUTPUT_DIRECTORY) + set(OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY}) + else() + if(NOT CORE_SYSTEM_NAME STREQUAL windows) + set(OUTPUT_DIRECTORY system) + endif() + endif() + if(CORE_SYSTEM_NAME STREQUAL windows) + set(OUTPUT_NAME lib${name}) + else() + set(OUTPUT_NAME lib${name}-${ARCH}) + endif() + + if(NOT arg_WRAPPED OR CORE_SYSTEM_NAME STREQUAL windows) + add_library(${name} SHARED ${SOURCES} ${HEADERS} ${OTHERS}) + set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY} + OUTPUT_NAME ${OUTPUT_NAME} PREFIX "") + + set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}/${OUTPUT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE STRING "" FORCE) + add_dependencies(${APP_NAME_LC}-libraries ${name}) + else() + add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS}) + set_target_properties(${name} PROPERTIES POSITION_INDEPENDENT_CODE 1) + core_link_library(${name} ${OUTPUT_DIRECTORY}/lib${name}) + endif() +endfunction() + +# Sets the compile language for all C source files in a target to CXX. +# Needs to be called from the CMakeLists.txt that defines the target. +# Arguments: +# target target +function(set_language_cxx target) + get_property(sources TARGET ${target} PROPERTY SOURCES) + foreach(file IN LISTS sources) + if(file MATCHES "\.c$") + set_source_files_properties(${file} PROPERTIES LANGUAGE CXX) + endif() + endforeach() +endfunction() + +# Add a data file to installation list with a mirror in build tree +# Mirroring files in the buildtree allows to execute the app from there. +# Arguments: +# file full path to file to mirror +# Optional Arguments: +# NO_INSTALL: exclude file from installation target (only mirror) +# DIRECTORY: directory where the file should be mirrored to +# (default: preserve tree structure relative to CORE_SOURCE_DIR) +# On return: +# Files is mirrored to the build tree and added to ${install_data} +# (if NO_INSTALL is not given). +function(copy_file_to_buildtree file) + cmake_parse_arguments(arg "NO_INSTALL" "DIRECTORY" "" ${ARGN}) + if(arg_DIRECTORY) + set(outdir ${arg_DIRECTORY}) + get_filename_component(outfile ${file} NAME) + set(outfile ${outdir}/${outfile}) + else() + string(REPLACE "${CORE_SOURCE_DIR}/" "" outfile ${file}) + get_filename_component(outdir ${outfile} DIRECTORY) + endif() + + if(NOT TARGET export-files) + file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake) + add_custom_target(export-files ALL COMMENT "Copying files into build tree" + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake) + set_target_properties(export-files PROPERTIES FOLDER "Build Utilities") + file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake "# Export files to build tree\n") + endif() + + # Exclude autotools build artefacts and other blacklisted files in source tree. + if(file MATCHES "(Makefile|\.in|\.xbt|\.so|\.dylib|\.gitignore)$") + if(VERBOSE) + message(STATUS "copy_file_to_buildtree - ignoring file: ${file}") + endif() + return() + endif() + + if(NOT file STREQUAL ${CMAKE_BINARY_DIR}/${outfile}) + if(VERBOSE) + message(STATUS "copy_file_to_buildtree - copying file: ${file} -> ${CMAKE_BINARY_DIR}/${outfile}") + endif() + file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake + "file(COPY \"${file}\" DESTINATION \"${CMAKE_BINARY_DIR}/${outdir}\")\n") + endif() + + if(NOT arg_NO_INSTALL) + list(APPEND install_data ${outfile}) + set(install_data ${install_data} PARENT_SCOPE) + endif() +endfunction() + +# Add data files to installation list with a mirror in build tree. +# reads list of files to install from a given list of text files. +# Arguments: +# pattern globbing pattern for text files to read +# Optional Arguments: +# NO_INSTALL: exclude files from installation target +# Implicit arguments: +# CORE_SOURCE_DIR - root of source tree +# On return: +# Files are mirrored to the build tree and added to ${install_data} +# (if NO_INSTALL is not given). +function(copy_files_from_filelist_to_buildtree pattern) + # copies files listed in text files to the buildtree + # Input: [glob pattern: filepattern] + cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN}) + list(APPEND pattern ${ARGN}) + list(SORT pattern) + if(VERBOSE) + message(STATUS "copy_files_from_filelist_to_buildtree - got pattern: ${pattern}") + endif() + foreach(pat ${pattern}) + file(GLOB filenames ${pat}) + foreach(filename ${filenames}) + string(STRIP ${filename} filename) + core_file_read_filtered(fstrings ${filename}) + foreach(dir ${fstrings}) + string(REPLACE " " ";" dir ${dir}) + list(GET dir 0 src) + list(LENGTH dir len) + if(len EQUAL 1) + set(dest) + else() + list(GET dir -1 dest) + endif() + + # If the full path to an existing file is specified then add that single file. + # Don't recursively add all files with the given name. + if(EXISTS ${CORE_SOURCE_DIR}/${src} AND NOT IS_DIRECTORY ${CORE_SOURCE_DIR}/${src}) + set(files ${src}) + else() + file(GLOB_RECURSE files RELATIVE ${CORE_SOURCE_DIR} ${CORE_SOURCE_DIR}/${src}) + endif() + + foreach(file ${files}) + if(arg_NO_INSTALL) + copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} DIRECTORY ${dest} NO_INSTALL) + else() + copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} DIRECTORY ${dest}) + endif() + endforeach() + endforeach() + endforeach() + endforeach() + set(install_data ${install_data} PARENT_SCOPE) +endfunction() + +# helper macro to set modified variables in parent scope +macro(export_dep) + set(SYSTEM_INCLUDES ${SYSTEM_INCLUDES} PARENT_SCOPE) + set(DEPLIBS ${DEPLIBS} PARENT_SCOPE) + set(DEP_DEFINES ${DEP_DEFINES} PARENT_SCOPE) + set(${depup}_FOUND ${${depup}_FOUND} PARENT_SCOPE) + mark_as_advanced(${depup}_LIBRARIES) +endmacro() + +# add a required dependency of main application +# Arguments: +# dep name of find rule for dependency, used uppercased for variable prefix +# On return: +# dependency added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES} +function(core_require_dep dep) + find_package(${dep} REQUIRED) + string(TOUPPER ${dep} depup) + list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) + list(APPEND DEPLIBS ${${depup}_LIBRARIES}) + list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) + export_dep() +endfunction() + +# add a required dyloaded dependency of main application +# Arguments: +# dep name of find rule for dependency, used uppercased for variable prefix +# On return: +# dependency added to ${SYSTEM_INCLUDES}, ${dep}_SONAME is set up +function(core_require_dyload_dep dep) + find_package(${dep} REQUIRED) + string(TOUPPER ${dep} depup) + list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) + list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) + find_soname(${depup} REQUIRED) + export_dep() + set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE) +endfunction() + +# helper macro for optional deps +macro(setup_enable_switch) + string(TOUPPER ${dep} depup) + if(ARGV1) + set(enable_switch ${ARGV1}) + else() + set(enable_switch ENABLE_${depup}) + endif() + # normal options are boolean, so we override set our ENABLE_FOO var to allow "auto" handling + set(${enable_switch} "AUTO" CACHE STRING "Enable ${depup} support?") +endmacro() + +# add an optional dependency of main application +# Arguments: +# dep name of find rule for dependency, used uppercased for variable prefix +# On return: +# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES} +function(core_optional_dep dep) + setup_enable_switch() + if(${enable_switch} STREQUAL AUTO) + find_package(${dep}) + elseif(${${enable_switch}}) + find_package(${dep} REQUIRED) + endif() + + if(${depup}_FOUND) + list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) + list(APPEND DEPLIBS ${${depup}_LIBRARIES}) + list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) + set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE) + export_dep() + else() + set(final_message ${final_message} "${depup} enabled: No" PARENT_SCOPE) + endif() +endfunction() + +# add an optional dyloaded dependency of main application +# Arguments: +# dep name of find rule for dependency, used uppercased for variable prefix +# On return: +# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEP_DEFINES}, ${dep}_SONAME is set up +function(core_optional_dyload_dep dep) + setup_enable_switch() + if(${enable_switch}) + find_package(${dep}) + if(${depup}_FOUND) + list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) + find_soname(${depup} REQUIRED) + list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) + set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE) + export_dep() + set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE) + endif() + endif() +endfunction() + +function(core_file_read_filtered result filepattern) + # Reads STRINGS from text files + # with comments filtered out + # Result: [list: result] + # Input: [glob pattern: filepattern] + file(GLOB filenames ${filepattern}) + list(SORT filenames) + foreach(filename ${filenames}) + if(VERBOSE) + message(STATUS "core_file_read_filtered - filename: ${filename}") + endif() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${filename}) + file(STRINGS ${filename} fstrings REGEX "^[^#//]") + foreach(fstring ${fstrings}) + string(REGEX REPLACE "^(.*)#(.*)" "\\1" fstring ${fstring}) + string(REGEX REPLACE "[ \n\r\t]//.*" "" fstring ${fstring}) + string(STRIP ${fstring} fstring) + list(APPEND filename_strings ${fstring}) + endforeach() + endforeach() + set(${result} ${filename_strings} PARENT_SCOPE) +endfunction() + +function(core_add_subdirs_from_filelist files) + # Adds subdirectories from a sorted list of files + # Input: [list: filenames] [bool: sort] + foreach(arg ${ARGN}) + list(APPEND files ${arg}) + endforeach() + list(SORT files) + if(VERBOSE) + message(STATUS "core_add_subdirs_from_filelist - got pattern: ${files}") + endif() + foreach(filename ${files}) + string(STRIP ${filename} filename) + core_file_read_filtered(fstrings ${filename}) + foreach(subdir ${fstrings}) + string(REPLACE " " ";" subdir ${subdir}) + list(GET subdir 0 subdir_src) + list(GET subdir -1 subdir_dest) + if(VERBOSE) + message(STATUS " core_add_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}/${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}") + endif() + add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest}) + endforeach() + endforeach() +endfunction() + +macro(core_add_optional_subdirs_from_filelist pattern) + # Adds subdirectories from text files + # if the option(s) in the 3rd field are enabled + # Input: [glob pattern: filepattern] + foreach(arg ${ARGN}) + list(APPEND pattern ${arg}) + endforeach() + foreach(elem ${pattern}) + string(STRIP ${elem} elem) + list(APPEND filepattern ${elem}) + endforeach() + + file(GLOB filenames ${filepattern}) + list(SORT filenames) + if(VERBOSE) + message(STATUS "core_add_optional_subdirs_from_filelist - got pattern: ${filenames}") + endif() + + foreach(filename ${filenames}) + if(VERBOSE) + message(STATUS "core_add_optional_subdirs_from_filelist - reading file: ${filename}") + endif() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${filename}) + file(STRINGS ${filename} fstrings REGEX "^[^#//]") + foreach(line ${fstrings}) + string(REPLACE " " ";" line "${line}") + list(GET line 0 subdir_src) + list(GET line 1 subdir_dest) + list(GET line 3 opts) + foreach(opt ${opts}) + if(ENABLE_${opt}) + if(VERBOSE) + message(STATUS " core_add_optional_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}/${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}") + endif() + add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest}) + else() + if(VERBOSE) + message(STATUS " core_add_optional_subdirs_from_filelist: OPTION ${opt} not enabled for ${subdir_src}, skipping subdir") + endif() + endif() + endforeach() + endforeach() + endforeach() +endmacro() + +# Generates an RFC2822 timestamp +# +# The following variable is set: +# RFC2822_TIMESTAMP +function(rfc2822stamp) + execute_process(COMMAND date -R + OUTPUT_VARIABLE RESULT) + set(RFC2822_TIMESTAMP ${RESULT} PARENT_SCOPE) +endfunction() + +# Generates an user stamp from git config info +# +# The following variable is set: +# PACKAGE_MAINTAINER - user stamp in the form of "username " +# if no git tree is found, value is set to "nobody " +function(userstamp) + find_package(Git) + if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git) + execute_process(COMMAND ${GIT_EXECUTABLE} config user.name + OUTPUT_VARIABLE username + WORKING_DIRECTORY ${CORE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} config user.email + OUTPUT_VARIABLE useremail + WORKING_DIRECTORY ${CORE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(PACKAGE_MAINTAINER "${username} <${useremail}>" PARENT_SCOPE) + else() + set(PACKAGE_MAINTAINER "nobody " PARENT_SCOPE) + endif() +endfunction() + +# Parses git info and sets variables used to identify the build +# Arguments: +# stamp variable name to return +# Optional Arguments: +# FULL: generate git HEAD commit in the form of 'YYYYMMDD-hash' +# if git tree is dirty, value is set in the form of 'YYYYMMDD-hash-dirty' +# if no git tree is found, value is set in the form of 'YYYYMMDD-nogitfound' +# if FULL is not given, stamp is generated following the same process as above +# but without 'YYYYMMDD' +# On return: +# Variable is set with generated stamp to PARENT_SCOPE +function(core_find_git_rev stamp) + # allow manual setting GIT_VERSION + if(GIT_VERSION) + set(${stamp} ${GIT_VERSION} PARENT_SCOPE) + else() + find_package(Git) + if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git) + execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet -- + RESULT_VARIABLE status_code + WORKING_DIRECTORY ${CORE_SOURCE_DIR}) + if(NOT status_code) + execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --ignore-submodules --quiet HEAD -- + RESULT_VARIABLE status_code + WORKING_DIRECTORY ${CORE_SOURCE_DIR}) + endif() + if(status_code) + execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h-dirty" HEAD + OUTPUT_VARIABLE HASH + WORKING_DIRECTORY ${CORE_SOURCE_DIR}) + string(SUBSTRING ${HASH} 1 13 HASH) + else() + execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h" HEAD + OUTPUT_VARIABLE HASH + WORKING_DIRECTORY ${CORE_SOURCE_DIR}) + string(SUBSTRING ${HASH} 1 7 HASH) + endif() + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%cd" --date=short HEAD + OUTPUT_VARIABLE DATE + WORKING_DIRECTORY ${CORE_SOURCE_DIR}) + string(SUBSTRING ${DATE} 1 10 DATE) + string(REPLACE "-" "" DATE ${DATE}) + else() + string(TIMESTAMP DATE "%Y%m%d" UTC) + set(HASH "nogitfound") + endif() + cmake_parse_arguments(arg "FULL" "" "" ${ARGN}) + if(arg_FULL) + set(${stamp} ${DATE}-${HASH} PARENT_SCOPE) + else() + set(${stamp} ${HASH} PARENT_SCOPE) + endif() + endif() +endfunction() + +# Parses version.txt and libKODI_guilib.h and sets variables +# used to construct dirs structure, file naming, API version, etc. +# +# The following variables are set from version.txt: +# APP_NAME - app name +# APP_NAME_LC - lowercased app name +# APP_NAME_UC - uppercased app name +# COMPANY_NAME - company name +# APP_VERSION_MAJOR - the app version major +# APP_VERSION_MINOR - the app version minor +# APP_VERSION_TAG - the app version tag +# APP_VERSION_TAG_LC - lowercased app version tag +# APP_VERSION - the app version (${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}-${APP_VERSION_TAG}) +# APP_ADDON_API - the addon API version in the form of 16.9.702 +# FILE_VERSION - file version in the form of 16,9,702,0 - Windows only +# +# The following variables are set from libKODI_guilib.h: +# guilib_version - current ADDONGUI API version +# guilib_version_min - minimal ADDONGUI API version +macro(core_find_versions) + include(CMakeParseArguments) + core_file_read_filtered(version_list ${CORE_SOURCE_DIR}/version.txt) + string(REPLACE " " ";" version_list "${version_list}") + cmake_parse_arguments(APP "" "APP_NAME;COMPANY_NAME;WEBSITE;VERSION_MAJOR;VERSION_MINOR;VERSION_TAG;VERSION_CODE;ADDON_API" "" ${version_list}) + + set(APP_NAME ${APP_APP_NAME}) # inconsistency but APP_APP_NAME looks weird + string(TOLOWER ${APP_APP_NAME} APP_NAME_LC) + string(TOUPPER ${APP_APP_NAME} APP_NAME_UC) + set(COMPANY_NAME ${APP_COMPANY_NAME}) + set(APP_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}) + if(APP_VERSION_TAG) + set(APP_VERSION ${APP_VERSION}-${APP_VERSION_TAG}) + endif() + string(REPLACE "." "," FILE_VERSION ${APP_ADDON_API}.0) + string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC) + file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version REGEX "^.*GUILIB_API_VERSION (.*)$") + string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version ${guilib_version}) + file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version_min REGEX "^.*GUILIB_MIN_API_VERSION (.*)$") + string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version_min ${guilib_version_min}) + # unset variables not used anywhere else + unset(version_list) + unset(APP_APP_NAME) + + # bail if we can't parse version.txt + if(NOT DEFINED APP_VERSION_MAJOR OR NOT DEFINED APP_VERSION_MINOR) + message(FATAL_ERROR "Could not determine app version! Make sure that ${CORE_SOURCE_DIR}/version.txt exists") + endif() + + # bail if we can't parse libKODI_guilib.h + if(NOT DEFINED guilib_version OR NOT DEFINED guilib_version_min) + message(FATAL_ERROR "Could not determine add-on API version! Make sure that ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h exists") + endif() +endmacro() + diff --git a/project/cmake/scripts/common/PrepareEnv.cmake b/project/cmake/scripts/common/PrepareEnv.cmake new file mode 100644 index 0000000..8e02382 --- /dev/null +++ b/project/cmake/scripts/common/PrepareEnv.cmake @@ -0,0 +1,93 @@ +# parse version.txt and libKODI_guilib.h to get the version and API info +include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake) +core_find_versions() + +# in case we need to download something, set KODI_MIRROR to the default if not alread set +if(NOT DEFINED KODI_MIRROR) + set(KODI_MIRROR "http://mirrors.kodi.tv") +endif() + +### copy all the addon binding header files to include/kodi +# make sure include/kodi exists and is empty +set(APP_LIB_DIR ${ADDON_DEPENDS_PATH}/lib/${APP_NAME_LC}) +if(NOT EXISTS "${APP_LIB_DIR}/") + file(MAKE_DIRECTORY ${APP_LIB_DIR}) +endif() + +set(APP_DATA_DIR ${ADDON_DEPENDS_PATH}/share/${APP_NAME_LC}) +if(NOT EXISTS "${APP_DATA_DIR}/") + file(MAKE_DIRECTORY ${APP_DATA_DIR}) +endif() + +set(APP_INCLUDE_DIR ${ADDON_DEPENDS_PATH}/include/${APP_NAME_LC}) +if(NOT EXISTS "${APP_INCLUDE_DIR}/") + file(MAKE_DIRECTORY ${APP_INCLUDE_DIR}) +endif() + +# make sure C++11 is always set +if(NOT WIN32) + string(REGEX MATCH "-std=(gnu|c)\\+\\+11" cxx11flag "${CMAKE_CXX_FLAGS}") + if(NOT cxx11flag) + set(CXX11_SWITCH "-std=c++11") + endif() +endif() + +# generate the proper KodiConfig.cmake file +configure_file(${CORE_SOURCE_DIR}/project/cmake/KodiConfig.cmake.in ${APP_LIB_DIR}/KodiConfig.cmake @ONLY) + +# copy cmake helpers to lib/kodi +file(COPY ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddonHelpers.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddOptions.cmake + DESTINATION ${APP_LIB_DIR}) + +### copy all the addon binding header files to include/kodi +# parse addon-bindings.mk to get the list of header files to copy +core_file_read_filtered(bindings ${CORE_SOURCE_DIR}/xbmc/addons/addon-bindings.mk) +foreach(binding ${bindings}) + string(REPLACE " =" ";" binding "${binding}") + string(REPLACE "+=" ";" binding "${binding}") + list(GET binding 1 header) + # copy the header file to include/kodi + configure_file(${CORE_SOURCE_DIR}/${header} ${APP_INCLUDE_DIR} COPYONLY) +endforeach() + +### on windows we need a "patch" binary to be able to patch 3rd party sources +if(WIN32) + find_program(PATCH_FOUND NAMES patch patch.exe) + if(PATCH_FOUND) + message(STATUS "patch utility found at ${PATCH_FOUND}") + else() + set(PATCH_ARCHIVE_NAME "patch-2.5.9-7-bin-3") + set(PATCH_ARCHIVE "${PATCH_ARCHIVE_NAME}.zip") + set(PATCH_URL "${KODI_MIRROR}/build-deps/win32/${PATCH_ARCHIVE}") + set(PATCH_DOWNLOAD ${BUILD_DIR}/download/${PATCH_ARCHIVE}) + + # download the archive containing patch.exe + message(STATUS "Downloading patch utility from ${PATCH_URL}...") + file(DOWNLOAD "${PATCH_URL}" "${PATCH_DOWNLOAD}" STATUS PATCH_DL_STATUS LOG PATCH_LOG SHOW_PROGRESS) + list(GET PATCH_DL_STATUS 0 PATCH_RETCODE) + if(NOT ${PATCH_RETCODE} EQUAL 0) + message(FATAL_ERROR "ERROR downloading ${PATCH_URL} - status: ${PATCH_DL_STATUS} log: ${PATCH_LOG}") + endif() + + # extract the archive containing patch.exe + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf ${PATCH_DOWNLOAD} + WORKING_DIRECTORY ${BUILD_DIR}) + + # make sure the extraction worked and that patch.exe is there + set(PATCH_PATH ${BUILD_DIR}/${PATCH_ARCHIVE_NAME}) + set(PATCH_BINARY_PATH ${PATCH_PATH}/bin/patch.exe) + if(NOT EXISTS ${PATCH_PATH} OR NOT EXISTS ${PATCH_BINARY_PATH}) + message(FATAL_ERROR "ERROR extracting patch utility from ${PATCH_DOWNLOAD_DIR}") + endif() + + # copy patch.exe into the output directory + file(INSTALL ${PATCH_BINARY_PATH} DESTINATION ${ADDON_DEPENDS_PATH}/bin) + + # make sure that cmake can find the copied patch.exe + find_program(PATCH_FOUND NAMES patch patch.exe) + if(NOT PATCH_FOUND) + message(FATAL_ERROR "ERROR installing patch utility from ${PATCH_BINARY_PATH} to ${ADDON_DEPENDS_PATH}/bin") + endif() + endif() +endif() diff --git a/project/cmake/scripts/common/ProjectMacros.cmake b/project/cmake/scripts/common/ProjectMacros.cmake new file mode 100644 index 0000000..e73ef90 --- /dev/null +++ b/project/cmake/scripts/common/ProjectMacros.cmake @@ -0,0 +1,89 @@ +# This script holds macros which are project specific + +# Pack a skin xbt file +# Arguments: +# input input directory to pack +# output ouput xbt file +# On return: +# xbt is added to ${XBT_FILES} +function(pack_xbt input output) + file(GLOB_RECURSE MEDIA_FILES ${input}/*) + get_filename_component(dir ${output} DIRECTORY) + add_custom_command(OUTPUT ${output} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} + COMMAND TexturePacker::TexturePacker + ARGS -input ${input} + -output ${output} + -dupecheck + DEPENDS ${MEDIA_FILES}) + list(APPEND XBT_FILES ${output}) + set(XBT_FILES ${XBT_FILES} PARENT_SCOPE) +endfunction() + +# Add a skin to installation list, mirroring it in build tree, packing textures +# Arguments: +# skin skin directory +# On return: +# xbt is added to ${XBT_FILES}, data added to ${install_data}, mirror in build tree +function(copy_skin_to_buildtree skin) + file(GLOB_RECURSE FILES ${skin}/*) + file(GLOB_RECURSE MEDIA_FILES ${skin}/media/*) + list(REMOVE_ITEM FILES ${MEDIA_FILES}) + foreach(file ${FILES}) + copy_file_to_buildtree(${file}) + endforeach() + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${dest}/media) + string(REPLACE "${CORE_SOURCE_DIR}/" "" dest ${skin}) + pack_xbt(${skin}/media ${CMAKE_BINARY_DIR}/${dest}/media/Textures.xbt) + + file(GLOB THEMES RELATIVE ${skin}/themes ${skin}/themes/*) + foreach(theme ${THEMES}) + pack_xbt(${skin}/themes/${theme} ${CMAKE_BINARY_DIR}/${dest}/media/${theme}.xbt) + endforeach() + + set(XBT_FILES ${XBT_FILES} PARENT_SCOPE) + set(install_data ${install_data} PARENT_SCOPE) +endfunction() + +# Get GTest tests as CMake tests. +# Copied from FindGTest.cmake +# Thanks to Daniel Blezek for the GTEST_ADD_TESTS code +function(GTEST_ADD_TESTS executable extra_args) + if(NOT ARGN) + message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS") + endif() + foreach(source ${ARGN}) + # This assumes that every source file passed in exists. Consider using + # SUPPORT_SOURCES for source files which do not contain tests and might + # have to be generated. + file(READ "${source}" contents) + string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) + foreach(hit ${found_tests}) + string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit}) + add_test(${test_name} ${executable} --gtest_filter=${test_name} ${extra_args}) + endforeach() + # Groups parametrized tests under a single ctest entry + string(REGEX MATCHALL "INSTANTIATE_TEST_CASE_P\\(([^,]+), *([^,]+)" found_tests2 ${contents}) + foreach(hit ${found_tests2}) + string(SUBSTRING ${hit} 24 -1 test_name) + string(REPLACE "," ";" test_name "${test_name}") + list(GET test_name 0 filter_name) + list(GET test_name 1 test_prefix) + string(STRIP ${test_prefix} test_prefix) + add_test(${test_prefix}.${filter_name} ${executable} --gtest_filter=${filter_name}* ${extra_args}) + endforeach() + endforeach() +endfunction() + +function(whole_archive output) + if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang) + set(${output} -Wl,--whole-archive ${ARGN} -Wl,--no-whole-archive PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) + foreach(library ${ARGN}) + list(APPEND ${output} -Wl,-force_load ${library}) + set(${output} ${${output}} PARENT_SCOPE) + endforeach() + else() + set(${output} ${ARGN} PARENT_SCOPE) + endif() +endfunction() diff --git a/project/cmake/scripts/common/Uninstall.cmake b/project/cmake/scripts/common/Uninstall.cmake new file mode 100644 index 0000000..5660e19 --- /dev/null +++ b/project/cmake/scripts/common/Uninstall.cmake @@ -0,0 +1,22 @@ +# Uninstall target +set(MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt) +if(EXISTS ${MANIFEST}) + file(STRINGS ${MANIFEST} files) + foreach(file IN LISTS files) + if(EXISTS $ENV{DESTDIR}${file}) + message(STATUS "Uninstalling: ${file}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E remove $ENV{DESTDIR}${file} + OUTPUT_VARIABLE rm_out + RESULT_VARIABLE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Failed to remove file: $ENV{DESTDIR}${file}") + endif() + else() + message(STATUS "File does not exist: $ENV{DESTDIR}${file}") + endif() + endforeach(file) +else() + message(STATUS "Cannot find install manifest: '${MANIFEST}'") +endif() diff --git a/project/cmake/scripts/common/addon-helpers.cmake b/project/cmake/scripts/common/addon-helpers.cmake deleted file mode 100644 index caef610..0000000 --- a/project/cmake/scripts/common/addon-helpers.cmake +++ /dev/null @@ -1,171 +0,0 @@ -# Workaround for the fact that cpack's filenames are not customizable. -# Each add-on is added as a separate component to facilitate zip/tgz packaging. -# The filenames are always of the form basename-component, which is -# incompatible with the addonid-version scheme we want. This hack renames -# the files from the file names generated by the 'package' target. -# Sadly we cannot extend the 'package' target, as it is a builtin target, see -# http://public.kitware.com/Bug/view.php?id=8438 -# Thus, we have to add an 'addon-package' target. -add_custom_target(addon-package - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package) - -macro(add_cpack_workaround target version ext) - if(NOT PACKAGE_DIR) - set(PACKAGE_DIR "${CMAKE_INSTALL_PREFIX}/zips") - endif() - - add_custom_command(TARGET addon-package PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_PACKAGE_DIRECTORY}/addon-${target}-${version}.${ext} ${PACKAGE_DIR}/${target}-${version}.${ext}) -endmacro() - -# Grab the version from a given add-on's addon.xml -macro (addon_version dir prefix) - IF(EXISTS ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in) - FILE(READ ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in ADDONXML) - ELSE() - FILE(READ ${dir}/addon.xml ADDONXML) - ENDIF() - - STRING(REGEX MATCH "]*version.?=.?.[0-9\\.]+" VERSION_STRING ${ADDONXML}) - STRING(REGEX REPLACE ".*version=.([0-9\\.]+).*" "\\1" ${prefix}_VERSION ${VERSION_STRING}) - message(STATUS ${prefix}_VERSION=${${prefix}_VERSION}) -endmacro() - -# Build, link and optionally package an add-on -macro (build_addon target prefix libs) - ADD_LIBRARY(${target} ${${prefix}_SOURCES}) - TARGET_LINK_LIBRARIES(${target} ${${libs}}) - addon_version(${target} ${prefix}) - SET_TARGET_PROPERTIES(${target} PROPERTIES VERSION ${${prefix}_VERSION} - SOVERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR} - PREFIX "") - IF(OS STREQUAL "android") - SET_TARGET_PROPERTIES(${target} PROPERTIES PREFIX "lib") - ENDIF(OS STREQUAL "android") - - # get the library's location - SET(LIBRARY_LOCATION $) - # get the library's filename - if("${CORE_SYSTEM_NAME}" STREQUAL "android") - # for android we need the filename without any version numbers - set(LIBRARY_FILENAME $) - else() - SET(LIBRARY_FILENAME $) - endif() - - # if there's an addon.xml.in we need to generate the addon.xml - IF(EXISTS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in) - SET(PLATFORM ${CORE_SYSTEM_NAME}) - - FILE(READ ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in addon_file) - STRING(CONFIGURE "${addon_file}" addon_file_conf @ONLY) - FILE(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}") - ENDIF() - - # set zip as default if addon-package is called without PACKAGE_XXX - SET(CPACK_GENERATOR "ZIP") - SET(ext "zip") - IF(PACKAGE_ZIP OR PACKAGE_TGZ) - IF(PACKAGE_TGZ) - SET(CPACK_GENERATOR "TGZ") - SET(ext "tar.gz") - ENDIF(PACKAGE_TGZ) - SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) - set(CPACK_PACKAGE_FILE_NAME addon) - IF(CMAKE_BUILD_TYPE STREQUAL "Release") - SET(CPACK_STRIP_FILES TRUE) - ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release") - set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) - set(CPACK_COMPONENTS_IGNORE_GROUPS 1) - list(APPEND CPACK_COMPONENTS_ALL ${target}-${${prefix}_VERSION}) - # Pack files together to create an archive - INSTALL(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION} PATTERN "addon.xml.in" EXCLUDE) - IF(WIN32) - if(NOT CPACK_PACKAGE_DIRECTORY) - # determine the temporary path - file(TO_CMAKE_PATH "$ENV{TEMP}" WIN32_TEMP_PATH) - string(LENGTH "${WIN32_TEMP_PATH}" WIN32_TEMP_PATH_LENGTH) - string(LENGTH "${PROJECT_BINARY_DIR}" PROJECT_BINARY_DIR_LENGTH) - - # check if the temporary path is shorter than the default packaging directory path - if(WIN32_TEMP_PATH_LENGTH GREATER 0 AND WIN32_TEMP_PATH_LENGTH LESS PROJECT_BINARY_DIR_LENGTH) - # set the directory used by CPack for packaging to the temp directory - set(CPACK_PACKAGE_DIRECTORY ${WIN32_TEMP_PATH}) - endif() - endif() - - # in case of a VC++ project the installation location contains a $(Configuration) VS variable - # we replace it with ${CMAKE_BUILD_TYPE} (which doesn't cover the case when the build configuration - # is changed within Visual Studio) - string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" LIBRARY_LOCATION "${LIBRARY_LOCATION}") - - # install the generated DLL file - INSTALL(PROGRAMS ${LIBRARY_LOCATION} DESTINATION ${target} - COMPONENT ${target}-${${prefix}_VERSION}) - - IF(CMAKE_BUILD_TYPE MATCHES Debug) - # for debug builds also install the PDB file - get_filename_component(LIBRARY_DIR ${LIBRARY_LOCATION} DIRECTORY) - INSTALL(FILES $ DESTINATION ${target} - COMPONENT ${target}-${${prefix}_VERSION}) - ENDIF() - ELSE(WIN32) - if(NOT CPACK_PACKAGE_DIRECTORY) - set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}) - endif() - INSTALL(TARGETS ${target} DESTINATION ${target} - COMPONENT ${target}-${${prefix}_VERSION}) - ENDIF(WIN32) - add_cpack_workaround(${target} ${${prefix}_VERSION} ${ext}) - ELSE(PACKAGE_ZIP OR PACKAGE_TGZ) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR NOT CMAKE_INSTALL_PREFIX) - message(STATUS "setting install paths to match ${APP_NAME}: CMAKE_INSTALL_PREFIX: ${${APP_NAME_UC}_PREFIX}") - set(CMAKE_INSTALL_PREFIX "${${APP_NAME_UC}_PREFIX}" CACHE PATH "${APP_NAME} install prefix" FORCE) - set(CMAKE_INSTALL_LIBDIR "${${APP_NAME_UC}_LIB_DIR}" CACHE PATH "${APP_NAME} install libdir" FORCE) - elseif(NOT CMAKE_INSTALL_PREFIX STREQUAL "${${APP_NAME_UC}_PREFIX}" AND NOT OVERRIDE_PATHS) - message(FATAL_ERROR "CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} differs from ${APP_NAME} prefix ${${APP_NAME_UC}_PREFIX}. Please pass -DOVERRIDE_PATHS=1 to skip this check") - else() - if(NOT CMAKE_INSTALL_LIBDIR) - set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib/${APP_NAME_LC}") - endif() - endif() - else() - set(CMAKE_INSTALL_LIBDIR "lib/${APP_NAME_LC}") - endif() - INSTALL(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) - INSTALL(DIRECTORY ${target} DESTINATION share/${APP_NAME_LC}/addons PATTERN "addon.xml.in" EXCLUDE) - ENDIF(PACKAGE_ZIP OR PACKAGE_TGZ) -endmacro() - -# finds a path to a given file (recursive) -function (kodi_find_path var_name filename search_path strip_file) - file(GLOB_RECURSE PATH_TO_FILE ${search_path} ${filename}) - if(strip_file) - string(REPLACE ${filename} "" PATH_TO_FILE ${PATH_TO_FILE}) - endif(strip_file) - set (${var_name} ${PATH_TO_FILE} PARENT_SCOPE) -endfunction() - -# Cmake build options -include(addoptions) -include(TestCXXAcceptsFlag) -OPTION(PACKAGE_ZIP "Package Zip file?" OFF) -OPTION(PACKAGE_TGZ "Package TGZ file?" OFF) -OPTION(BUILD_SHARED_LIBS "Build shared libs?" ON) - -# LTO support? -CHECK_CXX_ACCEPTS_FLAG("-flto" HAVE_LTO) -IF(HAVE_LTO) - OPTION(USE_LTO "use link time optimization" OFF) - IF(USE_LTO) - add_options(ALL_LANGUAGES ALL_BUILDS "-flto") - ENDIF(USE_LTO) -ENDIF(HAVE_LTO) - -# set this to try linking dependencies as static as possible -IF(ADDONS_PREFER_STATIC_LIBS) - SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) -ENDIF(ADDONS_PREFER_STATIC_LIBS) - diff --git a/project/cmake/scripts/common/addoptions.cmake b/project/cmake/scripts/common/addoptions.cmake deleted file mode 100644 index 0ebb823..0000000 --- a/project/cmake/scripts/common/addoptions.cmake +++ /dev/null @@ -1,82 +0,0 @@ -# - Add options without repeating them on the command line -# -# Synopsis: -# -# add_options (lang build opts) -# -# where: -# -# lang Name of the language whose compiler should receive the -# options, e.g. CXX. If a comma-separated list is received -# then the option is added for all those languages. Use the -# special value ALL_LANGUAGES for these languages: CXX, C -# and Fortran -# -# build Kind of build to which this options should apply, -# such as DEBUG and RELEASE. This can also be a comma- -# separated list. Use the special value ALL_BUILDS to apply -# to all builds. -# -# opts List of options to add. Each should be quoted. -# -# Example: -# -# add_options (CXX RELEASE "-O3" "-DNDEBUG" "-Wall") - -function (add_options langs builds) - # special handling of empty language specification - if ("${langs}" STREQUAL "ALL_LANGUAGES") - set (langs CXX C Fortran) - endif ("${langs}" STREQUAL "ALL_LANGUAGES") - foreach (lang IN LISTS langs) - # prepend underscore if necessary - foreach (build IN LISTS builds) - if (NOT ("${build}" STREQUAL "ALL_BUILDS")) - set (_bld "_${build}") - string (TOUPPER "${_bld}" _bld) - else (NOT ("${build}" STREQUAL "ALL_BUILDS")) - set (_bld "") - endif (NOT ("${build}" STREQUAL "ALL_BUILDS")) - foreach (_opt IN LISTS ARGN) - set (_var "CMAKE_${lang}_FLAGS${_bld}") - #message (STATUS "Adding \"${_opt}\" to \${${_var}}") - # remove it first - string (REPLACE "${_opt}" "" _without "${${_var}}") - string (STRIP "${_without}" _without) - # we need to strip this one as well, so they are comparable - string (STRIP "${${_var}}" _stripped) - # if it wasn't there, then add it at the end - if ("${_without}" STREQUAL "${_stripped}") - # don't add any extra spaces if no options yet are set - if (NOT ${_stripped} STREQUAL "") - set (${_var} "${_stripped} ${_opt}") - else (NOT ${_stripped} STREQUAL "") - set (${_var} "${_opt}") - endif (NOT ${_stripped} STREQUAL "") - set (${_var} "${${_var}}" PARENT_SCOPE) - endif ("${_without}" STREQUAL "${_stripped}") - endforeach (_opt) - endforeach (build) - endforeach (lang) -endfunction (add_options lang build) - -# set varname to flag unless user has specified something that matches regex -function (set_default_option varname flag regex) - if (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}") - set (${varname} ${flag} PARENT_SCOPE) - else (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}") - set (${varname} PARENT_SCOPE) - endif (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}" - AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}") -endfunction (set_default_option) - -# note: this must be called before project() -macro (no_default_options) - # prevent the platform probe to set options - set (CMAKE_NOT_USING_CONFIG_FLAGS TRUE) -endmacro (no_default_options) diff --git a/project/cmake/scripts/common/archsetup.cmake b/project/cmake/scripts/common/archsetup.cmake deleted file mode 100644 index dff5558..0000000 --- a/project/cmake/scripts/common/archsetup.cmake +++ /dev/null @@ -1,99 +0,0 @@ -# This script configures the build for a given architecture. -# Flags and stringified arch is set up. -# General compiler tests belongs here. -# -# On return, the following variables are set: -# CMAKE_SYSTEM_NAME - a lowercased system name -# CPU - the CPU on the target -# ARCH - the system architecture -# ARCH_DEFINES - list of compiler definitions for this architecture -# SYSTEM_DEFINES - list of compiler definitions for this system -# DEP_DEFINES - compiler definitions for system dependencies (e.g. LIRC) -# + the results of compiler tests etc. - -include(CheckCXXSourceCompiles) -include(CheckSymbolExists) -include(CheckFunctionExists) - -# Macro to check if a given type exists in a given header -# Arguments: -# header the header to check -# type the type to check for existence -# var the compiler definition to set if type exists -# On return: -# If type was found, the definition is added to SYSTEM_DEFINES -macro(check_type header type var) - check_cxx_source_compiles("#include <${header}> - int main() - { - ${type} s; - }" ${var}) - if(${var}) - list(APPEND SYSTEM_DEFINES -D${var}=1) - endif() -endmacro() - -# Macro to check if a given builtin function exists -# Arguments: -# func the function to check -# var the compiler definition to set if type exists -# On return: -# If type was found, the definition is added to SYSTEM_DEFINES -macro(check_builtin func var) - check_cxx_source_compiles(" - int main() - { - ${func}; - }" ${var}) - if(${var}) - list(APPEND SYSTEM_DEFINES -D${var}=1) - endif() -endmacro() - - -# -------- Main script --------- -message(STATUS "System type: ${CMAKE_SYSTEM_NAME}") -if(NOT CORE_SYSTEM_NAME) - string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME) -endif() - -if(WITH_CPU) - set(CPU ${WITH_CPU}) -elseif(NOT CMAKE_TOOLCHAIN_FILE) - set(CPU ${CMAKE_SYSTEM_PROCESSOR}) -endif() - -if(CMAKE_TOOLCHAIN_FILE) - if(NOT EXISTS "${CMAKE_TOOLCHAIN_FILE}") - message(FATAL_ERROR "Toolchain file ${CMAKE_TOOLCHAIN_FILE} does not exist.") - elseif(NOT DEPENDS_PATH OR NOT NATIVEPREFIX) - message(FATAL_ERROR "Toolchain did not define DEPENDS_PATH or NATIVEPREFIX. Possibly outdated depends.") - endif() -endif() - -# Main cpp -set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp) - -# system specific arch setup -include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/archsetup.cmake) - -message(STATUS "Core system type: ${CORE_SYSTEM_NAME}") -message(STATUS "Platform: ${PLATFORM}") -message(STATUS "CPU: ${CPU}, ARCH: ${ARCH}") - -check_type(string std::u16string HAVE_STD__U16_STRING) -check_type(string std::u32string HAVE_STD__U32_STRING) -check_type(string char16_t HAVE_CHAR16_T) -check_type(string char32_t HAVE_CHAR32_T) -check_type(stdint.h uint_least16_t HAVE_STDINT_H) -check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE) -check_builtin("long* temp=0; long ret=__sync_add_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_ADD_AND_FETCH) -check_builtin("long* temp=0; long ret=__sync_sub_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_SUB_AND_FETCH) -check_builtin("long* temp=0; long ret=__sync_val_compare_and_swap(temp, 1, 1)" HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP) -if(HAVE_POSIX_FADVISE) - list(APPEND SYSTEM_DEFINES -DHAVE_POSIX_FADVISE=1) -endif() -check_function_exists(localtime_r HAVE_LOCALTIME_R) -if(HAVE_LOCALTIME_R) - list(APPEND SYSTEM_DEFINES -DHAVE_LOCALTIME_R=1) -endif() diff --git a/project/cmake/scripts/common/check_target_platform.cmake b/project/cmake/scripts/common/check_target_platform.cmake deleted file mode 100644 index fc8b403..0000000 --- a/project/cmake/scripts/common/check_target_platform.cmake +++ /dev/null @@ -1,61 +0,0 @@ -# handle target platforms -function(check_target_platform dir target_platform build) - # param[in] dir path/directory of the addon/dependency - # param[in] target_platform target platform of the build - # param[out] build Result whether the addon/dependency should be built for the specified target platform - - set(${build} FALSE) - # check if the given directory exists and contains a platforms.txt - if(EXISTS ${dir} AND EXISTS ${dir}/platforms.txt) - # get all the specified platforms - file(STRINGS ${dir}/platforms.txt platforms) - separate_arguments(platforms) - - # check if the addon/dependency should be built for the current platform - foreach(platform ${platforms}) - if(${platform} STREQUAL "all" OR ${platform} STREQUAL ${target_platform}) - set(${build} TRUE) - else() - # check if the platform is defined as "!" - string(SUBSTRING ${platform} 0 1 platform_first) - if(${platform_first} STREQUAL "!") - # extract the platform - string(LENGTH ${platform} platform_length) - MATH(EXPR platform_length "${platform_length} - 1") - string(SUBSTRING ${platform} 1 ${platform_length} platform) - - # check if the current platform does not match the extracted platform - if (NOT ${platform} STREQUAL ${target_platform}) - set(${build} TRUE) - endif() - endif() - endif() - endforeach() - else() - set(${build} TRUE) - endif() - - # make the ${build} variable available to the calling script - set(${build} "${${build}}" PARENT_SCOPE) -endfunction() - -function(check_install_permissions install_dir have_perms) - # param[in] install_dir directory to check for write permissions - # param[out] have_perms wether we have permissions to install to install_dir - - set(${have_perms} TRUE) - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}/lib/kodi - COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}/share/kodi - COMMAND ${CMAKE_COMMAND} -E touch ${install_dir}/lib/kodi/.cmake-inst-test ${install_dir}/share/kodi/.cmake-inst-test - RESULT_VARIABLE permtest) - - if(${permtest} GREATER 0) - message(STATUS "check_install_permissions: ${permtest}") - set(${have_perms} FALSE) - endif() - set(${have_perms} "${${have_perms}}" PARENT_SCOPE) - - if(EXISTS ${install_dir}/lib/kodi/.cmake-inst-test OR EXISTS ${install_dir}/share/kodi/.cmake-inst-test) - file(REMOVE ${install_dir}/lib/kodi/.cmake-inst-test ${install_dir}/share/kodi/.cmake-inst-test) - endif() -endfunction() diff --git a/project/cmake/scripts/common/checkcommits.cmake b/project/cmake/scripts/common/checkcommits.cmake deleted file mode 100644 index 304e623..0000000 --- a/project/cmake/scripts/common/checkcommits.cmake +++ /dev/null @@ -1,75 +0,0 @@ -find_package(Git REQUIRED) - -macro(sanity_check message) - if(status_code) - message(FATAL_ERROR "${message}") - endif() -endmacro() - -# Check that there are no changes in working-tree -execute_process(COMMAND ${GIT_EXECUTABLE} diff --quiet - RESULT_VARIABLE status_code) -sanity_check("Cannot run with working tree changes. Commit, stash or drop them.") - -# Setup base of tests -set(check_base $ENV{CHECK_BASE}) -if(NOT check_base) - set(check_base origin/master) -endif() - -# Setup end of tests -set(check_head $ENV{CHECK_HEAD}) -if(NOT check_head) - set(check_head HEAD) -endif() - -# Setup target to build -set(check_target $ENV{CHECK_TARGET}) -if(NOT check_target) - set(check_target check) -endif() - -# Build threads -set(build_threads $ENV{CHECK_THREADS}) -if(NOT build_threads) - if(UNIX) - execute_process(COMMAND nproc - OUTPUT_VARIABLE build_threads) - string(REGEX REPLACE "(\r?\n)+$" "" build_threads "${build_threads}") - endif() -endif() - -# Record current HEAD -execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE current_branch) - -string(REGEX REPLACE "(\r?\n)+$" "" current_branch "${current_branch}") - -# Grab revision list -execute_process(COMMAND ${GIT_EXECUTABLE} rev-list ${check_base}..${check_head} --reverse - OUTPUT_VARIABLE rev_list) - -string(REPLACE "\n" ";" rev_list ${rev_list}) -foreach(rev ${rev_list}) - # Checkout - message("Testing revision ${rev}") - execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${rev} - RESULT_VARIABLE status_code) - sanity_check("Failed to checkout ${rev}") - - # Build - if(build_threads GREATER 2) - execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr" "--" "-j${build_threads}" - RESULT_VARIABLE status_code) - else() - execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr" - RESULT_VARIABLE status_code) - endif() - if(status_code) - execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch}) - endif() - sanity_check("Failed to build target for revision ${rev}") -endforeach() - -message("Everything checks out fine") -execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch}) diff --git a/project/cmake/scripts/common/generateversionedfiles.cmake b/project/cmake/scripts/common/generateversionedfiles.cmake deleted file mode 100644 index ea1fad5..0000000 --- a/project/cmake/scripts/common/generateversionedfiles.cmake +++ /dev/null @@ -1,11 +0,0 @@ -include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/macros.cmake) - -core_find_versions() -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/xbmc.addon) -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/kodi.guilib) -configure_file(${CORE_SOURCE_DIR}/addons/xbmc.addon/addon.xml.in - ${CMAKE_BINARY_DIR}/addons/xbmc.addon/addon.xml @ONLY) -configure_file(${CORE_SOURCE_DIR}/addons/kodi.guilib/addon.xml.in - ${CMAKE_BINARY_DIR}/addons/kodi.guilib/addon.xml @ONLY) -configure_file(${CORE_SOURCE_DIR}/xbmc/CompileInfo.cpp.in - ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/xbmc/CompileInfo.cpp @ONLY) diff --git a/project/cmake/scripts/common/generatorsetup.cmake b/project/cmake/scripts/common/generatorsetup.cmake deleted file mode 100644 index 75083ca..0000000 --- a/project/cmake/scripts/common/generatorsetup.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# Configure single-/multiconfiguration generators and variables -# -# CORE_BUILD_CONFIG that is set to -# - CMAKE_BUILD_TYPE for single configuration generators such as make, nmake -# - a variable that expands on build time to the current configuration for -# multi configuration generators such as VS or Xcode -if(CMAKE_CONFIGURATION_TYPES) - if(CMAKE_BUILD_TYPE) - message(FATAL_ERROR "CMAKE_BUILD_TYPE must not be defined for multi-configuration generators") - endif() - set(CORE_BUILD_CONFIG ${CMAKE_CFG_INTDIR}) - message(STATUS "Generator: Multi-configuration (${CMAKE_GENERATOR})") -else() - if(CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} - CACHE STRING "Choose build type (${CMAKE_BUILD_TYPES})" FORCE) - else() - # Set default - set(CMAKE_BUILD_TYPE Release - CACHE STRING "Choose build type (${CMAKE_BUILD_TYPES})" FORCE) - endif() - set(CORE_BUILD_CONFIG ${CMAKE_BUILD_TYPE}) - message(STATUS "Generator: Single-configuration: ${CMAKE_BUILD_TYPE} (${CMAKE_GENERATOR})") -endif() diff --git a/project/cmake/scripts/common/handle-depends.cmake b/project/cmake/scripts/common/handle-depends.cmake deleted file mode 100644 index 4d78928..0000000 --- a/project/cmake/scripts/common/handle-depends.cmake +++ /dev/null @@ -1,209 +0,0 @@ -include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake) - -# handle addon depends -function(add_addon_depends addon searchpath) - # input: string addon string searchpath - - set(OUTPUT_DIR ${DEPENDS_PATH}) - file(GLOB_RECURSE cmake_input_files ${searchpath}/${CORE_SYSTEM_NAME}/*.txt) - file(GLOB_RECURSE cmake_input_files2 ${searchpath}/common/*.txt) - list(APPEND cmake_input_files ${cmake_input_files2}) - - foreach(file ${cmake_input_files}) - if(NOT (file MATCHES CMakeLists.txt OR - file MATCHES install.txt OR - file MATCHES noinstall.txt OR - file MATCHES flags.txt OR - file MATCHES deps.txt OR - file MATCHES platforms.txt)) - message(STATUS "Processing ${file}") - file(STRINGS ${file} def) - separate_arguments(def) - list(LENGTH def deflength) - get_filename_component(dir ${file} PATH) - - # get the id of the dependency - if(NOT "${def}" STREQUAL "") - # read the id from the file - list(GET def 0 id) - else() - # read the id from the filename - get_filename_component(id ${file} NAME_WE) - endif() - - # check if the dependency has a platforms.txt - set(platform_found FALSE) - check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found) - - if(${platform_found} AND NOT TARGET ${id}) - # determine the download URL of the dependency - set(url "") - if(deflength GREATER 1) - list(GET def 1 url) - message(STATUS "${id} url: ${url}") - endif() - - # check if there are any library specific flags that need to be passed on - if(EXISTS ${dir}/flags.txt) - file(STRINGS ${dir}/flags.txt extraflags) - separate_arguments(extraflags) - message(STATUS "${id} extraflags: ${extraflags}") - endif() - - set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} - -DOUTPUT_DIR=${OUTPUT_DIR} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE} - -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX} - -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR} - -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} - -DENABLE_STATIC=1 - -DBUILD_SHARED_LIBS=0) - # if there are no make rules override files available take care of manually passing on ARCH_DEFINES - if(NOT CMAKE_USER_MAKE_RULES_OVERRIDE AND NOT CMAKE_USER_MAKE_RULES_OVERRIDE_CXX) - # make sure we create strings, not lists - set(TMP_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_DEFINES}") - set(TMP_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_DEFINES}") - list(APPEND BUILD_ARGS -DCMAKE_C_FLAGS=${TMP_C_FLAGS} - -DCMAKE_CXX_FLAGS=${TMP_CXX_FLAGS}) - endif() - - if(CMAKE_TOOLCHAIN_FILE) - list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) - MESSAGE("toolchain specified") - MESSAGE(${BUILD_ARGS}) - endif() - - # if there's a CMakeLists.txt use it to prepare the build - set(PATCH_FILE ${BUILD_DIR}/${id}/tmp/patch.cmake) - if(EXISTS ${dir}/CMakeLists.txt) - file(APPEND ${PATCH_FILE} - "file(COPY ${dir}/CMakeLists.txt - DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") - endif() - - # check if we have patches to apply - file(GLOB patches ${dir}/*.patch) - list(SORT patches) - foreach(patch ${patches}) - if(NOT PATCH_PROGRAM OR "${PATCH_PROGRAM}" STREQUAL "") - if(NOT PATCH_EXECUTABLE) - # find the path to the patch executable - find_program(PATCH_EXECUTABLE NAMES patch) - - if(NOT PATCH_EXECUTABLE) - message(FATAL_ERROR "Missing patch command (we looked in ${CMAKE_PREFIX_PATH})") - endif() - endif() - - # on windows "patch.exe" can only handle CR-LF line-endings so we - # need to force it to also handle LF-only line endings - set(PATCH_PROGRAM ${PATCH_EXECUTABLE}) - if(WIN32) - set(PATCH_PROGRAM "\"${PATCH_PROGRAM}\" --binary") - endif() - endif() - - file(APPEND ${PATCH_FILE} - "execute_process(COMMAND ${PATCH_PROGRAM} -p1 -i \"${patch}\")\n") - endforeach() - - - # if there's an install.txt use it to properly install the built files - set(INSTALL_COMMAND "") - if(EXISTS ${dir}/install.txt) - set(INSTALL_COMMAND INSTALL_COMMAND ${CMAKE_COMMAND} - -DINPUTDIR=${BUILD_DIR}/${id}/src/${id}-build/ - -DINPUTFILE=${dir}/install.txt - -DDESTDIR=${OUTPUT_DIR} - -DENABLE_STATIC=1 - "${extraflags}" - -P ${PROJECT_SOURCE_DIR}/install.cmake) - elseif(EXISTS ${dir}/noinstall.txt) - set(INSTALL_COMMAND INSTALL_COMMAND "") - endif() - - # check if there's a deps.txt containing dependencies on other libraries - if(EXISTS ${dir}/deps.txt) - file(STRINGS ${dir}/deps.txt deps) - message(STATUS "${id} depends: ${deps}") - else() - set(deps) - endif() - - if(CROSS_AUTOCONF AND AUTOCONF_FILES) - foreach(afile ${AUTOCONF_FILES}) - file(APPEND ${PATCH_FILE} - "message(STATUS \"AUTOCONF: copying ${afile} to ${BUILD_DIR}/${id}/src/${id}\")\n - file(COPY ${afile} DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") - endforeach() - endif() - - # if the patch file exists we need to set the PATCH_COMMAND - set(PATCH_COMMAND "") - if (EXISTS ${PATCH_FILE}) - set(PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_FILE}) - endif() - - # prepare the setup of the call to externalproject_add() - set(EXTERNALPROJECT_SETUP PREFIX ${BUILD_DIR}/${id} - CMAKE_ARGS ${extraflags} ${BUILD_ARGS} - PATCH_COMMAND ${PATCH_COMMAND} - "${INSTALL_COMMAND}") - - # if there's an url defined we need to pass that to externalproject_add() - if(DEFINED url AND NOT "${url}" STREQUAL "") - # check if there's a third parameter in the file - if(deflength GREATER 2) - # the third parameter is considered as a revision of a git repository - list(GET def 2 revision) - - externalproject_add(${id} - GIT_REPOSITORY ${url} - GIT_TAG ${revision} - "${EXTERNALPROJECT_SETUP}") - else() - set(CONFIGURE_COMMAND "") - if(NOT WIN32) - # manually specify the configure command to be able to pass in the custom PKG_CONFIG_PATH - set(CONFIGURE_COMMAND PKG_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig - ${CMAKE_COMMAND} -DCMAKE_LIBRARY_PATH=${OUTPUT_DIR}/lib ${extraflags} ${BUILD_ARGS} - ${BUILD_DIR}/${id}/src/${id} - -DPACKAGE_CONFIG_PATH=${OUTPUT_DIR}/lib/pkgconfig - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DOUTPUT_DIR=${OUTPUT_DIR} - -DCMAKE_PREFIX_PATH=${OUTPUT_DIR} - -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR} - -DCMAKE_EXE_LINKER_FLAGS=-L${OUTPUT_DIR}/lib - -DCMAKE_INCLUDE_PATH=${OUTPUT_DIR}/include) - endif() - - externalproject_add(${id} - URL ${url} - DOWNLOAD_DIR ${BUILD_DIR}/download - CONFIGURE_COMMAND ${CONFIGURE_COMMAND} - "${EXTERNALPROJECT_SETUP}") - endif() - else() - externalproject_add(${id} - SOURCE_DIR ${dir} - "${EXTERNALPROJECT_SETUP}") - endif() - - if(deps) - add_dependencies(${id} ${deps}) - endif() - endif() - - # if the dependency is available for the target platform add it to the list of the addon's dependencies - # (even if the target already exists as it still has to be built before the addon) - if(${platform_found}) - list(APPEND ${addon}_DEPS ${id}) - endif() - endif() - endforeach() - - # make the ${addon}_DEPS variable available to the calling script - set(${addon}_DEPS "${${addon}_DEPS}" PARENT_SCOPE) -endfunction() - diff --git a/project/cmake/scripts/common/macros.cmake b/project/cmake/scripts/common/macros.cmake deleted file mode 100644 index 0900740..0000000 --- a/project/cmake/scripts/common/macros.cmake +++ /dev/null @@ -1,383 +0,0 @@ -# This script holds the main functions used to construct the build system - -# include system specific macros -include(${CORE_SOURCE_DIR}/project/cmake/scripts/${CORE_SYSTEM_NAME}/macros.cmake) - -# Add a library, optionally as a dependency of the main application -# Arguments: -# name name of the library to add -# Optional Arguments: -# NO_MAIN_DEPENDS if specified, the library is not added to main depends -# Implicit arguments: -# SOURCES the sources of the library -# HEADERS the headers of the library (only for IDE support) -# OTHERS other library related files (only for IDE support) -# On return: -# Library will be built, optionally added to ${core_DEPENDS} -function(core_add_library name) - cmake_parse_arguments(arg "NO_MAIN_DEPENDS" "" "" ${ARGN}) - - if(NOT SOURCES) - message(STATUS "No sources added to ${name} skipping") - return() - endif() - - add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS}) - set_target_properties(${name} PROPERTIES PREFIX "") - if(NOT arg_NO_MAIN_DEPENDS) - set(core_DEPENDS ${name} ${core_DEPENDS} CACHE STRING "" FORCE) - endif() - - # Add precompiled headers to Kodi main libraries - if(WIN32 AND "${CMAKE_CURRENT_LIST_DIR}" MATCHES "^${CORE_SOURCE_DIR}/xbmc") - add_precompiled_header(${name} pch.h ${CORE_SOURCE_DIR}/xbmc/win32/pch.cpp - PCH_TARGET kodi) - endif() - - # IDE support - if(CMAKE_GENERATOR MATCHES "Xcode") - file(RELATIVE_PATH parentfolder ${CORE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..) - set_target_properties(${name} PROPERTIES FOLDER "${parentfolder}") - elseif(CMAKE_GENERATOR MATCHES "Visual Studio") - file(RELATIVE_PATH foldername ${CORE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) - set_target_properties(${name} PROPERTIES FOLDER "${foldername}") - source_group(" " REGULAR_EXPRESSION ".*") - endif() -endfunction() - -# Add a test library, and add sources to list for gtest integration macros -function(core_add_test_library name) - core_add_library(${name} NO_MAIN_DEPENDS) - set_target_properties(${name} PROPERTIES EXCLUDE_FROM_ALL 1) - foreach(src ${SOURCES}) - set(test_sources ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${test_sources} CACHE STRING "" FORCE) - endforeach() - set(test_archives ${test_archives} ${name} CACHE STRING "" FORCE) -endfunction() - -# Add a data file to installation list with a mirror in build tree -# Arguments: -# file full path to file to mirror -# relative the relative base of file path in the build/install tree -# Optional Arguments: -# NO_INSTALL: exclude file from installation target -# Implicit arguments: -# CORE_SOURCE_DIR - root of source tree -# On return: -# Files is mirrored to the build tree and added to ${install_data} -# (if NO_INSTALL is not given). -function(copy_file_to_buildtree file relative) - cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN}) - string(REPLACE "${relative}/" "" outfile ${file}) - get_filename_component(outdir ${outfile} DIRECTORY) - - if(NOT TARGET export-files) - file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake) - add_custom_target(export-files ALL COMMENT "Copying files into build tree" - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake) - endif() - if(NOT ${CORE_SOURCE_DIR} MATCHES ${CMAKE_BINARY_DIR}) - if(VERBOSE) - message(STATUS "copy_file_to_buildtree - copying file: ${file} -> ${CMAKE_BINARY_DIR}/${outfile}") - endif() - file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake - "file(COPY \"${file}\" DESTINATION \"${CMAKE_BINARY_DIR}/${outdir}\")\n") - endif() - if(NOT arg_NO_INSTALL) - list(APPEND install_data ${outfile}) - set(install_data ${install_data} PARENT_SCOPE) - endif() -endfunction() - -# Add data files to installation list with a mirror in build tree. -# reads list of files to install from a given list of text files. -# Arguments: -# pattern globbing pattern for text files to read -# Optional Arguments: -# NO_INSTALL: exclude files from installation target -# Implicit arguments: -# CORE_SOURCE_DIR - root of source tree -# On return: -# Files are mirrored to the build tree and added to ${install_data} -# (if NO_INSTALL is not given). -function(copy_files_from_filelist_to_buildtree pattern) - # copies files listed in text files to the buildtree - # Input: [glob pattern: filepattern] - cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN}) - list(APPEND pattern ${ARGN}) - list(SORT pattern) - if(VERBOSE) - message(STATUS "copy_files_from_filelist_to_buildtree - got pattern: ${pattern}") - endif() - foreach(pat ${pattern}) - file(GLOB filenames ${pat}) - foreach(filename ${filenames}) - string(STRIP ${filename} filename) - core_file_read_filtered(fstrings ${filename}) - foreach(dir ${fstrings}) - file(GLOB_RECURSE files RELATIVE ${CORE_SOURCE_DIR} ${CORE_SOURCE_DIR}/${dir}) - foreach(file ${files}) - if(arg_NO_INSTALL) - copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} ${CORE_SOURCE_DIR} NO_INSTALL) - else() - copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} ${CORE_SOURCE_DIR}) - endif() - endforeach() - endforeach() - endforeach() - endforeach() - set(install_data ${install_data} PARENT_SCOPE) -endfunction() - -# helper macro to set modified variables in parent scope -macro(export_dep) - set(SYSTEM_INCLUDES ${SYSTEM_INCLUDES} PARENT_SCOPE) - set(DEPLIBS ${DEPLIBS} PARENT_SCOPE) - set(DEP_DEFINES ${DEP_DEFINES} PARENT_SCOPE) - set(${depup}_FOUND ${${depup}_FOUND} PARENT_SCOPE) - mark_as_advanced(${depup}_LIBRARIES) -endmacro() - -# add a required dependency of main application -# Arguments: -# dep name of find rule for dependency, used uppercased for variable prefix -# On return: -# dependency added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES} -function(core_require_dep dep) - find_package(${dep} REQUIRED) - string(TOUPPER ${dep} depup) - list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) - list(APPEND DEPLIBS ${${depup}_LIBRARIES}) - list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) - export_dep() -endfunction() - -# add a required dyloaded dependency of main application -# Arguments: -# dep name of find rule for dependency, used uppercased for variable prefix -# On return: -# dependency added to ${SYSTEM_INCLUDES}, ${dep}_SONAME is set up -function(core_require_dyload_dep dep) - find_package(${dep} REQUIRED) - string(TOUPPER ${dep} depup) - list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) - list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) - find_soname(${depup} REQUIRED) - export_dep() - set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE) -endfunction() - -# helper macro for optional deps -macro(setup_enable_switch) - string(TOUPPER ${dep} depup) - if (ARGV1) - set(enable_switch ${ARGV1}) - else() - set(enable_switch ENABLE_${depup}) - endif() -endmacro() - -# add an optional dependency of main application -# Arguments: -# dep name of find rule for dependency, used uppercased for variable prefix -# On return: -# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES} -function(core_optional_dep dep) - setup_enable_switch() - if(${enable_switch}) - find_package(${dep}) - if(${depup}_FOUND) - list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) - list(APPEND DEPLIBS ${${depup}_LIBRARIES}) - list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) - set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE) - export_dep() - else() - set(final_message ${final_message} "${depup} enabled: No" PARENT_SCOPE) - endif() - endif() -endfunction() - -# add an optional dyloaded dependency of main application -# Arguments: -# dep name of find rule for dependency, used uppercased for variable prefix -# On return: -# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEP_DEFINES}, ${dep}_SONAME is set up -function(core_optional_dyload_dep dep) - setup_enable_switch() - if(${enable_switch}) - find_package(${dep}) - if(${depup}_FOUND) - list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS}) - find_soname(${depup} REQUIRED) - list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS}) - set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE) - export_dep() - set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE) - endif() - endif() -endfunction() - -function(core_file_read_filtered result filepattern) - # Reads STRINGS from text files - # with comments filtered out - # Result: [list: result] - # Input: [glob pattern: filepattern] - file(GLOB filenames ${filepattern}) - list(SORT filenames) - foreach(filename ${filenames}) - if(VERBOSE) - message(STATUS "core_file_read_filtered - filename: ${filename}") - endif() - file(STRINGS ${filename} fstrings REGEX "^[^#//]") - foreach(fstring ${fstrings}) - string(REGEX REPLACE "^(.*)#(.*)" "\\1" fstring ${fstring}) - string(REGEX REPLACE "//.*" "" fstring ${fstring}) - string(STRIP ${fstring} fstring) - list(APPEND filename_strings ${fstring}) - endforeach() - endforeach() - set(${result} ${filename_strings} PARENT_SCOPE) -endfunction() - -function(core_add_subdirs_from_filelist files) - # Adds subdirectories from a sorted list of files - # Input: [list: filenames] [bool: sort] - foreach(arg ${ARGN}) - list(APPEND files ${arg}) - endforeach() - list(SORT files) - if(VERBOSE) - message(STATUS "core_add_subdirs_from_filelist - got pattern: ${files}") - endif() - foreach(filename ${files}) - string(STRIP ${filename} filename) - core_file_read_filtered(fstrings ${filename}) - foreach(subdir ${fstrings}) - STRING_SPLIT(subdir " " ${subdir}) - list(GET subdir 0 subdir_src) - list(GET subdir -1 subdir_dest) - if(VERBOSE) - message(STATUS " core_add_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}") - endif() - add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest}) - endforeach() - endforeach() -endfunction() - -macro(core_add_optional_subdirs_from_filelist pattern) - # Adds subdirectories from text files - # if the option(s) in the 3rd field are enabled - # Input: [glob pattern: filepattern] - foreach(arg ${ARGN}) - list(APPEND pattern ${arg}) - endforeach() - foreach(elem ${pattern}) - string(STRIP ${elem} elem) - list(APPEND filepattern ${elem}) - endforeach() - - file(GLOB filenames ${filepattern}) - list(SORT filenames) - if(VERBOSE) - message(STATUS "core_add_optional_subdirs_from_filelist - got pattern: ${filenames}") - endif() - - foreach(filename ${filenames}) - if(VERBOSE) - message(STATUS "core_add_optional_subdirs_from_filelist - reading file: ${filename}") - endif() - file(STRINGS ${filename} fstrings REGEX "^[^#//]") - foreach(line ${fstrings}) - string(REPLACE " " ";" line "${line}") - list(GET line 0 subdir_src) - list(GET line 1 subdir_dest) - list(GET line 3 opts) - foreach(opt ${opts}) - if(ENABLE_${opt}) - if(VERBOSE) - message(STATUS " core_add_optional_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}") - endif() - add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest}) - else() - if(VERBOSE) - message(STATUS " core_add_optional_subdirs_from_filelist: OPTION ${opt} not enabled for ${subdir_src}, skipping subdir") - endif() - endif() - endforeach() - endforeach() - endforeach() -endmacro() - -macro(today RESULT) - if (WIN32) - execute_process(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT}) - string(REGEX REPLACE "(..)/(..)/..(..).*" "\\1/\\2/\\3" ${RESULT} ${${RESULT}}) - elseif(UNIX) - execute_process(COMMAND date -u +%F - OUTPUT_VARIABLE ${RESULT}) - string(REGEX REPLACE "(..)/(..)/..(..).*" "\\1/\\2/\\3" ${RESULT} ${${RESULT}}) - else() - message(SEND_ERROR "date not implemented") - set(${RESULT} 000000) - endif() - string(REGEX REPLACE "(\r?\n)+$" "" ${RESULT} "${${RESULT}}") -endmacro() - -function(core_find_git_rev) - find_package(Git) - if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git) - execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet -- - RESULT_VARIABLE status_code - WORKING_DIRECTORY ${CORE_SOURCE_DIR}) - if (NOT status_code) - execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --ignore-submodules --quiet HEAD -- - RESULT_VARIABLE status_code - WORKING_DIRECTORY ${CORE_SOURCE_DIR}) - endif() - if (status_code) - execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h-dirty" HEAD - OUTPUT_VARIABLE HASH - WORKING_DIRECTORY ${CORE_SOURCE_DIR}) - string(SUBSTRING ${HASH} 1 13 HASH) - else() - execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h" HEAD - OUTPUT_VARIABLE HASH - WORKING_DIRECTORY ${CORE_SOURCE_DIR}) - string(SUBSTRING ${HASH} 1 7 HASH) - endif() - execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%cd" --date=short HEAD - OUTPUT_VARIABLE DATE - WORKING_DIRECTORY ${CORE_SOURCE_DIR}) - string(SUBSTRING ${DATE} 1 10 DATE) - else() - today(DATE) - set(HASH "nogitfound") - endif() - string(REPLACE "-" "" DATE ${DATE}) - set(GIT_REV "${DATE}-${HASH}") - if(GIT_REV) - set(APP_SCMID ${GIT_REV} PARENT_SCOPE) - endif() -endfunction() - -macro(core_find_versions) - include(CMakeParseArguments) - core_file_read_filtered(version_list ${CORE_SOURCE_DIR}/version.txt) - string(REPLACE " " ";" version_list "${version_list}") - cmake_parse_arguments(APP "" "VERSION_MAJOR;VERSION_MINOR;VERSION_TAG;VERSION_CODE;ADDON_API;APP_NAME;COMPANY_NAME" "" ${version_list}) - - set(APP_NAME ${APP_APP_NAME}) # inconsistency in upstream - string(TOLOWER ${APP_APP_NAME} APP_NAME_LC) - set(COMPANY_NAME ${APP_COMPANY_NAME}) - set(APP_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}) - if(APP_VERSION_TAG) - set(APP_VERSION ${APP_VERSION}-${APP_VERSION_TAG}) - endif() - string(REPLACE "." "," FILE_VERSION ${APP_ADDON_API}.0) - string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC) - file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version REGEX "^.*GUILIB_API_VERSION (.*)$") - string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version ${guilib_version}) - file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version_min REGEX "^.*GUILIB_MIN_API_VERSION (.*)$") - string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version_min ${guilib_version_min}) -endmacro() diff --git a/project/cmake/scripts/common/managestring.cmake b/project/cmake/scripts/common/managestring.cmake deleted file mode 100644 index 7321f4c..0000000 --- a/project/cmake/scripts/common/managestring.cmake +++ /dev/null @@ -1,235 +0,0 @@ -# - Collection of String utility macros. -# Defines the following macros: -# STRING_TRIM(var str [NOUNQUOTE]) -# - Trim a string by removing the leading and trailing spaces, -# just like STRING(STRIP ...) in CMake 2.6 and later. -# This macro is needed as CMake 2.4 does not support STRING(STRIP ..) -# This macro also remove quote and double quote marks around the string, -# unless NOUNQUOTE is defined. -# * Parameters: -# + var: A variable that stores the result. -# + str: A string. -# + NOUNQUOTE: (Optional) do not remove the double quote mark around the string. -# -# STRING_UNQUOTE(var str) -# - Remove double quote marks and quote marks around a string. -# If the string is not quoted, then it returns an empty string. -# * Parameters: -# + var: A variable that stores the result. -# + str: A string. -# -# STRING_JOIN(var delimiter str_list [str...]) -# - Concatenate strings, with delimiter inserted between strings. -# * Parameters: -# + var: A variable that stores the result. -# + str_list: A list of string. -# + str: (Optional) more string to be join. -# -# STRING_SPLIT(var delimiter str [NOESCAPE_SEMICOLON]) -# - Split a string into a list using a delimiter, which can be in 1 or more -# characters long. -# * Parameters: -# + var: A variable that stores the result. -# + delimiter: To separate a string. -# + str: A string. -# + NOESCAPE_SEMICOLON: (Optional) Do not escape semicolons. -# - -IF(NOT DEFINED _MANAGE_STRING_CMAKE_) - SET(_MANAGE_STRING_CMAKE_ "DEFINED") - - MACRO(STRING_TRIM var str) - SET(${var} "") - IF (NOT "${ARGN}" STREQUAL "NOUNQUOTE") - # Need not trim a quoted string. - STRING_UNQUOTE(_var "${str}") - IF(NOT _var STREQUAL "") - # String is quoted - SET(${var} "${_var}") - ENDIF(NOT _var STREQUAL "") - ENDIF(NOT "${ARGN}" STREQUAL "NOUNQUOTE") - - IF(${var} STREQUAL "") - SET(_var_1 "${str}") - STRING(REGEX REPLACE "^[ \t\r\n]+" "" _var_2 "${str}" ) - STRING(REGEX REPLACE "[ \t\r\n]+$" "" _var_3 "${_var_2}" ) - SET(${var} "${_var_3}") - ENDIF(${var} STREQUAL "") - ENDMACRO(STRING_TRIM var str) - - # Internal macro - # Variable cannot be escaped here, as variable is already substituted - # at the time it passes to this macro. - MACRO(STRING_ESCAPE var str) - # ';' and '\' are tricky, need to be encoded. - # '#' => '#H' - # '\' => '#B' - # ';' => '#S' - SET(_NOESCAPE_SEMICOLON "") - SET(_NOESCAPE_HASH "") - - FOREACH(_arg ${ARGN}) - IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON") - ELSEIF(${_arg} STREQUAL "NOESCAPE_HASH") - SET(_NOESCAPE_HASH "NOESCAPE_HASH") - ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - ENDFOREACH(_arg) - - IF(_NOESCAPE_HASH STREQUAL "") - STRING(REGEX REPLACE "#" "#H" _ret "${str}") - ELSE(_NOESCAPE_HASH STREQUAL "") - SET(_ret "${str}") - ENDIF(_NOESCAPE_HASH STREQUAL "") - - STRING(REGEX REPLACE "\\\\" "#B" _ret "${_ret}") - IF(_NOESCAPE_SEMICOLON STREQUAL "") - STRING(REGEX REPLACE ";" "#S" _ret "${_ret}") - ENDIF(_NOESCAPE_SEMICOLON STREQUAL "") - SET(${var} "${_ret}") - ENDMACRO(STRING_ESCAPE var str) - - MACRO(STRING_UNESCAPE var str) - # '#B' => '\' - # '#H' => '#' - # '#D' => '$' - # '#S' => ';' - SET(_ESCAPE_VARIABLE "") - SET(_NOESCAPE_SEMICOLON "") - SET(_ret "${str}") - FOREACH(_arg ${ARGN}) - IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON") - ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE") - SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE") - STRING(REGEX REPLACE "#D" "$" _ret "${_ret}") - ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - ENDFOREACH(_arg) - - STRING(REGEX REPLACE "#B" "\\\\" _ret "${_ret}") - IF(_NOESCAPE_SEMICOLON STREQUAL "") - # ';' => '#S' - STRING(REGEX REPLACE "#S" "\\\\;" _ret "${_ret}") - ELSE(_NOESCAPE_SEMICOLON STREQUAL "") - STRING(REGEX REPLACE "#S" ";" _ret "${_ret}") - ENDIF(_NOESCAPE_SEMICOLON STREQUAL "") - - IF(NOT _ESCAPE_VARIABLE STREQUAL "") - # '#D' => '$' - STRING(REGEX REPLACE "#D" "$" _ret "${_ret}") - ENDIF(NOT _ESCAPE_VARIABLE STREQUAL "") - STRING(REGEX REPLACE "#H" "#" _ret "${_ret}") - SET(${var} "${_ret}") - ENDMACRO(STRING_UNESCAPE var str) - - - MACRO(STRING_UNQUOTE var str) - STRING_ESCAPE(_ret "${str}" ${ARGN}) - IF(_ret MATCHES "^[ \t\r\n]+") - STRING(REGEX REPLACE "^[ \t\r\n]+" "" _ret "${_ret}") - ENDIF(_ret MATCHES "^[ \t\r\n]+") - IF(_ret MATCHES "^\"") - # Double quote - STRING(REGEX REPLACE "\"\(.*\)\"[ \t\r\n]*$" "\\1" _ret "${_ret}") - ELSEIF(_ret MATCHES "^'") - # Single quote - STRING(REGEX REPLACE "'\(.*\)'[ \t\r\n]*$" "\\1" _ret "${_ret}") - ELSE(_ret MATCHES "^\"") - SET(_ret "") - ENDIF(_ret MATCHES "^\"") - - # Unencoding - STRING_UNESCAPE(${var} "${_ret}" ${ARGN}) - ENDMACRO(STRING_UNQUOTE var str) - - MACRO(STRING_JOIN var delimiter str_list) - SET(_ret "") - FOREACH(_str ${str_list}) - IF(_ret STREQUAL "") - SET(_ret "${_str}") - ELSE(_ret STREQUAL "") - SET(_ret "${_ret}${delimiter}${_str}") - ENDIF(_ret STREQUAL "") - ENDFOREACH(_str ${str_list}) - - FOREACH(_str ${ARGN}) - IF(_ret STREQUAL "") - SET(_ret "${_str}") - ELSE(_ret STREQUAL "") - SET(_ret "${_ret}${delimiter}${_str}") - ENDIF(_ret STREQUAL "") - ENDFOREACH(_str ${str_list}) - SET(${var} "${_ret}") - ENDMACRO(STRING_JOIN var delimiter str_list) - - MACRO(STRING_SPLIT var delimiter str) - SET(_max_tokens "") - SET(_NOESCAPE_SEMICOLON "") - SET(_ESCAPE_VARIABLE "") - FOREACH(_arg ${ARGN}) - IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON") - ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE") - SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE") - ELSE(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - SET(_max_tokens ${_arg}) - ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON") - ENDFOREACH(_arg) - - IF(NOT _max_tokens) - SET(_max_tokens -1) - ENDIF(NOT _max_tokens) - - STRING_ESCAPE(_str "${str}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE}) - STRING_ESCAPE(_delimiter "${delimiter}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE}) - - SET(_str_list "") - SET(_token_count 0) - STRING(LENGTH "${_delimiter}" _de_len) - - WHILE(NOT _token_count EQUAL _max_tokens) - MATH(EXPR _token_count ${_token_count}+1) - IF(_token_count EQUAL _max_tokens) - # Last token, no need splitting - SET(_str_list ${_str_list} "${_str}") - ELSE(_token_count EQUAL _max_tokens) - # in case encoded characters are delimiters - STRING(LENGTH "${_str}" _str_len) - SET(_index 0) - SET(_token "") - SET(_str_remain "") - MATH(EXPR _str_end ${_str_len}-${_de_len}+1) - SET(_bound "k") - WHILE(_index LESS _str_end) - STRING(SUBSTRING "${_str}" ${_index} ${_de_len} _str_cursor) - IF(_str_cursor STREQUAL _delimiter) - # Get the token - STRING(SUBSTRING "${_str}" 0 ${_index} _token) - # Get the rest - MATH(EXPR _rest_index ${_index}+${_de_len}) - MATH(EXPR _rest_len ${_str_len}-${_index}-${_de_len}) - STRING(SUBSTRING "${_str}" ${_rest_index} ${_rest_len} _str_remain) - SET(_index ${_str_end}) - ELSE(_str_cursor STREQUAL _delimiter) - MATH(EXPR _index ${_index}+1) - ENDIF(_str_cursor STREQUAL _delimiter) - ENDWHILE(_index LESS _str_end) - - IF(_str_remain STREQUAL "") - # Meaning: end of string - LIST(APPEND _str_list "${_str}") - SET(_max_tokens ${_token_count}) - ELSE(_str_remain STREQUAL "") - LIST(APPEND _str_list "${_token}") - SET(_str "${_str_remain}") - ENDIF(_str_remain STREQUAL "") - ENDIF(_token_count EQUAL _max_tokens) - ENDWHILE(NOT _token_count EQUAL _max_tokens) - - - # Unencoding - STRING_UNESCAPE(${var} "${_str_list}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE}) - ENDMACRO(STRING_SPLIT var delimiter str) - -ENDIF(NOT DEFINED _MANAGE_STRING_CMAKE_) - diff --git a/project/cmake/scripts/common/pathsetup.cmake b/project/cmake/scripts/common/pathsetup.cmake deleted file mode 100644 index 54b352d..0000000 --- a/project/cmake/scripts/common/pathsetup.cmake +++ /dev/null @@ -1,3 +0,0 @@ -# This script configures installation paths - -include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/pathsetup.cmake) diff --git a/project/cmake/scripts/common/prepare-env.cmake b/project/cmake/scripts/common/prepare-env.cmake deleted file mode 100644 index 8e9bd1c..0000000 --- a/project/cmake/scripts/common/prepare-env.cmake +++ /dev/null @@ -1,136 +0,0 @@ -# parse version.txt to get the version info -if(EXISTS "${APP_ROOT}/version.txt") - file(STRINGS "${APP_ROOT}/version.txt" versions) - foreach (version ${versions}) - if(version MATCHES "^VERSION_.*") - string(REGEX MATCH "^[^ ]+" version_name ${version}) - string(REPLACE "${version_name} " "" version_value ${version}) - set(APP_${version_name} "${version_value}") - else() - string(REGEX MATCH "^[^ ]+" name ${version}) - string(REPLACE "${name} " "" value ${version}) - set(${name} "${value}") - endif() - endforeach() - string(TOLOWER ${APP_NAME} APP_NAME_LC) - string(TOUPPER ${APP_NAME} APP_NAME_UC) -endif() - -# bail if we can't parse versions -if(NOT DEFINED APP_VERSION_MAJOR OR NOT DEFINED APP_VERSION_MINOR) - message(FATAL_ERROR "Could not determine app version! make sure that ${APP_ROOT}/version.txt exists") -endif() - -# in case we need to download something, set KODI_MIRROR to the default if not alread set -if(NOT DEFINED KODI_MIRROR) - set(KODI_MIRROR "http://mirrors.kodi.tv") -endif() - -### copy all the addon binding header files to include/kodi -# make sure include/kodi exists and is empty -set(APP_LIB_DIR ${DEPENDS_PATH}/lib/${APP_NAME_LC}) -if(NOT EXISTS "${APP_LIB_DIR}/") - file(MAKE_DIRECTORY ${APP_LIB_DIR}) -endif() - -set(APP_INCLUDE_DIR ${DEPENDS_PATH}/include/${APP_NAME_LC}) -if(NOT EXISTS "${APP_INCLUDE_DIR}/") - file(MAKE_DIRECTORY ${APP_INCLUDE_DIR}) -endif() - -# we still need XBMC_INCLUDE_DIR and XBMC_LIB_DIR for backwards compatibility to xbmc -set(XBMC_LIB_DIR ${DEPENDS_PATH}/lib/xbmc) -if(NOT EXISTS "${XBMC_LIB_DIR}/") - file(MAKE_DIRECTORY ${XBMC_LIB_DIR}) -endif() -set(XBMC_INCLUDE_DIR ${DEPENDS_PATH}/include/xbmc) -if(NOT EXISTS "${XBMC_INCLUDE_DIR}/") - file(MAKE_DIRECTORY ${XBMC_INCLUDE_DIR}) -endif() - -# make sure C++11 is always set -if(NOT WIN32) - string(REGEX MATCH "-std=(gnu|c)\\+\\+11" cxx11flag "${CMAKE_CXX_FLAGS}") - if(NOT cxx11flag) - set(CXX11_SWITCH "-std=c++11") - endif() -endif() - -# generate the proper kodi-config.cmake file -configure_file(${APP_ROOT}/project/cmake/kodi-config.cmake.in ${APP_LIB_DIR}/kodi-config.cmake @ONLY) - -# copy cmake helpers to lib/kodi -file(COPY ${APP_ROOT}/project/cmake/scripts/common/addon-helpers.cmake - ${APP_ROOT}/project/cmake/scripts/common/addoptions.cmake - DESTINATION ${APP_LIB_DIR}) - -# generate xbmc-config.cmake for backwards compatibility to xbmc -configure_file(${APP_ROOT}/project/cmake/xbmc-config.cmake.in ${XBMC_LIB_DIR}/xbmc-config.cmake @ONLY) - -### copy all the addon binding header files to include/kodi -# parse addon-bindings.mk to get the list of header files to copy -file(STRINGS ${APP_ROOT}/xbmc/addons/addon-bindings.mk bindings) -string(REPLACE "\n" ";" bindings "${bindings}") -foreach(binding ${bindings}) - string(REPLACE " =" ";" binding "${binding}") - string(REPLACE "+=" ";" binding "${binding}") - list(GET binding 1 header) - # copy the header file to include/kodi - file(COPY ${APP_ROOT}/${header} DESTINATION ${APP_INCLUDE_DIR}) - - # auto-generate header files for backwards compatibility to xbmc with deprecation warning - # but only do it if the file doesn't already exist - get_filename_component(headerfile ${header} NAME) - if (NOT EXISTS "${XBMC_INCLUDE_DIR}/${headerfile}") - file(WRITE ${XBMC_INCLUDE_DIR}/${headerfile} -"#pragma once -#define DEPRECATION_WARNING \"Including xbmc/${headerfile} has been deprecated, please use kodi/${headerfile}\" -#ifdef _MSC_VER - #pragma message(\"WARNING: \" DEPRECATION_WARNING) -#else - #warning DEPRECATION_WARNING -#endif -#include \"kodi/${headerfile}\"") - endif() -endforeach() - -### on windows we need a "patch" binary to be able to patch 3rd party sources -if(WIN32) - find_program(PATCH_FOUND NAMES patch patch.exe) - if(PATCH_FOUND) - message(STATUS "patch utility found at ${PATCH_FOUND}") - else() - set(PATCH_ARCHIVE_NAME "patch-2.5.9-7-bin-3") - set(PATCH_ARCHIVE "${PATCH_ARCHIVE_NAME}.zip") - set(PATCH_URL "${KODI_MIRROR}/build-deps/win32/${PATCH_ARCHIVE}") - set(PATCH_DOWNLOAD ${BUILD_DIR}/download/${PATCH_ARCHIVE}) - - # download the archive containing patch.exe - message(STATUS "Downloading patch utility from ${PATCH_URL}...") - file(DOWNLOAD "${PATCH_URL}" "${PATCH_DOWNLOAD}" STATUS PATCH_DL_STATUS LOG PATCH_LOG SHOW_PROGRESS) - list(GET PATCH_DL_STATUS 0 PATCH_RETCODE) - if(NOT ${PATCH_RETCODE} EQUAL 0) - message(FATAL_ERROR "ERROR downloading ${PATCH_URL} - status: ${PATCH_DL_STATUS} log: ${PATCH_LOG}") - endif() - - # extract the archive containing patch.exe - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf ${PATCH_DOWNLOAD} - WORKING_DIRECTORY ${BUILD_DIR}) - - # make sure the extraction worked and that patch.exe is there - set(PATCH_PATH ${BUILD_DIR}/${PATCH_ARCHIVE_NAME}) - set(PATCH_BINARY_PATH ${PATCH_PATH}/bin/patch.exe) - if(NOT EXISTS ${PATCH_PATH} OR NOT EXISTS ${PATCH_BINARY_PATH}) - message(FATAL_ERROR "ERROR extracting patch utility from ${PATCH_DOWNLOAD_DIR}") - endif() - - # copy patch.exe into the output directory - file(INSTALL ${PATCH_BINARY_PATH} DESTINATION ${DEPENDS_PATH}/bin) - - # make sure that cmake can find the copied patch.exe - find_program(PATCH_FOUND NAMES patch patch.exe) - if(NOT PATCH_FOUND) - message(FATAL_ERROR "ERROR installing patch utility from ${PATCH_BINARY_PATH} to ${DEPENDS_PATH}/bin") - endif() - endif() -endif() diff --git a/project/cmake/scripts/common/projectmacros.cmake b/project/cmake/scripts/common/projectmacros.cmake deleted file mode 100644 index 7ce4ee9..0000000 --- a/project/cmake/scripts/common/projectmacros.cmake +++ /dev/null @@ -1,87 +0,0 @@ -# This script holds macros which are project specific - -# Pack a skin xbt file -# Arguments: -# input input directory to pack -# output ouput xbt file -# On return: -# xbt is added to ${XBT_FILES} -function(pack_xbt input output) - file(GLOB_RECURSE MEDIA_FILES ${input}/*) - get_filename_component(dir ${output} PATH) - add_custom_command(OUTPUT ${output} - COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} - COMMAND TexturePacker::TexturePacker - ARGS -input ${input} - -output ${output} - -dupecheck - DEPENDS ${MEDIA_FILES}) - list(APPEND XBT_FILES ${output}) - set(XBT_FILES ${XBT_FILES} PARENT_SCOPE) -endfunction() - -# Add a skin to installation list, mirroring it in build tree, packing textures -# Arguments: -# skin skin directory -# relative relative base path in build tree -# On return: -# xbt is added to ${XBT_FILES}, data added to ${install_data}, mirror in build tree -function(copy_skin_to_buildtree skin relative) - file(GLOB_RECURSE FILES ${skin}/*) - file(GLOB_RECURSE MEDIA_FILES ${skin}/media/*) - list(REMOVE_ITEM FILES ${MEDIA_FILES}) - foreach(file ${FILES}) - copy_file_to_buildtree(${file} ${relative}) - endforeach() - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${dest}/media) - string(REPLACE "${relative}/" "" dest ${skin}) - pack_xbt(${skin}/media ${CMAKE_BINARY_DIR}/${dest}/media/Textures.xbt) - - file(GLOB THEMES RELATIVE ${skin}/themes ${skin}/themes/*) - foreach(theme ${THEMES}) - pack_xbt(${skin}/themes/${theme} ${CMAKE_BINARY_DIR}/${dest}/media/${theme}.xbt) - endforeach() - - set(XBT_FILES ${XBT_FILES} PARENT_SCOPE) - set(install_data ${install_data} PARENT_SCOPE) -endfunction() - -# Get GTest tests as CMake tests. -# Copied from FindGTest.cmake -# Thanks to Daniel Blezek for the GTEST_ADD_TESTS code -function(GTEST_ADD_TESTS executable extra_args) - if(NOT ARGN) - message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS") - endif() - foreach(source ${ARGN}) - file(READ "${source}" contents) - string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) - foreach(hit ${found_tests}) - string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit}) - add_test(${test_name} ${executable} --gtest_filter=${test_name} ${extra_args}) - endforeach() - # Groups parametrized tests under a single ctest entry - string(REGEX MATCHALL "INSTANTIATE_TEST_CASE_P\\(([^,]+), *([^,]+)" found_tests2 ${contents}) - foreach(hit ${found_tests2}) - string(SUBSTRING ${hit} 24 -1 test_name) - string(REPLACE "," ";" test_name "${test_name}") - list(GET test_name 0 filter_name) - list(GET test_name 1 test_prefix) - string(STRIP ${test_prefix} test_prefix) - add_test(${test_prefix}.${filter_name} ${executable} --gtest_filter=${filter_name}* ${extra_args}) - endforeach() - endforeach() -endfunction() - -function(whole_archive output) - if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang) - set(${output} -Wl,--whole-archive ${ARGN} -Wl,--no-whole-archive PARENT_SCOPE) - elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) - foreach(library ${ARGN}) - list(APPEND ${output} -Wl,-force_load ${library}) - set(${output} ${${output}} PARENT_SCOPE) - endforeach() - else() - set(${output} ${ARGN} PARENT_SCOPE) - endif() -endfunction() diff --git a/project/cmake/scripts/darwin/archsetup.cmake b/project/cmake/scripts/darwin/archsetup.cmake deleted file mode 100644 index accb8ab..0000000 --- a/project/cmake/scripts/darwin/archsetup.cmake +++ /dev/null @@ -1,34 +0,0 @@ -if(NOT CMAKE_TOOLCHAIN_FILE) - message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for darwin. See ${PROJECT_SOURCE_DIR}/README.md") -endif() - -set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp - ${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/SDLMain.mm - ${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/SDLMain.h) - -set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX) -set(SYSTEM_DEFINES -D_REENTRANT -D_FILE_DEFINED -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE - -D__STDC_CONSTANT_MACROS) -set(PLATFORM_DIR linux) -set(CMAKE_SYSTEM_NAME Darwin) -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CPU STREQUAL x86_64) - set(ARCH x86_64-apple-darwin) - elseif(CPU STREQUAL i386) - set(ARCH i386-apple-darwin) - else() - message(SEND_ERROR "Unknown CPU: ${CPU}") - endif() -endif() - -find_package(CXX11 REQUIRED) - -list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${NATIVEPREFIX}) - -list(APPEND DEPLIBS "-framework DiskArbitration" "-framework IOKit" - "-framework IOSurface" "-framework SystemConfiguration" - "-framework ApplicationServices" "-framework AppKit" - "-framework CoreAudio" "-framework AudioToolbox" - "-framework CoreGraphics") diff --git a/project/cmake/scripts/darwin/install.cmake b/project/cmake/scripts/darwin/install.cmake deleted file mode 100644 index e69de29..0000000 diff --git a/project/cmake/scripts/darwin/macros.cmake b/project/cmake/scripts/darwin/macros.cmake deleted file mode 100644 index 4ee17c2..0000000 --- a/project/cmake/scripts/darwin/macros.cmake +++ /dev/null @@ -1,108 +0,0 @@ -function(core_link_library lib wraplib) - if(CMAKE_GENERATOR MATCHES "Unix Makefiles") - set(wrapper_obj cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) - elseif(CMAKE_GENERATOR MATCHES "Xcode") - set(wrapper_obj cores/dll-loader/exports/kodi.build/$(CONFIGURATION)/wrapper.build/Objects-$(CURRENT_VARIANT)/$(CURRENT_ARCH)/wrapper.o) - else() - message(FATAL_ERROR "Unsupported generator in core_link_library") - endif() - - set(export -bundle -undefined dynamic_lookup -read_only_relocs suppress - -Wl,-alias_list,${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def - ${CORE_BUILD_DIR}/${wrapper_obj}) - set(check_arg "") - if(TARGET ${lib}) - set(target ${lib}) - set(link_lib $) - set(check_arg ${ARGV2}) - set(data_arg ${ARGV3}) - else() - set(target ${ARGV2}) - set(link_lib ${lib}) - set(check_arg ${ARGV3}) - set(data_arg ${ARGV4}) - endif() - if(check_arg STREQUAL export) - set(export ${export} - -Wl,--version-script=${ARGV3}) - elseif(check_arg STREQUAL nowrap) - set(export ${data_arg}) - elseif(check_arg STREQUAL extras) - foreach(arg ${data_arg}) - list(APPEND export ${arg}) - endforeach() - endif() - get_filename_component(dir ${wraplib} PATH) - - # We can't simply pass the linker flags to the args section of the custom command - # because cmake will add quotes around it (and the linker will fail due to those). - # We need to do this handstand first ... - separate_arguments(CUSTOM_COMMAND_ARGS_LDFLAGS UNIX_COMMAND "${CMAKE_SHARED_LINKER_FLAGS}") - - add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} - COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} - COMMAND ${CMAKE_C_COMPILER} - ARGS ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} - -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} - DEPENDS ${target} wrapper.def wrapper - VERBATIM) - - # Uncomment to create wrap_ targets for debugging - #get_filename_component(libname ${wraplib} NAME_WE) - #add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) - - list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) - set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE) -endfunction() - -function(find_soname lib) - cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN}) - - string(TOLOWER ${lib} liblow) - if(${lib}_LDFLAGS) - set(link_lib "${${lib}_LDFLAGS}") - else() - set(link_lib "${${lib}_LIBRARIES}") - endif() - - execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs - COMMAND fgrep libraries: - COMMAND sed "s/[^=]*=\\(.*\\)/\\1/" - COMMAND sed "s/:/ /g" - ERROR_QUIET - OUTPUT_VARIABLE cc_lib_path - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND echo ${link_lib} - COMMAND sed "s/-L[ ]*//g" - COMMAND sed "s/-l[^ ]*//g" - ERROR_QUIET - OUTPUT_VARIABLE env_lib_path - OUTPUT_STRIP_TRAILING_WHITESPACE) - - foreach(path ${cc_lib_path} ${env_lib_path}) - if(IS_DIRECTORY ${path}) - execute_process(COMMAND ls -- ${path}/lib${liblow}.dylib - ERROR_QUIET - OUTPUT_VARIABLE lib_file - OUTPUT_STRIP_TRAILING_WHITESPACE) - else() - set(lib_file ${path}) - endif() - if(lib_file) - # we want the path/name that is embedded in the dylib - execute_process(COMMAND otool -L ${lib_file} - COMMAND grep -v lib${liblow}.dylib - COMMAND grep ${liblow} - COMMAND awk "{V=1; print $V}" - ERROR_QUIET - OUTPUT_VARIABLE filename - OUTPUT_STRIP_TRAILING_WHITESPACE) - get_filename_component(${lib}_SONAME "${filename}" NAME) - message(STATUS "${lib} soname: ${${lib}_SONAME}") - endif() - endforeach() - if(arg_REQUIRED AND NOT ${lib}_SONAME) - message(FATAL_ERROR "Could not find dynamically loadable library ${lib}") - endif() - set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE) -endfunction() diff --git a/project/cmake/scripts/darwin/pathsetup.cmake b/project/cmake/scripts/darwin/pathsetup.cmake deleted file mode 100644 index 071dfd4..0000000 --- a/project/cmake/scripts/darwin/pathsetup.cmake +++ /dev/null @@ -1,32 +0,0 @@ -if(NOT prefix) - set(prefix ${DEPENDS_PATH}) -endif() -if(NOT exec_prefix) - set(exec_prefix ${prefix}) -endif() -if(NOT libdir) - set(libdir ${prefix}/lib) -endif() -if(NOT bindir) - set(bindir ${prefix}/bin) -endif() -if(NOT includedir) - set(includedir ${prefix}/include) -endif() -if(NOT datarootdir) - set(datarootdir ${prefix}/share) -endif() -if(NOT datadir) - set(datadir ${datarootdir}) -endif() - -list(APPEND final_message "-- PATH config --") -list(APPEND final_message "Prefix: ${prefix}") -list(APPEND final_message "Libdir: ${libdir}") -list(APPEND final_message "Bindir: ${bindir}") -list(APPEND final_message "Includedir: ${includedir}") -list(APPEND final_message "Datarootdir: ${datarootdir}") -list(APPEND final_message "Datadir: ${datadir}") - -set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" - -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/freebsd/ArchSetup.cmake b/project/cmake/scripts/freebsd/ArchSetup.cmake new file mode 100644 index 0000000..013205c --- /dev/null +++ b/project/cmake/scripts/freebsd/ArchSetup.cmake @@ -0,0 +1,16 @@ +set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_FREEBSD) +set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED + -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) +set(PLATFORM_DIR linux) +set(SYSTEM_LDFLAGS -L/usr/local/lib) +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(ARCH x86_64-freebsd) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i.86") + set(ARCH x86-freebsd) + else() + message(WARNING "unknown CPU: ${CPU}") + endif() +endif() diff --git a/project/cmake/scripts/freebsd/Install.cmake b/project/cmake/scripts/freebsd/Install.cmake new file mode 120000 index 0000000..28ce012 --- /dev/null +++ b/project/cmake/scripts/freebsd/Install.cmake @@ -0,0 +1 @@ +../linux/Install.cmake \ No newline at end of file diff --git a/project/cmake/scripts/freebsd/Macros.cmake b/project/cmake/scripts/freebsd/Macros.cmake new file mode 120000 index 0000000..2fdbb25 --- /dev/null +++ b/project/cmake/scripts/freebsd/Macros.cmake @@ -0,0 +1 @@ +../linux/Macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/freebsd/PathSetup.cmake b/project/cmake/scripts/freebsd/PathSetup.cmake new file mode 120000 index 0000000..6786c1c --- /dev/null +++ b/project/cmake/scripts/freebsd/PathSetup.cmake @@ -0,0 +1 @@ +../linux/PathSetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/freebsd/archsetup.cmake b/project/cmake/scripts/freebsd/archsetup.cmake deleted file mode 100644 index b85121f..0000000 --- a/project/cmake/scripts/freebsd/archsetup.cmake +++ /dev/null @@ -1,19 +0,0 @@ -set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_FREEBSD) -set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED - -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) -set(PLATFORM_DIR linux) -set(SYSTEM_LDFLAGS -L/usr/local/lib) -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) - set(ARCH x86_64-freebsd) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i.86") - set(ARCH x86-freebsd) - else() - message(WARNING "unknown CPU: ${CPU}") - endif() -endif() - -set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use") -set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE}) diff --git a/project/cmake/scripts/freebsd/install.cmake b/project/cmake/scripts/freebsd/install.cmake deleted file mode 100644 index 8247416..0000000 --- a/project/cmake/scripts/freebsd/install.cmake +++ /dev/null @@ -1,60 +0,0 @@ -set(libdir ${CMAKE_INSTALL_PREFIX}/lib) -set(bindir ${CMAKE_INSTALL_PREFIX}/bin) - -configure_file(${CORE_SOURCE_DIR}/tools/Linux/xbmc.sh.in - ${CORE_BUILD_DIR}/scripts/xbmc @ONLY) -configure_file(${CORE_SOURCE_DIR}/tools/Linux/xbmc-standalone.sh.in - ${CORE_BUILD_DIR}/scripts/xbmc-standalone @ONLY) - -install(TARGETS xbmc-xrandr DESTINATION lib/xbmc) -install(FILES ${addon_bindings} DESTINATION include/xbmc) -install(FILES ${cmake_files} ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/modules/xbmc-config.cmake - DESTINATION lib/xbmc) -install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/xbmc - ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/xbmc-standalone - DESTINATION bin) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/FEH.py - DESTINATION share/xbmc) - -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/xbmc-xsession.desktop - RENAME XBMC.desktop - DESTINATION share/xsessions) - -install(FILES ${CORE_SOURCE_DIR}/copying.txt - ${CORE_SOURCE_DIR}/LICENSE.GPL - ${CORE_SOURCE_DIR}/version.txt - ${CORE_SOURCE_DIR}/docs/README.freebsd - DESTINATION share/doc/xbmc) - -foreach(texture ${XBT_FILES}) - string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture}) - get_filename_component(dir ${dir} PATH) - install(FILES ${texture} - DESTINATION share/xbmc/${dir}) -endforeach() - -foreach(wraplib ${WRAP_FILES}) - get_filename_component(dir ${wraplib} PATH) - install(PROGRAMS ${CMAKE_BINARY_DIR}/${wraplib} - DESTINATION lib/xbmc/${dir}) -endforeach() - -foreach(file ${install_data}) - get_filename_component(dir ${file} PATH) - install(FILES ${CMAKE_BINARY_DIR}/${file} - DESTINATION share/xbmc/${dir}) -endforeach() - -install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs) - foreach(dir \${dirs}) - file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*) - foreach(file \${FILES}) - get_filename_component(dir \${file} PATH) - file(INSTALL \${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/xbmc/\${dir}) - endforeach() - endforeach()") -foreach(subdir ${build_dirs}) - string(REPLACE " " ";" subdir ${subdir}) - list(GET subdir 0 id) - install(CODE "execute_process(COMMAND make -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install)") -endforeach() diff --git a/project/cmake/scripts/freebsd/macros.cmake b/project/cmake/scripts/freebsd/macros.cmake deleted file mode 100644 index f0bf7ba..0000000 --- a/project/cmake/scripts/freebsd/macros.cmake +++ /dev/null @@ -1 +0,0 @@ -include(../linux/macros.cmake) diff --git a/project/cmake/scripts/freebsd/pathsetup.cmake b/project/cmake/scripts/freebsd/pathsetup.cmake deleted file mode 100644 index 1fb45b6..0000000 --- a/project/cmake/scripts/freebsd/pathsetup.cmake +++ /dev/null @@ -1 +0,0 @@ -include(${PROJECT_SOURCE_DIR}/scripts/linux/pathsetup.cmake) diff --git a/project/cmake/scripts/ios/ArchSetup.cmake b/project/cmake/scripts/ios/ArchSetup.cmake new file mode 100644 index 0000000..56661e2 --- /dev/null +++ b/project/cmake/scripts/ios/ArchSetup.cmake @@ -0,0 +1,36 @@ +if(NOT CMAKE_TOOLCHAIN_FILE) + message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for ios. See ${PROJECT_SOURCE_DIR}/README.md") +endif() + +set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/XBMCApplication.m) + +set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_IOS) +set(SYSTEM_DEFINES -D_REENTRANT -D_FILE_DEFINED -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE + -D__STDC_CONSTANT_MACROS) +set(PLATFORM_DIR linux) +set(CMAKE_SYSTEM_NAME Darwin) +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CPU STREQUAL armv7 OR CPU STREQUAL arm64) + set(ARCH arm-osx) + set(NEON False) + else() + message(SEND_ERROR "Unknown CPU: ${CPU}") + endif() +endif() + +find_package(CXX11 REQUIRED) + +list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${NATIVEPREFIX}) + +list(APPEND DEPLIBS "-framework CoreFoundation" "-framework CoreVideo" + "-framework CoreAudio" "-framework AudioToolbox" + "-framework QuartzCore" "-framework MediaPlayer" + "-framework CFNetwork" "-framework CoreGraphics" + "-framework Foundation" "-framework UIKit" + "-framework CoreMedia" "-framework AVFoundation" + "-framework VideoToolbox") + +set(ENABLE_DVDCSS OFF CACHE BOOL "" FORCE) +set(ENABLE_OPTICAL OFF CACHE BOOL "" FORCE) diff --git a/project/cmake/scripts/ios/Install.cmake b/project/cmake/scripts/ios/Install.cmake new file mode 100644 index 0000000..052565f --- /dev/null +++ b/project/cmake/scripts/ios/Install.cmake @@ -0,0 +1,74 @@ +# IOS packaging + +set(PACKAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build/${CORE_BUILD_CONFIG}-iphoneos) + +file(MAKE_DIRECTORY ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app) +set(BUNDLE_RESOURCES xbmc/platform/darwin/ios/Default-568h@2x.png + xbmc/platform/darwin/ios/Default-667h@2x.png + xbmc/platform/darwin/ios/Default-736h@3x.png + xbmc/platform/darwin/ios/Default-Landscape-736h@3x.png + tools/darwin/packaging/media/ios/rounded/AppIcon29x29.png + tools/darwin/packaging/media/ios/rounded/AppIcon29x29@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon40x40.png + tools/darwin/packaging/media/ios/rounded/AppIcon40x40@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon50x50.png + tools/darwin/packaging/media/ios/rounded/AppIcon50x50@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon57x57.png + tools/darwin/packaging/media/ios/rounded/AppIcon57x57@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon60x60.png + tools/darwin/packaging/media/ios/rounded/AppIcon60x60@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon72x72.png + tools/darwin/packaging/media/ios/rounded/AppIcon72x72@2x.png + tools/darwin/packaging/media/ios/rounded/AppIcon76x76.png + tools/darwin/packaging/media/ios/rounded/AppIcon76x76@2x.png) + +foreach(resource IN LISTS BUNDLE_RESOURCES) + configure_file(${CORE_SOURCE_DIR}/${resource} ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app COPYONLY) +endforeach() +configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/English.lproj/InfoPlist.strings + ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/English.lproj/InfoPlist.strings COPYONLY) + +configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/Info.plist.in + ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/Info.plist @ONLY) + +add_custom_target(bundle + COMMAND ${CMAKE_COMMAND} -E copy $ ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/${APP_NAME}.bin + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/DllPaths_generated.h + ${CMAKE_BINARY_DIR}/xbmc/DllPaths_generated.h + COMMAND "ACTION=build" + "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}" + "TARGET_NAME=${APP_NAME}.app" + "APP_NAME=${APP_NAME}" + "PRODUCT_NAME=${APP_NAME}" + "WRAPPER_EXTENSION=app" + "SRCROOT=${CMAKE_BINARY_DIR}" + ${CORE_SOURCE_DIR}/tools/darwin/Support/CopyRootFiles-ios.command + COMMAND "XBMC_DEPENDS=${DEPENDS_PATH}" + "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}" + "TARGET_NAME=${APP_NAME}.app" + "APP_NAME=${APP_NAME}" + "PRODUCT_NAME=${APP_NAME}" + "FULL_PRODUCT_NAME=${APP_NAME}.app" + "WRAPPER_EXTENSION=app" + "SRCROOT=${CMAKE_BINARY_DIR}" + ${CORE_SOURCE_DIR}/tools/darwin/Support/copyframeworks-ios.command) +add_dependencies(bundle ${APP_NAME_LC}) + +set(DEPENDS_ROOT_FOR_XCODE ${NATIVEPREFIX}/..) +configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/ios/mkdeb-ios.sh.in + ${CMAKE_BINARY_DIR}/tools/darwin/packaging/ios/mkdeb-ios.sh @ONLY) +configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/migrate_to_kodi_ios.sh.in + ${CMAKE_BINARY_DIR}/tools/darwin/packaging/migrate_to_kodi_ios.sh @ONLY) + +add_custom_target(deb + COMMAND "XBMC_DEPENDS_ROOT=${NATIVEPREFIX}/.." + "PLATFORM_NAME=${PLATFORM}" + "CODESIGNING_FOLDER_PATH=${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app" + "BUILT_PRODUCTS_DIR=${PACKAGE_OUTPUT_DIR}" + "WRAPPER_NAME=${APP_NAME}.app" + "APP_NAME=${APP_NAME}" + "CODE_SIGN_IDENTITY=\"\"" + ${CORE_SOURCE_DIR}/tools/darwin/Support/Codesign.command + COMMAND sh ./mkdeb-ios.sh ${CORE_BUILD_CONFIG} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/darwin/packaging/ios) +add_dependencies(deb bundle) diff --git a/project/cmake/scripts/ios/Macros.cmake b/project/cmake/scripts/ios/Macros.cmake new file mode 120000 index 0000000..54c1b28 --- /dev/null +++ b/project/cmake/scripts/ios/Macros.cmake @@ -0,0 +1 @@ +../osx/Macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/ios/PathSetup.cmake b/project/cmake/scripts/ios/PathSetup.cmake new file mode 120000 index 0000000..d7f25b2 --- /dev/null +++ b/project/cmake/scripts/ios/PathSetup.cmake @@ -0,0 +1 @@ +../osx/PathSetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/ios/archsetup.cmake b/project/cmake/scripts/ios/archsetup.cmake deleted file mode 100644 index e6639f7..0000000 --- a/project/cmake/scripts/ios/archsetup.cmake +++ /dev/null @@ -1,38 +0,0 @@ -if(NOT CMAKE_TOOLCHAIN_FILE) - message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for ios. See ${PROJECT_SOURCE_DIR}/README.md") -endif() - -set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/XBMCApplication.m) - -set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_IOS) -set(SYSTEM_DEFINES -D_REENTRANT -D_FILE_DEFINED -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE - -D__STDC_CONSTANT_MACROS) -set(PLATFORM_DIR linux) -set(CMAKE_SYSTEM_NAME Darwin) -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CPU STREQUAL armv7) - set(ARCH arm-apple-darwin) - elseif(CPU STREQUAL arm64) - set(ARCH arm-apple-darwin) - else() - message(SEND_ERROR "Unknown CPU: ${CPU}") - endif() -endif() - -find_package(CXX11 REQUIRED) - -list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${NATIVEPREFIX}) - -list(APPEND DEPLIBS "-framework CoreFoundation" "-framework CoreVideo" - "-framework CoreAudio" "-framework AudioToolbox" - "-framework QuartzCore" "-framework MediaPlayer" - "-framework CFNetwork" "-framework CoreGraphics" - "-framework Foundation" "-framework UIKit" - "-framework CoreMedia" "-framework AVFoundation") - -set(ENABLE_DVDCSS OFF) -set(ENABLE_OPTICAL OFF) -set(ENABLE_VTB ON) -set(VTB_FOUND 1 CACHE INTERNAL "VTB") diff --git a/project/cmake/scripts/ios/install.cmake b/project/cmake/scripts/ios/install.cmake deleted file mode 120000 index 0ea6586..0000000 --- a/project/cmake/scripts/ios/install.cmake +++ /dev/null @@ -1 +0,0 @@ -../darwin/install.cmake \ No newline at end of file diff --git a/project/cmake/scripts/ios/macros.cmake b/project/cmake/scripts/ios/macros.cmake deleted file mode 120000 index 45c7ad1..0000000 --- a/project/cmake/scripts/ios/macros.cmake +++ /dev/null @@ -1 +0,0 @@ -../darwin/macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/ios/pathsetup.cmake b/project/cmake/scripts/ios/pathsetup.cmake deleted file mode 120000 index f8e1248..0000000 --- a/project/cmake/scripts/ios/pathsetup.cmake +++ /dev/null @@ -1 +0,0 @@ -../darwin/pathsetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/linux/ArchSetup.cmake b/project/cmake/scripts/linux/ArchSetup.cmake new file mode 100644 index 0000000..cae0bb8 --- /dev/null +++ b/project/cmake/scripts/linux/ArchSetup.cmake @@ -0,0 +1,41 @@ +set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_LINUX) +set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED + -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) +set(PLATFORM_DIR linux) +set(CMAKE_SYSTEM_NAME Linux) +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CPU STREQUAL x86_64) + set(ARCH x86_64-linux) + set(NEON False) + elseif(CPU MATCHES "i.86") + set(ARCH i486-linux) + set(NEON False) + add_options(CXX ALL_BUILDS "-msse") + elseif(CPU MATCHES arm) + set(ARCH arm) + set(NEON True) + elseif(CPU MATCHES aarch64 OR CPU MATCHES arm64) + set(ARCH aarch64) + set(NEON False) + else() + message(SEND_ERROR "Unknown CPU: ${CPU}") + endif() +endif() + +# Make sure we strip binaries in Release build +if(CMAKE_BUILD_TYPE STREQUAL Release AND CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") +endif() + +find_package(CXX11 REQUIRED) +include(LDGOLD) + +# Code Coverage +if(CMAKE_BUILD_TYPE STREQUAL Coverage) + set(COVERAGE_TEST_BINARY ${APP_NAME_LC}-test) + set(COVERAGE_SOURCE_DIR ${CORE_SOURCE_DIR}) + set(COVERAGE_DEPENDS "\${APP_NAME_LC}" "\${APP_NAME_LC}-test") + set(COVERAGE_EXCLUDES */test/* lib/* */lib/*) +endif() diff --git a/project/cmake/scripts/linux/CodeCoverage.cmake b/project/cmake/scripts/linux/CodeCoverage.cmake new file mode 100644 index 0000000..efc2208 --- /dev/null +++ b/project/cmake/scripts/linux/CodeCoverage.cmake @@ -0,0 +1,97 @@ +# - CodeCoverage +# Generate code coverage reports with LCOV and GCovr. +# +# Configuration: +# COVERAGE_SOURCE_DIR - Source root directory (default ${CMAKE_SOURCE_DIR}). +# COVERAGE_BINARY_DIR - Directory where the coverage reports (and intermediate files) +# are generated to. +# COVERAGE_EXCLUDES - List of exclude patterns (for example '*/tests/*'). +# +# The following targets will be generated: +# coverage - Builds an html report. Requires LCOV. +# coverage_xml - Builds an xml report (in Cobertura format for Jenkins). +# Requires Gcovr. +# +# Inspired by https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake + +# Comiler and linker setup +set(CMAKE_C_FLAGS_COVERAGE "-g -O0 --coverage" CACHE STRING + "Flags used by the C compiler during coverage builds." FORCE) +set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 --coverage" CACHE STRING + "Flags used by the C++ compiler during coverage builds." FORCE) +set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "--coverage" CACHE STRING + "Flags used for linking binaries during coverage builds." FORCE) +set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "--coverage" CACHE STRING + "Flags used by the shared libraries linker during coverage builds." FORCE) +mark_as_advanced( + CMAKE_C_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE + CMAKE_SHARED_LINKER_FLAGS_COVERAGE CMAKE_STATIC_LINKER_FLAGS_COVERAGE +) + +find_program(LCOV_EXECUTABLE lcov) +find_program(GENINFO_EXECUTABLE geninfo) +find_program(GENHTML_EXECUTABLE genhtml) +find_program(GCOVR_EXECUTABLE gcovr) +mark_as_advanced(LCOV_EXECUTABLE GENINFO_EXECUTABLE GENHTML_EXECUTABLE GCOVR_EXECUTABLE) + +# Default options +if(NOT COVERAGE_SOURCE_DIR) + set(COVERAGE_SOURCE_DIR ${CMAKE_SOURCE_DIR}) +endif() +if(NOT COVERAGE_BINARY_DIR) + set(COVERAGE_BINARY_DIR ${CMAKE_BINARY_DIR}/coverage) +endif() +if(NOT COVERAGE_EXCLUDES) + set(COVERAGE_EXCLUDES) +endif() + +# Allow variables in COVERAGE_DEPENDS that are not evaluated before this file is included. +string(CONFIGURE "${COVERAGE_DEPENDS}" COVERAGE_DEPENDS) + +# Add coverage target that generates an HTML report using LCOV +if(LCOV_EXECUTABLE AND GENINFO_EXECUTABLE AND GENHTML_EXECUTABLE) + file(MAKE_DIRECTORY ${COVERAGE_BINARY_DIR}) + add_custom_target(coverage + COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_BINARY_DIR} + COMMAND ${LCOV_EXECUTABLE} -z -q -d ${CMAKE_BINARY_DIR} + COMMAND ${LCOV_EXECUTABLE} -c -q -i -d ${CMAKE_BINARY_DIR} -b ${COVERAGE_SOURCE_DIR} + -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_base.info + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test || true + COMMAND ${LCOV_EXECUTABLE} -c -q -d ${CMAKE_BINARY_DIR} -b ${COVERAGE_SOURCE_DIR} + -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_test.info + COMMAND ${LCOV_EXECUTABLE} -a ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_base.info + -a ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_test.info + -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info -q + COMMAND ${LCOV_EXECUTABLE} -q -r ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info + /usr/include/* ${CMAKE_BINARY_DIR}/* ${COVERAGE_EXCLUDES} + -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info + COMMAND ${GENHTML_EXECUTABLE} ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info + -o ${COVERAGE_BINARY_DIR}/html -s --legend --highlight --demangle-cpp + COMMAND ${CMAKE_COMMAND} -E echo "Coverage report: file://${COVERAGE_BINARY_DIR}/html/index.html" + WORKING_DIRECTORY ${COVERAGE_BINARY_DIR} + VERBATIM + DEPENDS ${COVERAGE_DEPENDS} + COMMENT "Generate code coverage html report" + ) +else() + message(WARNING "Target coverage not available (lcov, geninfo and genhtml needed).") +endif() + +# Add coverage target that generates an XML report using Gcovr +if(GCOVR_EXECUTABLE) + file(MAKE_DIRECTORY ${COVERAGE_BINARY_DIR}) + string(REGEX REPLACE "([^;]+)" "--exclude=\"\\1\"" _gcovr_excludes "${COVERAGE_EXCLUDES}") + string(REPLACE "*" ".*" _gcovr_excludes "${_gcovr_excludes}") + add_custom_target(coverage_xml + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test || true + COMMAND ${GCOVR_EXECUTABLE} -x -r ${COVERAGE_SOURCE_DIR} -o ${COVERAGE_BINARY_DIR}/coverage.xml + --object-directory ${CMAKE_BINARY_DIR} ${_gcovr_excludes} ${CMAKE_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E echo "Coverage report: file://${COVERAGE_BINARY_DIR}/coverage.xml" + WORKING_DIRECTORY ${COVERAGE_BINARY_DIR} + DEPENDS ${COVERAGE_DEPENDS} + COMMENT "Generate code coverage xml report" + ) + unset(_gcovr_excludes) +else() + message(WARNING "Target coverage_xml not available (gcovr needed).") +endif() diff --git a/project/cmake/scripts/linux/ExtraTargets.cmake b/project/cmake/scripts/linux/ExtraTargets.cmake new file mode 100644 index 0000000..2bb5f6f --- /dev/null +++ b/project/cmake/scripts/linux/ExtraTargets.cmake @@ -0,0 +1,12 @@ +# xrandr +if(ENABLE_X11 AND X_FOUND AND XRANDR_FOUND) + find_package(X QUIET) + find_package(XRandR QUIET) + add_executable(${APP_NAME_LC}-xrandr ${CORE_SOURCE_DIR}/xbmc-xrandr.c) + target_link_libraries(${APP_NAME_LC}-xrandr ${SYSTEM_LDFLAGS} ${X_LIBRARIES} m ${XRANDR_LIBRARIES}) +endif() + +# WiiRemote +if(ENABLE_EVENTCLIENTS) + add_subdirectory(${CORE_SOURCE_DIR}/tools/EventClients/Clients/WiiRemote build/WiiRemote) +endif() diff --git a/project/cmake/scripts/linux/Install.cmake b/project/cmake/scripts/linux/Install.cmake new file mode 100644 index 0000000..5458707 --- /dev/null +++ b/project/cmake/scripts/linux/Install.cmake @@ -0,0 +1,355 @@ +if(X_FOUND) + set(USE_X11 1) +else() + set(USE_X11 0) +endif() +if(OPENGL_FOUND) + set(USE_OPENGL 1) +else() + set(USE_OPENGL 0) +endif() +if(OPENGLES_FOUND) + set(USE_OPENGLES 1) +else() + set(USE_OPENGLES 0) +endif() + +# CMake config +set(APP_PREFIX ${prefix}) +set(APP_LIB_DIR ${libdir}/${APP_NAME_LC}) +set(APP_DATA_DIR ${datarootdir}/${APP_NAME_LC}) +set(APP_INCLUDE_DIR ${includedir}/${APP_NAME_LC}) +set(CXX11_SWITCH "-std=c++11") + +# Set XBMC_STANDALONE_SH_PULSE so we can insert PulseAudio block into kodi-standalone +if(EXISTS ${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse) + if(ENABLE_PULSEAUDIO AND PULSEAUDIO_FOUND) + file(READ "${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse" pulse_content) + set(XBMC_STANDALONE_SH_PULSE ${pulse_content}) + endif() +endif() + +# Configure startup scripts +configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi.sh.in + ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} @ONLY) +configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.in + ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone @ONLY) + +# Configure cmake files +configure_file(${PROJECT_SOURCE_DIR}/KodiConfig.cmake.in + ${CORE_BUILD_DIR}/scripts/${APP_NAME}Config.cmake @ONLY) + +# Configure xsession entry +configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-xsession.desktop.in + ${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop @ONLY) + +# Install app +install(TARGETS ${APP_NAME_LC} + DESTINATION ${libdir}/${APP_NAME_LC} + COMPONENT kodi-bin) +if(ENABLE_X11 AND XRANDR_FOUND) + install(TARGETS ${APP_NAME_LC}-xrandr + DESTINATION ${libdir}/${APP_NAME_LC} + COMPONENT kodi-bin) +endif() + +# Install scripts +install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} + ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone + DESTINATION ${bindir} + COMPONENT kodi-bin) + +# Install libraries +foreach(library ${LIBRARY_FILES}) + get_filename_component(dir ${library} DIRECTORY) + string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${dir}) + install(PROGRAMS ${library} + DESTINATION ${libdir}/${APP_NAME_LC}/${dir} + COMPONENT kodi-bin) +endforeach() + +# Install add-ons, fonts, icons, keyboard maps, keymaps, etc +# (addons, media, system, userdata folders in share/kodi/) +foreach(file ${install_data}) + get_filename_component(dir ${file} DIRECTORY) + install(FILES ${CMAKE_BINARY_DIR}/${file} + DESTINATION ${datarootdir}/${APP_NAME_LC}/${dir} + COMPONENT kodi) +endforeach() + +# Install xsession entry +install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop + DESTINATION ${datarootdir}/xsessions + COMPONENT kodi) + +# Install desktop entry +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/kodi.desktop + DESTINATION ${datarootdir}/applications + COMPONENT kodi) + +# Install icons +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon16x16.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/16x16/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon22x22.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/22x22/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon24x24.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/24x24/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon32x32.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/32x32/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon48x48.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/48x48/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon64x64.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/64x64/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon128x128.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/128x128/apps + COMPONENT kodi) +install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon256x256.png + RENAME ${APP_NAME_LC}.png + DESTINATION ${datarootdir}/icons/hicolor/256x256/apps + COMPONENT kodi) +install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -q -t + $ENV{DESTDIR}${datarootdir}/icons/hicolor ERROR_QUIET)" + COMPONENT kodi) + +# Install docs +install(FILES ${CORE_SOURCE_DIR}/copying.txt + ${CORE_SOURCE_DIR}/LICENSE.GPL + ${CORE_SOURCE_DIR}/version.txt + ${CORE_SOURCE_DIR}/docs/README.linux + DESTINATION ${datarootdir}/doc/${APP_NAME_LC} + COMPONENT kodi) + +install(FILES ${CORE_SOURCE_DIR}/privacy-policy.txt + DESTINATION ${datarootdir}/${APP_NAME_LC} + COMPONENT kodi) + +# Install kodi-tools-texturepacker +install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/texturepacker/TexturePacker + DESTINATION ${bindir} + COMPONENT kodi-tools-texturepacker) + +# Install kodi-addon-dev headers +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_utils.hpp + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_audioengine.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_inputstream.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_peripheral.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_addon.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_codec.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_pvr.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_cpp_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_codec_types.h + ${CORE_SOURCE_DIR}/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxPacket.h + ${CORE_SOURCE_DIR}/xbmc/filesystem/IFileTypes.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-addon-dev) + +# Install kodi-addon-dev add-on bindings +install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME}Config.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddonHelpers.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddOptions.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/ArchSetup.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckCommits.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckTargetPlatform.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/GenerateVersionedFiles.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/GeneratorSetup.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/HandleDepends.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/PrepareEnv.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/common/ProjectMacros.cmake + ${CORE_SOURCE_DIR}/project/cmake/scripts/linux/PathSetup.cmake + DESTINATION ${datarootdir}/${APP_NAME_LC}/cmake + COMPONENT kodi-addon-dev) + +# Install kodi-audio-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/cores/AudioEngine/Utils/AEChannelData.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_adsp_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_adsp_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audiodec_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audiodec_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_audioenc_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_audioenc_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audioengine_types.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-audio-dev) + +if(ENABLE_EVENTCLIENTS) + # Install kodi-eventclients-common BT python files + install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/__init__.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/bt.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/hid.py + DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/bt + COMPONENT kodi-eventclients-common) + + # Install kodi-eventclients-common PS3 python files + install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/__init__.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/keymaps.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixaxis.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixpair.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixwatch.py + DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/ps3 + COMPONENT kodi-eventclients-common) + + # Install kodi-eventclients-common python files + file(WRITE ${CMAKE_BINARY_DIR}/packages/deb/defs.py ICON_PATH="usr/share/pixmaps/${APP_NAME_LC}/") + install(PROGRAMS ${CMAKE_BINARY_DIR}/packages/deb/defs.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/__init__.py + "${CORE_SOURCE_DIR}/tools/EventClients/Clients/PS3 BD Remote/ps3_remote.py" + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/xbmcclient.py + ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/zeroconf.py + DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC} + COMPONENT kodi-eventclients-common) + + # Install kodi-eventclients-common icons + install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/icons/bluetooth.png + ${CORE_SOURCE_DIR}/tools/EventClients/icons/phone.png + ${CORE_SOURCE_DIR}/tools/EventClients/icons/mail.png + ${CORE_SOURCE_DIR}/tools/EventClients/icons/mouse.png + DESTINATION ${datarootdir}/pixmaps/${APP_NAME_LC} + COMPONENT kodi-eventclients-common) + + # Install kodi-eventclients-dev headers + install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/lib/c++/xbmcclient.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-eventclients-dev) + + # Install kodi-eventclients-dev C# examples + install(FILES "${CORE_SOURCE_DIR}/tools/EventClients/examples/c#/XBMCDemoClient1.cs" + DESTINATION "${docdir}/${APP_NAME_LC}-eventclients-dev/examples/C#" + COMPONENT kodi-eventclients-dev) + + # Install kodi-eventclients-dev C++ examples + install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_notification.cpp + ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_log.cpp + ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_button1.cpp + ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_mouse.cpp + ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_button2.cpp + DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/C++ + COMPONENT kodi-eventclients-dev) + + # Install kodi-eventclients-dev java examples + install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/examples/java/XBMCDemoClient1.java + DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/java + COMPONENT kodi-eventclients-dev) + + # Install kodi-eventclients-dev python examples + install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_mouse.py + ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_button1.py + ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_notification.py + ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_action.py + ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_button2.py + ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_simple.py + DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/python + COMPONENT kodi-eventclients-dev) + + # Install kodi-eventclients-ps3 + install(PROGRAMS "${CORE_SOURCE_DIR}/tools/EventClients/Clients/PS3 BD Remote/ps3_remote.py" + RENAME ${APP_NAME_LC}-ps3remote + DESTINATION ${bindir} + COMPONENT kodi-eventclients-ps3) + + # Install kodi-eventclients-wiiremote + install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/WiiRemote/${APP_NAME_LC}-wiiremote + DESTINATION ${bindir} + COMPONENT kodi-eventclients-wiiremote) + + # Install kodi-eventclients-xbmc-send + install(PROGRAMS "${CORE_SOURCE_DIR}/tools/EventClients/Clients/Kodi Send/kodi-send.py" + RENAME ${APP_NAME_LC}-send + DESTINATION ${bindir} + COMPONENT kodi-eventclients-xbmc-send) +endif() + +# Install kodi-inputstream-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_inputstream_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_inputstream_types.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-inputstream-dev) + +# Install kodi-pvr-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-pvr-dev) + +# Install kodi-screensaver-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_scr_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_scr_types.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-screensaver-dev) + +# Install kodi-visualization-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_vis_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_vis_types.h + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-visualization-dev) + +# Install kodi-peripheral-dev +install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_callbacks.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_dll.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_types.h + ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp + DESTINATION ${includedir}/${APP_NAME_LC} + COMPONENT kodi-peripheral-dev) + +# Install XBT skin files +foreach(texture ${XBT_FILES}) + string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture}) + get_filename_component(dir ${dir} DIRECTORY) + install(FILES ${texture} + DESTINATION ${datarootdir}/${APP_NAME_LC}/${dir} + COMPONENT kodi) +endforeach() + +# Install extra stuff if it exists +if(EXISTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs) + install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs) + foreach(dir \${dirs}) + file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*) + foreach(file \${FILES}) + get_filename_component(dir \${file} DIRECTORY) + file(INSTALL \${file} DESTINATION ${datarootdir}/${APP_NAME_LC}/\${dir}) + endforeach() + endforeach()") +endif() + +if(NOT "$ENV{DESTDIR}" STREQUAL "") + set(DESTDIR ${CMAKE_BINARY_DIR}/$ENV{DESTDIR}) +endif() +foreach(subdir ${build_dirs}) + if(NOT subdir MATCHES kodi-platform) + string(REPLACE " " ";" subdir ${subdir}) + list(GET subdir 0 id) + install(CODE "execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install DESTDIR=${DESTDIR})") + endif() +endforeach() + +# generate packages? yes please, if everything checks out +if(CPACK_GENERATOR) + if(CPACK_GENERATOR STREQUAL DEB AND CORE_SYSTEM_NAME STREQUAL linux) + if(CMAKE_BUILD_TYPE STREQUAL Debug) + message(STATUS "DEB Generator: Build type is set to 'Debug'. Packaged binaries will be unstripped.") + endif() + include(${PROJECT_SOURCE_DIR}/cpack/CPackConfigDEB.cmake) + else() + message(FATAL_ERROR "DEB Generator: Can't configure CPack to generate Debian packages on non-linux systems.") + endif() +endif() diff --git a/project/cmake/scripts/linux/Macros.cmake b/project/cmake/scripts/linux/Macros.cmake new file mode 100644 index 0000000..72e9d5c --- /dev/null +++ b/project/cmake/scripts/linux/Macros.cmake @@ -0,0 +1,95 @@ +function(core_link_library lib wraplib) + set(export -Wl,--unresolved-symbols=ignore-all + `cat ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def` + ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) + set(check_arg "") + if(TARGET ${lib}) + set(target ${lib}) + set(link_lib $) + set(check_arg ${ARGV2}) + set(data_arg ${ARGV3}) + else() + set(target ${ARGV2}) + set(link_lib ${lib}) + set(check_arg ${ARGV3}) + set(data_arg ${ARGV4}) + endif() + + # wrapper has to be adapted in order to support coverage. + if(CMAKE_BUILD_TYPE STREQUAL Coverage) + set(export "") + endif() + + if(check_arg STREQUAL export) + set(export ${export} + -Wl,--version-script=${ARGV3}) + elseif(check_arg STREQUAL extras) + foreach(arg ${data_arg}) + list(APPEND export ${arg}) + endforeach() + elseif(check_arg STREQUAL archives) + set(extra_libs ${data_arg}) + endif() + + string(REGEX REPLACE "[ ]+" ";" _flags ${CMAKE_SHARED_LINKER_FLAGS}) + get_filename_component(dir ${wraplib} DIRECTORY) + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} + COMMAND ${CMAKE_C_COMPILER} + ARGS ${_flags} -Wl,--whole-archive + "${link_lib}" ${extra_libs} + -Wl,--no-whole-archive -lm + -Wl,-soname,${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} + -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} + ${export} + DEPENDS ${target} wrapper.def wrapper) + + get_filename_component(libname ${wraplib} NAME_WE) + add_custom_target(wrap_${libname} ALL DEPENDS ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) + set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped) + add_dependencies(${APP_NAME_LC}-libraries wrap_${libname}) + + set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} CACHE STRING "" FORCE) +endfunction() + +function(find_soname lib) + cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN}) + + string(TOLOWER ${lib} liblow) + if(${lib}_LDFLAGS) + set(link_lib "${${lib}_LDFLAGS}") + else() + if(IS_ABSOLUTE "${${lib}_LIBRARIES}") + set(link_lib "${${lib}_LIBRARIES}") + else() + set(link_lib -l${${lib}_LIBRARIES}) + endif() + endif() + execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-M ${link_lib} + COMMAND grep LOAD.*${liblow} + ERROR_QUIET + OUTPUT_VARIABLE ${lib}_FILENAME) + string(REPLACE "LOAD " "" ${lib}_FILENAME "${${lib}_FILENAME}") + string(STRIP "${${lib}_FILENAME}" ${lib}_FILENAME) + if(NOT ${lib}_FILENAME) + execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-t ${link_lib} + OUTPUT_QUIET + ERROR_VARIABLE _TMP_FILENAME) + string(REGEX MATCH ".*lib${liblow}.so" ${lib}_FILENAME ${_TMP_FILENAME}) + endif() + if(${lib}_FILENAME) + execute_process(COMMAND objdump -p ${${lib}_FILENAME} + COMMAND grep SONAME.*${liblow} + ERROR_QUIET + OUTPUT_VARIABLE ${lib}_SONAME) + string(REPLACE "SONAME " "" ${lib}_SONAME ${${lib}_SONAME}) + string(STRIP ${${lib}_SONAME} ${lib}_SONAME) + if(VERBOSE) + message(STATUS "${lib} soname: ${${lib}_SONAME}") + endif() + set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE) + endif() + if(arg_REQUIRED AND NOT ${lib}_SONAME) + message(FATAL_ERROR "Could not find dynamically loadable library ${lib}") + endif() +endfunction() diff --git a/project/cmake/scripts/linux/PathSetup.cmake b/project/cmake/scripts/linux/PathSetup.cmake new file mode 100644 index 0000000..f69711e --- /dev/null +++ b/project/cmake/scripts/linux/PathSetup.cmake @@ -0,0 +1,39 @@ +include(GNUInstallDirs) + +if(NOT prefix) + set(prefix ${CMAKE_INSTALL_PREFIX}) +else() + set(CMAKE_INSTALL_PREFIX ${prefix}) +endif() +if(NOT exec_prefix) + set(exec_prefix ${prefix}) +endif() +if(NOT libdir) + set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) +endif() +if(NOT bindir) + set(bindir ${CMAKE_INSTALL_FULL_BINDIR}) +endif() +if(NOT includedir) + set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +endif() +if(NOT datarootdir) + set(datarootdir ${CMAKE_INSTALL_FULL_DATAROOTDIR}) +endif() +if(NOT datadir) + set(datadir ${CMAKE_INSTALL_FULL_DATADIR}) +endif() +if(NOT docdir) + set(docdir ${CMAKE_INSTALL_FULL_DOCDIR}) +endif() + +list(APPEND final_message "-- PATH config --") +list(APPEND final_message "Prefix: ${prefix}") +list(APPEND final_message "Libdir: ${libdir}") +list(APPEND final_message "Bindir: ${bindir}") +list(APPEND final_message "Includedir: ${includedir}") +list(APPEND final_message "Datarootdir: ${datarootdir}") +list(APPEND final_message "Datadir: ${datadir}") + +set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" + -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/linux/archsetup.cmake b/project/cmake/scripts/linux/archsetup.cmake deleted file mode 100644 index e193768..0000000 --- a/project/cmake/scripts/linux/archsetup.cmake +++ /dev/null @@ -1,21 +0,0 @@ -set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_LINUX) -set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED - -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) -set(PLATFORM_DIR linux) -set(CMAKE_SYSTEM_NAME Linux) -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CPU STREQUAL x86_64) - set(ARCH x86_64-linux) - elseif(CPU MATCHES "i.86") - set(ARCH i486-linux) - else() - message(SEND_ERROR "Unknown CPU: ${CPU}") - endif() -endif() - -find_package(CXX11 REQUIRED) - -set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use") -set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE}) diff --git a/project/cmake/scripts/linux/install.cmake b/project/cmake/scripts/linux/install.cmake deleted file mode 100644 index 962a816..0000000 --- a/project/cmake/scripts/linux/install.cmake +++ /dev/null @@ -1,146 +0,0 @@ -if(X_FOUND) - set(USE_X11 1) -else() - set(USE_X11 0) -endif() -if(OPENGL_FOUND) - set(USE_OPENGL 1) -else() - set(USE_OPENGL 0) -endif() -if(OPENGLES_FOUND) - set(USE_OPENGLES 1) -else() - set(USE_OPENGLES 0) -endif() - -configure_file(${CORE_SOURCE_DIR}/project/cmake/${APP_NAME_LC}-config.cmake.in - ${CORE_BUILD_DIR}/${APP_NAME_LC}-config.cmake @ONLY) - -configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi.sh.in - ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} @ONLY) - -# Set XBMC_STANDALONE_SH_PULSE so we can insert PulseAudio block into kodi-standalone -if(EXISTS ${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse) - if(ENABLE_PULSEAUDIO AND PULSEAUDIO_FOUND) - file(READ "${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse" pulse_content) - set(XBMC_STANDALONE_SH_PULSE ${pulse_content}) - endif() -endif() - -configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.in - ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone @ONLY) - -install(TARGETS ${APP_NAME_LC} DESTINATION ${libdir}/kodi) -if(ENABLE_X11 AND XRANDR_FOUND) - install(TARGETS ${APP_NAME_LC}-xrandr DESTINATION ${libdir}/${APP_NAME_LC}) -endif() - -if(NOT EXISTS ${libdir}/xbmc) -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${libdir})") -endif() -install(FILES ${addon_bindings} DESTINATION ${includedir}/kodi) -if(NOT EXISTS ${includedir}/xbmc) -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${includedir})") -endif() - -install(FILES ${cmake_files} - DESTINATION ${libdir}/kodi) -install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}-config.cmake - DESTINATION ${libdir}/${APP_NAME_LC}) -install(FILES ${CORE_SOURCE_DIR}/project/cmake/xbmc-config.cmake.in - RENAME xbmc-config.cmake - DESTINATION ${libdir}/${APP_NAME_LC}) - -install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} - ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone - DESTINATION ${bindir}) -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC} xbmc WORKING_DIRECTORY ${bindir})") -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}-standalone xbmc-standalone WORKING_DIRECTORY ${bindir})") - -configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-xsession.desktop.in - ${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop) -install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop - DESTINATION ${datarootdir}/xsessions) -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}.desktop xbmc.desktop WORKING_DIRECTORY ${datarootdir}/xsessions/)") - -if(NOT EXISTS ${datarootdir}/xbmc) -install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${datarootdir})") -endif() - -install(FILES ${CORE_SOURCE_DIR}/copying.txt - ${CORE_SOURCE_DIR}/LICENSE.GPL - ${CORE_SOURCE_DIR}/version.txt - ${CORE_SOURCE_DIR}/docs/README.linux - DESTINATION ${datarootdir}/doc/kodi) - -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/kodi.desktop - DESTINATION ${datarootdir}/applications) - -foreach(texture ${XBT_FILES}) - string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture}) - get_filename_component(dir ${dir} PATH) - install(FILES ${texture} - DESTINATION ${datarootdir}/kodi/${dir}) -endforeach() - -foreach(wraplib ${WRAP_FILES}) - get_filename_component(dir ${wraplib} PATH) - install(PROGRAMS ${CMAKE_BINARY_DIR}/${wraplib} - DESTINATION ${libdir}/kodi/${dir}) -endforeach() - -foreach(file ${install_data}) - get_filename_component(dir ${file} PATH) - install(FILES ${CMAKE_BINARY_DIR}/${file} - DESTINATION ${datarootdir}/kodi/${dir}) -endforeach() - -if(EXISTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs) - install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs) - foreach(dir \${dirs}) - file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*) - foreach(file \${FILES}) - get_filename_component(dir \${file} PATH) - file(INSTALL \${file} DESTINATION ${datarootdir}/kodi/\${dir}) - endforeach() - endforeach()") -endif() - -if(NOT "$ENV{DESTDIR}" STREQUAL "") - set(DESTDIR ${CMAKE_BINARY_DIR}/$ENV{DESTDIR}) -endif() -foreach(subdir ${build_dirs}) - if(NOT subdir MATCHES kodi-platform) - string(REPLACE " " ";" subdir ${subdir}) - list(GET subdir 0 id) - install(CODE "execute_process(COMMAND make -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install DESTDIR=${DESTDIR})") - endif() -endforeach() - -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon16x16.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/16x16/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon22x22.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/22x22/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon24x24.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/24x24/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon32x32.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/32x32/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon48x48.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/48x48/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon64x64.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/64x64/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon128x128.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/128x128/apps) -install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon256x256.png - RENAME ${APP_NAME_LC}.png - DESTINATION ${datarootdir}/icons/hicolor/256x256/apps) - -install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -q -t $ENV{DESTDIR}${datarootdir}/icons/hicolor ERROR_QUIET)") diff --git a/project/cmake/scripts/linux/macros.cmake b/project/cmake/scripts/linux/macros.cmake deleted file mode 100644 index 7453a1c..0000000 --- a/project/cmake/scripts/linux/macros.cmake +++ /dev/null @@ -1,79 +0,0 @@ -function(core_link_library lib wraplib) - set(export -Wl,--unresolved-symbols=ignore-all - `cat ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def` - ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) - set(check_arg "") - if(TARGET ${lib}) - set(target ${lib}) - set(link_lib ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${lib}/${lib}.a) - set(check_arg ${ARGV2}) - set(data_arg ${ARGV3}) - else() - set(target ${ARGV2}) - set(link_lib ${lib}) - set(check_arg ${ARGV3}) - set(data_arg ${ARGV4}) - endif() - if(check_arg STREQUAL export) - set(export ${export} - -Wl,--version-script=${ARGV3}) - elseif(check_arg STREQUAL nowrap) - set(export ${data_arg}) - elseif(check_arg STREQUAL extras) - foreach(arg ${data_arg}) - list(APPEND export ${arg}) - endforeach() - endif() - get_filename_component(dir ${wraplib} PATH) - add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} - COMMAND cmake -E make_directory ${dir} - COMMAND ${CMAKE_C_COMPILER} - ARGS -Wl,--whole-archive - ${link_lib} - -Wl,--no-whole-archive -lm - -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} - ${export} - DEPENDS ${target} wrapper.def wrapper) - list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) - set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE) -endfunction() - -function(find_soname lib) - cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN}) - - string(TOLOWER ${lib} liblow) - if(${lib}_LDFLAGS) - set(link_lib "${${lib}_LDFLAGS}") - else() - if(IS_ABSOLUTE "${${lib}_LIBRARIES}") - set(link_lib "${${lib}_LIBRARIES}") - else() - set(link_lib -l${${lib}_LIBRARIES}) - endif() - endif() - execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-M ${link_lib} - COMMAND grep LOAD.*${liblow} - ERROR_QUIET - OUTPUT_VARIABLE ${lib}_FILENAME) - string(REPLACE "LOAD " "" ${lib}_FILENAME "${${lib}_FILENAME}") - string(STRIP "${${lib}_FILENAME}" ${lib}_FILENAME) - if(NOT ${lib}_FILENAME) - execute_process(COMMAND ${CMAKE_C_COMPILER} -nostdlib -o /dev/null -Wl,-t ${link_lib} - OUTPUT_QUIET - ERROR_VARIABLE _TMP_FILENAME) - string(REGEX MATCH ".*lib${liblow}.so" ${lib}_FILENAME ${_TMP_FILENAME}) - endif() - if(${lib}_FILENAME) - execute_process(COMMAND objdump -p ${${lib}_FILENAME} - COMMAND grep SONAME.*${liblow} - ERROR_QUIET - OUTPUT_VARIABLE ${lib}_SONAME) - string(REPLACE "SONAME " "" ${lib}_SONAME ${${lib}_SONAME}) - string(STRIP ${${lib}_SONAME} ${lib}_SONAME) - message(STATUS "${lib} soname: ${${lib}_SONAME}") - set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE) - endif() - if(arg_REQUIRED AND NOT ${lib}_SONAME) - message(FATAL_ERROR "Could not find dynamically loadable library ${lib}") - endif() -endfunction() diff --git a/project/cmake/scripts/linux/pathsetup.cmake b/project/cmake/scripts/linux/pathsetup.cmake deleted file mode 100644 index 8550616..0000000 --- a/project/cmake/scripts/linux/pathsetup.cmake +++ /dev/null @@ -1,34 +0,0 @@ -if(NOT prefix) - set(prefix ${CMAKE_INSTALL_PREFIX}) -else() - set(CMAKE_INSTALL_PREFIX ${prefix}) -endif() -if(NOT exec_prefix) - set(exec_prefix ${prefix}) -endif() -if(NOT libdir) - set(libdir ${prefix}/lib) -endif() -if(NOT bindir) - set(bindir ${prefix}/bin) -endif() -if(NOT includedir) - set(includedir ${prefix}/include) -endif() -if(NOT datarootdir) - set(datarootdir ${prefix}/share) -endif() -if(NOT datadir) - set(datadir ${datarootdir}) -endif() - -list(APPEND final_message "-- PATH config --") -list(APPEND final_message "Prefix: ${prefix}") -list(APPEND final_message "Libdir: ${libdir}") -list(APPEND final_message "Bindir: ${bindir}") -list(APPEND final_message "Includedir: ${includedir}") -list(APPEND final_message "Datarootdir: ${datarootdir}") -list(APPEND final_message "Datadir: ${datadir}") - -set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" - -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/osx/ArchSetup.cmake b/project/cmake/scripts/osx/ArchSetup.cmake new file mode 100644 index 0000000..3047863 --- /dev/null +++ b/project/cmake/scripts/osx/ArchSetup.cmake @@ -0,0 +1,34 @@ +if(NOT CMAKE_TOOLCHAIN_FILE) + message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for osx. See ${PROJECT_SOURCE_DIR}/README.md") +endif() + +set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp + ${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/SDLMain.mm + ${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/SDLMain.h) + +set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX) +set(SYSTEM_DEFINES -D_REENTRANT -D_FILE_DEFINED -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE + -D__STDC_CONSTANT_MACROS) +set(PLATFORM_DIR linux) +set(CMAKE_SYSTEM_NAME Darwin) +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CPU STREQUAL x86_64 OR CPU STREQUAL i386) + set(ARCH x86-osx) + set(NEON False) + else() + message(SEND_ERROR "Unknown CPU: ${CPU}") + endif() +endif() + +find_package(CXX11 REQUIRED) + +list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${NATIVEPREFIX}) + +list(APPEND DEPLIBS "-framework DiskArbitration" "-framework IOKit" + "-framework IOSurface" "-framework SystemConfiguration" + "-framework ApplicationServices" "-framework AppKit" + "-framework CoreAudio" "-framework AudioToolbox" + "-framework CoreGraphics" "-framework CoreMedia" + "-framework VideoToolbox") diff --git a/project/cmake/scripts/osx/ExtraTargets.cmake b/project/cmake/scripts/osx/ExtraTargets.cmake new file mode 100644 index 0000000..ed9c089 --- /dev/null +++ b/project/cmake/scripts/osx/ExtraTargets.cmake @@ -0,0 +1,3 @@ +# XBMCHelper +add_subdirectory(${CORE_SOURCE_DIR}/tools/EventClients/Clients/OSXRemote build/XBMCHelper) +add_dependencies(${APP_NAME_LC} XBMCHelper) diff --git a/project/cmake/scripts/osx/Install.cmake b/project/cmake/scripts/osx/Install.cmake new file mode 100644 index 0000000..3924ccf --- /dev/null +++ b/project/cmake/scripts/osx/Install.cmake @@ -0,0 +1,40 @@ +# OSX packaging + +set(PACKAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build/${CORE_BUILD_CONFIG}) + +configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/Info.plist.in + ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist @ONLY) +execute_process(COMMAND perl -p -i -e "s/r####/${APP_SCMID}/" ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist) + +add_custom_target(bundle + COMMAND ${CMAKE_COMMAND} -E copy $ ${PACKAGE_OUTPUT_DIR}/${APP_NAME} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/DllPaths_generated.h + ${CMAKE_BINARY_DIR}/xbmc/DllPaths_generated.h + COMMAND "ACTION=build" + "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}" + "TARGET_NAME=${APP_NAME}.app" + "APP_NAME=${APP_NAME}" + "SRCROOT=${CMAKE_BINARY_DIR}" + ${CORE_SOURCE_DIR}/tools/darwin/Support/CopyRootFiles-osx.command + COMMAND "XBMC_DEPENDS=${DEPENDS_PATH}" + "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}" + "TARGET_NAME=${APP_NAME}.app" + "APP_NAME=${APP_NAME}" + "FULL_PRODUCT_NAME=${APP_NAME}.app" + "SRCROOT=${CMAKE_BINARY_DIR}" + ${CORE_SOURCE_DIR}/tools/darwin/Support/copyframeworks-osx.command) +set_target_properties(bundle PROPERTIES FOLDER "Build Utilities") +add_dependencies(bundle ${APP_NAME_LC}) + +configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh.in + ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh @ONLY) + +add_custom_target(dmg + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/darwin/packaging/osx/ + ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/darwin/packaging/media/osx/ + ${CMAKE_BINARY_DIR}/tools/darwin/packaging/media/osx/ + COMMAND ./mkdmg-osx.sh ${CORE_BUILD_CONFIG} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx) +set_target_properties(dmg PROPERTIES FOLDER "Build Utilities") +add_dependencies(dmg bundle) diff --git a/project/cmake/scripts/osx/Macros.cmake b/project/cmake/scripts/osx/Macros.cmake new file mode 100644 index 0000000..0d04439 --- /dev/null +++ b/project/cmake/scripts/osx/Macros.cmake @@ -0,0 +1,111 @@ +function(core_link_library lib wraplib) + if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL Ninja) + set(wrapper_obj cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) + elseif(CMAKE_GENERATOR MATCHES "Xcode") + set(wrapper_obj cores/dll-loader/exports/kodi.build/$(CONFIGURATION)/wrapper.build/Objects-$(CURRENT_VARIANT)/$(CURRENT_ARCH)/wrapper.o) + else() + message(FATAL_ERROR "Unsupported generator in core_link_library") + endif() + + set(export -bundle -undefined dynamic_lookup -read_only_relocs suppress + -Wl,-alias_list,${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def + ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${wrapper_obj}) + set(extension ${CMAKE_SHARED_MODULE_SUFFIX}) + set(check_arg "") + if(TARGET ${lib}) + set(target ${lib}) + set(link_lib $) + set(check_arg ${ARGV2}) + set(data_arg ${ARGV3}) + else() + set(target ${ARGV2}) + set(link_lib ${lib}) + set(check_arg ${ARGV3}) + set(data_arg ${ARGV4}) + endif() + if(check_arg STREQUAL export) + set(export ${export} + -Wl,--version-script=${ARGV3}) + elseif(check_arg STREQUAL extras) + foreach(arg ${data_arg}) + list(APPEND export ${arg}) + endforeach() + elseif(check_arg STREQUAL archives) + set(extra_libs ${data_arg}) + endif() + get_filename_component(dir ${wraplib} DIRECTORY) + + # We can't simply pass the linker flags to the args section of the custom command + # because cmake will add quotes around it (and the linker will fail due to those). + # We need to do this handstand first ... + string(REPLACE " " ";" CUSTOM_COMMAND_ARGS_LDFLAGS ${CMAKE_SHARED_LINKER_FLAGS}) + + add_custom_command(OUTPUT ${wraplib}-${ARCH}${extension} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} + COMMAND ${CMAKE_C_COMPILER} + ARGS ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} ${extra_libs} + -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension} + DEPENDS ${target} wrapper.def wrapper + VERBATIM) + + get_filename_component(libname ${wraplib} NAME_WE) + add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${extension}) + set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped) + add_dependencies(${APP_NAME_LC}-libraries wrap_${libname}) + + set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension} CACHE STRING "" FORCE) +endfunction() + +function(find_soname lib) + cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN}) + + string(TOLOWER ${lib} liblow) + if(${lib}_LDFLAGS) + set(link_lib "${${lib}_LDFLAGS}") + else() + set(link_lib "${${lib}_LIBRARIES}") + endif() + + execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs + COMMAND fgrep libraries: + COMMAND sed "s/[^=]*=\\(.*\\)/\\1/" + COMMAND sed "s/:/ /g" + ERROR_QUIET + OUTPUT_VARIABLE cc_lib_path + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND echo ${link_lib} + COMMAND sed "s/-L[ ]*//g" + COMMAND sed "s/-l[^ ]*//g" + ERROR_QUIET + OUTPUT_VARIABLE env_lib_path + OUTPUT_STRIP_TRAILING_WHITESPACE) + + foreach(path ${cc_lib_path} ${env_lib_path}) + if(IS_DIRECTORY ${path}) + execute_process(COMMAND ls -- ${path}/lib${liblow}.dylib + ERROR_QUIET + OUTPUT_VARIABLE lib_file + OUTPUT_STRIP_TRAILING_WHITESPACE) + else() + set(lib_file ${path}) + endif() + if(lib_file) + # we want the path/name that is embedded in the dylib + execute_process(COMMAND otool -L ${lib_file} + COMMAND grep -v lib${liblow}.dylib + COMMAND grep ${liblow} + COMMAND awk "{V=1; print $V}" + ERROR_QUIET + OUTPUT_VARIABLE filename + OUTPUT_STRIP_TRAILING_WHITESPACE) + get_filename_component(${lib}_SONAME "${filename}" NAME) + if(VERBOSE) + message(STATUS "${lib} soname: ${${lib}_SONAME}") + endif() + endif() + endforeach() + if(arg_REQUIRED AND NOT ${lib}_SONAME) + message(FATAL_ERROR "Could not find dynamically loadable library ${lib}") + endif() + set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE) +endfunction() diff --git a/project/cmake/scripts/osx/PathSetup.cmake b/project/cmake/scripts/osx/PathSetup.cmake new file mode 100644 index 0000000..071dfd4 --- /dev/null +++ b/project/cmake/scripts/osx/PathSetup.cmake @@ -0,0 +1,32 @@ +if(NOT prefix) + set(prefix ${DEPENDS_PATH}) +endif() +if(NOT exec_prefix) + set(exec_prefix ${prefix}) +endif() +if(NOT libdir) + set(libdir ${prefix}/lib) +endif() +if(NOT bindir) + set(bindir ${prefix}/bin) +endif() +if(NOT includedir) + set(includedir ${prefix}/include) +endif() +if(NOT datarootdir) + set(datarootdir ${prefix}/share) +endif() +if(NOT datadir) + set(datadir ${datarootdir}) +endif() + +list(APPEND final_message "-- PATH config --") +list(APPEND final_message "Prefix: ${prefix}") +list(APPEND final_message "Libdir: ${libdir}") +list(APPEND final_message "Bindir: ${bindir}") +list(APPEND final_message "Includedir: ${includedir}") +list(APPEND final_message "Datarootdir: ${datarootdir}") +list(APPEND final_message "Datadir: ${datadir}") + +set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" + -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/rbpi/ArchSetup.cmake b/project/cmake/scripts/rbpi/ArchSetup.cmake new file mode 100644 index 0000000..fa1f9f4 --- /dev/null +++ b/project/cmake/scripts/rbpi/ArchSetup.cmake @@ -0,0 +1,28 @@ +set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI + -DHAS_OMXPLAYER -DHAVE_OMXLIB) +set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED + -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) +set(PLATFORM_DIR linux) + +string(REGEX REPLACE "[ ]+" ";" SYSTEM_LDFLAGS $ENV{LDFLAGS}) +set(CMAKE_SYSTEM_NAME Linux) + +if(WITH_ARCH) + set(ARCH ${WITH_ARCH}) +else() + if(CPU STREQUAL arm1176jzf-s) + set(ARCH arm-linux-gnueabihf) + set(NEON False) + elseif(CPU MATCHES "cortex-a7" OR CPU MATCHES "cortex-a53") + set(ARCH arm-linux-gnueabihf) + set(NEON True) + else() + message(SEND_ERROR "Unknown CPU: ${CPU}") + endif() +endif() + +find_package(CXX11 REQUIRED) + +set(MMAL_FOUND 1 CACHE INTERNAL "MMAL") +set(OMX_FOUND 1 CACHE INTERNAL "OMX") +set(OMXLIB_FOUND 1 CACHE INTERNAL "OMX") diff --git a/project/cmake/scripts/rbpi/Install.cmake b/project/cmake/scripts/rbpi/Install.cmake new file mode 120000 index 0000000..28ce012 --- /dev/null +++ b/project/cmake/scripts/rbpi/Install.cmake @@ -0,0 +1 @@ +../linux/Install.cmake \ No newline at end of file diff --git a/project/cmake/scripts/rbpi/Macros.cmake b/project/cmake/scripts/rbpi/Macros.cmake new file mode 120000 index 0000000..2fdbb25 --- /dev/null +++ b/project/cmake/scripts/rbpi/Macros.cmake @@ -0,0 +1 @@ +../linux/Macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/rbpi/PathSetup.cmake b/project/cmake/scripts/rbpi/PathSetup.cmake new file mode 120000 index 0000000..6786c1c --- /dev/null +++ b/project/cmake/scripts/rbpi/PathSetup.cmake @@ -0,0 +1 @@ +../linux/PathSetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/rbpi/archsetup.cmake b/project/cmake/scripts/rbpi/archsetup.cmake deleted file mode 100644 index 72a610f..0000000 --- a/project/cmake/scripts/rbpi/archsetup.cmake +++ /dev/null @@ -1,32 +0,0 @@ -if(NOT CMAKE_TOOLCHAIN_FILE) - message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for rbpi. See ${PROJECT_SOURCE_DIR}/README.md") -endif() - -set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI - -DHAS_OMXPLAYER -DHAVE_OMXLIB) -set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED - -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64) -set(PLATFORM_DIR linux) - -string(REGEX REPLACE "[ ]+" ";" SYSTEM_LDFLAGS $ENV{LDFLAGS}) -set(CMAKE_SYSTEM_NAME Linux) - -if(WITH_ARCH) - set(ARCH ${WITH_ARCH}) -else() - if(CPU STREQUAL arm1176jzf-s) - set(ARCH arm-linux-gnueabihf) - elseif(CPU MATCHES "cortex-a7") - set(ARCH arm-linux-gnueabihf) - else() - message(SEND_ERROR "Unknown CPU: ${CPU}") - endif() -endif() - -find_package(CXX11 REQUIRED) - -set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use") -set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE}) -set(MMAL_FOUND 1 CACHE INTERNAL "MMAL") -set(OMX_FOUND 1 CACHE INTERNAL "OMX") -set(OMXLIB_FOUND 1 CACHE INTERNAL "OMX") diff --git a/project/cmake/scripts/rbpi/install.cmake b/project/cmake/scripts/rbpi/install.cmake deleted file mode 120000 index 0409981..0000000 --- a/project/cmake/scripts/rbpi/install.cmake +++ /dev/null @@ -1 +0,0 @@ -../linux/install.cmake \ No newline at end of file diff --git a/project/cmake/scripts/rbpi/macros.cmake b/project/cmake/scripts/rbpi/macros.cmake deleted file mode 120000 index 28c77ca..0000000 --- a/project/cmake/scripts/rbpi/macros.cmake +++ /dev/null @@ -1 +0,0 @@ -../linux/macros.cmake \ No newline at end of file diff --git a/project/cmake/scripts/rbpi/pathsetup.cmake b/project/cmake/scripts/rbpi/pathsetup.cmake deleted file mode 120000 index 26d7f17..0000000 --- a/project/cmake/scripts/rbpi/pathsetup.cmake +++ /dev/null @@ -1 +0,0 @@ -../linux/pathsetup.cmake \ No newline at end of file diff --git a/project/cmake/scripts/windows/ArchSetup.cmake b/project/cmake/scripts/windows/ArchSetup.cmake new file mode 100644 index 0000000..431b641 --- /dev/null +++ b/project/cmake/scripts/windows/ArchSetup.cmake @@ -0,0 +1,89 @@ +# -------- Architecture settings --------- + +set(ARCH win32) + + +# -------- Paths (mainly for find_package) --------- + +set(PLATFORM_DIR platform/win32) + +# Precompiled headers fail with per target output directory. (needs CMake 3.1) +set(PRECOMPILEDHEADER_DIR ${PROJECT_BINARY_DIR}/${CORE_BUILD_CONFIG}/objs) + +set(CMAKE_SYSTEM_NAME Windows) +list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32) +list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg) +list(APPEND CMAKE_SYSTEM_LIBRARY_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin) +list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../BuildDependencies) + +set(PYTHON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../BuildDependencies/include/python) + + +# -------- Compiler options --------- + +add_options(CXX ALL_BUILDS "/wd\"4996\"") +set(ARCH_DEFINES -D_WINDOWS -DTARGET_WINDOWS) +set(SYSTEM_DEFINES -DNOMINMAX -D_USE_32BIT_TIME_T -DHAS_DX -D__STDC_CONSTANT_MACROS + -DTAGLIB_STATIC -DNPT_CONFIG_ENABLE_LOGGING + -DPLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi" + -DPLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi" + $<$:-DD3D_DEBUG_INFO -D_ITERATOR_DEBUG_LEVEL=0>) + +# Make sure /FS is set for Visual Studio in order to prevent simultanious access to pdb files. +if(CMAKE_GENERATOR MATCHES "Visual Studio") + set(CMAKE_CXX_FLAGS "/MP /FS ${CMAKE_CXX_FLAGS}") +endif() + +# Google Test needs to use shared version of runtime libraries +set(gtest_force_shared_crt ON CACHE STRING "" FORCE) + + +# -------- Linker options --------- + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") + +# For #pragma comment(lib X) +# TODO: It would certainly be better to handle these libraries via CMake modules. +link_directories(${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin + ${PROJECT_SOURCE_DIR}/../BuildDependencies/lib) + +# Additional libraries +list(APPEND DEPLIBS d3d11.lib DInput8.lib DSound.lib winmm.lib Mpr.lib Iphlpapi.lib + PowrProf.lib setupapi.lib dwmapi.lib yajl.lib dxguid.lib DelayImp.lib) + +# NODEFAULTLIB option +set(_nodefaultlibs_RELEASE libcmt) +set(_nodefaultlibs_DEBUG libcmt msvcrt) +foreach(_lib ${_nodefaultlibs_RELEASE}) + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:\"${_lib}\"") +endforeach() +foreach(_lib ${_nodefaultlibs_DEBUG}) + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:\"${_lib}\"") +endforeach() + +# DELAYLOAD option +set(_delayloadlibs zlib.dll libmysql.dll libxslt.dll dnssd.dll dwmapi.dll ssh.dll sqlite3.dll + avcodec-57.dll avfilter-6.dll avformat-57.dll avutil-55.dll + postproc-54.dll swresample-2.dll swscale-4.dll d3dcompiler_47.dll) +foreach(_lib ${_delayloadlibs}) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DELAYLOAD:\"${_lib}\"") +endforeach() + +# Make the Release version create a PDB +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") +# Minimize the size or the resulting DLLs +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF") + + +# -------- Visual Studio options --------- + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + + # Generate a batch file that opens Visual Studio with the necessary env variables set. + file(WRITE ${CMAKE_BINARY_DIR}/kodi-sln.bat + "@echo off\n" + "set KODI_HOME=%~dp0\n" + "set PATH=%~dp0\\system\n" + "start %~dp0\\${PROJECT_NAME}.sln") +endif() diff --git a/project/cmake/scripts/windows/CFlagOverrides.cmake b/project/cmake/scripts/windows/CFlagOverrides.cmake new file mode 100644 index 0000000..3158e75 --- /dev/null +++ b/project/cmake/scripts/windows/CFlagOverrides.cmake @@ -0,0 +1,5 @@ +if(MSVC) + set(CMAKE_C_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /Zi /arch:SSE2") + set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") + set(CMAKE_C_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") +endif() diff --git a/project/cmake/scripts/windows/CXXFlagOverrides.cmake b/project/cmake/scripts/windows/CXXFlagOverrides.cmake new file mode 100644 index 0000000..0b52dc6 --- /dev/null +++ b/project/cmake/scripts/windows/CXXFlagOverrides.cmake @@ -0,0 +1,5 @@ +if(MSVC) + set(CMAKE_CXX_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /GR /Zi /EHsc /arch:SSE2") + set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") + set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") +endif() diff --git a/project/cmake/scripts/windows/Install.cmake b/project/cmake/scripts/windows/Install.cmake new file mode 100644 index 0000000..e69de29 diff --git a/project/cmake/scripts/windows/Macros.cmake b/project/cmake/scripts/windows/Macros.cmake new file mode 100644 index 0000000..2d3500d --- /dev/null +++ b/project/cmake/scripts/windows/Macros.cmake @@ -0,0 +1,66 @@ +function(core_link_library lib wraplib) + message(AUTHOR_WARNING "core_link_library is not compatible with windows.") +endfunction() + +function(find_soname lib) + # Windows uses hardcoded dlls in xbmc/DllPaths_win32.h. + # Therefore the output of this function is unused. +endfunction() + +# Add precompiled header to target +# Arguments: +# target existing target that will be set up to compile with a precompiled header +# pch_header the precompiled header file +# pch_source the precompiled header source file +# Optional Arguments: +# PCH_TARGET build precompiled header as separate target with the given name +# so that the same precompiled header can be used for multiple libraries +# EXCLUDE_SOURCES if not all target sources shall use the precompiled header, +# the relevant files can be listed here +# On return: +# Compiles the pch_source into a precompiled header and adds the header to +# the given target +function(add_precompiled_header target pch_header pch_source) + cmake_parse_arguments(PCH "" "PCH_TARGET" "EXCLUDE_SOURCES" ${ARGN}) + + if(PCH_PCH_TARGET) + set(pch_binary ${PRECOMPILEDHEADER_DIR}/${PCH_PCH_TARGET}.pch) + else() + set(pch_binary ${PRECOMPILEDHEADER_DIR}/${target}.pch) + endif() + + # Set compile options and dependency for sources + get_target_property(sources ${target} SOURCES) + list(REMOVE_ITEM sources ${pch_source}) + foreach(exclude_source IN LISTS PCH_EXCLUDE_SOURCES) + list(REMOVE_ITEM sources ${exclude_source}) + endforeach() + set_source_files_properties(${sources} + PROPERTIES COMPILE_FLAGS "/Yu\"${pch_header}\" /Fp\"${pch_binary}\" /FI\"${pch_header}\"" + OBJECT_DEPENDS "${pch_binary}") + + # Set compile options for precompiled header + if(NOT PCH_PCH_TARGET OR NOT TARGET ${PCH_PCH_TARGET}_pch) + set_source_files_properties(${pch_source} + PROPERTIES COMPILE_FLAGS "/Yc\"${pch_header}\" /Fp\"${pch_binary}\"" + OBJECT_OUTPUTS "${pch_binary}") + endif() + + # Compile precompiled header + if(PCH_PCH_TARGET) + # As own target for usage in multiple libraries + if(NOT TARGET ${PCH_PCH_TARGET}_pch) + add_library(${PCH_PCH_TARGET}_pch STATIC ${pch_source}) + set_target_properties(${PCH_PCH_TARGET}_pch PROPERTIES COMPILE_PDB_NAME vc140 + COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR} + FOLDER "Build Utilities") + endif() + # From VS2012 onwards, precompiled headers have to be linked against (LNK2011). + target_link_libraries(${target} PUBLIC ${PCH_PCH_TARGET}_pch) + set_target_properties(${target} PROPERTIES COMPILE_PDB_NAME vc140 + COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR}) + else() + # As part of the target + target_sources(${target} PRIVATE ${pch_source}) + endif() +endfunction() diff --git a/project/cmake/scripts/windows/PathSetup.cmake b/project/cmake/scripts/windows/PathSetup.cmake new file mode 100644 index 0000000..8550616 --- /dev/null +++ b/project/cmake/scripts/windows/PathSetup.cmake @@ -0,0 +1,34 @@ +if(NOT prefix) + set(prefix ${CMAKE_INSTALL_PREFIX}) +else() + set(CMAKE_INSTALL_PREFIX ${prefix}) +endif() +if(NOT exec_prefix) + set(exec_prefix ${prefix}) +endif() +if(NOT libdir) + set(libdir ${prefix}/lib) +endif() +if(NOT bindir) + set(bindir ${prefix}/bin) +endif() +if(NOT includedir) + set(includedir ${prefix}/include) +endif() +if(NOT datarootdir) + set(datarootdir ${prefix}/share) +endif() +if(NOT datadir) + set(datadir ${datarootdir}) +endif() + +list(APPEND final_message "-- PATH config --") +list(APPEND final_message "Prefix: ${prefix}") +list(APPEND final_message "Libdir: ${libdir}") +list(APPEND final_message "Bindir: ${bindir}") +list(APPEND final_message "Includedir: ${includedir}") +list(APPEND final_message "Datarootdir: ${datarootdir}") +list(APPEND final_message "Datadir: ${datadir}") + +set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" + -DINSTALL_PATH=\"${datarootdir}/kodi\") diff --git a/project/cmake/scripts/windows/archsetup.cmake b/project/cmake/scripts/windows/archsetup.cmake deleted file mode 100644 index a54ab65..0000000 --- a/project/cmake/scripts/windows/archsetup.cmake +++ /dev/null @@ -1,81 +0,0 @@ -# -------- Architecture settings --------- - -set(ARCH win32) - - -# -------- Paths (mainly for find_package) --------- - -set(PLATFORM_DIR win32) - -# Precompiled headers fail with per target output directory. (needs CMake 3.1) -set(PRECOMPILEDHEADER_DIR ${PROJECT_BINARY_DIR}/${CORE_BUILD_CONFIG}/objs) - -set(CMAKE_SYSTEM_NAME Windows) -list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32) -list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg) -list(APPEND CMAKE_SYSTEM_LIBRARY_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin) -list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../BuildDependencies) - -set(JPEG_NAMES ${JPEG_NAMES} jpeg-static) -set(PYTHON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../BuildDependencies/include/python) - - -# -------- Compiler options --------- - -add_options(CXX ALL_BUILDS "/wd\"4996\"") -set(ARCH_DEFINES -D_WINDOWS -DTARGET_WINDOWS) -set(SYSTEM_DEFINES -DNOMINMAX -D_USE_32BIT_TIME_T -DHAS_DX -D__STDC_CONSTANT_MACROS - -DTAGLIB_STATIC -DNPT_CONFIG_ENABLE_LOGGING - -DPLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi" - -DPLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi" - -DBUILDING_WITH_CMAKE - $<$:-DD3D_DEBUG_INFO -D_ITERATOR_DEBUG_LEVEL=0>) - -# Make sure /FS is set for Visual Studio in order to prevent simultanious access to pdb files. -if(CMAKE_GENERATOR MATCHES "Visual Studio") - set(CMAKE_CXX_FLAGS "/MP /FS ${CMAKE_CXX_FLAGS}") -endif() - - -# -------- Linker options --------- - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") - -# For #pragma comment(lib X) -# TODO: It would certainly be better to handle these libraries via CMake modules. -link_directories(${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin - ${PROJECT_SOURCE_DIR}/../BuildDependencies/lib) - -# Additional libraries -list(APPEND DEPLIBS d3d11.lib DInput8.lib DSound.lib winmm.lib Mpr.lib Iphlpapi.lib - PowrProf.lib setupapi.lib dwmapi.lib yajl.lib dxguid.lib DelayImp.lib) - -# NODEFAULTLIB option -set(_nodefaultlibs_RELEASE libcmt) -set(_nodefaultlibs_DEBUG libcmt msvcrt) -foreach(_lib ${_nodefaultlibs_RELEASE}) - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:\"${_lib}\"") -endforeach() -foreach(_lib ${_nodefaultlibs_DEBUG}) - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:\"${_lib}\"") -endforeach() - -# DELAYLOAD option -set(_delayloadlibs zlib.dll libmysql.dll libxslt.dll dnssd.dll dwmapi.dll ssh.dll sqlite3.dll - avcodec-57.dll avfilter-6.dll avformat-57.dll avutil-55.dll - postproc-54.dll swresample-2.dll swscale-4.dll d3dcompiler_47.dll) -foreach(_lib ${_delayloadlibs}) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DELAYLOAD:\"${_lib}\"") -endforeach() - -# Make the Release version create a PDB -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") -# Minimize the size or the resulting DLLs -set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF") - - -# -------- Visual Studio options --------- - -if(CMAKE_GENERATOR MATCHES "Visual Studio") - set_property(GLOBAL PROPERTY USE_FOLDERS ON) -endif() diff --git a/project/cmake/scripts/windows/c-flag-overrides.cmake b/project/cmake/scripts/windows/c-flag-overrides.cmake deleted file mode 100644 index fd85f5c..0000000 --- a/project/cmake/scripts/windows/c-flag-overrides.cmake +++ /dev/null @@ -1,5 +0,0 @@ -if(MSVC) - set(CMAKE_C_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /Zi /arch:SSE2") - set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") - set(CMAKE_C_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") -endif(MSVC) diff --git a/project/cmake/scripts/windows/cxx-flag-overrides.cmake b/project/cmake/scripts/windows/cxx-flag-overrides.cmake deleted file mode 100644 index 536b809..0000000 --- a/project/cmake/scripts/windows/cxx-flag-overrides.cmake +++ /dev/null @@ -1,5 +0,0 @@ -if(MSVC) - set(CMAKE_CXX_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /GR /Zi /EHsc /arch:SSE2") - set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") - set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") -endif(MSVC) diff --git a/project/cmake/scripts/windows/install.cmake b/project/cmake/scripts/windows/install.cmake deleted file mode 100644 index e69de29..0000000 diff --git a/project/cmake/scripts/windows/macros.cmake b/project/cmake/scripts/windows/macros.cmake deleted file mode 100644 index 2b61875..0000000 --- a/project/cmake/scripts/windows/macros.cmake +++ /dev/null @@ -1,145 +0,0 @@ -function(core_link_library lib wraplib) -# set(export -Wl,--unresolved-symbols=ignore-all -# `cat ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def` -# ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) -# set(check_arg "") -# if(TARGET ${lib}) -# set(target ${lib}) -# set(link_lib ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${lib}/${lib}.a) -# set(check_arg ${ARGV2}) -# set(data_arg ${ARGV3}) -# else() -# set(target ${ARGV2}) -# set(link_lib ${lib}) -# set(check_arg ${ARGV3}) -# set(data_arg ${ARGV4}) -# endif() -# if(check_arg STREQUAL "export") -# set(export ${export} -# -Wl,--version-script=${ARGV3}) -# elseif(check_arg STREQUAL "nowrap") -# set(export ${data_arg}) -# elseif(check_arg STREQUAL "extras") -# foreach(arg ${data_arg}) -# list(APPEND export ${arg}) -# endforeach() -# endif() -# get_filename_component(dir ${wraplib} PATH) -# add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} -# COMMAND cmake -E make_directory ${dir} -# COMMAND ${CMAKE_C_COMPILER} -# ARGS -Wl,--whole-archive -# ${link_lib} -# -Wl,--no-whole-archive -lm -# -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} -# ${export} -# DEPENDS ${target} wrapper.def wrapper) -# list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) -# set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE) -endfunction() - -function(find_soname lib) - # Windows uses hardcoded dlls in xbmc/DllPaths_win32.h. - # Therefore the output of this function is unused. -endfunction() - -# Add precompiled header to target -# Arguments: -# target existing target that will be set up to compile with a precompiled header -# pch_header the precompiled header file -# pch_source the precompiled header source file -# Optional Arguments: -# PCH_TARGET build precompiled header as separate target with the given name -# so that the same precompiled header can be used for multiple libraries -# EXCLUDE_SOURCES if not all target sources shall use the precompiled header, -# the relevant files can be listed here -# On return: -# Compiles the pch_source into a precompiled header and adds the header to -# the given target -function(add_precompiled_header target pch_header pch_source) - cmake_parse_arguments(PCH "" "PCH_TARGET" "EXCLUDE_SOURCES" ${ARGN}) - - if(PCH_PCH_TARGET) - set(pch_binary ${PRECOMPILEDHEADER_DIR}/${PCH_PCH_TARGET}.pch) - else() - set(pch_binary ${PRECOMPILEDHEADER_DIR}/${target}.pch) - endif() - - # Set compile options and dependency for sources - get_target_property(sources ${target} SOURCES) - list(REMOVE_ITEM sources ${pch_source}) - foreach(exclude_source IN LISTS PCH_EXCLUDE_SOURCES) - list(REMOVE_ITEM sources ${exclude_source}) - endforeach() - set_source_files_properties(${sources} - PROPERTIES COMPILE_FLAGS "/Yu\"${pch_header}\" /Fp\"${pch_binary}\" /FI\"${pch_header}\"" - OBJECT_DEPENDS "${pch_binary}") - - # Set compile options for precompiled header - if(NOT PCH_PCH_TARGET OR NOT TARGET ${PCH_PCH_TARGET}_pch) - set_source_files_properties(${pch_source} - PROPERTIES COMPILE_FLAGS "/Yc\"${pch_header}\" /Fp\"${pch_binary}\"" - OBJECT_OUTPUTS "${pch_binary}") - endif() - - # Compile precompiled header - if(PCH_PCH_TARGET) - # As own target for usage in multiple libraries - if(NOT TARGET ${PCH_PCH_TARGET}_pch) - add_library(${PCH_PCH_TARGET}_pch STATIC ${pch_source}) - set_target_properties(${PCH_PCH_TARGET}_pch PROPERTIES COMPILE_PDB_NAME vc140 - COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR}) - endif() - # From VS2012 onwards, precompiled headers have to be linked against (LNK2011). - target_link_libraries(${target} PUBLIC ${PCH_PCH_TARGET}_pch) - set_target_properties(${target} PROPERTIES COMPILE_PDB_NAME vc140 - COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR}) - else() - # As part of the target - target_sources(${target} PRIVATE ${pch_source}) - endif() -endfunction() - -# Adds an FX-compiled shader to a target -# Creates a custom command that FX-compiles the given shader and adds the -# generated header file to the given target. -# Arguments: -# target Target to add the FX-compiled shader to -# hlsl HLSL shader input file -# profile HLSL profile that specifies the shader model -# entrypoint Shader entry point -# On return: -# FXC_FILE is set to the name of the generated header file. -function(add_shader_dx target hlsl profile entrypoint) - get_filename_component(file ${hlsl} NAME_WE) - add_custom_command(OUTPUT ${file}.h - COMMAND ${FXC} /Fh ${file}.h - /E ${entrypoint} - /T ${profile} - /Vn ${file} - /Qstrip_reflect - ${hlsl} - DEPENDS ${hlsl} - COMMENT "FX compile ${hlsl}" - VERBATIM) - target_sources(${target} PRIVATE ${file}.h) - target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -endfunction() - -# Copies the main dlls to the root of the buildtree -# On return: -# files added to ${install_data}, mirror in build tree -function(copy_main_dlls_to_buildtree) - set(dir ${PROJECT_SOURCE_DIR}/../Win32BuildSetup/dependencies) - file(GLOB_RECURSE files ${dir}/*) - foreach(file ${files}) - copy_file_to_buildtree(${file} ${dir}) - endforeach() - - if(D3DCOMPILER_DLL) - get_filename_component(d3dcompiler_dir ${D3DCOMPILER_DLL} DIRECTORY) - copy_file_to_buildtree(${D3DCOMPILER_DLL} ${d3dcompiler_dir}) - endif() - - set(install_data ${install_data} PARENT_SCOPE) -endfunction() diff --git a/project/cmake/scripts/windows/pathsetup.cmake b/project/cmake/scripts/windows/pathsetup.cmake deleted file mode 100644 index 8550616..0000000 --- a/project/cmake/scripts/windows/pathsetup.cmake +++ /dev/null @@ -1,34 +0,0 @@ -if(NOT prefix) - set(prefix ${CMAKE_INSTALL_PREFIX}) -else() - set(CMAKE_INSTALL_PREFIX ${prefix}) -endif() -if(NOT exec_prefix) - set(exec_prefix ${prefix}) -endif() -if(NOT libdir) - set(libdir ${prefix}/lib) -endif() -if(NOT bindir) - set(bindir ${prefix}/bin) -endif() -if(NOT includedir) - set(includedir ${prefix}/include) -endif() -if(NOT datarootdir) - set(datarootdir ${prefix}/share) -endif() -if(NOT datadir) - set(datadir ${datarootdir}) -endif() - -list(APPEND final_message "-- PATH config --") -list(APPEND final_message "Prefix: ${prefix}") -list(APPEND final_message "Libdir: ${libdir}") -list(APPEND final_message "Bindir: ${bindir}") -list(APPEND final_message "Includedir: ${includedir}") -list(APPEND final_message "Datarootdir: ${datarootdir}") -list(APPEND final_message "Datadir: ${datadir}") - -set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\" - -DINSTALL_PATH=\"${datarootdir}/kodi\") -- cgit v1.2.3