summaryrefslogtreecommitdiffstats
path: root/project/cmake/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'project/cmake/scripts')
-rw-r--r--project/cmake/scripts/android/ArchSetup.cmake (renamed from project/cmake/scripts/android/archsetup.cmake)19
-rw-r--r--project/cmake/scripts/android/Install.cmake123
l---------project/cmake/scripts/android/Macros.cmake1
-rw-r--r--project/cmake/scripts/android/PathSetup.cmake (renamed from project/cmake/scripts/windows/pathsetup.cmake)5
l---------project/cmake/scripts/android/macros.cmake1
l---------project/cmake/scripts/android/pathsetup.cmake1
-rw-r--r--project/cmake/scripts/common/AddOptions.cmake78
-rw-r--r--project/cmake/scripts/common/AddonHelpers.cmake268
-rw-r--r--project/cmake/scripts/common/ArchSetup.cmake (renamed from project/cmake/scripts/common/archsetup.cmake)53
-rw-r--r--project/cmake/scripts/common/CMakeHelpers.cmake54
-rw-r--r--project/cmake/scripts/common/CheckCommits.cmake (renamed from project/cmake/scripts/common/checkcommits.cmake)0
-rw-r--r--project/cmake/scripts/common/CheckTargetPlatform.cmake (renamed from project/cmake/scripts/common/check_target_platform.cmake)32
-rw-r--r--project/cmake/scripts/common/GenerateVersionedFiles.cmake18
-rw-r--r--project/cmake/scripts/common/GeneratorSetup.cmake (renamed from project/cmake/scripts/common/generatorsetup.cmake)25
-rw-r--r--project/cmake/scripts/common/HandleDepends.cmake (renamed from project/cmake/scripts/common/handle-depends.cmake)30
-rw-r--r--project/cmake/scripts/common/Macros.cmake619
-rw-r--r--project/cmake/scripts/common/PrepareEnv.cmake (renamed from project/cmake/scripts/common/prepare-env.cmake)79
-rw-r--r--project/cmake/scripts/common/ProjectMacros.cmake (renamed from project/cmake/scripts/common/projectmacros.cmake)12
-rw-r--r--project/cmake/scripts/common/Uninstall.cmake22
-rw-r--r--project/cmake/scripts/common/addon-helpers.cmake171
-rw-r--r--project/cmake/scripts/common/addoptions.cmake82
-rw-r--r--project/cmake/scripts/common/generateversionedfiles.cmake11
-rw-r--r--project/cmake/scripts/common/macros.cmake383
-rw-r--r--project/cmake/scripts/common/managestring.cmake235
-rw-r--r--project/cmake/scripts/common/pathsetup.cmake3
-rw-r--r--project/cmake/scripts/darwin/install.cmake0
-rw-r--r--project/cmake/scripts/freebsd/ArchSetup.cmake (renamed from project/cmake/scripts/freebsd/archsetup.cmake)3
l---------project/cmake/scripts/freebsd/Install.cmake1
l---------project/cmake/scripts/freebsd/Macros.cmake1
l---------project/cmake/scripts/freebsd/PathSetup.cmake1
-rw-r--r--project/cmake/scripts/freebsd/install.cmake60
-rw-r--r--project/cmake/scripts/freebsd/macros.cmake1
-rw-r--r--project/cmake/scripts/freebsd/pathsetup.cmake1
-rw-r--r--project/cmake/scripts/ios/ArchSetup.cmake (renamed from project/cmake/scripts/ios/archsetup.cmake)16
-rw-r--r--project/cmake/scripts/ios/Install.cmake74
l---------project/cmake/scripts/ios/Macros.cmake1
l---------project/cmake/scripts/ios/PathSetup.cmake1
l---------project/cmake/scripts/ios/install.cmake1
l---------project/cmake/scripts/ios/macros.cmake1
l---------project/cmake/scripts/ios/pathsetup.cmake1
-rw-r--r--project/cmake/scripts/linux/ArchSetup.cmake41
-rw-r--r--project/cmake/scripts/linux/CodeCoverage.cmake97
-rw-r--r--project/cmake/scripts/linux/ExtraTargets.cmake12
-rw-r--r--project/cmake/scripts/linux/Install.cmake355
-rw-r--r--project/cmake/scripts/linux/Macros.cmake (renamed from project/cmake/scripts/linux/macros.cmake)40
-rw-r--r--project/cmake/scripts/linux/PathSetup.cmake39
-rw-r--r--project/cmake/scripts/linux/archsetup.cmake21
-rw-r--r--project/cmake/scripts/linux/install.cmake146
-rw-r--r--project/cmake/scripts/osx/ArchSetup.cmake (renamed from project/cmake/scripts/darwin/archsetup.cmake)12
-rw-r--r--project/cmake/scripts/osx/ExtraTargets.cmake3
-rw-r--r--project/cmake/scripts/osx/Install.cmake40
-rw-r--r--project/cmake/scripts/osx/Macros.cmake (renamed from project/cmake/scripts/darwin/macros.cmake)35
-rw-r--r--project/cmake/scripts/osx/PathSetup.cmake (renamed from project/cmake/scripts/darwin/pathsetup.cmake)0
-rw-r--r--project/cmake/scripts/rbpi/ArchSetup.cmake (renamed from project/cmake/scripts/rbpi/archsetup.cmake)10
l---------project/cmake/scripts/rbpi/Install.cmake1
l---------project/cmake/scripts/rbpi/Macros.cmake1
l---------project/cmake/scripts/rbpi/PathSetup.cmake1
l---------project/cmake/scripts/rbpi/install.cmake1
l---------project/cmake/scripts/rbpi/macros.cmake1
l---------project/cmake/scripts/rbpi/pathsetup.cmake1
-rw-r--r--project/cmake/scripts/windows/ArchSetup.cmake (renamed from project/cmake/scripts/windows/archsetup.cmake)14
-rw-r--r--project/cmake/scripts/windows/CFlagOverrides.cmake (renamed from project/cmake/scripts/windows/c-flag-overrides.cmake)2
-rw-r--r--project/cmake/scripts/windows/CXXFlagOverrides.cmake (renamed from project/cmake/scripts/windows/cxx-flag-overrides.cmake)2
-rw-r--r--project/cmake/scripts/windows/Install.cmake (renamed from project/cmake/scripts/android/install.cmake)0
-rw-r--r--project/cmake/scripts/windows/Macros.cmake66
-rw-r--r--project/cmake/scripts/windows/PathSetup.cmake (renamed from project/cmake/scripts/linux/pathsetup.cmake)0
-rw-r--r--project/cmake/scripts/windows/install.cmake0
-rw-r--r--project/cmake/scripts/windows/macros.cmake145
68 files changed, 2147 insertions, 1427 deletions
diff --git a/project/cmake/scripts/android/archsetup.cmake b/project/cmake/scripts/android/ArchSetup.cmake
index 86c0f6a..281f94f 100644
--- a/project/cmake/scripts/android/archsetup.cmake
+++ b/project/cmake/scripts/android/ArchSetup.cmake
@@ -1,5 +1,7 @@
1if(NOT CMAKE_TOOLCHAIN_FILE) 1if(NOT CMAKE_TOOLCHAIN_FILE)
2 message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for android. See ${PROJECT_SOURCE_DIR}/README.md") 2 message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for android. See ${PROJECT_SOURCE_DIR}/README.md")
3elseif(NOT SDK_PLATFORM)
4 message(FATAL_ERROR "Toolchain did not define SDK_PLATFORM. Possibly outdated depends.")
3endif() 5endif()
4 6
5set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -DTARGET_ANDROID) 7set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -DTARGET_ANDROID)
@@ -10,9 +12,13 @@ if(WITH_ARCH)
10 set(ARCH ${WITH_ARCH}) 12 set(ARCH ${WITH_ARCH})
11else() 13else()
12 if(CPU STREQUAL armeabi-v7a) 14 if(CPU STREQUAL armeabi-v7a)
13 set(ARCH arm-linux-androideabi) 15 set(ARCH arm)
16 set(NEON True)
17 elseif(CPU STREQUAL arm64-v8a)
18 set(ARCH aarch64)
14 elseif(CPU STREQUAL i686) 19 elseif(CPU STREQUAL i686)
15 set(ARCH i686-linux-android) 20 set(ARCH i486-linux)
21 set(NEON False)
16 else() 22 else()
17 message(SEND_ERROR "Unknown CPU: ${CPU}") 23 message(SEND_ERROR "Unknown CPU: ${CPU}")
18 endif() 24 endif()
@@ -21,10 +27,9 @@ endif()
21set(FFMPEG_OPTS --enable-cross-compile --cpu=cortex-a9 --arch=arm --target-os=linux --enable-neon 27set(FFMPEG_OPTS --enable-cross-compile --cpu=cortex-a9 --arch=arm --target-os=linux --enable-neon
22 --disable-vdpau --cc=${CMAKE_C_COMPILER} --host-cc=${CMAKE_C_COMPILER} 28 --disable-vdpau --cc=${CMAKE_C_COMPILER} --host-cc=${CMAKE_C_COMPILER}
23 --strip=${CMAKE_STRIP}) 29 --strip=${CMAKE_STRIP})
24set(ENABLE_SDL OFF) 30set(ENABLE_SDL OFF CACHE BOOL "" FORCE)
25set(ENABLE_X11 OFF) 31set(ENABLE_X11 OFF CACHE BOOL "" FORCE)
26set(ENABLE_EGL ON) 32set(ENABLE_AML OFF CACHE BOOL "" FORCE)
27set(ENABLE_AML ON) 33set(ENABLE_OPTICAL OFF CACHE BOOL "" FORCE)
28set(ENABLE_OPTICAL OFF)
29 34
30list(APPEND DEPLIBS android log jnigraphics) 35list(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 @@
1# Android packaging
2
3find_program(AAPT_EXECUTABLE aapt PATHS ${SDK_BUILDTOOLS_PATH})
4if(NOT AAPT_EXECUTABLE)
5 message(FATAL_ERROR "Could NOT find aapt executable")
6endif()
7find_program(DX_EXECUTABLE dx PATHS ${SDK_BUILDTOOLS_PATH})
8if(NOT DX_EXECUTABLE)
9 message(FATAL_ERROR "Could NOT find dx executable")
10endif()
11find_program(ZIPALIGN_EXECUTABLE zipalign PATHS ${SDK_BUILDTOOLS_PATH})
12if(NOT ZIPALIGN_EXECUTABLE)
13 message(FATAL_ERROR "Could NOT find zipalign executable")
14endif()
15
16# Configure files into packaging environment.
17configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/Makefile.in
18 ${CMAKE_BINARY_DIR}/tools/android/packaging/Makefile @ONLY)
19configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/apksign
20 ${CMAKE_BINARY_DIR}/tools/android/packaging/apksign COPYONLY)
21configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/make_symbols.sh
22 ${CMAKE_BINARY_DIR}/tools/android/packaging/make_symbols.sh COPYONLY)
23file(WRITE ${CMAKE_BINARY_DIR}/tools/depends/Makefile.include
24 "$(PREFIX)/lib/${APP_NAME_LC}/lib${APP_NAME_LC}.so: ;\n")
25
26set(package_files strings.xml
27 activity_main.xml
28 AndroidManifest.xml
29 src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java
30 src/org/xbmc/kodi/XBMCInputDeviceListener.java
31 src/org/xbmc/kodi/Main.java
32 src/org/xbmc/kodi/XBMCSettingsContentObserver.java
33 src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java
34 src/org/xbmc/kodi/XBMCVideoView.java
35 src/org/xbmc/kodi/Splash.java
36 src/org/xbmc/kodi/XBMCBroadcastReceiver.java)
37foreach(file IN LISTS package_files)
38 configure_file(${CORE_SOURCE_DIR}/tools/android/packaging/xbmc/${file}.in
39 ${CMAKE_BINARY_DIR}/tools/android/packaging/xbmc/${file} @ONLY)
40endforeach()
41
42# Copy files to the location expected by the Android packaging scripts.
43add_custom_target(bundle
44 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/android/packaging/media
45 ${CMAKE_BINARY_DIR}/tools/android/packaging/media
46 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/android/packaging/xbmc/res
47 ${CMAKE_BINARY_DIR}/tools/android/packaging/xbmc/res
48 COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDS_PATH}/lib/python2.7 ${libdir}/python2.7
49 COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPENDS_PATH}/share/${APP_NAME_LC} ${datadir}/${APP_NAME_LC}
50 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${APP_NAME_LC}>
51 ${libdir}/${APP_NAME_LC}/$<TARGET_FILE_NAME:${APP_NAME_LC}>)
52add_dependencies(bundle ${APP_NAME_LC})
53
54# This function is used to prepare a prefix expected by the Android packaging
55# scripts. It creates a bundle_files command that is added to the bundle target.
56function(add_bundle_file file destination relative)
57 if(NOT TARGET bundle_files)
58 file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake)
59 add_custom_target(bundle_files COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake)
60 add_dependencies(bundle bundle_files)
61 endif()
62
63 string(REPLACE "${relative}/" "" outfile ${file})
64 get_filename_component(file ${file} REALPATH)
65 get_filename_component(outdir ${outfile} DIRECTORY)
66 file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake
67 "file(COPY \"${file}\" DESTINATION \"${destination}/${outdir}\")\n")
68 if(file MATCHES "\\.so\\..+$")
69 get_filename_component(srcfile "${file}" NAME)
70 string(REGEX REPLACE "\\.so\\..+$" "\.so" destfile ${srcfile})
71 file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/BundleFiles.cmake
72 "file(RENAME \"${destination}/${outdir}/${srcfile}\" \"${destination}/${outdir}/${destfile}\")\n")
73 endif()
74endfunction()
75
76# Copy files into prefix
77foreach(file IN LISTS XBT_FILES install_data)
78 string(REPLACE "${CMAKE_BINARY_DIR}/" "" file ${file})
79 add_bundle_file(${CMAKE_BINARY_DIR}/${file} ${datarootdir}/${APP_NAME_LC} ${CMAKE_BINARY_DIR})
80endforeach()
81
82foreach(library IN LISTS LIBRARY_FILES)
83 add_bundle_file(${library} ${libdir}/${APP_NAME_LC} ${CMAKE_BINARY_DIR})
84endforeach()
85
86foreach(lib IN LISTS required_dyload dyload_optional ITEMS Shairplay)
87 string(TOUPPER ${lib} lib_up)
88 set(lib_so ${${lib_up}_SONAME})
89 if(lib_so AND EXISTS ${DEPENDS_PATH}/lib/${lib_so})
90 add_bundle_file(${DEPENDS_PATH}/lib/${lib_so} ${libdir} "")
91 endif()
92endforeach()
93add_bundle_file(${SMBCLIENT_LIBRARY} ${libdir} "")
94add_bundle_file(${DEPENDS_PATH}/lib/librtmp.so ${libdir} "")
95
96# Main targets from Makefile.in
97if(CPU MATCHES i686)
98 set(CPU x86)
99 set(ARCH x86)
100endif()
101foreach(target apk obb apk-unsigned apk-obb apk-obb-unsigned apk-noobb apk-clean apk-sign)
102 add_custom_target(${target}
103 COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} ${CMAKE_MAKE_PROGRAM}
104 -C ${CMAKE_BINARY_DIR}/tools/android/packaging
105 CORE_SOURCE_DIR=${CORE_SOURCE_DIR}
106 CC=${CMAKE_C_COMPILER}
107 CPU=${CPU}
108 ARCH=${ARCH}
109 PREFIX=${prefix}
110 NDKROOT=${NDKROOT}
111 SDKROOT=${SDKROOT}
112 SDK_PLATFORM=${SDK_PLATFORM}
113 STRIP=${CMAKE_STRIP}
114 AAPT=${AAPT_EXECUTABLE}
115 DX=${DX_EXECUTABLE}
116 ZIPALIGN=${ZIPALIGN_EXECUTABLE}
117 ${target}
118 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/android/packaging
119 )
120 if(NOT target STREQUAL apk-clean)
121 add_dependencies(${target} bundle)
122 endif()
123endforeach()
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/windows/pathsetup.cmake b/project/cmake/scripts/android/PathSetup.cmake
index 8550616..69de883 100644
--- a/project/cmake/scripts/windows/pathsetup.cmake
+++ b/project/cmake/scripts/android/PathSetup.cmake
@@ -1,8 +1,7 @@
1if(NOT prefix) 1if(NOT prefix)
2 set(prefix ${CMAKE_INSTALL_PREFIX}) 2 set(prefix ${CMAKE_BINARY_DIR}/install)
3else()
4 set(CMAKE_INSTALL_PREFIX ${prefix})
5endif() 3endif()
4set(CMAKE_INSTALL_PREFIX ${prefix})
6if(NOT exec_prefix) 5if(NOT exec_prefix)
7 set(exec_prefix ${prefix}) 6 set(exec_prefix ${prefix})
8endif() 7endif()
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 @@
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
deleted file mode 120000
index 26d7f17..0000000
--- a/project/cmake/scripts/android/pathsetup.cmake
+++ /dev/null
@@ -1 +0,0 @@
1../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 @@
1# - Add options without repeating them on the command line
2#
3# Synopsis:
4#
5# add_options (lang build opts)
6#
7# where:
8#
9# lang Name of the language whose compiler should receive the
10# options, e.g. CXX. If a comma-separated list is received
11# then the option is added for all those languages. Use the
12# special value ALL_LANGUAGES for these languages: CXX, C
13# and Fortran
14#
15# build Kind of build to which this options should apply,
16# such as DEBUG and RELEASE. This can also be a comma-
17# separated list. Use the special value ALL_BUILDS to apply
18# to all builds.
19#
20# opts List of options to add. Each should be quoted.
21#
22# Example:
23#
24# add_options (CXX RELEASE "-O3" "-DNDEBUG" "-Wall")
25
26function(add_options langs builds)
27 # special handling of empty language specification
28 if("${langs}" STREQUAL "ALL_LANGUAGES")
29 set(langs CXX C Fortran)
30 endif()
31 foreach(lang IN LISTS langs)
32 # prepend underscore if necessary
33 foreach(build IN LISTS builds)
34 if(NOT ("${build}" STREQUAL "ALL_BUILDS"))
35 set(_bld "_${build}")
36 string(TOUPPER "${_bld}" _bld)
37 else()
38 set(_bld "")
39 endif()
40 foreach(_opt IN LISTS ARGN)
41 set(_var "CMAKE_${lang}_FLAGS${_bld}")
42 #message(STATUS "Adding \"${_opt}\" to \${${_var}}")
43 # remove it first
44 string(REPLACE "${_opt}" "" _without "${${_var}}")
45 string(STRIP "${_without}" _without)
46 # we need to strip this one as well, so they are comparable
47 string(STRIP "${${_var}}" _stripped)
48 # if it wasn't there, then add it at the end
49 if("${_without}" STREQUAL "${_stripped}")
50 # don't add any extra spaces if no options yet are set
51 if(NOT ${_stripped} STREQUAL "")
52 set(${_var} "${_stripped} ${_opt}")
53 else()
54 set(${_var} "${_opt}")
55 endif()
56 set(${_var} "${${_var}}" PARENT_SCOPE)
57 endif()
58 endforeach()
59 endforeach()
60 endforeach()
61endfunction()
62
63# set varname to flag unless user has specified something that matches regex
64function(set_default_option varname flag regex)
65 if(NOT "$ENV{CXXFLAGS}" MATCHES "${regex}"
66 AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}"
67 AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
68 set(${varname} ${flag} PARENT_SCOPE)
69 else()
70 set(${varname} PARENT_SCOPE)
71 endif()
72endfunction()
73
74# note: this must be called before project()
75macro(no_default_options)
76 # prevent the platform probe to set options
77 set(CMAKE_NOT_USING_CONFIG_FLAGS TRUE)
78endmacro()
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 @@
1# Workaround for the fact that cpack's filenames are not customizable.
2# Each add-on is added as a separate component to facilitate zip/tgz packaging.
3# The filenames are always of the form basename-component, which is
4# incompatible with the addonid-version scheme we want. This hack renames
5# the files from the file names generated by the 'package' target.
6# Sadly we cannot extend the 'package' target, as it is a builtin target, see
7# http://public.kitware.com/Bug/view.php?id=8438
8# Thus, we have to add an 'addon-package' target.
9add_custom_target(addon-package
10 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package)
11
12macro(add_cpack_workaround target version ext)
13 if(NOT PACKAGE_DIR)
14 set(PACKAGE_DIR "${CMAKE_INSTALL_PREFIX}/zips")
15 endif()
16
17 add_custom_command(TARGET addon-package PRE_BUILD
18 COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIR}
19 COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_PACKAGE_DIRECTORY}/addon-${target}-${version}.${ext} ${PACKAGE_DIR}/${target}-${version}.${ext})
20endmacro()
21
22# Grab the version from a given add-on's addon.xml
23macro (addon_version dir prefix)
24 if(EXISTS ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in)
25 file(READ ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in ADDONXML)
26 else()
27 file(READ ${dir}/addon.xml ADDONXML)
28 endif()
29
30 string(REGEX MATCH "<addon[^>]*version.?=.?.[0-9\\.]+" VERSION_STRING ${ADDONXML})
31 string(REGEX REPLACE ".*version=.([0-9\\.]+).*" "\\1" ${prefix}_VERSION ${VERSION_STRING})
32 message(STATUS ${prefix}_VERSION=${${prefix}_VERSION})
33endmacro()
34
35# Build, link and optionally package an add-on
36macro (build_addon target prefix libs)
37 addon_version(${target} ${prefix})
38 if(${prefix}_SOURCES)
39 add_library(${target} ${${prefix}_SOURCES})
40 target_link_libraries(${target} ${${libs}})
41 set_target_properties(${target} PROPERTIES VERSION ${${prefix}_VERSION}
42 SOVERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}
43 PREFIX "")
44 if(OS STREQUAL "android")
45 set_target_properties(${target} PROPERTIES PREFIX "lib")
46 endif()
47 elseif(${prefix}_CUSTOM_BINARY)
48 add_custom_target(${target} ALL)
49 endif()
50
51 # get the library's location
52 if(${prefix}_CUSTOM_BINARY)
53 list(GET ${prefix}_CUSTOM_BINARY 0 LIBRARY_LOCATION)
54 list(GET ${prefix}_CUSTOM_BINARY 1 LIBRARY_FILENAME)
55 else()
56 set(LIBRARY_LOCATION $<TARGET_FILE:${target}>)
57 # get the library's filename
58 if("${CORE_SYSTEM_NAME}" STREQUAL "android")
59 # for android we need the filename without any version numbers
60 set(LIBRARY_FILENAME $<TARGET_LINKER_FILE_NAME:${target}>)
61 else()
62 set(LIBRARY_FILENAME $<TARGET_FILE_NAME:${target}>)
63 endif()
64 endif()
65
66 # if there's an addon.xml.in we need to generate the addon.xml
67 if(EXISTS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in)
68 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in)
69 set(PLATFORM ${CORE_SYSTEM_NAME})
70
71 file(READ ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in addon_file)
72 string(CONFIGURE "${addon_file}" addon_file_conf @ONLY)
73 file(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}")
74 if(${APP_NAME_UC}_BUILD_DIR)
75 file(GENERATE OUTPUT ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/addon.xml CONTENT "${addon_file_conf}")
76 endif()
77 endif()
78
79 # if there's an settings.xml.in we need to generate the settings.xml
80 if(EXISTS ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in)
81 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in)
82 set(PLATFORM ${CORE_SYSTEM_NAME})
83
84 file(READ ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml.in settings_file)
85 string(CONFIGURE "${settings_file}" settings_file_conf @ONLY)
86 file(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/resources/settings.xml CONTENT "${settings_file_conf}")
87 if(${APP_NAME_UC}_BUILD_DIR)
88 file(GENERATE OUTPUT ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/resources/settings.xml CONTENT "${settings_file_conf}")
89 endif()
90 endif()
91
92 # set zip as default if addon-package is called without PACKAGE_XXX
93 set(CPACK_GENERATOR "ZIP")
94 set(ext "zip")
95 if(PACKAGE_ZIP OR PACKAGE_TGZ)
96 if(PACKAGE_TGZ)
97 set(CPACK_GENERATOR "TGZ")
98 set(ext "tar.gz")
99 endif()
100 set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
101 set(CPACK_PACKAGE_FILE_NAME addon)
102 if(CMAKE_BUILD_TYPE STREQUAL "Release")
103 set(CPACK_STRIP_FILES TRUE)
104 endif()
105 set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
106 set(CPACK_COMPONENTS_IGNORE_GROUPS 1)
107 list(APPEND CPACK_COMPONENTS_ALL ${target}-${${prefix}_VERSION})
108 # Pack files together to create an archive
109 install(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION} PATTERN "xml.in" EXCLUDE)
110 if(WIN32)
111 if(NOT CPACK_PACKAGE_DIRECTORY)
112 # determine the temporary path
113 file(TO_CMAKE_PATH "$ENV{TEMP}" WIN32_TEMP_PATH)
114 string(LENGTH "${WIN32_TEMP_PATH}" WIN32_TEMP_PATH_LENGTH)
115 string(LENGTH "${PROJECT_BINARY_DIR}" PROJECT_BINARY_DIR_LENGTH)
116
117 # check if the temporary path is shorter than the default packaging directory path
118 if(WIN32_TEMP_PATH_LENGTH GREATER 0 AND WIN32_TEMP_PATH_LENGTH LESS PROJECT_BINARY_DIR_LENGTH)
119 # set the directory used by CPack for packaging to the temp directory
120 set(CPACK_PACKAGE_DIRECTORY ${WIN32_TEMP_PATH})
121 endif()
122 endif()
123
124 # in case of a VC++ project the installation location contains a $(Configuration) VS variable
125 # we replace it with ${CMAKE_BUILD_TYPE} (which doesn't cover the case when the build configuration
126 # is changed within Visual Studio)
127 string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" LIBRARY_LOCATION "${LIBRARY_LOCATION}")
128
129 if(${prefix}_SOURCES)
130 # install the generated DLL file
131 install(PROGRAMS ${LIBRARY_LOCATION} DESTINATION ${target}
132 COMPONENT ${target}-${${prefix}_VERSION})
133
134 if(CMAKE_BUILD_TYPE MATCHES Debug)
135 # for debug builds also install the PDB file
136 get_filename_component(LIBRARY_DIR ${LIBRARY_LOCATION} DIRECTORY)
137 install(FILES $<TARGET_PDB_FILE:${target}> DESTINATION ${target}
138 COMPONENT ${target}-${${prefix}_VERSION})
139 endif()
140 endif()
141 if (${prefix}_CUSTOM_BINARY)
142 list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY)
143 list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY)
144 install(FILES ${FROM_BINARY} DESTINATION ${target} RENAME ${TO_BINARY})
145 endif()
146 if(${prefix}_CUSTOM_DATA)
147 install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${target}/resources)
148 endif()
149 else()
150 if(NOT CPACK_PACKAGE_DIRECTORY)
151 set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR})
152 endif()
153 if(${prefix}_SOURCES)
154 install(TARGETS ${target} DESTINATION ${target}
155 COMPONENT ${target}-${${prefix}_VERSION})
156 endif()
157 if (${prefix}_CUSTOM_BINARY)
158 list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY)
159 list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY)
160 if(OS STREQUAL "android")
161 set(TO_BINARY "lib${TO_BINARY}")
162 endif()
163 install(FILES ${FROM_BINARY} DESTINATION ${target} RENAME ${TO_BINARY}
164 COMPONENT ${target}-${${prefix}_VERSION})
165 endif()
166 if(${prefix}_CUSTOM_DATA)
167 install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${target}/resources)
168 endif()
169 endif()
170 add_cpack_workaround(${target} ${${prefix}_VERSION} ${ext})
171 else()
172 if(CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL rbpi OR CORE_SYSTEM_NAME STREQUAL freebsd)
173 if(NOT OVERRIDE_PATHS)
174 if(CMAKE_INSTALL_PREFIX AND NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND NOT CMAKE_INSTALL_PREFIX STREQUAL "${${APP_NAME_UC}_PREFIX}")
175 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")
176 endif()
177 if(CMAKE_INSTALL_LIBDIR AND NOT CMAKE_INSTALL_LIBDIR STREQUAL "${${APP_NAME_UC}_LIB_DIR}")
178 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")
179 endif()
180 if(CMAKE_INSTALL_DATADIR AND NOT CMAKE_INSTALL_DATADIR STREQUAL "${${APP_NAME_UC}_DATA_DIR}")
181 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")
182 endif()
183 set(CMAKE_INSTALL_PREFIX "${${APP_NAME_UC}_PREFIX}" CACHE PATH "${APP_NAME} install prefix" FORCE)
184 set(CMAKE_INSTALL_LIBDIR "${${APP_NAME_UC}_LIB_DIR}" CACHE PATH "${APP_NAME} install libdir" FORCE)
185 set(CMAKE_INSTALL_DATADIR "${${APP_NAME_UC}_DATA_DIR}" CACHE PATH "${APP_NAME} install datadir" FORCE)
186 else()
187 if(NOT CMAKE_INSTALL_LIBDIR)
188 set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib/${APP_NAME_LC}")
189 endif()
190 if(NOT CMAKE_INSTALL_DATADIR)
191 set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_PREFIX}/share/${APP_NAME_LC}")
192 endif()
193 endif()
194 else()
195 set(CMAKE_INSTALL_LIBDIR "lib/${APP_NAME_LC}")
196 set(CMAKE_INSTALL_DATADIR "share/${APP_NAME_LC}")
197 endif()
198 if(${prefix}_SOURCES)
199 install(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target})
200 endif()
201 if (${prefix}_CUSTOM_BINARY)
202 list(GET ${prefix}_CUSTOM_BINARY 0 FROM_BINARY)
203 list(GET ${prefix}_CUSTOM_BINARY 1 TO_BINARY)
204 if(OS STREQUAL "android")
205 set(TO_BINARY "lib${TO_BINARY}")
206 endif()
207 install(FILES ${FROM_BINARY} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target} RENAME ${TO_BINARY})
208 endif()
209 install(DIRECTORY ${target} DESTINATION ${CMAKE_INSTALL_DATADIR}/addons PATTERN "xml.in" EXCLUDE)
210 if(${prefix}_CUSTOM_DATA)
211 install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/addons/${target}/resources)
212 endif()
213 endif()
214 if(${APP_NAME_UC}_BUILD_DIR)
215 file(GLOB_RECURSE files ${CMAKE_CURRENT_SOURCE_DIR}/${target}/*)
216 if(${prefix}_CUSTOM_DATA)
217 add_custom_command(TARGET ${target} POST_BUILD
218 COMMAND ${CMAKE_COMMAND} -E copy_directory
219 ${${prefix}_CUSTOM_DATA}
220 ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/resources)
221 endif()
222 foreach(file ${files})
223 string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/${target}/" "" name "${file}")
224 # A good way to deal with () in filenames
225 if(NOT ${file} MATCHES xml.in)
226 configure_file(${file} ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/${name} COPYONLY)
227 endif()
228 endforeach()
229 add_custom_command(TARGET ${target} POST_BUILD
230 COMMAND ${CMAKE_COMMAND} -E copy
231 ${LIBRARY_LOCATION}
232 ${${APP_NAME_UC}_BUILD_DIR}/addons/${target}/${LIBRARY_FILENAME})
233 endif()
234endmacro()
235
236# finds a path to a given file (recursive)
237function (kodi_find_path var_name filename search_path strip_file)
238 file(GLOB_RECURSE PATH_TO_FILE ${search_path} ${filename})
239 if(strip_file)
240 string(REPLACE ${filename} "" PATH_TO_FILE ${PATH_TO_FILE})
241 endif()
242 set (${var_name} ${PATH_TO_FILE} PARENT_SCOPE)
243endfunction()
244
245# Cmake build options
246include(AddOptions)
247include(TestCXXAcceptsFlag)
248option(PACKAGE_ZIP "Package Zip file?" OFF)
249option(PACKAGE_TGZ "Package TGZ file?" OFF)
250option(BUILD_SHARED_LIBS "Build shared libs?" ON)
251
252# LTO support?
253CHECK_CXX_ACCEPTS_FLAG("-flto" HAVE_LTO)
254if(HAVE_LTO)
255 option(USE_LTO "use link time optimization" OFF)
256 if(USE_LTO)
257 add_options(ALL_LANGUAGES ALL_BUILDS "-flto")
258 endif()
259endif()
260
261# set this to try linking dependencies as static as possible
262if(ADDONS_PREFER_STATIC_LIBS)
263 set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
264endif()
265
266if(${APP_NAME_UC}_BUILD_DIR)
267 list(APPEND CMAKE_PREFIX_PATH ${${APP_NAME_UC}_BUILD_DIR}/build)
268endif()
diff --git a/project/cmake/scripts/common/archsetup.cmake b/project/cmake/scripts/common/ArchSetup.cmake
index dff5558..438e3bd 100644
--- a/project/cmake/scripts/common/archsetup.cmake
+++ b/project/cmake/scripts/common/ArchSetup.cmake
@@ -71,15 +71,33 @@ if(CMAKE_TOOLCHAIN_FILE)
71 endif() 71 endif()
72endif() 72endif()
73 73
74# While CMAKE_CROSSCOMPILING is set unconditionally if there's a toolchain file,
75# this variable is set if we can execute build artefacts on the host system (for example unit tests).
76if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL CMAKE_SYSTEM_PROCESSOR AND
77 CMAKE_HOST_SYSTEM_NAME STREQUAL CMAKE_SYSTEM_NAME)
78 set(CORE_HOST_IS_TARGET TRUE)
79else()
80 set(CORE_HOST_IS_TARGET FALSE)
81endif()
82
74# Main cpp 83# Main cpp
75set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp) 84set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp)
76 85
77# system specific arch setup 86# system specific arch setup
78include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/archsetup.cmake) 87if(NOT EXISTS ${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake)
88 message(FATAL_ERROR "Couldn't find configuration for '${CORE_SYSTEM_NAME}' "
89 "Either the platform is not (yet) supported "
90 "or a toolchain file has to be specified. "
91 "Consult ${CMAKE_SOURCE_DIR}/README.md for instructions. "
92 "Note: Specifying a toolchain requires a clean build directory!")
93endif()
94include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake)
79 95
80message(STATUS "Core system type: ${CORE_SYSTEM_NAME}") 96message(STATUS "Core system type: ${CORE_SYSTEM_NAME}")
81message(STATUS "Platform: ${PLATFORM}") 97message(STATUS "Platform: ${PLATFORM}")
82message(STATUS "CPU: ${CPU}, ARCH: ${ARCH}") 98message(STATUS "CPU: ${CPU}, ARCH: ${ARCH}")
99message(STATUS "Cross-Compiling: ${CMAKE_CROSSCOMPILING}")
100message(STATUS "Execute build artefacts on host: ${CORE_HOST_IS_TARGET}")
83 101
84check_type(string std::u16string HAVE_STD__U16_STRING) 102check_type(string std::u16string HAVE_STD__U16_STRING)
85check_type(string std::u32string HAVE_STD__U32_STRING) 103check_type(string std::u32string HAVE_STD__U32_STRING)
@@ -87,6 +105,7 @@ check_type(string char16_t HAVE_CHAR16_T)
87check_type(string char32_t HAVE_CHAR32_T) 105check_type(string char32_t HAVE_CHAR32_T)
88check_type(stdint.h uint_least16_t HAVE_STDINT_H) 106check_type(stdint.h uint_least16_t HAVE_STDINT_H)
89check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE) 107check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE)
108check_symbol_exists(PRIdMAX inttypes.h HAVE_INTTYPES_H)
90check_builtin("long* temp=0; long ret=__sync_add_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_ADD_AND_FETCH) 109check_builtin("long* temp=0; long ret=__sync_add_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_ADD_AND_FETCH)
91check_builtin("long* temp=0; long ret=__sync_sub_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_SUB_AND_FETCH) 110check_builtin("long* temp=0; long ret=__sync_sub_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_SUB_AND_FETCH)
92check_builtin("long* temp=0; long ret=__sync_val_compare_and_swap(temp, 1, 1)" HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP) 111check_builtin("long* temp=0; long ret=__sync_val_compare_and_swap(temp, 1, 1)" HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP)
@@ -97,3 +116,35 @@ check_function_exists(localtime_r HAVE_LOCALTIME_R)
97if(HAVE_LOCALTIME_R) 116if(HAVE_LOCALTIME_R)
98 list(APPEND SYSTEM_DEFINES -DHAVE_LOCALTIME_R=1) 117 list(APPEND SYSTEM_DEFINES -DHAVE_LOCALTIME_R=1)
99endif() 118endif()
119if(HAVE_INTTYPES_H)
120 list(APPEND SYSTEM_DEFINES -DHAVE_INTTYPES_H=1)
121endif()
122
123find_package(SSE)
124foreach(_sse SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX AVX2)
125 if(${${_sse}_FOUND})
126 # enable SSE versions up to 4.1 by default, if available
127 if(NOT ${_sse} MATCHES "AVX" AND NOT ${_sse} STREQUAL "SSE4_2")
128 option(ENABLE_${_sse} "Enable ${_sse}" ON)
129 else()
130 option(ENABLE_${_sse} "Enable ${_sse}" OFF)
131 endif()
132 endif()
133 if(ENABLE_${_sse})
134 set(HAVE_${_sse} TRUE CACHE STRING "${_sse} enabled")
135 list(APPEND ARCH_DEFINES -DHAVE_${_sse}=1)
136 endif()
137endforeach()
138
139if(NOT DEFINED NEON OR NEON)
140 option(ENABLE_NEON "Enable NEON optimization" ${NEON})
141 if(ENABLE_NEON)
142 message(STATUS "NEON optimization enabled")
143 add_options(CXX ALL_BUILDS "-mfpu=neon -mvectorize-with-neon-quad")
144 endif()
145endif()
146
147if(CMAKE_BUILD_TYPE STREQUAL "Debug")
148 add_options (ALL_LANGUAGES DEBUG "-g" "-D_DEBUG" "-Wall")
149endif()
150
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 @@
1# This file contains functions that support the debugging of the CMake files.
2
3# This file shouldn't be included per default in any CMake file. It should be
4# included and used only on demand. All functions are prefixed with "debug_".
5#
6# Usage:
7# include(scripts/common/CMakeHelpers.cmake)
8# debug_print_variables()
9
10# Print all CMake variables.
11macro(debug_print_variables)
12 get_cmake_property(_variableNames VARIABLES)
13 foreach(_variableName ${_variableNames})
14 message(STATUS "${_variableName} = ${${_variableName}}")
15 endforeach()
16endmacro()
17
18# Get all properties that CMake supports and convert them to a list.
19function(debug_get_properties VAR)
20 execute_process(COMMAND cmake --help-property-list
21 OUTPUT_VARIABLE _properties)
22 string(REGEX REPLACE ";" "\\\\;" _properties "${_properties}")
23 string(REGEX REPLACE "\n" ";" _properties "${_properties}")
24 list(REMOVE_DUPLICATES _properties)
25 list(REMOVE_ITEM _properties LOCATION)
26 set(${VAR} ${_properties} PARENT_SCOPE)
27endfunction()
28
29# List all properties.
30function(debug_list_properties)
31 debug_get_properties(_properties)
32 message("CMake properties = ${_properties}")
33endfunction()
34
35# Print all set properties of a specified target.
36function(debug_print_target_properties target)
37 if(NOT TARGET ${target})
38 message(FATAL_ERROR "There is no target named '${target}'")
39 endif()
40
41 debug_get_properties(_properties)
42
43 # Reading LOCATION property is deprecated and triggers a fatal error.
44 string(REGEX REPLACE ";LOCATION;|LOCATION" "" _properties "${_properties}")
45 string(REGEX REPLACE "<CONFIG>" "${CMAKE_BUILD_TYPE}" _properties
46 "${_properties}")
47 foreach(_property ${_properties})
48 get_property(_value TARGET ${target} PROPERTY ${_property} SET)
49 if(_value)
50 get_target_property(_value ${target} ${_property})
51 message("${target} ${_property} = ${_value}")
52 endif()
53 endforeach()
54endfunction()
diff --git a/project/cmake/scripts/common/checkcommits.cmake b/project/cmake/scripts/common/CheckCommits.cmake
index 304e623..304e623 100644
--- a/project/cmake/scripts/common/checkcommits.cmake
+++ b/project/cmake/scripts/common/CheckCommits.cmake
diff --git a/project/cmake/scripts/common/check_target_platform.cmake b/project/cmake/scripts/common/CheckTargetPlatform.cmake
index fc8b403..5b5d9a1 100644
--- a/project/cmake/scripts/common/check_target_platform.cmake
+++ b/project/cmake/scripts/common/CheckTargetPlatform.cmake
@@ -9,7 +9,7 @@ function(check_target_platform dir target_platform build)
9 if(EXISTS ${dir} AND EXISTS ${dir}/platforms.txt) 9 if(EXISTS ${dir} AND EXISTS ${dir}/platforms.txt)
10 # get all the specified platforms 10 # get all the specified platforms
11 file(STRINGS ${dir}/platforms.txt platforms) 11 file(STRINGS ${dir}/platforms.txt platforms)
12 separate_arguments(platforms) 12 string(REPLACE " " ";" platforms ${platforms})
13 13
14 # check if the addon/dependency should be built for the current platform 14 # check if the addon/dependency should be built for the current platform
15 foreach(platform ${platforms}) 15 foreach(platform ${platforms})
@@ -21,11 +21,11 @@ function(check_target_platform dir target_platform build)
21 if(${platform_first} STREQUAL "!") 21 if(${platform_first} STREQUAL "!")
22 # extract the platform 22 # extract the platform
23 string(LENGTH ${platform} platform_length) 23 string(LENGTH ${platform} platform_length)
24 MATH(EXPR platform_length "${platform_length} - 1") 24 math(EXPR platform_length "${platform_length} - 1")
25 string(SUBSTRING ${platform} 1 ${platform_length} platform) 25 string(SUBSTRING ${platform} 1 ${platform_length} platform)
26 26
27 # check if the current platform does not match the extracted platform 27 # check if the current platform does not match the extracted platform
28 if (NOT ${platform} STREQUAL ${target_platform}) 28 if(NOT ${platform} STREQUAL ${target_platform})
29 set(${build} TRUE) 29 set(${build} TRUE)
30 endif() 30 endif()
31 endif() 31 endif()
@@ -43,19 +43,21 @@ function(check_install_permissions install_dir have_perms)
43 # param[in] install_dir directory to check for write permissions 43 # param[in] install_dir directory to check for write permissions
44 # param[out] have_perms wether we have permissions to install to install_dir 44 # param[out] have_perms wether we have permissions to install to install_dir
45 45
46 set(${have_perms} TRUE) 46 set(testfile_lib ${install_dir}/lib/kodi/.cmake-inst-test)
47 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}/lib/kodi 47 set(testfile_share ${install_dir}/share/kodi/.cmake-inst-test)
48 COMMAND ${CMAKE_COMMAND} -E make_directory ${install_dir}/share/kodi 48 get_filename_component(testdir_lib ${testfile_lib} DIRECTORY)
49 COMMAND ${CMAKE_COMMAND} -E touch ${install_dir}/lib/kodi/.cmake-inst-test ${install_dir}/share/kodi/.cmake-inst-test 49 get_filename_component(testdir_share ${testfile_share} DIRECTORY)
50 RESULT_VARIABLE permtest)
51 50
52 if(${permtest} GREATER 0) 51 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${testdir_lib})
53 message(STATUS "check_install_permissions: ${permtest}") 52 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${testdir_share})
54 set(${have_perms} FALSE) 53 execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${testfile_lib})
55 endif() 54 execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${testfile_share})
56 set(${have_perms} "${${have_perms}}" PARENT_SCOPE)
57 55
58 if(EXISTS ${install_dir}/lib/kodi/.cmake-inst-test OR EXISTS ${install_dir}/share/kodi/.cmake-inst-test) 56 if(EXISTS ${testfile_lib} AND EXISTS ${testfile_share})
59 file(REMOVE ${install_dir}/lib/kodi/.cmake-inst-test ${install_dir}/share/kodi/.cmake-inst-test) 57 set(${have_perms} True PARENT_SCOPE)
58 else()
59 message(STATUS "check_install_permissions ${install_dir}: failed to create files")
60 set(${have_perms} False PARENT_SCOPE)
60 endif() 61 endif()
62 file(REMOVE ${testfile_lib} ${testfile_share})
61endfunction() 63endfunction()
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 @@
1include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake)
2
3core_find_versions()
4file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/xbmc.addon)
5file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/kodi.guilib)
6
7# configure_file without dependency tracking
8# configure_file would register additional file dependencies that interfere
9# with the ones from add_custom_command (and the generation would happen twice)
10function(generate_versioned_file _SRC _DEST)
11 file(READ ${CORE_SOURCE_DIR}/${_SRC} file_content)
12 string(CONFIGURE "${file_content}" file_content @ONLY)
13 file(WRITE ${CMAKE_BINARY_DIR}/${_DEST} "${file_content}")
14endfunction()
15
16generate_versioned_file(addons/xbmc.addon/addon.xml.in addons/xbmc.addon/addon.xml)
17generate_versioned_file(addons/kodi.guilib/addon.xml.in addons/kodi.guilib/addon.xml)
18generate_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
index 75083ca..304b504 100644
--- a/project/cmake/scripts/common/generatorsetup.cmake
+++ b/project/cmake/scripts/common/GeneratorSetup.cmake
@@ -22,3 +22,28 @@ else()
22 set(CORE_BUILD_CONFIG ${CMAKE_BUILD_TYPE}) 22 set(CORE_BUILD_CONFIG ${CMAKE_BUILD_TYPE})
23 message(STATUS "Generator: Single-configuration: ${CMAKE_BUILD_TYPE} (${CMAKE_GENERATOR})") 23 message(STATUS "Generator: Single-configuration: ${CMAKE_BUILD_TYPE} (${CMAKE_GENERATOR})")
24endif() 24endif()
25
26# Print CMake version
27message(STATUS "CMake Version: ${CMAKE_VERSION}")
28
29# Deal with CMake special cases
30if(CMAKE_VERSION VERSION_EQUAL 3.5.1)
31 message(WARNING "CMake 3.5.1 introduced a crash during configuration. "
32 "Please consider upgrading to 3.5.2 (cmake.org/Bug/view.php?id=16044)")
33endif()
34
35# Darwin needs CMake 3.4
36if(APPLE AND CMAKE_VERSION VERSION_LESS 3.4)
37 message(WARNING "Build on Darwin requires CMake 3.4 or later (tdb library support) "
38 "or the usage of the patched version in depends.")
39endif()
40
41# Windows needs CMake 3.6 (VS_STARTUP_PROJECT)
42if(WIN32 AND CMAKE_VERSION VERSION_LESS 3.6)
43 message(FATAL_ERROR "Build on Windows needs CMake 3.6 or later")
44endif()
45
46# Ninja needs CMake 3.2 due to ExternalProject BUILD_BYPRODUCTS usage
47if(CMAKE_GENERATOR STREQUAL Ninja AND CMAKE_VERSION VERSION_LESS 3.2)
48 message(FATAL_ERROR "Generator: Ninja requires CMake 3.2 or later")
49endif()
diff --git a/project/cmake/scripts/common/handle-depends.cmake b/project/cmake/scripts/common/HandleDepends.cmake
index 4d78928..880ccdf 100644
--- a/project/cmake/scripts/common/handle-depends.cmake
+++ b/project/cmake/scripts/common/HandleDepends.cmake
@@ -1,15 +1,17 @@
1include(${APP_ROOT}/project/cmake/scripts/common/check_target_platform.cmake) 1include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckTargetPlatform.cmake)
2 2
3# handle addon depends 3# handle addon depends
4function(add_addon_depends addon searchpath) 4function(add_addon_depends addon searchpath)
5 # input: string addon string searchpath 5 # input: string addon string searchpath
6 6
7 set(OUTPUT_DIR ${DEPENDS_PATH}) 7 set(OUTPUT_DIR ${ADDON_DEPENDS_PATH})
8 # look for platform-specific dependencies
8 file(GLOB_RECURSE cmake_input_files ${searchpath}/${CORE_SYSTEM_NAME}/*.txt) 9 file(GLOB_RECURSE cmake_input_files ${searchpath}/${CORE_SYSTEM_NAME}/*.txt)
9 file(GLOB_RECURSE cmake_input_files2 ${searchpath}/common/*.txt) 10 file(GLOB_RECURSE cmake_input_files2 ${searchpath}/common/*.txt)
10 list(APPEND cmake_input_files ${cmake_input_files2}) 11 list(APPEND cmake_input_files ${cmake_input_files2})
11 12
12 foreach(file ${cmake_input_files}) 13 foreach(file ${cmake_input_files})
14 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${file})
13 if(NOT (file MATCHES CMakeLists.txt OR 15 if(NOT (file MATCHES CMakeLists.txt OR
14 file MATCHES install.txt OR 16 file MATCHES install.txt OR
15 file MATCHES noinstall.txt OR 17 file MATCHES noinstall.txt OR
@@ -18,9 +20,9 @@ function(add_addon_depends addon searchpath)
18 file MATCHES platforms.txt)) 20 file MATCHES platforms.txt))
19 message(STATUS "Processing ${file}") 21 message(STATUS "Processing ${file}")
20 file(STRINGS ${file} def) 22 file(STRINGS ${file} def)
21 separate_arguments(def) 23 string(REPLACE " " ";" def ${def})
22 list(LENGTH def deflength) 24 list(LENGTH def deflength)
23 get_filename_component(dir ${file} PATH) 25 get_filename_component(dir ${file} DIRECTORY)
24 26
25 # get the id of the dependency 27 # get the id of the dependency
26 if(NOT "${def}" STREQUAL "") 28 if(NOT "${def}" STREQUAL "")
@@ -45,8 +47,9 @@ function(add_addon_depends addon searchpath)
45 47
46 # check if there are any library specific flags that need to be passed on 48 # check if there are any library specific flags that need to be passed on
47 if(EXISTS ${dir}/flags.txt) 49 if(EXISTS ${dir}/flags.txt)
50 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/flags.txt)
48 file(STRINGS ${dir}/flags.txt extraflags) 51 file(STRINGS ${dir}/flags.txt extraflags)
49 separate_arguments(extraflags) 52 string(REPLACE " " ";" extraflags ${extraflags})
50 message(STATUS "${id} extraflags: ${extraflags}") 53 message(STATUS "${id} extraflags: ${extraflags}")
51 endif() 54 endif()
52 55
@@ -70,16 +73,20 @@ function(add_addon_depends addon searchpath)
70 73
71 if(CMAKE_TOOLCHAIN_FILE) 74 if(CMAKE_TOOLCHAIN_FILE)
72 list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) 75 list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
73 MESSAGE("toolchain specified") 76 message("toolchain specified")
74 MESSAGE(${BUILD_ARGS}) 77 message(${BUILD_ARGS})
75 endif() 78 endif()
76 79
77 # if there's a CMakeLists.txt use it to prepare the build 80 # prepare patchfile. ensure we have a clean file after reconfiguring
78 set(PATCH_FILE ${BUILD_DIR}/${id}/tmp/patch.cmake) 81 set(PATCH_FILE ${BUILD_DIR}/${id}/tmp/patch.cmake)
82 file(REMOVE ${PATCH_FILE})
83
84 # if there's a CMakeLists.txt use it to prepare the build
79 if(EXISTS ${dir}/CMakeLists.txt) 85 if(EXISTS ${dir}/CMakeLists.txt)
86 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/CMakeLists.txt)
80 file(APPEND ${PATCH_FILE} 87 file(APPEND ${PATCH_FILE}
81 "file(COPY ${dir}/CMakeLists.txt 88 "file(COPY ${dir}/CMakeLists.txt
82 DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") 89 DESTINATION ${BUILD_DIR}/${id}/src/${id})\n")
83 endif() 90 endif()
84 91
85 # check if we have patches to apply 92 # check if we have patches to apply
@@ -104,6 +111,7 @@ function(add_addon_depends addon searchpath)
104 endif() 111 endif()
105 endif() 112 endif()
106 113
114 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${patch})
107 file(APPEND ${PATCH_FILE} 115 file(APPEND ${PATCH_FILE}
108 "execute_process(COMMAND ${PATCH_PROGRAM} -p1 -i \"${patch}\")\n") 116 "execute_process(COMMAND ${PATCH_PROGRAM} -p1 -i \"${patch}\")\n")
109 endforeach() 117 endforeach()
@@ -125,6 +133,7 @@ function(add_addon_depends addon searchpath)
125 133
126 # check if there's a deps.txt containing dependencies on other libraries 134 # check if there's a deps.txt containing dependencies on other libraries
127 if(EXISTS ${dir}/deps.txt) 135 if(EXISTS ${dir}/deps.txt)
136 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${dir}/deps.txt)
128 file(STRINGS ${dir}/deps.txt deps) 137 file(STRINGS ${dir}/deps.txt deps)
129 message(STATUS "${id} depends: ${deps}") 138 message(STATUS "${id} depends: ${deps}")
130 else() 139 else()
@@ -133,6 +142,7 @@ function(add_addon_depends addon searchpath)
133 142
134 if(CROSS_AUTOCONF AND AUTOCONF_FILES) 143 if(CROSS_AUTOCONF AND AUTOCONF_FILES)
135 foreach(afile ${AUTOCONF_FILES}) 144 foreach(afile ${AUTOCONF_FILES})
145 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${afile})
136 file(APPEND ${PATCH_FILE} 146 file(APPEND ${PATCH_FILE}
137 "message(STATUS \"AUTOCONF: copying ${afile} to ${BUILD_DIR}/${id}/src/${id}\")\n 147 "message(STATUS \"AUTOCONF: copying ${afile} to ${BUILD_DIR}/${id}/src/${id}\")\n
138 file(COPY ${afile} DESTINATION ${BUILD_DIR}/${id}/src/${id})\n") 148 file(COPY ${afile} DESTINATION ${BUILD_DIR}/${id}/src/${id})\n")
@@ -141,7 +151,7 @@ function(add_addon_depends addon searchpath)
141 151
142 # if the patch file exists we need to set the PATCH_COMMAND 152 # if the patch file exists we need to set the PATCH_COMMAND
143 set(PATCH_COMMAND "") 153 set(PATCH_COMMAND "")
144 if (EXISTS ${PATCH_FILE}) 154 if(EXISTS ${PATCH_FILE})
145 set(PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_FILE}) 155 set(PATCH_COMMAND ${CMAKE_COMMAND} -P ${PATCH_FILE})
146 endif() 156 endif()
147 157
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 @@
1# This script holds the main functions used to construct the build system
2
3# include system specific macros
4include(${CORE_SOURCE_DIR}/project/cmake/scripts/${CORE_SYSTEM_NAME}/Macros.cmake)
5
6# IDEs: Group source files in target in folders (file system hierarchy)
7# Source: http://blog.audio-tk.com/2015/09/01/sorting-source-files-and-projects-in-folders-with-cmake-and-visual-studioxcode/
8# Arguments:
9# target The target that shall be grouped by folders.
10# Optional Arguments:
11# RELATIVE allows to specify a different reference folder.
12function(source_group_by_folder target)
13 if(NOT TARGET ${target})
14 message(FATAL_ERROR "There is no target named '${target}'")
15 endif()
16
17 set(SOURCE_GROUP_DELIMITER "/")
18
19 cmake_parse_arguments(arg "" "RELATIVE" "" ${ARGN})
20 if(arg_RELATIVE)
21 set(relative_dir ${arg_RELATIVE})
22 else()
23 set(relative_dir ${CMAKE_CURRENT_SOURCE_DIR})
24 endif()
25
26 get_property(files TARGET ${target} PROPERTY SOURCES)
27 if(files)
28 list(SORT files)
29
30 if(CMAKE_GENERATOR STREQUAL Xcode)
31 set_target_properties(${target} PROPERTIES SOURCES "${files}")
32 endif()
33 endif()
34 foreach(file ${files})
35 if(NOT IS_ABSOLUTE ${file})
36 set(file ${CMAKE_CURRENT_SOURCE_DIR}/${file})
37 endif()
38 file(RELATIVE_PATH relative_file ${relative_dir} ${file})
39 get_filename_component(dir "${relative_file}" DIRECTORY)
40 if(NOT dir STREQUAL "${last_dir}")
41 if(files)
42 source_group("${last_dir}" FILES ${files})
43 endif()
44 set(files "")
45 endif()
46 set(files ${files} ${file})
47 set(last_dir "${dir}")
48 endforeach(file)
49 if(files)
50 source_group("${last_dir}" FILES ${files})
51 endif()
52endfunction()
53
54# Add sources to main application
55# Arguments:
56# name name of the library to add
57# Implicit arguments:
58# ENABLE_STATIC_LIBS Build static libraries per directory
59# SOURCES the sources of the library
60# HEADERS the headers of the library (only for IDE support)
61# OTHERS other library related files (only for IDE support)
62# On return:
63# Library will be built, optionally added to ${core_DEPENDS}
64# Sets CORE_LIBRARY for calls for setting target specific options
65function(core_add_library name)
66 if(ENABLE_STATIC_LIBS)
67 add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS})
68 set_target_properties(${name} PROPERTIES PREFIX "")
69 set(core_DEPENDS ${name} ${core_DEPENDS} CACHE STRING "" FORCE)
70 add_dependencies(${name} libcpluff ffmpeg dvdnav crossguid)
71 set(CORE_LIBRARY ${name} PARENT_SCOPE)
72
73 # Add precompiled headers to Kodi main libraries
74 if(CORE_SYSTEM_NAME STREQUAL windows)
75 add_precompiled_header(${name} pch.h ${CORE_SOURCE_DIR}/xbmc/platform/win32/pch.cpp PCH_TARGET kodi)
76 set_language_cxx(${name})
77 target_link_libraries(${name} PUBLIC effects11)
78 endif()
79 else()
80 foreach(src IN LISTS SOURCES HEADERS OTHERS)
81 get_filename_component(src_path "${src}" ABSOLUTE)
82 list(APPEND FILES ${src_path})
83 endforeach()
84 target_sources(lib${APP_NAME_LC} PRIVATE ${FILES})
85 set(CORE_LIBRARY lib${APP_NAME_LC} PARENT_SCOPE)
86 endif()
87endfunction()
88
89# Add a test library, and add sources to list for gtest integration macros
90function(core_add_test_library name)
91 if(ENABLE_STATIC_LIBS)
92 add_library(${name} STATIC ${SOURCES} ${SUPPORTED_SOURCES} ${HEADERS} ${OTHERS})
93 set_target_properties(${name} PROPERTIES PREFIX ""
94 EXCLUDE_FROM_ALL 1
95 FOLDER "Build Utilities/tests")
96 add_dependencies(${name} libcpluff ffmpeg dvdnav crossguid)
97 set(test_archives ${test_archives} ${name} CACHE STRING "" FORCE)
98 endif()
99 foreach(src IN LISTS SOURCES)
100 get_filename_component(src_path "${src}" ABSOLUTE)
101 set(test_sources "${src_path}" ${test_sources} CACHE STRING "" FORCE)
102 endforeach()
103endfunction()
104
105# Add an addon callback library
106# Arguments:
107# name name of the library to add
108# Implicit arguments:
109# SOURCES the sources of the library
110# HEADERS the headers of the library (only for IDE support)
111# OTHERS other library related files (only for IDE support)
112# On return:
113# Library target is defined and added to LIBRARY_FILES
114function(core_add_addon_library name)
115 get_filename_component(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} NAME)
116 list(APPEND SOURCES lib${name}.cpp)
117 core_add_shared_library(${name} OUTPUT_DIRECTORY addons/${DIRECTORY})
118 set_target_properties(${name} PROPERTIES FOLDER addons)
119 target_include_directories(${name} PRIVATE
120 ${CMAKE_CURRENT_SOURCE_DIR}
121 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi
122 ${CORE_SOURCE_DIR}/xbmc)
123endfunction()
124
125# Add an dl-loaded shared library
126# Arguments:
127# name name of the library to add
128# Optional arguments:
129# WRAPPED wrap this library on POSIX platforms to add VFS support for
130# libraries that would otherwise not support it.
131# OUTPUT_DIRECTORY where to create the library in the build dir
132# (default: system)
133# Implicit arguments:
134# SOURCES the sources of the library
135# HEADERS the headers of the library (only for IDE support)
136# OTHERS other library related files (only for IDE support)
137# On return:
138# Library target is defined and added to LIBRARY_FILES
139function(core_add_shared_library name)
140 cmake_parse_arguments(arg "WRAPPED" "OUTPUT_DIRECTORY" "" ${ARGN})
141 if(arg_OUTPUT_DIRECTORY)
142 set(OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY})
143 else()
144 if(NOT CORE_SYSTEM_NAME STREQUAL windows)
145 set(OUTPUT_DIRECTORY system)
146 endif()
147 endif()
148 if(CORE_SYSTEM_NAME STREQUAL windows)
149 set(OUTPUT_NAME lib${name})
150 else()
151 set(OUTPUT_NAME lib${name}-${ARCH})
152 endif()
153
154 if(NOT arg_WRAPPED OR CORE_SYSTEM_NAME STREQUAL windows)
155 add_library(${name} SHARED ${SOURCES} ${HEADERS} ${OTHERS})
156 set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}
157 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}
158 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}
159 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}
160 OUTPUT_NAME ${OUTPUT_NAME} PREFIX "")
161
162 set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${OUTPUT_DIRECTORY}/${OUTPUT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} CACHE STRING "" FORCE)
163 add_dependencies(${APP_NAME_LC}-libraries ${name})
164 else()
165 add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS})
166 set_target_properties(${name} PROPERTIES POSITION_INDEPENDENT_CODE 1)
167 core_link_library(${name} ${OUTPUT_DIRECTORY}/lib${name})
168 endif()
169endfunction()
170
171# Sets the compile language for all C source files in a target to CXX.
172# Needs to be called from the CMakeLists.txt that defines the target.
173# Arguments:
174# target target
175function(set_language_cxx target)
176 get_property(sources TARGET ${target} PROPERTY SOURCES)
177 foreach(file IN LISTS sources)
178 if(file MATCHES "\.c$")
179 set_source_files_properties(${file} PROPERTIES LANGUAGE CXX)
180 endif()
181 endforeach()
182endfunction()
183
184# Add a data file to installation list with a mirror in build tree
185# Mirroring files in the buildtree allows to execute the app from there.
186# Arguments:
187# file full path to file to mirror
188# Optional Arguments:
189# NO_INSTALL: exclude file from installation target (only mirror)
190# DIRECTORY: directory where the file should be mirrored to
191# (default: preserve tree structure relative to CORE_SOURCE_DIR)
192# On return:
193# Files is mirrored to the build tree and added to ${install_data}
194# (if NO_INSTALL is not given).
195function(copy_file_to_buildtree file)
196 cmake_parse_arguments(arg "NO_INSTALL" "DIRECTORY" "" ${ARGN})
197 if(arg_DIRECTORY)
198 set(outdir ${arg_DIRECTORY})
199 get_filename_component(outfile ${file} NAME)
200 set(outfile ${outdir}/${outfile})
201 else()
202 string(REPLACE "${CORE_SOURCE_DIR}/" "" outfile ${file})
203 get_filename_component(outdir ${outfile} DIRECTORY)
204 endif()
205
206 if(NOT TARGET export-files)
207 file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake)
208 add_custom_target(export-files ALL COMMENT "Copying files into build tree"
209 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake)
210 set_target_properties(export-files PROPERTIES FOLDER "Build Utilities")
211 file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake "# Export files to build tree\n")
212 endif()
213
214 # Exclude autotools build artefacts and other blacklisted files in source tree.
215 if(file MATCHES "(Makefile|\.in|\.xbt|\.so|\.dylib|\.gitignore)$")
216 if(VERBOSE)
217 message(STATUS "copy_file_to_buildtree - ignoring file: ${file}")
218 endif()
219 return()
220 endif()
221
222 if(NOT file STREQUAL ${CMAKE_BINARY_DIR}/${outfile})
223 if(VERBOSE)
224 message(STATUS "copy_file_to_buildtree - copying file: ${file} -> ${CMAKE_BINARY_DIR}/${outfile}")
225 endif()
226 file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake
227 "file(COPY \"${file}\" DESTINATION \"${CMAKE_BINARY_DIR}/${outdir}\")\n")
228 endif()
229
230 if(NOT arg_NO_INSTALL)
231 list(APPEND install_data ${outfile})
232 set(install_data ${install_data} PARENT_SCOPE)
233 endif()
234endfunction()
235
236# Add data files to installation list with a mirror in build tree.
237# reads list of files to install from a given list of text files.
238# Arguments:
239# pattern globbing pattern for text files to read
240# Optional Arguments:
241# NO_INSTALL: exclude files from installation target
242# Implicit arguments:
243# CORE_SOURCE_DIR - root of source tree
244# On return:
245# Files are mirrored to the build tree and added to ${install_data}
246# (if NO_INSTALL is not given).
247function(copy_files_from_filelist_to_buildtree pattern)
248 # copies files listed in text files to the buildtree
249 # Input: [glob pattern: filepattern]
250 cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN})
251 list(APPEND pattern ${ARGN})
252 list(SORT pattern)
253 if(VERBOSE)
254 message(STATUS "copy_files_from_filelist_to_buildtree - got pattern: ${pattern}")
255 endif()
256 foreach(pat ${pattern})
257 file(GLOB filenames ${pat})
258 foreach(filename ${filenames})
259 string(STRIP ${filename} filename)
260 core_file_read_filtered(fstrings ${filename})
261 foreach(dir ${fstrings})
262 string(REPLACE " " ";" dir ${dir})
263 list(GET dir 0 src)
264 list(LENGTH dir len)
265 if(len EQUAL 1)
266 set(dest)
267 else()
268 list(GET dir -1 dest)
269 endif()
270
271 # If the full path to an existing file is specified then add that single file.
272 # Don't recursively add all files with the given name.
273 if(EXISTS ${CORE_SOURCE_DIR}/${src} AND NOT IS_DIRECTORY ${CORE_SOURCE_DIR}/${src})
274 set(files ${src})
275 else()
276 file(GLOB_RECURSE files RELATIVE ${CORE_SOURCE_DIR} ${CORE_SOURCE_DIR}/${src})
277 endif()
278
279 foreach(file ${files})
280 if(arg_NO_INSTALL)
281 copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} DIRECTORY ${dest} NO_INSTALL)
282 else()
283 copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} DIRECTORY ${dest})
284 endif()
285 endforeach()
286 endforeach()
287 endforeach()
288 endforeach()
289 set(install_data ${install_data} PARENT_SCOPE)
290endfunction()
291
292# helper macro to set modified variables in parent scope
293macro(export_dep)
294 set(SYSTEM_INCLUDES ${SYSTEM_INCLUDES} PARENT_SCOPE)
295 set(DEPLIBS ${DEPLIBS} PARENT_SCOPE)
296 set(DEP_DEFINES ${DEP_DEFINES} PARENT_SCOPE)
297 set(${depup}_FOUND ${${depup}_FOUND} PARENT_SCOPE)
298 mark_as_advanced(${depup}_LIBRARIES)
299endmacro()
300
301# add a required dependency of main application
302# Arguments:
303# dep name of find rule for dependency, used uppercased for variable prefix
304# On return:
305# dependency added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES}
306function(core_require_dep dep)
307 find_package(${dep} REQUIRED)
308 string(TOUPPER ${dep} depup)
309 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
310 list(APPEND DEPLIBS ${${depup}_LIBRARIES})
311 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
312 export_dep()
313endfunction()
314
315# add a required dyloaded dependency of main application
316# Arguments:
317# dep name of find rule for dependency, used uppercased for variable prefix
318# On return:
319# dependency added to ${SYSTEM_INCLUDES}, ${dep}_SONAME is set up
320function(core_require_dyload_dep dep)
321 find_package(${dep} REQUIRED)
322 string(TOUPPER ${dep} depup)
323 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
324 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
325 find_soname(${depup} REQUIRED)
326 export_dep()
327 set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE)
328endfunction()
329
330# helper macro for optional deps
331macro(setup_enable_switch)
332 string(TOUPPER ${dep} depup)
333 if(ARGV1)
334 set(enable_switch ${ARGV1})
335 else()
336 set(enable_switch ENABLE_${depup})
337 endif()
338 # normal options are boolean, so we override set our ENABLE_FOO var to allow "auto" handling
339 set(${enable_switch} "AUTO" CACHE STRING "Enable ${depup} support?")
340endmacro()
341
342# add an optional dependency of main application
343# Arguments:
344# dep name of find rule for dependency, used uppercased for variable prefix
345# On return:
346# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES}
347function(core_optional_dep dep)
348 setup_enable_switch()
349 if(${enable_switch} STREQUAL AUTO)
350 find_package(${dep})
351 elseif(${${enable_switch}})
352 find_package(${dep} REQUIRED)
353 endif()
354
355 if(${depup}_FOUND)
356 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
357 list(APPEND DEPLIBS ${${depup}_LIBRARIES})
358 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
359 set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE)
360 export_dep()
361 else()
362 set(final_message ${final_message} "${depup} enabled: No" PARENT_SCOPE)
363 endif()
364endfunction()
365
366# add an optional dyloaded dependency of main application
367# Arguments:
368# dep name of find rule for dependency, used uppercased for variable prefix
369# On return:
370# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEP_DEFINES}, ${dep}_SONAME is set up
371function(core_optional_dyload_dep dep)
372 setup_enable_switch()
373 if(${enable_switch})
374 find_package(${dep})
375 if(${depup}_FOUND)
376 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
377 find_soname(${depup} REQUIRED)
378 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
379 set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE)
380 export_dep()
381 set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE)
382 endif()
383 endif()
384endfunction()
385
386function(core_file_read_filtered result filepattern)
387 # Reads STRINGS from text files
388 # with comments filtered out
389 # Result: [list: result]
390 # Input: [glob pattern: filepattern]
391 file(GLOB filenames ${filepattern})
392 list(SORT filenames)
393 foreach(filename ${filenames})
394 if(VERBOSE)
395 message(STATUS "core_file_read_filtered - filename: ${filename}")
396 endif()
397 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${filename})
398 file(STRINGS ${filename} fstrings REGEX "^[^#//]")
399 foreach(fstring ${fstrings})
400 string(REGEX REPLACE "^(.*)#(.*)" "\\1" fstring ${fstring})
401 string(REGEX REPLACE "[ \n\r\t]//.*" "" fstring ${fstring})
402 string(STRIP ${fstring} fstring)
403 list(APPEND filename_strings ${fstring})
404 endforeach()
405 endforeach()
406 set(${result} ${filename_strings} PARENT_SCOPE)
407endfunction()
408
409function(core_add_subdirs_from_filelist files)
410 # Adds subdirectories from a sorted list of files
411 # Input: [list: filenames] [bool: sort]
412 foreach(arg ${ARGN})
413 list(APPEND files ${arg})
414 endforeach()
415 list(SORT files)
416 if(VERBOSE)
417 message(STATUS "core_add_subdirs_from_filelist - got pattern: ${files}")
418 endif()
419 foreach(filename ${files})
420 string(STRIP ${filename} filename)
421 core_file_read_filtered(fstrings ${filename})
422 foreach(subdir ${fstrings})
423 string(REPLACE " " ";" subdir ${subdir})
424 list(GET subdir 0 subdir_src)
425 list(GET subdir -1 subdir_dest)
426 if(VERBOSE)
427 message(STATUS " core_add_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}/${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}")
428 endif()
429 add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest})
430 endforeach()
431 endforeach()
432endfunction()
433
434macro(core_add_optional_subdirs_from_filelist pattern)
435 # Adds subdirectories from text files
436 # if the option(s) in the 3rd field are enabled
437 # Input: [glob pattern: filepattern]
438 foreach(arg ${ARGN})
439 list(APPEND pattern ${arg})
440 endforeach()
441 foreach(elem ${pattern})
442 string(STRIP ${elem} elem)
443 list(APPEND filepattern ${elem})
444 endforeach()
445
446 file(GLOB filenames ${filepattern})
447 list(SORT filenames)
448 if(VERBOSE)
449 message(STATUS "core_add_optional_subdirs_from_filelist - got pattern: ${filenames}")
450 endif()
451
452 foreach(filename ${filenames})
453 if(VERBOSE)
454 message(STATUS "core_add_optional_subdirs_from_filelist - reading file: ${filename}")
455 endif()
456 set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${filename})
457 file(STRINGS ${filename} fstrings REGEX "^[^#//]")
458 foreach(line ${fstrings})
459 string(REPLACE " " ";" line "${line}")
460 list(GET line 0 subdir_src)
461 list(GET line 1 subdir_dest)
462 list(GET line 3 opts)
463 foreach(opt ${opts})
464 if(ENABLE_${opt})
465 if(VERBOSE)
466 message(STATUS " core_add_optional_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}/${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}")
467 endif()
468 add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest})
469 else()
470 if(VERBOSE)
471 message(STATUS " core_add_optional_subdirs_from_filelist: OPTION ${opt} not enabled for ${subdir_src}, skipping subdir")
472 endif()
473 endif()
474 endforeach()
475 endforeach()
476 endforeach()
477endmacro()
478
479# Generates an RFC2822 timestamp
480#
481# The following variable is set:
482# RFC2822_TIMESTAMP
483function(rfc2822stamp)
484 execute_process(COMMAND date -R
485 OUTPUT_VARIABLE RESULT)
486 set(RFC2822_TIMESTAMP ${RESULT} PARENT_SCOPE)
487endfunction()
488
489# Generates an user stamp from git config info
490#
491# The following variable is set:
492# PACKAGE_MAINTAINER - user stamp in the form of "username <username@example.com>"
493# if no git tree is found, value is set to "nobody <nobody@example.com>"
494function(userstamp)
495 find_package(Git)
496 if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git)
497 execute_process(COMMAND ${GIT_EXECUTABLE} config user.name
498 OUTPUT_VARIABLE username
499 WORKING_DIRECTORY ${CORE_SOURCE_DIR}
500 OUTPUT_STRIP_TRAILING_WHITESPACE)
501 execute_process(COMMAND ${GIT_EXECUTABLE} config user.email
502 OUTPUT_VARIABLE useremail
503 WORKING_DIRECTORY ${CORE_SOURCE_DIR}
504 OUTPUT_STRIP_TRAILING_WHITESPACE)
505 set(PACKAGE_MAINTAINER "${username} <${useremail}>" PARENT_SCOPE)
506 else()
507 set(PACKAGE_MAINTAINER "nobody <nobody@example.com>" PARENT_SCOPE)
508 endif()
509endfunction()
510
511# Parses git info and sets variables used to identify the build
512# Arguments:
513# stamp variable name to return
514# Optional Arguments:
515# FULL: generate git HEAD commit in the form of 'YYYYMMDD-hash'
516# if git tree is dirty, value is set in the form of 'YYYYMMDD-hash-dirty'
517# if no git tree is found, value is set in the form of 'YYYYMMDD-nogitfound'
518# if FULL is not given, stamp is generated following the same process as above
519# but without 'YYYYMMDD'
520# On return:
521# Variable is set with generated stamp to PARENT_SCOPE
522function(core_find_git_rev stamp)
523 # allow manual setting GIT_VERSION
524 if(GIT_VERSION)
525 set(${stamp} ${GIT_VERSION} PARENT_SCOPE)
526 else()
527 find_package(Git)
528 if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git)
529 execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet --
530 RESULT_VARIABLE status_code
531 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
532 if(NOT status_code)
533 execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --ignore-submodules --quiet HEAD --
534 RESULT_VARIABLE status_code
535 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
536 endif()
537 if(status_code)
538 execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h-dirty" HEAD
539 OUTPUT_VARIABLE HASH
540 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
541 string(SUBSTRING ${HASH} 1 13 HASH)
542 else()
543 execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h" HEAD
544 OUTPUT_VARIABLE HASH
545 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
546 string(SUBSTRING ${HASH} 1 7 HASH)
547 endif()
548 execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%cd" --date=short HEAD
549 OUTPUT_VARIABLE DATE
550 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
551 string(SUBSTRING ${DATE} 1 10 DATE)
552 string(REPLACE "-" "" DATE ${DATE})
553 else()
554 string(TIMESTAMP DATE "%Y%m%d" UTC)
555 set(HASH "nogitfound")
556 endif()
557 cmake_parse_arguments(arg "FULL" "" "" ${ARGN})
558 if(arg_FULL)
559 set(${stamp} ${DATE}-${HASH} PARENT_SCOPE)
560 else()
561 set(${stamp} ${HASH} PARENT_SCOPE)
562 endif()
563 endif()
564endfunction()
565
566# Parses version.txt and libKODI_guilib.h and sets variables
567# used to construct dirs structure, file naming, API version, etc.
568#
569# The following variables are set from version.txt:
570# APP_NAME - app name
571# APP_NAME_LC - lowercased app name
572# APP_NAME_UC - uppercased app name
573# COMPANY_NAME - company name
574# APP_VERSION_MAJOR - the app version major
575# APP_VERSION_MINOR - the app version minor
576# APP_VERSION_TAG - the app version tag
577# APP_VERSION_TAG_LC - lowercased app version tag
578# APP_VERSION - the app version (${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}-${APP_VERSION_TAG})
579# APP_ADDON_API - the addon API version in the form of 16.9.702
580# FILE_VERSION - file version in the form of 16,9,702,0 - Windows only
581#
582# The following variables are set from libKODI_guilib.h:
583# guilib_version - current ADDONGUI API version
584# guilib_version_min - minimal ADDONGUI API version
585macro(core_find_versions)
586 include(CMakeParseArguments)
587 core_file_read_filtered(version_list ${CORE_SOURCE_DIR}/version.txt)
588 string(REPLACE " " ";" version_list "${version_list}")
589 cmake_parse_arguments(APP "" "APP_NAME;COMPANY_NAME;WEBSITE;VERSION_MAJOR;VERSION_MINOR;VERSION_TAG;VERSION_CODE;ADDON_API" "" ${version_list})
590
591 set(APP_NAME ${APP_APP_NAME}) # inconsistency but APP_APP_NAME looks weird
592 string(TOLOWER ${APP_APP_NAME} APP_NAME_LC)
593 string(TOUPPER ${APP_APP_NAME} APP_NAME_UC)
594 set(COMPANY_NAME ${APP_COMPANY_NAME})
595 set(APP_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR})
596 if(APP_VERSION_TAG)
597 set(APP_VERSION ${APP_VERSION}-${APP_VERSION_TAG})
598 endif()
599 string(REPLACE "." "," FILE_VERSION ${APP_ADDON_API}.0)
600 string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC)
601 file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version REGEX "^.*GUILIB_API_VERSION (.*)$")
602 string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version ${guilib_version})
603 file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version_min REGEX "^.*GUILIB_MIN_API_VERSION (.*)$")
604 string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version_min ${guilib_version_min})
605 # unset variables not used anywhere else
606 unset(version_list)
607 unset(APP_APP_NAME)
608
609 # bail if we can't parse version.txt
610 if(NOT DEFINED APP_VERSION_MAJOR OR NOT DEFINED APP_VERSION_MINOR)
611 message(FATAL_ERROR "Could not determine app version! Make sure that ${CORE_SOURCE_DIR}/version.txt exists")
612 endif()
613
614 # bail if we can't parse libKODI_guilib.h
615 if(NOT DEFINED guilib_version OR NOT DEFINED guilib_version_min)
616 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")
617 endif()
618endmacro()
619
diff --git a/project/cmake/scripts/common/prepare-env.cmake b/project/cmake/scripts/common/PrepareEnv.cmake
index 8e9bd1c..8e02382 100644
--- a/project/cmake/scripts/common/prepare-env.cmake
+++ b/project/cmake/scripts/common/PrepareEnv.cmake
@@ -1,25 +1,6 @@
1# parse version.txt to get the version info 1# parse version.txt and libKODI_guilib.h to get the version and API info
2if(EXISTS "${APP_ROOT}/version.txt") 2include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake)
3 file(STRINGS "${APP_ROOT}/version.txt" versions) 3core_find_versions()
4 foreach (version ${versions})
5 if(version MATCHES "^VERSION_.*")
6 string(REGEX MATCH "^[^ ]+" version_name ${version})
7 string(REPLACE "${version_name} " "" version_value ${version})
8 set(APP_${version_name} "${version_value}")
9 else()
10 string(REGEX MATCH "^[^ ]+" name ${version})
11 string(REPLACE "${name} " "" value ${version})
12 set(${name} "${value}")
13 endif()
14 endforeach()
15 string(TOLOWER ${APP_NAME} APP_NAME_LC)
16 string(TOUPPER ${APP_NAME} APP_NAME_UC)
17endif()
18
19# bail if we can't parse versions
20if(NOT DEFINED APP_VERSION_MAJOR OR NOT DEFINED APP_VERSION_MINOR)
21 message(FATAL_ERROR "Could not determine app version! make sure that ${APP_ROOT}/version.txt exists")
22endif()
23 4
24# in case we need to download something, set KODI_MIRROR to the default if not alread set 5# in case we need to download something, set KODI_MIRROR to the default if not alread set
25if(NOT DEFINED KODI_MIRROR) 6if(NOT DEFINED KODI_MIRROR)
@@ -28,24 +9,19 @@ endif()
28 9
29### copy all the addon binding header files to include/kodi 10### copy all the addon binding header files to include/kodi
30# make sure include/kodi exists and is empty 11# make sure include/kodi exists and is empty
31set(APP_LIB_DIR ${DEPENDS_PATH}/lib/${APP_NAME_LC}) 12set(APP_LIB_DIR ${ADDON_DEPENDS_PATH}/lib/${APP_NAME_LC})
32if(NOT EXISTS "${APP_LIB_DIR}/") 13if(NOT EXISTS "${APP_LIB_DIR}/")
33 file(MAKE_DIRECTORY ${APP_LIB_DIR}) 14 file(MAKE_DIRECTORY ${APP_LIB_DIR})
34endif() 15endif()
35 16
36set(APP_INCLUDE_DIR ${DEPENDS_PATH}/include/${APP_NAME_LC}) 17set(APP_DATA_DIR ${ADDON_DEPENDS_PATH}/share/${APP_NAME_LC})
37if(NOT EXISTS "${APP_INCLUDE_DIR}/") 18if(NOT EXISTS "${APP_DATA_DIR}/")
38 file(MAKE_DIRECTORY ${APP_INCLUDE_DIR}) 19 file(MAKE_DIRECTORY ${APP_DATA_DIR})
39endif() 20endif()
40 21
41# we still need XBMC_INCLUDE_DIR and XBMC_LIB_DIR for backwards compatibility to xbmc 22set(APP_INCLUDE_DIR ${ADDON_DEPENDS_PATH}/include/${APP_NAME_LC})
42set(XBMC_LIB_DIR ${DEPENDS_PATH}/lib/xbmc) 23if(NOT EXISTS "${APP_INCLUDE_DIR}/")
43if(NOT EXISTS "${XBMC_LIB_DIR}/") 24 file(MAKE_DIRECTORY ${APP_INCLUDE_DIR})
44 file(MAKE_DIRECTORY ${XBMC_LIB_DIR})
45endif()
46set(XBMC_INCLUDE_DIR ${DEPENDS_PATH}/include/xbmc)
47if(NOT EXISTS "${XBMC_INCLUDE_DIR}/")
48 file(MAKE_DIRECTORY ${XBMC_INCLUDE_DIR})
49endif() 25endif()
50 26
51# make sure C++11 is always set 27# make sure C++11 is always set
@@ -56,42 +32,23 @@ if(NOT WIN32)
56 endif() 32 endif()
57endif() 33endif()
58 34
59# generate the proper kodi-config.cmake file 35# generate the proper KodiConfig.cmake file
60configure_file(${APP_ROOT}/project/cmake/kodi-config.cmake.in ${APP_LIB_DIR}/kodi-config.cmake @ONLY) 36configure_file(${CORE_SOURCE_DIR}/project/cmake/KodiConfig.cmake.in ${APP_LIB_DIR}/KodiConfig.cmake @ONLY)
61 37
62# copy cmake helpers to lib/kodi 38# copy cmake helpers to lib/kodi
63file(COPY ${APP_ROOT}/project/cmake/scripts/common/addon-helpers.cmake 39file(COPY ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddonHelpers.cmake
64 ${APP_ROOT}/project/cmake/scripts/common/addoptions.cmake 40 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddOptions.cmake
65 DESTINATION ${APP_LIB_DIR}) 41 DESTINATION ${APP_LIB_DIR})
66 42
67# generate xbmc-config.cmake for backwards compatibility to xbmc
68configure_file(${APP_ROOT}/project/cmake/xbmc-config.cmake.in ${XBMC_LIB_DIR}/xbmc-config.cmake @ONLY)
69
70### copy all the addon binding header files to include/kodi 43### copy all the addon binding header files to include/kodi
71# parse addon-bindings.mk to get the list of header files to copy 44# parse addon-bindings.mk to get the list of header files to copy
72file(STRINGS ${APP_ROOT}/xbmc/addons/addon-bindings.mk bindings) 45core_file_read_filtered(bindings ${CORE_SOURCE_DIR}/xbmc/addons/addon-bindings.mk)
73string(REPLACE "\n" ";" bindings "${bindings}")
74foreach(binding ${bindings}) 46foreach(binding ${bindings})
75 string(REPLACE " =" ";" binding "${binding}") 47 string(REPLACE " =" ";" binding "${binding}")
76 string(REPLACE "+=" ";" binding "${binding}") 48 string(REPLACE "+=" ";" binding "${binding}")
77 list(GET binding 1 header) 49 list(GET binding 1 header)
78 # copy the header file to include/kodi 50 # copy the header file to include/kodi
79 file(COPY ${APP_ROOT}/${header} DESTINATION ${APP_INCLUDE_DIR}) 51 configure_file(${CORE_SOURCE_DIR}/${header} ${APP_INCLUDE_DIR} COPYONLY)
80
81 # auto-generate header files for backwards compatibility to xbmc with deprecation warning
82 # but only do it if the file doesn't already exist
83 get_filename_component(headerfile ${header} NAME)
84 if (NOT EXISTS "${XBMC_INCLUDE_DIR}/${headerfile}")
85 file(WRITE ${XBMC_INCLUDE_DIR}/${headerfile}
86"#pragma once
87#define DEPRECATION_WARNING \"Including xbmc/${headerfile} has been deprecated, please use kodi/${headerfile}\"
88#ifdef _MSC_VER
89 #pragma message(\"WARNING: \" DEPRECATION_WARNING)
90#else
91 #warning DEPRECATION_WARNING
92#endif
93#include \"kodi/${headerfile}\"")
94 endif()
95endforeach() 52endforeach()
96 53
97### on windows we need a "patch" binary to be able to patch 3rd party sources 54### on windows we need a "patch" binary to be able to patch 3rd party sources
@@ -125,12 +82,12 @@ if(WIN32)
125 endif() 82 endif()
126 83
127 # copy patch.exe into the output directory 84 # copy patch.exe into the output directory
128 file(INSTALL ${PATCH_BINARY_PATH} DESTINATION ${DEPENDS_PATH}/bin) 85 file(INSTALL ${PATCH_BINARY_PATH} DESTINATION ${ADDON_DEPENDS_PATH}/bin)
129 86
130 # make sure that cmake can find the copied patch.exe 87 # make sure that cmake can find the copied patch.exe
131 find_program(PATCH_FOUND NAMES patch patch.exe) 88 find_program(PATCH_FOUND NAMES patch patch.exe)
132 if(NOT PATCH_FOUND) 89 if(NOT PATCH_FOUND)
133 message(FATAL_ERROR "ERROR installing patch utility from ${PATCH_BINARY_PATH} to ${DEPENDS_PATH}/bin") 90 message(FATAL_ERROR "ERROR installing patch utility from ${PATCH_BINARY_PATH} to ${ADDON_DEPENDS_PATH}/bin")
134 endif() 91 endif()
135 endif() 92 endif()
136endif() 93endif()
diff --git a/project/cmake/scripts/common/projectmacros.cmake b/project/cmake/scripts/common/ProjectMacros.cmake
index 7ce4ee9..e73ef90 100644
--- a/project/cmake/scripts/common/projectmacros.cmake
+++ b/project/cmake/scripts/common/ProjectMacros.cmake
@@ -8,7 +8,7 @@
8# xbt is added to ${XBT_FILES} 8# xbt is added to ${XBT_FILES}
9function(pack_xbt input output) 9function(pack_xbt input output)
10 file(GLOB_RECURSE MEDIA_FILES ${input}/*) 10 file(GLOB_RECURSE MEDIA_FILES ${input}/*)
11 get_filename_component(dir ${output} PATH) 11 get_filename_component(dir ${output} DIRECTORY)
12 add_custom_command(OUTPUT ${output} 12 add_custom_command(OUTPUT ${output}
13 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} 13 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
14 COMMAND TexturePacker::TexturePacker 14 COMMAND TexturePacker::TexturePacker
@@ -23,18 +23,17 @@ endfunction()
23# Add a skin to installation list, mirroring it in build tree, packing textures 23# Add a skin to installation list, mirroring it in build tree, packing textures
24# Arguments: 24# Arguments:
25# skin skin directory 25# skin skin directory
26# relative relative base path in build tree
27# On return: 26# On return:
28# xbt is added to ${XBT_FILES}, data added to ${install_data}, mirror in build tree 27# xbt is added to ${XBT_FILES}, data added to ${install_data}, mirror in build tree
29function(copy_skin_to_buildtree skin relative) 28function(copy_skin_to_buildtree skin)
30 file(GLOB_RECURSE FILES ${skin}/*) 29 file(GLOB_RECURSE FILES ${skin}/*)
31 file(GLOB_RECURSE MEDIA_FILES ${skin}/media/*) 30 file(GLOB_RECURSE MEDIA_FILES ${skin}/media/*)
32 list(REMOVE_ITEM FILES ${MEDIA_FILES}) 31 list(REMOVE_ITEM FILES ${MEDIA_FILES})
33 foreach(file ${FILES}) 32 foreach(file ${FILES})
34 copy_file_to_buildtree(${file} ${relative}) 33 copy_file_to_buildtree(${file})
35 endforeach() 34 endforeach()
36 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${dest}/media) 35 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${dest}/media)
37 string(REPLACE "${relative}/" "" dest ${skin}) 36 string(REPLACE "${CORE_SOURCE_DIR}/" "" dest ${skin})
38 pack_xbt(${skin}/media ${CMAKE_BINARY_DIR}/${dest}/media/Textures.xbt) 37 pack_xbt(${skin}/media ${CMAKE_BINARY_DIR}/${dest}/media/Textures.xbt)
39 38
40 file(GLOB THEMES RELATIVE ${skin}/themes ${skin}/themes/*) 39 file(GLOB THEMES RELATIVE ${skin}/themes ${skin}/themes/*)
@@ -54,6 +53,9 @@ function(GTEST_ADD_TESTS executable extra_args)
54 message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS") 53 message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS")
55 endif() 54 endif()
56 foreach(source ${ARGN}) 55 foreach(source ${ARGN})
56 # This assumes that every source file passed in exists. Consider using
57 # SUPPORT_SOURCES for source files which do not contain tests and might
58 # have to be generated.
57 file(READ "${source}" contents) 59 file(READ "${source}" contents)
58 string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) 60 string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents})
59 foreach(hit ${found_tests}) 61 foreach(hit ${found_tests})
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 @@
1# Uninstall target
2set(MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt)
3if(EXISTS ${MANIFEST})
4 file(STRINGS ${MANIFEST} files)
5 foreach(file IN LISTS files)
6 if(EXISTS $ENV{DESTDIR}${file})
7 message(STATUS "Uninstalling: ${file}")
8 execute_process(
9 COMMAND ${CMAKE_COMMAND} -E remove $ENV{DESTDIR}${file}
10 OUTPUT_VARIABLE rm_out
11 RESULT_VARIABLE rm_retval
12 )
13 if(NOT "${rm_retval}" STREQUAL 0)
14 message(FATAL_ERROR "Failed to remove file: $ENV{DESTDIR}${file}")
15 endif()
16 else()
17 message(STATUS "File does not exist: $ENV{DESTDIR}${file}")
18 endif()
19 endforeach(file)
20else()
21 message(STATUS "Cannot find install manifest: '${MANIFEST}'")
22endif()
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 @@
1# Workaround for the fact that cpack's filenames are not customizable.
2# Each add-on is added as a separate component to facilitate zip/tgz packaging.
3# The filenames are always of the form basename-component, which is
4# incompatible with the addonid-version scheme we want. This hack renames
5# the files from the file names generated by the 'package' target.
6# Sadly we cannot extend the 'package' target, as it is a builtin target, see
7# http://public.kitware.com/Bug/view.php?id=8438
8# Thus, we have to add an 'addon-package' target.
9add_custom_target(addon-package
10 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target package)
11
12macro(add_cpack_workaround target version ext)
13 if(NOT PACKAGE_DIR)
14 set(PACKAGE_DIR "${CMAKE_INSTALL_PREFIX}/zips")
15 endif()
16
17 add_custom_command(TARGET addon-package PRE_BUILD
18 COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIR}
19 COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_PACKAGE_DIRECTORY}/addon-${target}-${version}.${ext} ${PACKAGE_DIR}/${target}-${version}.${ext})
20endmacro()
21
22# Grab the version from a given add-on's addon.xml
23macro (addon_version dir prefix)
24 IF(EXISTS ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in)
25 FILE(READ ${PROJECT_SOURCE_DIR}/${dir}/addon.xml.in ADDONXML)
26 ELSE()
27 FILE(READ ${dir}/addon.xml ADDONXML)
28 ENDIF()
29
30 STRING(REGEX MATCH "<addon[^>]*version.?=.?.[0-9\\.]+" VERSION_STRING ${ADDONXML})
31 STRING(REGEX REPLACE ".*version=.([0-9\\.]+).*" "\\1" ${prefix}_VERSION ${VERSION_STRING})
32 message(STATUS ${prefix}_VERSION=${${prefix}_VERSION})
33endmacro()
34
35# Build, link and optionally package an add-on
36macro (build_addon target prefix libs)
37 ADD_LIBRARY(${target} ${${prefix}_SOURCES})
38 TARGET_LINK_LIBRARIES(${target} ${${libs}})
39 addon_version(${target} ${prefix})
40 SET_TARGET_PROPERTIES(${target} PROPERTIES VERSION ${${prefix}_VERSION}
41 SOVERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR}
42 PREFIX "")
43 IF(OS STREQUAL "android")
44 SET_TARGET_PROPERTIES(${target} PROPERTIES PREFIX "lib")
45 ENDIF(OS STREQUAL "android")
46
47 # get the library's location
48 SET(LIBRARY_LOCATION $<TARGET_FILE:${target}>)
49 # get the library's filename
50 if("${CORE_SYSTEM_NAME}" STREQUAL "android")
51 # for android we need the filename without any version numbers
52 set(LIBRARY_FILENAME $<TARGET_LINKER_FILE_NAME:${target}>)
53 else()
54 SET(LIBRARY_FILENAME $<TARGET_FILE_NAME:${target}>)
55 endif()
56
57 # if there's an addon.xml.in we need to generate the addon.xml
58 IF(EXISTS ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in)
59 SET(PLATFORM ${CORE_SYSTEM_NAME})
60
61 FILE(READ ${PROJECT_SOURCE_DIR}/${target}/addon.xml.in addon_file)
62 STRING(CONFIGURE "${addon_file}" addon_file_conf @ONLY)
63 FILE(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}")
64 ENDIF()
65
66 # set zip as default if addon-package is called without PACKAGE_XXX
67 SET(CPACK_GENERATOR "ZIP")
68 SET(ext "zip")
69 IF(PACKAGE_ZIP OR PACKAGE_TGZ)
70 IF(PACKAGE_TGZ)
71 SET(CPACK_GENERATOR "TGZ")
72 SET(ext "tar.gz")
73 ENDIF(PACKAGE_TGZ)
74 SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
75 set(CPACK_PACKAGE_FILE_NAME addon)
76 IF(CMAKE_BUILD_TYPE STREQUAL "Release")
77 SET(CPACK_STRIP_FILES TRUE)
78 ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release")
79 set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
80 set(CPACK_COMPONENTS_IGNORE_GROUPS 1)
81 list(APPEND CPACK_COMPONENTS_ALL ${target}-${${prefix}_VERSION})
82 # Pack files together to create an archive
83 INSTALL(DIRECTORY ${target} DESTINATION ./ COMPONENT ${target}-${${prefix}_VERSION} PATTERN "addon.xml.in" EXCLUDE)
84 IF(WIN32)
85 if(NOT CPACK_PACKAGE_DIRECTORY)
86 # determine the temporary path
87 file(TO_CMAKE_PATH "$ENV{TEMP}" WIN32_TEMP_PATH)
88 string(LENGTH "${WIN32_TEMP_PATH}" WIN32_TEMP_PATH_LENGTH)
89 string(LENGTH "${PROJECT_BINARY_DIR}" PROJECT_BINARY_DIR_LENGTH)
90
91 # check if the temporary path is shorter than the default packaging directory path
92 if(WIN32_TEMP_PATH_LENGTH GREATER 0 AND WIN32_TEMP_PATH_LENGTH LESS PROJECT_BINARY_DIR_LENGTH)
93 # set the directory used by CPack for packaging to the temp directory
94 set(CPACK_PACKAGE_DIRECTORY ${WIN32_TEMP_PATH})
95 endif()
96 endif()
97
98 # in case of a VC++ project the installation location contains a $(Configuration) VS variable
99 # we replace it with ${CMAKE_BUILD_TYPE} (which doesn't cover the case when the build configuration
100 # is changed within Visual Studio)
101 string(REPLACE "$(Configuration)" "${CMAKE_BUILD_TYPE}" LIBRARY_LOCATION "${LIBRARY_LOCATION}")
102
103 # install the generated DLL file
104 INSTALL(PROGRAMS ${LIBRARY_LOCATION} DESTINATION ${target}
105 COMPONENT ${target}-${${prefix}_VERSION})
106
107 IF(CMAKE_BUILD_TYPE MATCHES Debug)
108 # for debug builds also install the PDB file
109 get_filename_component(LIBRARY_DIR ${LIBRARY_LOCATION} DIRECTORY)
110 INSTALL(FILES $<TARGET_PDB_FILE:${target}> DESTINATION ${target}
111 COMPONENT ${target}-${${prefix}_VERSION})
112 ENDIF()
113 ELSE(WIN32)
114 if(NOT CPACK_PACKAGE_DIRECTORY)
115 set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR})
116 endif()
117 INSTALL(TARGETS ${target} DESTINATION ${target}
118 COMPONENT ${target}-${${prefix}_VERSION})
119 ENDIF(WIN32)
120 add_cpack_workaround(${target} ${${prefix}_VERSION} ${ext})
121 ELSE(PACKAGE_ZIP OR PACKAGE_TGZ)
122 if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
123 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR NOT CMAKE_INSTALL_PREFIX)
124 message(STATUS "setting install paths to match ${APP_NAME}: CMAKE_INSTALL_PREFIX: ${${APP_NAME_UC}_PREFIX}")
125 set(CMAKE_INSTALL_PREFIX "${${APP_NAME_UC}_PREFIX}" CACHE PATH "${APP_NAME} install prefix" FORCE)
126 set(CMAKE_INSTALL_LIBDIR "${${APP_NAME_UC}_LIB_DIR}" CACHE PATH "${APP_NAME} install libdir" FORCE)
127 elseif(NOT CMAKE_INSTALL_PREFIX STREQUAL "${${APP_NAME_UC}_PREFIX}" AND NOT OVERRIDE_PATHS)
128 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")
129 else()
130 if(NOT CMAKE_INSTALL_LIBDIR)
131 set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib/${APP_NAME_LC}")
132 endif()
133 endif()
134 else()
135 set(CMAKE_INSTALL_LIBDIR "lib/${APP_NAME_LC}")
136 endif()
137 INSTALL(TARGETS ${target} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target})
138 INSTALL(DIRECTORY ${target} DESTINATION share/${APP_NAME_LC}/addons PATTERN "addon.xml.in" EXCLUDE)
139 ENDIF(PACKAGE_ZIP OR PACKAGE_TGZ)
140endmacro()
141
142# finds a path to a given file (recursive)
143function (kodi_find_path var_name filename search_path strip_file)
144 file(GLOB_RECURSE PATH_TO_FILE ${search_path} ${filename})
145 if(strip_file)
146 string(REPLACE ${filename} "" PATH_TO_FILE ${PATH_TO_FILE})
147 endif(strip_file)
148 set (${var_name} ${PATH_TO_FILE} PARENT_SCOPE)
149endfunction()
150
151# Cmake build options
152include(addoptions)
153include(TestCXXAcceptsFlag)
154OPTION(PACKAGE_ZIP "Package Zip file?" OFF)
155OPTION(PACKAGE_TGZ "Package TGZ file?" OFF)
156OPTION(BUILD_SHARED_LIBS "Build shared libs?" ON)
157
158# LTO support?
159CHECK_CXX_ACCEPTS_FLAG("-flto" HAVE_LTO)
160IF(HAVE_LTO)
161 OPTION(USE_LTO "use link time optimization" OFF)
162 IF(USE_LTO)
163 add_options(ALL_LANGUAGES ALL_BUILDS "-flto")
164 ENDIF(USE_LTO)
165ENDIF(HAVE_LTO)
166
167# set this to try linking dependencies as static as possible
168IF(ADDONS_PREFER_STATIC_LIBS)
169 SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
170ENDIF(ADDONS_PREFER_STATIC_LIBS)
171
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 @@
1# - Add options without repeating them on the command line
2#
3# Synopsis:
4#
5# add_options (lang build opts)
6#
7# where:
8#
9# lang Name of the language whose compiler should receive the
10# options, e.g. CXX. If a comma-separated list is received
11# then the option is added for all those languages. Use the
12# special value ALL_LANGUAGES for these languages: CXX, C
13# and Fortran
14#
15# build Kind of build to which this options should apply,
16# such as DEBUG and RELEASE. This can also be a comma-
17# separated list. Use the special value ALL_BUILDS to apply
18# to all builds.
19#
20# opts List of options to add. Each should be quoted.
21#
22# Example:
23#
24# add_options (CXX RELEASE "-O3" "-DNDEBUG" "-Wall")
25
26function (add_options langs builds)
27 # special handling of empty language specification
28 if ("${langs}" STREQUAL "ALL_LANGUAGES")
29 set (langs CXX C Fortran)
30 endif ("${langs}" STREQUAL "ALL_LANGUAGES")
31 foreach (lang IN LISTS langs)
32 # prepend underscore if necessary
33 foreach (build IN LISTS builds)
34 if (NOT ("${build}" STREQUAL "ALL_BUILDS"))
35 set (_bld "_${build}")
36 string (TOUPPER "${_bld}" _bld)
37 else (NOT ("${build}" STREQUAL "ALL_BUILDS"))
38 set (_bld "")
39 endif (NOT ("${build}" STREQUAL "ALL_BUILDS"))
40 foreach (_opt IN LISTS ARGN)
41 set (_var "CMAKE_${lang}_FLAGS${_bld}")
42 #message (STATUS "Adding \"${_opt}\" to \${${_var}}")
43 # remove it first
44 string (REPLACE "${_opt}" "" _without "${${_var}}")
45 string (STRIP "${_without}" _without)
46 # we need to strip this one as well, so they are comparable
47 string (STRIP "${${_var}}" _stripped)
48 # if it wasn't there, then add it at the end
49 if ("${_without}" STREQUAL "${_stripped}")
50 # don't add any extra spaces if no options yet are set
51 if (NOT ${_stripped} STREQUAL "")
52 set (${_var} "${_stripped} ${_opt}")
53 else (NOT ${_stripped} STREQUAL "")
54 set (${_var} "${_opt}")
55 endif (NOT ${_stripped} STREQUAL "")
56 set (${_var} "${${_var}}" PARENT_SCOPE)
57 endif ("${_without}" STREQUAL "${_stripped}")
58 endforeach (_opt)
59 endforeach (build)
60 endforeach (lang)
61endfunction (add_options lang build)
62
63# set varname to flag unless user has specified something that matches regex
64function (set_default_option varname flag regex)
65 if (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}"
66 AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}"
67 AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
68 set (${varname} ${flag} PARENT_SCOPE)
69 else (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}"
70 AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}"
71 AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
72 set (${varname} PARENT_SCOPE)
73 endif (NOT "$ENV{CXXFLAGS}" MATCHES "${regex}"
74 AND NOT "${CMAKE_CXX_FLAGS}" MATCHES "${regex}"
75 AND NOT "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
76endfunction (set_default_option)
77
78# note: this must be called before project()
79macro (no_default_options)
80 # prevent the platform probe to set options
81 set (CMAKE_NOT_USING_CONFIG_FLAGS TRUE)
82endmacro (no_default_options)
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 @@
1include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/macros.cmake)
2
3core_find_versions()
4file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/xbmc.addon)
5file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/addons/kodi.guilib)
6configure_file(${CORE_SOURCE_DIR}/addons/xbmc.addon/addon.xml.in
7 ${CMAKE_BINARY_DIR}/addons/xbmc.addon/addon.xml @ONLY)
8configure_file(${CORE_SOURCE_DIR}/addons/kodi.guilib/addon.xml.in
9 ${CMAKE_BINARY_DIR}/addons/kodi.guilib/addon.xml @ONLY)
10configure_file(${CORE_SOURCE_DIR}/xbmc/CompileInfo.cpp.in
11 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/xbmc/CompileInfo.cpp @ONLY)
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 @@
1# This script holds the main functions used to construct the build system
2
3# include system specific macros
4include(${CORE_SOURCE_DIR}/project/cmake/scripts/${CORE_SYSTEM_NAME}/macros.cmake)
5
6# Add a library, optionally as a dependency of the main application
7# Arguments:
8# name name of the library to add
9# Optional Arguments:
10# NO_MAIN_DEPENDS if specified, the library is not added to main depends
11# Implicit arguments:
12# SOURCES the sources of the library
13# HEADERS the headers of the library (only for IDE support)
14# OTHERS other library related files (only for IDE support)
15# On return:
16# Library will be built, optionally added to ${core_DEPENDS}
17function(core_add_library name)
18 cmake_parse_arguments(arg "NO_MAIN_DEPENDS" "" "" ${ARGN})
19
20 if(NOT SOURCES)
21 message(STATUS "No sources added to ${name} skipping")
22 return()
23 endif()
24
25 add_library(${name} STATIC ${SOURCES} ${HEADERS} ${OTHERS})
26 set_target_properties(${name} PROPERTIES PREFIX "")
27 if(NOT arg_NO_MAIN_DEPENDS)
28 set(core_DEPENDS ${name} ${core_DEPENDS} CACHE STRING "" FORCE)
29 endif()
30
31 # Add precompiled headers to Kodi main libraries
32 if(WIN32 AND "${CMAKE_CURRENT_LIST_DIR}" MATCHES "^${CORE_SOURCE_DIR}/xbmc")
33 add_precompiled_header(${name} pch.h ${CORE_SOURCE_DIR}/xbmc/win32/pch.cpp
34 PCH_TARGET kodi)
35 endif()
36
37 # IDE support
38 if(CMAKE_GENERATOR MATCHES "Xcode")
39 file(RELATIVE_PATH parentfolder ${CORE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..)
40 set_target_properties(${name} PROPERTIES FOLDER "${parentfolder}")
41 elseif(CMAKE_GENERATOR MATCHES "Visual Studio")
42 file(RELATIVE_PATH foldername ${CORE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
43 set_target_properties(${name} PROPERTIES FOLDER "${foldername}")
44 source_group(" " REGULAR_EXPRESSION ".*")
45 endif()
46endfunction()
47
48# Add a test library, and add sources to list for gtest integration macros
49function(core_add_test_library name)
50 core_add_library(${name} NO_MAIN_DEPENDS)
51 set_target_properties(${name} PROPERTIES EXCLUDE_FROM_ALL 1)
52 foreach(src ${SOURCES})
53 set(test_sources ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${test_sources} CACHE STRING "" FORCE)
54 endforeach()
55 set(test_archives ${test_archives} ${name} CACHE STRING "" FORCE)
56endfunction()
57
58# Add a data file to installation list with a mirror in build tree
59# Arguments:
60# file full path to file to mirror
61# relative the relative base of file path in the build/install tree
62# Optional Arguments:
63# NO_INSTALL: exclude file from installation target
64# Implicit arguments:
65# CORE_SOURCE_DIR - root of source tree
66# On return:
67# Files is mirrored to the build tree and added to ${install_data}
68# (if NO_INSTALL is not given).
69function(copy_file_to_buildtree file relative)
70 cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN})
71 string(REPLACE "${relative}/" "" outfile ${file})
72 get_filename_component(outdir ${outfile} DIRECTORY)
73
74 if(NOT TARGET export-files)
75 file(REMOVE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake)
76 add_custom_target(export-files ALL COMMENT "Copying files into build tree"
77 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake)
78 endif()
79 if(NOT ${CORE_SOURCE_DIR} MATCHES ${CMAKE_BINARY_DIR})
80 if(VERBOSE)
81 message(STATUS "copy_file_to_buildtree - copying file: ${file} -> ${CMAKE_BINARY_DIR}/${outfile}")
82 endif()
83 file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake
84 "file(COPY \"${file}\" DESTINATION \"${CMAKE_BINARY_DIR}/${outdir}\")\n")
85 endif()
86 if(NOT arg_NO_INSTALL)
87 list(APPEND install_data ${outfile})
88 set(install_data ${install_data} PARENT_SCOPE)
89 endif()
90endfunction()
91
92# Add data files to installation list with a mirror in build tree.
93# reads list of files to install from a given list of text files.
94# Arguments:
95# pattern globbing pattern for text files to read
96# Optional Arguments:
97# NO_INSTALL: exclude files from installation target
98# Implicit arguments:
99# CORE_SOURCE_DIR - root of source tree
100# On return:
101# Files are mirrored to the build tree and added to ${install_data}
102# (if NO_INSTALL is not given).
103function(copy_files_from_filelist_to_buildtree pattern)
104 # copies files listed in text files to the buildtree
105 # Input: [glob pattern: filepattern]
106 cmake_parse_arguments(arg "NO_INSTALL" "" "" ${ARGN})
107 list(APPEND pattern ${ARGN})
108 list(SORT pattern)
109 if(VERBOSE)
110 message(STATUS "copy_files_from_filelist_to_buildtree - got pattern: ${pattern}")
111 endif()
112 foreach(pat ${pattern})
113 file(GLOB filenames ${pat})
114 foreach(filename ${filenames})
115 string(STRIP ${filename} filename)
116 core_file_read_filtered(fstrings ${filename})
117 foreach(dir ${fstrings})
118 file(GLOB_RECURSE files RELATIVE ${CORE_SOURCE_DIR} ${CORE_SOURCE_DIR}/${dir})
119 foreach(file ${files})
120 if(arg_NO_INSTALL)
121 copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} ${CORE_SOURCE_DIR} NO_INSTALL)
122 else()
123 copy_file_to_buildtree(${CORE_SOURCE_DIR}/${file} ${CORE_SOURCE_DIR})
124 endif()
125 endforeach()
126 endforeach()
127 endforeach()
128 endforeach()
129 set(install_data ${install_data} PARENT_SCOPE)
130endfunction()
131
132# helper macro to set modified variables in parent scope
133macro(export_dep)
134 set(SYSTEM_INCLUDES ${SYSTEM_INCLUDES} PARENT_SCOPE)
135 set(DEPLIBS ${DEPLIBS} PARENT_SCOPE)
136 set(DEP_DEFINES ${DEP_DEFINES} PARENT_SCOPE)
137 set(${depup}_FOUND ${${depup}_FOUND} PARENT_SCOPE)
138 mark_as_advanced(${depup}_LIBRARIES)
139endmacro()
140
141# add a required dependency of main application
142# Arguments:
143# dep name of find rule for dependency, used uppercased for variable prefix
144# On return:
145# dependency added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES}
146function(core_require_dep dep)
147 find_package(${dep} REQUIRED)
148 string(TOUPPER ${dep} depup)
149 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
150 list(APPEND DEPLIBS ${${depup}_LIBRARIES})
151 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
152 export_dep()
153endfunction()
154
155# add a required dyloaded dependency of main application
156# Arguments:
157# dep name of find rule for dependency, used uppercased for variable prefix
158# On return:
159# dependency added to ${SYSTEM_INCLUDES}, ${dep}_SONAME is set up
160function(core_require_dyload_dep dep)
161 find_package(${dep} REQUIRED)
162 string(TOUPPER ${dep} depup)
163 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
164 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
165 find_soname(${depup} REQUIRED)
166 export_dep()
167 set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE)
168endfunction()
169
170# helper macro for optional deps
171macro(setup_enable_switch)
172 string(TOUPPER ${dep} depup)
173 if (ARGV1)
174 set(enable_switch ${ARGV1})
175 else()
176 set(enable_switch ENABLE_${depup})
177 endif()
178endmacro()
179
180# add an optional dependency of main application
181# Arguments:
182# dep name of find rule for dependency, used uppercased for variable prefix
183# On return:
184# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEPLIBS} and ${DEP_DEFINES}
185function(core_optional_dep dep)
186 setup_enable_switch()
187 if(${enable_switch})
188 find_package(${dep})
189 if(${depup}_FOUND)
190 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
191 list(APPEND DEPLIBS ${${depup}_LIBRARIES})
192 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
193 set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE)
194 export_dep()
195 else()
196 set(final_message ${final_message} "${depup} enabled: No" PARENT_SCOPE)
197 endif()
198 endif()
199endfunction()
200
201# add an optional dyloaded dependency of main application
202# Arguments:
203# dep name of find rule for dependency, used uppercased for variable prefix
204# On return:
205# dependency optionally added to ${SYSTEM_INCLUDES}, ${DEP_DEFINES}, ${dep}_SONAME is set up
206function(core_optional_dyload_dep dep)
207 setup_enable_switch()
208 if(${enable_switch})
209 find_package(${dep})
210 if(${depup}_FOUND)
211 list(APPEND SYSTEM_INCLUDES ${${depup}_INCLUDE_DIRS})
212 find_soname(${depup} REQUIRED)
213 list(APPEND DEP_DEFINES ${${depup}_DEFINITIONS})
214 set(final_message ${final_message} "${depup} enabled: Yes" PARENT_SCOPE)
215 export_dep()
216 set(${depup}_SONAME ${${depup}_SONAME} PARENT_SCOPE)
217 endif()
218 endif()
219endfunction()
220
221function(core_file_read_filtered result filepattern)
222 # Reads STRINGS from text files
223 # with comments filtered out
224 # Result: [list: result]
225 # Input: [glob pattern: filepattern]
226 file(GLOB filenames ${filepattern})
227 list(SORT filenames)
228 foreach(filename ${filenames})
229 if(VERBOSE)
230 message(STATUS "core_file_read_filtered - filename: ${filename}")
231 endif()
232 file(STRINGS ${filename} fstrings REGEX "^[^#//]")
233 foreach(fstring ${fstrings})
234 string(REGEX REPLACE "^(.*)#(.*)" "\\1" fstring ${fstring})
235 string(REGEX REPLACE "//.*" "" fstring ${fstring})
236 string(STRIP ${fstring} fstring)
237 list(APPEND filename_strings ${fstring})
238 endforeach()
239 endforeach()
240 set(${result} ${filename_strings} PARENT_SCOPE)
241endfunction()
242
243function(core_add_subdirs_from_filelist files)
244 # Adds subdirectories from a sorted list of files
245 # Input: [list: filenames] [bool: sort]
246 foreach(arg ${ARGN})
247 list(APPEND files ${arg})
248 endforeach()
249 list(SORT files)
250 if(VERBOSE)
251 message(STATUS "core_add_subdirs_from_filelist - got pattern: ${files}")
252 endif()
253 foreach(filename ${files})
254 string(STRIP ${filename} filename)
255 core_file_read_filtered(fstrings ${filename})
256 foreach(subdir ${fstrings})
257 STRING_SPLIT(subdir " " ${subdir})
258 list(GET subdir 0 subdir_src)
259 list(GET subdir -1 subdir_dest)
260 if(VERBOSE)
261 message(STATUS " core_add_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}")
262 endif()
263 add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest})
264 endforeach()
265 endforeach()
266endfunction()
267
268macro(core_add_optional_subdirs_from_filelist pattern)
269 # Adds subdirectories from text files
270 # if the option(s) in the 3rd field are enabled
271 # Input: [glob pattern: filepattern]
272 foreach(arg ${ARGN})
273 list(APPEND pattern ${arg})
274 endforeach()
275 foreach(elem ${pattern})
276 string(STRIP ${elem} elem)
277 list(APPEND filepattern ${elem})
278 endforeach()
279
280 file(GLOB filenames ${filepattern})
281 list(SORT filenames)
282 if(VERBOSE)
283 message(STATUS "core_add_optional_subdirs_from_filelist - got pattern: ${filenames}")
284 endif()
285
286 foreach(filename ${filenames})
287 if(VERBOSE)
288 message(STATUS "core_add_optional_subdirs_from_filelist - reading file: ${filename}")
289 endif()
290 file(STRINGS ${filename} fstrings REGEX "^[^#//]")
291 foreach(line ${fstrings})
292 string(REPLACE " " ";" line "${line}")
293 list(GET line 0 subdir_src)
294 list(GET line 1 subdir_dest)
295 list(GET line 3 opts)
296 foreach(opt ${opts})
297 if(ENABLE_${opt})
298 if(VERBOSE)
299 message(STATUS " core_add_optional_subdirs_from_filelist - adding subdir: ${CORE_SOURCE_DIR}${subdir_src} -> ${CORE_BUILD_DIR}/${subdir_dest}")
300 endif()
301 add_subdirectory(${CORE_SOURCE_DIR}/${subdir_src} ${CORE_BUILD_DIR}/${subdir_dest})
302 else()
303 if(VERBOSE)
304 message(STATUS " core_add_optional_subdirs_from_filelist: OPTION ${opt} not enabled for ${subdir_src}, skipping subdir")
305 endif()
306 endif()
307 endforeach()
308 endforeach()
309 endforeach()
310endmacro()
311
312macro(today RESULT)
313 if (WIN32)
314 execute_process(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT})
315 string(REGEX REPLACE "(..)/(..)/..(..).*" "\\1/\\2/\\3" ${RESULT} ${${RESULT}})
316 elseif(UNIX)
317 execute_process(COMMAND date -u +%F
318 OUTPUT_VARIABLE ${RESULT})
319 string(REGEX REPLACE "(..)/(..)/..(..).*" "\\1/\\2/\\3" ${RESULT} ${${RESULT}})
320 else()
321 message(SEND_ERROR "date not implemented")
322 set(${RESULT} 000000)
323 endif()
324 string(REGEX REPLACE "(\r?\n)+$" "" ${RESULT} "${${RESULT}}")
325endmacro()
326
327function(core_find_git_rev)
328 find_package(Git)
329 if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git)
330 execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet --
331 RESULT_VARIABLE status_code
332 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
333 if (NOT status_code)
334 execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --ignore-submodules --quiet HEAD --
335 RESULT_VARIABLE status_code
336 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
337 endif()
338 if (status_code)
339 execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h-dirty" HEAD
340 OUTPUT_VARIABLE HASH
341 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
342 string(SUBSTRING ${HASH} 1 13 HASH)
343 else()
344 execute_process(COMMAND ${GIT_EXECUTABLE} log -n 1 --pretty=format:"%h" HEAD
345 OUTPUT_VARIABLE HASH
346 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
347 string(SUBSTRING ${HASH} 1 7 HASH)
348 endif()
349 execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:"%cd" --date=short HEAD
350 OUTPUT_VARIABLE DATE
351 WORKING_DIRECTORY ${CORE_SOURCE_DIR})
352 string(SUBSTRING ${DATE} 1 10 DATE)
353 else()
354 today(DATE)
355 set(HASH "nogitfound")
356 endif()
357 string(REPLACE "-" "" DATE ${DATE})
358 set(GIT_REV "${DATE}-${HASH}")
359 if(GIT_REV)
360 set(APP_SCMID ${GIT_REV} PARENT_SCOPE)
361 endif()
362endfunction()
363
364macro(core_find_versions)
365 include(CMakeParseArguments)
366 core_file_read_filtered(version_list ${CORE_SOURCE_DIR}/version.txt)
367 string(REPLACE " " ";" version_list "${version_list}")
368 cmake_parse_arguments(APP "" "VERSION_MAJOR;VERSION_MINOR;VERSION_TAG;VERSION_CODE;ADDON_API;APP_NAME;COMPANY_NAME" "" ${version_list})
369
370 set(APP_NAME ${APP_APP_NAME}) # inconsistency in upstream
371 string(TOLOWER ${APP_APP_NAME} APP_NAME_LC)
372 set(COMPANY_NAME ${APP_COMPANY_NAME})
373 set(APP_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR})
374 if(APP_VERSION_TAG)
375 set(APP_VERSION ${APP_VERSION}-${APP_VERSION_TAG})
376 endif()
377 string(REPLACE "." "," FILE_VERSION ${APP_ADDON_API}.0)
378 string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC)
379 file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version REGEX "^.*GUILIB_API_VERSION (.*)$")
380 string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version ${guilib_version})
381 file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version_min REGEX "^.*GUILIB_MIN_API_VERSION (.*)$")
382 string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version_min ${guilib_version_min})
383endmacro()
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 @@
1# - Collection of String utility macros.
2# Defines the following macros:
3# STRING_TRIM(var str [NOUNQUOTE])
4# - Trim a string by removing the leading and trailing spaces,
5# just like STRING(STRIP ...) in CMake 2.6 and later.
6# This macro is needed as CMake 2.4 does not support STRING(STRIP ..)
7# This macro also remove quote and double quote marks around the string,
8# unless NOUNQUOTE is defined.
9# * Parameters:
10# + var: A variable that stores the result.
11# + str: A string.
12# + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
13#
14# STRING_UNQUOTE(var str)
15# - Remove double quote marks and quote marks around a string.
16# If the string is not quoted, then it returns an empty string.
17# * Parameters:
18# + var: A variable that stores the result.
19# + str: A string.
20#
21# STRING_JOIN(var delimiter str_list [str...])
22# - Concatenate strings, with delimiter inserted between strings.
23# * Parameters:
24# + var: A variable that stores the result.
25# + str_list: A list of string.
26# + str: (Optional) more string to be join.
27#
28# STRING_SPLIT(var delimiter str [NOESCAPE_SEMICOLON])
29# - Split a string into a list using a delimiter, which can be in 1 or more
30# characters long.
31# * Parameters:
32# + var: A variable that stores the result.
33# + delimiter: To separate a string.
34# + str: A string.
35# + NOESCAPE_SEMICOLON: (Optional) Do not escape semicolons.
36#
37
38IF(NOT DEFINED _MANAGE_STRING_CMAKE_)
39 SET(_MANAGE_STRING_CMAKE_ "DEFINED")
40
41 MACRO(STRING_TRIM var str)
42 SET(${var} "")
43 IF (NOT "${ARGN}" STREQUAL "NOUNQUOTE")
44 # Need not trim a quoted string.
45 STRING_UNQUOTE(_var "${str}")
46 IF(NOT _var STREQUAL "")
47 # String is quoted
48 SET(${var} "${_var}")
49 ENDIF(NOT _var STREQUAL "")
50 ENDIF(NOT "${ARGN}" STREQUAL "NOUNQUOTE")
51
52 IF(${var} STREQUAL "")
53 SET(_var_1 "${str}")
54 STRING(REGEX REPLACE "^[ \t\r\n]+" "" _var_2 "${str}" )
55 STRING(REGEX REPLACE "[ \t\r\n]+$" "" _var_3 "${_var_2}" )
56 SET(${var} "${_var_3}")
57 ENDIF(${var} STREQUAL "")
58 ENDMACRO(STRING_TRIM var str)
59
60 # Internal macro
61 # Variable cannot be escaped here, as variable is already substituted
62 # at the time it passes to this macro.
63 MACRO(STRING_ESCAPE var str)
64 # ';' and '\' are tricky, need to be encoded.
65 # '#' => '#H'
66 # '\' => '#B'
67 # ';' => '#S'
68 SET(_NOESCAPE_SEMICOLON "")
69 SET(_NOESCAPE_HASH "")
70
71 FOREACH(_arg ${ARGN})
72 IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
73 SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
74 ELSEIF(${_arg} STREQUAL "NOESCAPE_HASH")
75 SET(_NOESCAPE_HASH "NOESCAPE_HASH")
76 ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
77 ENDFOREACH(_arg)
78
79 IF(_NOESCAPE_HASH STREQUAL "")
80 STRING(REGEX REPLACE "#" "#H" _ret "${str}")
81 ELSE(_NOESCAPE_HASH STREQUAL "")
82 SET(_ret "${str}")
83 ENDIF(_NOESCAPE_HASH STREQUAL "")
84
85 STRING(REGEX REPLACE "\\\\" "#B" _ret "${_ret}")
86 IF(_NOESCAPE_SEMICOLON STREQUAL "")
87 STRING(REGEX REPLACE ";" "#S" _ret "${_ret}")
88 ENDIF(_NOESCAPE_SEMICOLON STREQUAL "")
89 SET(${var} "${_ret}")
90 ENDMACRO(STRING_ESCAPE var str)
91
92 MACRO(STRING_UNESCAPE var str)
93 # '#B' => '\'
94 # '#H' => '#'
95 # '#D' => '$'
96 # '#S' => ';'
97 SET(_ESCAPE_VARIABLE "")
98 SET(_NOESCAPE_SEMICOLON "")
99 SET(_ret "${str}")
100 FOREACH(_arg ${ARGN})
101 IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
102 SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
103 ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE")
104 SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE")
105 STRING(REGEX REPLACE "#D" "$" _ret "${_ret}")
106 ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
107 ENDFOREACH(_arg)
108
109 STRING(REGEX REPLACE "#B" "\\\\" _ret "${_ret}")
110 IF(_NOESCAPE_SEMICOLON STREQUAL "")
111 # ';' => '#S'
112 STRING(REGEX REPLACE "#S" "\\\\;" _ret "${_ret}")
113 ELSE(_NOESCAPE_SEMICOLON STREQUAL "")
114 STRING(REGEX REPLACE "#S" ";" _ret "${_ret}")
115 ENDIF(_NOESCAPE_SEMICOLON STREQUAL "")
116
117 IF(NOT _ESCAPE_VARIABLE STREQUAL "")
118 # '#D' => '$'
119 STRING(REGEX REPLACE "#D" "$" _ret "${_ret}")
120 ENDIF(NOT _ESCAPE_VARIABLE STREQUAL "")
121 STRING(REGEX REPLACE "#H" "#" _ret "${_ret}")
122 SET(${var} "${_ret}")
123 ENDMACRO(STRING_UNESCAPE var str)
124
125
126 MACRO(STRING_UNQUOTE var str)
127 STRING_ESCAPE(_ret "${str}" ${ARGN})
128 IF(_ret MATCHES "^[ \t\r\n]+")
129 STRING(REGEX REPLACE "^[ \t\r\n]+" "" _ret "${_ret}")
130 ENDIF(_ret MATCHES "^[ \t\r\n]+")
131 IF(_ret MATCHES "^\"")
132 # Double quote
133 STRING(REGEX REPLACE "\"\(.*\)\"[ \t\r\n]*$" "\\1" _ret "${_ret}")
134 ELSEIF(_ret MATCHES "^'")
135 # Single quote
136 STRING(REGEX REPLACE "'\(.*\)'[ \t\r\n]*$" "\\1" _ret "${_ret}")
137 ELSE(_ret MATCHES "^\"")
138 SET(_ret "")
139 ENDIF(_ret MATCHES "^\"")
140
141 # Unencoding
142 STRING_UNESCAPE(${var} "${_ret}" ${ARGN})
143 ENDMACRO(STRING_UNQUOTE var str)
144
145 MACRO(STRING_JOIN var delimiter str_list)
146 SET(_ret "")
147 FOREACH(_str ${str_list})
148 IF(_ret STREQUAL "")
149 SET(_ret "${_str}")
150 ELSE(_ret STREQUAL "")
151 SET(_ret "${_ret}${delimiter}${_str}")
152 ENDIF(_ret STREQUAL "")
153 ENDFOREACH(_str ${str_list})
154
155 FOREACH(_str ${ARGN})
156 IF(_ret STREQUAL "")
157 SET(_ret "${_str}")
158 ELSE(_ret STREQUAL "")
159 SET(_ret "${_ret}${delimiter}${_str}")
160 ENDIF(_ret STREQUAL "")
161 ENDFOREACH(_str ${str_list})
162 SET(${var} "${_ret}")
163 ENDMACRO(STRING_JOIN var delimiter str_list)
164
165 MACRO(STRING_SPLIT var delimiter str)
166 SET(_max_tokens "")
167 SET(_NOESCAPE_SEMICOLON "")
168 SET(_ESCAPE_VARIABLE "")
169 FOREACH(_arg ${ARGN})
170 IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
171 SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
172 ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE")
173 SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE")
174 ELSE(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
175 SET(_max_tokens ${_arg})
176 ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
177 ENDFOREACH(_arg)
178
179 IF(NOT _max_tokens)
180 SET(_max_tokens -1)
181 ENDIF(NOT _max_tokens)
182
183 STRING_ESCAPE(_str "${str}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
184 STRING_ESCAPE(_delimiter "${delimiter}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
185
186 SET(_str_list "")
187 SET(_token_count 0)
188 STRING(LENGTH "${_delimiter}" _de_len)
189
190 WHILE(NOT _token_count EQUAL _max_tokens)
191 MATH(EXPR _token_count ${_token_count}+1)
192 IF(_token_count EQUAL _max_tokens)
193 # Last token, no need splitting
194 SET(_str_list ${_str_list} "${_str}")
195 ELSE(_token_count EQUAL _max_tokens)
196 # in case encoded characters are delimiters
197 STRING(LENGTH "${_str}" _str_len)
198 SET(_index 0)
199 SET(_token "")
200 SET(_str_remain "")
201 MATH(EXPR _str_end ${_str_len}-${_de_len}+1)
202 SET(_bound "k")
203 WHILE(_index LESS _str_end)
204 STRING(SUBSTRING "${_str}" ${_index} ${_de_len} _str_cursor)
205 IF(_str_cursor STREQUAL _delimiter)
206 # Get the token
207 STRING(SUBSTRING "${_str}" 0 ${_index} _token)
208 # Get the rest
209 MATH(EXPR _rest_index ${_index}+${_de_len})
210 MATH(EXPR _rest_len ${_str_len}-${_index}-${_de_len})
211 STRING(SUBSTRING "${_str}" ${_rest_index} ${_rest_len} _str_remain)
212 SET(_index ${_str_end})
213 ELSE(_str_cursor STREQUAL _delimiter)
214 MATH(EXPR _index ${_index}+1)
215 ENDIF(_str_cursor STREQUAL _delimiter)
216 ENDWHILE(_index LESS _str_end)
217
218 IF(_str_remain STREQUAL "")
219 # Meaning: end of string
220 LIST(APPEND _str_list "${_str}")
221 SET(_max_tokens ${_token_count})
222 ELSE(_str_remain STREQUAL "")
223 LIST(APPEND _str_list "${_token}")
224 SET(_str "${_str_remain}")
225 ENDIF(_str_remain STREQUAL "")
226 ENDIF(_token_count EQUAL _max_tokens)
227 ENDWHILE(NOT _token_count EQUAL _max_tokens)
228
229
230 # Unencoding
231 STRING_UNESCAPE(${var} "${_str_list}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
232 ENDMACRO(STRING_SPLIT var delimiter str)
233
234ENDIF(NOT DEFINED _MANAGE_STRING_CMAKE_)
235
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 @@
1# This script configures installation paths
2
3include(${PROJECT_SOURCE_DIR}/scripts/${CORE_SYSTEM_NAME}/pathsetup.cmake)
diff --git a/project/cmake/scripts/darwin/install.cmake b/project/cmake/scripts/darwin/install.cmake
deleted file mode 100644
index e69de29..0000000
--- a/project/cmake/scripts/darwin/install.cmake
+++ /dev/null
diff --git a/project/cmake/scripts/freebsd/archsetup.cmake b/project/cmake/scripts/freebsd/ArchSetup.cmake
index b85121f..013205c 100644
--- a/project/cmake/scripts/freebsd/archsetup.cmake
+++ b/project/cmake/scripts/freebsd/ArchSetup.cmake
@@ -14,6 +14,3 @@ else()
14 message(WARNING "unknown CPU: ${CPU}") 14 message(WARNING "unknown CPU: ${CPU}")
15 endif() 15 endif()
16endif() 16endif()
17
18set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
19set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE})
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/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 @@
1set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
2set(bindir ${CMAKE_INSTALL_PREFIX}/bin)
3
4configure_file(${CORE_SOURCE_DIR}/tools/Linux/xbmc.sh.in
5 ${CORE_BUILD_DIR}/scripts/xbmc @ONLY)
6configure_file(${CORE_SOURCE_DIR}/tools/Linux/xbmc-standalone.sh.in
7 ${CORE_BUILD_DIR}/scripts/xbmc-standalone @ONLY)
8
9install(TARGETS xbmc-xrandr DESTINATION lib/xbmc)
10install(FILES ${addon_bindings} DESTINATION include/xbmc)
11install(FILES ${cmake_files} ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/modules/xbmc-config.cmake
12 DESTINATION lib/xbmc)
13install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/xbmc
14 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/xbmc-standalone
15 DESTINATION bin)
16install(FILES ${CORE_SOURCE_DIR}/tools/Linux/FEH.py
17 DESTINATION share/xbmc)
18
19install(FILES ${CORE_SOURCE_DIR}/tools/Linux/xbmc-xsession.desktop
20 RENAME XBMC.desktop
21 DESTINATION share/xsessions)
22
23install(FILES ${CORE_SOURCE_DIR}/copying.txt
24 ${CORE_SOURCE_DIR}/LICENSE.GPL
25 ${CORE_SOURCE_DIR}/version.txt
26 ${CORE_SOURCE_DIR}/docs/README.freebsd
27 DESTINATION share/doc/xbmc)
28
29foreach(texture ${XBT_FILES})
30 string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture})
31 get_filename_component(dir ${dir} PATH)
32 install(FILES ${texture}
33 DESTINATION share/xbmc/${dir})
34endforeach()
35
36foreach(wraplib ${WRAP_FILES})
37 get_filename_component(dir ${wraplib} PATH)
38 install(PROGRAMS ${CMAKE_BINARY_DIR}/${wraplib}
39 DESTINATION lib/xbmc/${dir})
40endforeach()
41
42foreach(file ${install_data})
43 get_filename_component(dir ${file} PATH)
44 install(FILES ${CMAKE_BINARY_DIR}/${file}
45 DESTINATION share/xbmc/${dir})
46endforeach()
47
48install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs)
49 foreach(dir \${dirs})
50 file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*)
51 foreach(file \${FILES})
52 get_filename_component(dir \${file} PATH)
53 file(INSTALL \${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/xbmc/\${dir})
54 endforeach()
55 endforeach()")
56foreach(subdir ${build_dirs})
57 string(REPLACE " " ";" subdir ${subdir})
58 list(GET subdir 0 id)
59 install(CODE "execute_process(COMMAND make -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install)")
60endforeach()
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 @@
1include(../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 @@
1include(${PROJECT_SOURCE_DIR}/scripts/linux/pathsetup.cmake)
diff --git a/project/cmake/scripts/ios/archsetup.cmake b/project/cmake/scripts/ios/ArchSetup.cmake
index e6639f7..56661e2 100644
--- a/project/cmake/scripts/ios/archsetup.cmake
+++ b/project/cmake/scripts/ios/ArchSetup.cmake
@@ -12,10 +12,9 @@ set(CMAKE_SYSTEM_NAME Darwin)
12if(WITH_ARCH) 12if(WITH_ARCH)
13 set(ARCH ${WITH_ARCH}) 13 set(ARCH ${WITH_ARCH})
14else() 14else()
15 if(CPU STREQUAL armv7) 15 if(CPU STREQUAL armv7 OR CPU STREQUAL arm64)
16 set(ARCH arm-apple-darwin) 16 set(ARCH arm-osx)
17 elseif(CPU STREQUAL arm64) 17 set(NEON False)
18 set(ARCH arm-apple-darwin)
19 else() 18 else()
20 message(SEND_ERROR "Unknown CPU: ${CPU}") 19 message(SEND_ERROR "Unknown CPU: ${CPU}")
21 endif() 20 endif()
@@ -30,9 +29,8 @@ list(APPEND DEPLIBS "-framework CoreFoundation" "-framework CoreVideo"
30 "-framework QuartzCore" "-framework MediaPlayer" 29 "-framework QuartzCore" "-framework MediaPlayer"
31 "-framework CFNetwork" "-framework CoreGraphics" 30 "-framework CFNetwork" "-framework CoreGraphics"
32 "-framework Foundation" "-framework UIKit" 31 "-framework Foundation" "-framework UIKit"
33 "-framework CoreMedia" "-framework AVFoundation") 32 "-framework CoreMedia" "-framework AVFoundation"
33 "-framework VideoToolbox")
34 34
35set(ENABLE_DVDCSS OFF) 35set(ENABLE_DVDCSS OFF CACHE BOOL "" FORCE)
36set(ENABLE_OPTICAL OFF) 36set(ENABLE_OPTICAL OFF CACHE BOOL "" FORCE)
37set(ENABLE_VTB ON)
38set(VTB_FOUND 1 CACHE INTERNAL "VTB")
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 @@
1# IOS packaging
2
3set(PACKAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build/${CORE_BUILD_CONFIG}-iphoneos)
4
5file(MAKE_DIRECTORY ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app)
6set(BUNDLE_RESOURCES xbmc/platform/darwin/ios/Default-568h@2x.png
7 xbmc/platform/darwin/ios/Default-667h@2x.png
8 xbmc/platform/darwin/ios/Default-736h@3x.png
9 xbmc/platform/darwin/ios/Default-Landscape-736h@3x.png
10 tools/darwin/packaging/media/ios/rounded/AppIcon29x29.png
11 tools/darwin/packaging/media/ios/rounded/AppIcon29x29@2x.png
12 tools/darwin/packaging/media/ios/rounded/AppIcon40x40.png
13 tools/darwin/packaging/media/ios/rounded/AppIcon40x40@2x.png
14 tools/darwin/packaging/media/ios/rounded/AppIcon50x50.png
15 tools/darwin/packaging/media/ios/rounded/AppIcon50x50@2x.png
16 tools/darwin/packaging/media/ios/rounded/AppIcon57x57.png
17 tools/darwin/packaging/media/ios/rounded/AppIcon57x57@2x.png
18 tools/darwin/packaging/media/ios/rounded/AppIcon60x60.png
19 tools/darwin/packaging/media/ios/rounded/AppIcon60x60@2x.png
20 tools/darwin/packaging/media/ios/rounded/AppIcon72x72.png
21 tools/darwin/packaging/media/ios/rounded/AppIcon72x72@2x.png
22 tools/darwin/packaging/media/ios/rounded/AppIcon76x76.png
23 tools/darwin/packaging/media/ios/rounded/AppIcon76x76@2x.png)
24
25foreach(resource IN LISTS BUNDLE_RESOURCES)
26 configure_file(${CORE_SOURCE_DIR}/${resource} ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app COPYONLY)
27endforeach()
28configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/English.lproj/InfoPlist.strings
29 ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/English.lproj/InfoPlist.strings COPYONLY)
30
31configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/ios/Info.plist.in
32 ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/Info.plist @ONLY)
33
34add_custom_target(bundle
35 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${APP_NAME_LC}> ${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app/${APP_NAME}.bin
36 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/DllPaths_generated.h
37 ${CMAKE_BINARY_DIR}/xbmc/DllPaths_generated.h
38 COMMAND "ACTION=build"
39 "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
40 "TARGET_NAME=${APP_NAME}.app"
41 "APP_NAME=${APP_NAME}"
42 "PRODUCT_NAME=${APP_NAME}"
43 "WRAPPER_EXTENSION=app"
44 "SRCROOT=${CMAKE_BINARY_DIR}"
45 ${CORE_SOURCE_DIR}/tools/darwin/Support/CopyRootFiles-ios.command
46 COMMAND "XBMC_DEPENDS=${DEPENDS_PATH}"
47 "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
48 "TARGET_NAME=${APP_NAME}.app"
49 "APP_NAME=${APP_NAME}"
50 "PRODUCT_NAME=${APP_NAME}"
51 "FULL_PRODUCT_NAME=${APP_NAME}.app"
52 "WRAPPER_EXTENSION=app"
53 "SRCROOT=${CMAKE_BINARY_DIR}"
54 ${CORE_SOURCE_DIR}/tools/darwin/Support/copyframeworks-ios.command)
55add_dependencies(bundle ${APP_NAME_LC})
56
57set(DEPENDS_ROOT_FOR_XCODE ${NATIVEPREFIX}/..)
58configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/ios/mkdeb-ios.sh.in
59 ${CMAKE_BINARY_DIR}/tools/darwin/packaging/ios/mkdeb-ios.sh @ONLY)
60configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/migrate_to_kodi_ios.sh.in
61 ${CMAKE_BINARY_DIR}/tools/darwin/packaging/migrate_to_kodi_ios.sh @ONLY)
62
63add_custom_target(deb
64 COMMAND "XBMC_DEPENDS_ROOT=${NATIVEPREFIX}/.."
65 "PLATFORM_NAME=${PLATFORM}"
66 "CODESIGNING_FOLDER_PATH=${PACKAGE_OUTPUT_DIR}/${APP_NAME}.app"
67 "BUILT_PRODUCTS_DIR=${PACKAGE_OUTPUT_DIR}"
68 "WRAPPER_NAME=${APP_NAME}.app"
69 "APP_NAME=${APP_NAME}"
70 "CODE_SIGN_IDENTITY=\"\""
71 ${CORE_SOURCE_DIR}/tools/darwin/Support/Codesign.command
72 COMMAND sh ./mkdeb-ios.sh ${CORE_BUILD_CONFIG}
73 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/darwin/packaging/ios)
74add_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/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 @@
1../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 @@
1../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 @@
1../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 @@
1set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_LINUX)
2set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED
3 -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64)
4set(PLATFORM_DIR linux)
5set(CMAKE_SYSTEM_NAME Linux)
6if(WITH_ARCH)
7 set(ARCH ${WITH_ARCH})
8else()
9 if(CPU STREQUAL x86_64)
10 set(ARCH x86_64-linux)
11 set(NEON False)
12 elseif(CPU MATCHES "i.86")
13 set(ARCH i486-linux)
14 set(NEON False)
15 add_options(CXX ALL_BUILDS "-msse")
16 elseif(CPU MATCHES arm)
17 set(ARCH arm)
18 set(NEON True)
19 elseif(CPU MATCHES aarch64 OR CPU MATCHES arm64)
20 set(ARCH aarch64)
21 set(NEON False)
22 else()
23 message(SEND_ERROR "Unknown CPU: ${CPU}")
24 endif()
25endif()
26
27# Make sure we strip binaries in Release build
28if(CMAKE_BUILD_TYPE STREQUAL Release AND CMAKE_COMPILER_IS_GNUCXX)
29 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
30endif()
31
32find_package(CXX11 REQUIRED)
33include(LDGOLD)
34
35# Code Coverage
36if(CMAKE_BUILD_TYPE STREQUAL Coverage)
37 set(COVERAGE_TEST_BINARY ${APP_NAME_LC}-test)
38 set(COVERAGE_SOURCE_DIR ${CORE_SOURCE_DIR})
39 set(COVERAGE_DEPENDS "\${APP_NAME_LC}" "\${APP_NAME_LC}-test")
40 set(COVERAGE_EXCLUDES */test/* lib/* */lib/*)
41endif()
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 @@
1# - CodeCoverage
2# Generate code coverage reports with LCOV and GCovr.
3#
4# Configuration:
5# COVERAGE_SOURCE_DIR - Source root directory (default ${CMAKE_SOURCE_DIR}).
6# COVERAGE_BINARY_DIR - Directory where the coverage reports (and intermediate files)
7# are generated to.
8# COVERAGE_EXCLUDES - List of exclude patterns (for example '*/tests/*').
9#
10# The following targets will be generated:
11# coverage - Builds an html report. Requires LCOV.
12# coverage_xml - Builds an xml report (in Cobertura format for Jenkins).
13# Requires Gcovr.
14#
15# Inspired by https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake
16
17# Comiler and linker setup
18set(CMAKE_C_FLAGS_COVERAGE "-g -O0 --coverage" CACHE STRING
19 "Flags used by the C compiler during coverage builds." FORCE)
20set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 --coverage" CACHE STRING
21 "Flags used by the C++ compiler during coverage builds." FORCE)
22set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "--coverage" CACHE STRING
23 "Flags used for linking binaries during coverage builds." FORCE)
24set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "--coverage" CACHE STRING
25 "Flags used by the shared libraries linker during coverage builds." FORCE)
26mark_as_advanced(
27 CMAKE_C_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
28 CMAKE_SHARED_LINKER_FLAGS_COVERAGE CMAKE_STATIC_LINKER_FLAGS_COVERAGE
29)
30
31find_program(LCOV_EXECUTABLE lcov)
32find_program(GENINFO_EXECUTABLE geninfo)
33find_program(GENHTML_EXECUTABLE genhtml)
34find_program(GCOVR_EXECUTABLE gcovr)
35mark_as_advanced(LCOV_EXECUTABLE GENINFO_EXECUTABLE GENHTML_EXECUTABLE GCOVR_EXECUTABLE)
36
37# Default options
38if(NOT COVERAGE_SOURCE_DIR)
39 set(COVERAGE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
40endif()
41if(NOT COVERAGE_BINARY_DIR)
42 set(COVERAGE_BINARY_DIR ${CMAKE_BINARY_DIR}/coverage)
43endif()
44if(NOT COVERAGE_EXCLUDES)
45 set(COVERAGE_EXCLUDES)
46endif()
47
48# Allow variables in COVERAGE_DEPENDS that are not evaluated before this file is included.
49string(CONFIGURE "${COVERAGE_DEPENDS}" COVERAGE_DEPENDS)
50
51# Add coverage target that generates an HTML report using LCOV
52if(LCOV_EXECUTABLE AND GENINFO_EXECUTABLE AND GENHTML_EXECUTABLE)
53 file(MAKE_DIRECTORY ${COVERAGE_BINARY_DIR})
54 add_custom_target(coverage
55 COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_BINARY_DIR}
56 COMMAND ${LCOV_EXECUTABLE} -z -q -d ${CMAKE_BINARY_DIR}
57 COMMAND ${LCOV_EXECUTABLE} -c -q -i -d ${CMAKE_BINARY_DIR} -b ${COVERAGE_SOURCE_DIR}
58 -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_base.info
59 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test || true
60 COMMAND ${LCOV_EXECUTABLE} -c -q -d ${CMAKE_BINARY_DIR} -b ${COVERAGE_SOURCE_DIR}
61 -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_test.info
62 COMMAND ${LCOV_EXECUTABLE} -a ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_base.info
63 -a ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage_test.info
64 -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info -q
65 COMMAND ${LCOV_EXECUTABLE} -q -r ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info
66 /usr/include/* ${CMAKE_BINARY_DIR}/* ${COVERAGE_EXCLUDES}
67 -o ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info
68 COMMAND ${GENHTML_EXECUTABLE} ${COVERAGE_BINARY_DIR}/${PROJECT_NAME}.coverage.info
69 -o ${COVERAGE_BINARY_DIR}/html -s --legend --highlight --demangle-cpp
70 COMMAND ${CMAKE_COMMAND} -E echo "Coverage report: file://${COVERAGE_BINARY_DIR}/html/index.html"
71 WORKING_DIRECTORY ${COVERAGE_BINARY_DIR}
72 VERBATIM
73 DEPENDS ${COVERAGE_DEPENDS}
74 COMMENT "Generate code coverage html report"
75 )
76else()
77 message(WARNING "Target coverage not available (lcov, geninfo and genhtml needed).")
78endif()
79
80# Add coverage target that generates an XML report using Gcovr
81if(GCOVR_EXECUTABLE)
82 file(MAKE_DIRECTORY ${COVERAGE_BINARY_DIR})
83 string(REGEX REPLACE "([^;]+)" "--exclude=\"\\1\"" _gcovr_excludes "${COVERAGE_EXCLUDES}")
84 string(REPLACE "*" ".*" _gcovr_excludes "${_gcovr_excludes}")
85 add_custom_target(coverage_xml
86 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test || true
87 COMMAND ${GCOVR_EXECUTABLE} -x -r ${COVERAGE_SOURCE_DIR} -o ${COVERAGE_BINARY_DIR}/coverage.xml
88 --object-directory ${CMAKE_BINARY_DIR} ${_gcovr_excludes} ${CMAKE_BINARY_DIR}
89 COMMAND ${CMAKE_COMMAND} -E echo "Coverage report: file://${COVERAGE_BINARY_DIR}/coverage.xml"
90 WORKING_DIRECTORY ${COVERAGE_BINARY_DIR}
91 DEPENDS ${COVERAGE_DEPENDS}
92 COMMENT "Generate code coverage xml report"
93 )
94 unset(_gcovr_excludes)
95else()
96 message(WARNING "Target coverage_xml not available (gcovr needed).")
97endif()
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 @@
1# xrandr
2if(ENABLE_X11 AND X_FOUND AND XRANDR_FOUND)
3 find_package(X QUIET)
4 find_package(XRandR QUIET)
5 add_executable(${APP_NAME_LC}-xrandr ${CORE_SOURCE_DIR}/xbmc-xrandr.c)
6 target_link_libraries(${APP_NAME_LC}-xrandr ${SYSTEM_LDFLAGS} ${X_LIBRARIES} m ${XRANDR_LIBRARIES})
7endif()
8
9# WiiRemote
10if(ENABLE_EVENTCLIENTS)
11 add_subdirectory(${CORE_SOURCE_DIR}/tools/EventClients/Clients/WiiRemote build/WiiRemote)
12endif()
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 @@
1if(X_FOUND)
2 set(USE_X11 1)
3else()
4 set(USE_X11 0)
5endif()
6if(OPENGL_FOUND)
7 set(USE_OPENGL 1)
8else()
9 set(USE_OPENGL 0)
10endif()
11if(OPENGLES_FOUND)
12 set(USE_OPENGLES 1)
13else()
14 set(USE_OPENGLES 0)
15endif()
16
17# CMake config
18set(APP_PREFIX ${prefix})
19set(APP_LIB_DIR ${libdir}/${APP_NAME_LC})
20set(APP_DATA_DIR ${datarootdir}/${APP_NAME_LC})
21set(APP_INCLUDE_DIR ${includedir}/${APP_NAME_LC})
22set(CXX11_SWITCH "-std=c++11")
23
24# Set XBMC_STANDALONE_SH_PULSE so we can insert PulseAudio block into kodi-standalone
25if(EXISTS ${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse)
26 if(ENABLE_PULSEAUDIO AND PULSEAUDIO_FOUND)
27 file(READ "${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse" pulse_content)
28 set(XBMC_STANDALONE_SH_PULSE ${pulse_content})
29 endif()
30endif()
31
32# Configure startup scripts
33configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi.sh.in
34 ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} @ONLY)
35configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.in
36 ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone @ONLY)
37
38# Configure cmake files
39configure_file(${PROJECT_SOURCE_DIR}/KodiConfig.cmake.in
40 ${CORE_BUILD_DIR}/scripts/${APP_NAME}Config.cmake @ONLY)
41
42# Configure xsession entry
43configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-xsession.desktop.in
44 ${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop @ONLY)
45
46# Install app
47install(TARGETS ${APP_NAME_LC}
48 DESTINATION ${libdir}/${APP_NAME_LC}
49 COMPONENT kodi-bin)
50if(ENABLE_X11 AND XRANDR_FOUND)
51 install(TARGETS ${APP_NAME_LC}-xrandr
52 DESTINATION ${libdir}/${APP_NAME_LC}
53 COMPONENT kodi-bin)
54endif()
55
56# Install scripts
57install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}
58 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone
59 DESTINATION ${bindir}
60 COMPONENT kodi-bin)
61
62# Install libraries
63foreach(library ${LIBRARY_FILES})
64 get_filename_component(dir ${library} DIRECTORY)
65 string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${dir})
66 install(PROGRAMS ${library}
67 DESTINATION ${libdir}/${APP_NAME_LC}/${dir}
68 COMPONENT kodi-bin)
69endforeach()
70
71# Install add-ons, fonts, icons, keyboard maps, keymaps, etc
72# (addons, media, system, userdata folders in share/kodi/)
73foreach(file ${install_data})
74 get_filename_component(dir ${file} DIRECTORY)
75 install(FILES ${CMAKE_BINARY_DIR}/${file}
76 DESTINATION ${datarootdir}/${APP_NAME_LC}/${dir}
77 COMPONENT kodi)
78endforeach()
79
80# Install xsession entry
81install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop
82 DESTINATION ${datarootdir}/xsessions
83 COMPONENT kodi)
84
85# Install desktop entry
86install(FILES ${CORE_SOURCE_DIR}/tools/Linux/kodi.desktop
87 DESTINATION ${datarootdir}/applications
88 COMPONENT kodi)
89
90# Install icons
91install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon16x16.png
92 RENAME ${APP_NAME_LC}.png
93 DESTINATION ${datarootdir}/icons/hicolor/16x16/apps
94 COMPONENT kodi)
95install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon22x22.png
96 RENAME ${APP_NAME_LC}.png
97 DESTINATION ${datarootdir}/icons/hicolor/22x22/apps
98 COMPONENT kodi)
99install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon24x24.png
100 RENAME ${APP_NAME_LC}.png
101 DESTINATION ${datarootdir}/icons/hicolor/24x24/apps
102 COMPONENT kodi)
103install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon32x32.png
104 RENAME ${APP_NAME_LC}.png
105 DESTINATION ${datarootdir}/icons/hicolor/32x32/apps
106 COMPONENT kodi)
107install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon48x48.png
108 RENAME ${APP_NAME_LC}.png
109 DESTINATION ${datarootdir}/icons/hicolor/48x48/apps
110 COMPONENT kodi)
111install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon64x64.png
112 RENAME ${APP_NAME_LC}.png
113 DESTINATION ${datarootdir}/icons/hicolor/64x64/apps
114 COMPONENT kodi)
115install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon128x128.png
116 RENAME ${APP_NAME_LC}.png
117 DESTINATION ${datarootdir}/icons/hicolor/128x128/apps
118 COMPONENT kodi)
119install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon256x256.png
120 RENAME ${APP_NAME_LC}.png
121 DESTINATION ${datarootdir}/icons/hicolor/256x256/apps
122 COMPONENT kodi)
123install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -q -t
124 $ENV{DESTDIR}${datarootdir}/icons/hicolor ERROR_QUIET)"
125 COMPONENT kodi)
126
127# Install docs
128install(FILES ${CORE_SOURCE_DIR}/copying.txt
129 ${CORE_SOURCE_DIR}/LICENSE.GPL
130 ${CORE_SOURCE_DIR}/version.txt
131 ${CORE_SOURCE_DIR}/docs/README.linux
132 DESTINATION ${datarootdir}/doc/${APP_NAME_LC}
133 COMPONENT kodi)
134
135install(FILES ${CORE_SOURCE_DIR}/privacy-policy.txt
136 DESTINATION ${datarootdir}/${APP_NAME_LC}
137 COMPONENT kodi)
138
139# Install kodi-tools-texturepacker
140install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/texturepacker/TexturePacker
141 DESTINATION ${bindir}
142 COMPONENT kodi-tools-texturepacker)
143
144# Install kodi-addon-dev headers
145install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_types.h
146 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_vfs_utils.hpp
147 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h
148 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_audioengine.h
149 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h
150 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_inputstream.h
151 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_peripheral.h
152 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_addon.h
153 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_codec.h
154 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libXBMC_pvr.h
155 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_cpp_dll.h
156 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h
157 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_types.h
158 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_codec_types.h
159 ${CORE_SOURCE_DIR}/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxPacket.h
160 ${CORE_SOURCE_DIR}/xbmc/filesystem/IFileTypes.h
161 DESTINATION ${includedir}/${APP_NAME_LC}
162 COMPONENT kodi-addon-dev)
163
164# Install kodi-addon-dev add-on bindings
165install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME}Config.cmake
166 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddonHelpers.cmake
167 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/AddOptions.cmake
168 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/ArchSetup.cmake
169 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckCommits.cmake
170 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckTargetPlatform.cmake
171 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/GenerateVersionedFiles.cmake
172 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/GeneratorSetup.cmake
173 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/HandleDepends.cmake
174 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/Macros.cmake
175 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/PrepareEnv.cmake
176 ${CORE_SOURCE_DIR}/project/cmake/scripts/common/ProjectMacros.cmake
177 ${CORE_SOURCE_DIR}/project/cmake/scripts/linux/PathSetup.cmake
178 DESTINATION ${datarootdir}/${APP_NAME_LC}/cmake
179 COMPONENT kodi-addon-dev)
180
181# Install kodi-audio-dev
182install(FILES ${CORE_SOURCE_DIR}/xbmc/cores/AudioEngine/Utils/AEChannelData.h
183 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_adsp_dll.h
184 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_adsp_types.h
185 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audiodec_dll.h
186 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audiodec_types.h
187 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_audioenc_dll.h
188 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_audioenc_types.h
189 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_audioengine_types.h
190 DESTINATION ${includedir}/${APP_NAME_LC}
191 COMPONENT kodi-audio-dev)
192
193if(ENABLE_EVENTCLIENTS)
194 # Install kodi-eventclients-common BT python files
195 install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/__init__.py
196 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/bt.py
197 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/hid.py
198 DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/bt
199 COMPONENT kodi-eventclients-common)
200
201 # Install kodi-eventclients-common PS3 python files
202 install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/__init__.py
203 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/keymaps.py
204 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixaxis.py
205 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixpair.py
206 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixwatch.py
207 DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/ps3
208 COMPONENT kodi-eventclients-common)
209
210 # Install kodi-eventclients-common python files
211 file(WRITE ${CMAKE_BINARY_DIR}/packages/deb/defs.py ICON_PATH="usr/share/pixmaps/${APP_NAME_LC}/")
212 install(PROGRAMS ${CMAKE_BINARY_DIR}/packages/deb/defs.py
213 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/__init__.py
214 "${CORE_SOURCE_DIR}/tools/EventClients/Clients/PS3 BD Remote/ps3_remote.py"
215 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/xbmcclient.py
216 ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/zeroconf.py
217 DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}
218 COMPONENT kodi-eventclients-common)
219
220 # Install kodi-eventclients-common icons
221 install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/icons/bluetooth.png
222 ${CORE_SOURCE_DIR}/tools/EventClients/icons/phone.png
223 ${CORE_SOURCE_DIR}/tools/EventClients/icons/mail.png
224 ${CORE_SOURCE_DIR}/tools/EventClients/icons/mouse.png
225 DESTINATION ${datarootdir}/pixmaps/${APP_NAME_LC}
226 COMPONENT kodi-eventclients-common)
227
228 # Install kodi-eventclients-dev headers
229 install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/lib/c++/xbmcclient.h
230 DESTINATION ${includedir}/${APP_NAME_LC}
231 COMPONENT kodi-eventclients-dev)
232
233 # Install kodi-eventclients-dev C# examples
234 install(FILES "${CORE_SOURCE_DIR}/tools/EventClients/examples/c#/XBMCDemoClient1.cs"
235 DESTINATION "${docdir}/${APP_NAME_LC}-eventclients-dev/examples/C#"
236 COMPONENT kodi-eventclients-dev)
237
238 # Install kodi-eventclients-dev C++ examples
239 install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_notification.cpp
240 ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_log.cpp
241 ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_button1.cpp
242 ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_mouse.cpp
243 ${CORE_SOURCE_DIR}/tools/EventClients/examples/c++/example_button2.cpp
244 DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/C++
245 COMPONENT kodi-eventclients-dev)
246
247 # Install kodi-eventclients-dev java examples
248 install(FILES ${CORE_SOURCE_DIR}/tools/EventClients/examples/java/XBMCDemoClient1.java
249 DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/java
250 COMPONENT kodi-eventclients-dev)
251
252 # Install kodi-eventclients-dev python examples
253 install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_mouse.py
254 ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_button1.py
255 ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_notification.py
256 ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_action.py
257 ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_button2.py
258 ${CORE_SOURCE_DIR}/tools/EventClients/examples/python/example_simple.py
259 DESTINATION ${docdir}/${APP_NAME_LC}-eventclients-dev/examples/python
260 COMPONENT kodi-eventclients-dev)
261
262 # Install kodi-eventclients-ps3
263 install(PROGRAMS "${CORE_SOURCE_DIR}/tools/EventClients/Clients/PS3 BD Remote/ps3_remote.py"
264 RENAME ${APP_NAME_LC}-ps3remote
265 DESTINATION ${bindir}
266 COMPONENT kodi-eventclients-ps3)
267
268 # Install kodi-eventclients-wiiremote
269 install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/WiiRemote/${APP_NAME_LC}-wiiremote
270 DESTINATION ${bindir}
271 COMPONENT kodi-eventclients-wiiremote)
272
273 # Install kodi-eventclients-xbmc-send
274 install(PROGRAMS "${CORE_SOURCE_DIR}/tools/EventClients/Clients/Kodi Send/kodi-send.py"
275 RENAME ${APP_NAME_LC}-send
276 DESTINATION ${bindir}
277 COMPONENT kodi-eventclients-xbmc-send)
278endif()
279
280# Install kodi-inputstream-dev
281install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_inputstream_dll.h
282 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_inputstream_types.h
283 DESTINATION ${includedir}/${APP_NAME_LC}
284 COMPONENT kodi-inputstream-dev)
285
286# Install kodi-pvr-dev
287install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h
288 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_dll.h
289 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h
290 DESTINATION ${includedir}/${APP_NAME_LC}
291 COMPONENT kodi-pvr-dev)
292
293# Install kodi-screensaver-dev
294install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_scr_dll.h
295 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_scr_types.h
296 DESTINATION ${includedir}/${APP_NAME_LC}
297 COMPONENT kodi-screensaver-dev)
298
299# Install kodi-visualization-dev
300install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_vis_dll.h
301 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_vis_types.h
302 DESTINATION ${includedir}/${APP_NAME_LC}
303 COMPONENT kodi-visualization-dev)
304
305# Install kodi-peripheral-dev
306install(FILES ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_callbacks.h
307 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_dll.h
308 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_types.h
309 ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp
310 DESTINATION ${includedir}/${APP_NAME_LC}
311 COMPONENT kodi-peripheral-dev)
312
313# Install XBT skin files
314foreach(texture ${XBT_FILES})
315 string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture})
316 get_filename_component(dir ${dir} DIRECTORY)
317 install(FILES ${texture}
318 DESTINATION ${datarootdir}/${APP_NAME_LC}/${dir}
319 COMPONENT kodi)
320endforeach()
321
322# Install extra stuff if it exists
323if(EXISTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs)
324 install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs)
325 foreach(dir \${dirs})
326 file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*)
327 foreach(file \${FILES})
328 get_filename_component(dir \${file} DIRECTORY)
329 file(INSTALL \${file} DESTINATION ${datarootdir}/${APP_NAME_LC}/\${dir})
330 endforeach()
331 endforeach()")
332endif()
333
334if(NOT "$ENV{DESTDIR}" STREQUAL "")
335 set(DESTDIR ${CMAKE_BINARY_DIR}/$ENV{DESTDIR})
336endif()
337foreach(subdir ${build_dirs})
338 if(NOT subdir MATCHES kodi-platform)
339 string(REPLACE " " ";" subdir ${subdir})
340 list(GET subdir 0 id)
341 install(CODE "execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install DESTDIR=${DESTDIR})")
342 endif()
343endforeach()
344
345# generate packages? yes please, if everything checks out
346if(CPACK_GENERATOR)
347 if(CPACK_GENERATOR STREQUAL DEB AND CORE_SYSTEM_NAME STREQUAL linux)
348 if(CMAKE_BUILD_TYPE STREQUAL Debug)
349 message(STATUS "DEB Generator: Build type is set to 'Debug'. Packaged binaries will be unstripped.")
350 endif()
351 include(${PROJECT_SOURCE_DIR}/cpack/CPackConfigDEB.cmake)
352 else()
353 message(FATAL_ERROR "DEB Generator: Can't configure CPack to generate Debian packages on non-linux systems.")
354 endif()
355endif()
diff --git a/project/cmake/scripts/linux/macros.cmake b/project/cmake/scripts/linux/Macros.cmake
index 7453a1c..72e9d5c 100644
--- a/project/cmake/scripts/linux/macros.cmake
+++ b/project/cmake/scripts/linux/Macros.cmake
@@ -5,7 +5,7 @@ function(core_link_library lib wraplib)
5 set(check_arg "") 5 set(check_arg "")
6 if(TARGET ${lib}) 6 if(TARGET ${lib})
7 set(target ${lib}) 7 set(target ${lib})
8 set(link_lib ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${lib}/${lib}.a) 8 set(link_lib $<TARGET_FILE:${lib}>)
9 set(check_arg ${ARGV2}) 9 set(check_arg ${ARGV2})
10 set(data_arg ${ARGV3}) 10 set(data_arg ${ARGV3})
11 else() 11 else()
@@ -14,28 +14,42 @@ function(core_link_library lib wraplib)
14 set(check_arg ${ARGV3}) 14 set(check_arg ${ARGV3})
15 set(data_arg ${ARGV4}) 15 set(data_arg ${ARGV4})
16 endif() 16 endif()
17
18 # wrapper has to be adapted in order to support coverage.
19 if(CMAKE_BUILD_TYPE STREQUAL Coverage)
20 set(export "")
21 endif()
22
17 if(check_arg STREQUAL export) 23 if(check_arg STREQUAL export)
18 set(export ${export} 24 set(export ${export}
19 -Wl,--version-script=${ARGV3}) 25 -Wl,--version-script=${ARGV3})
20 elseif(check_arg STREQUAL nowrap)
21 set(export ${data_arg})
22 elseif(check_arg STREQUAL extras) 26 elseif(check_arg STREQUAL extras)
23 foreach(arg ${data_arg}) 27 foreach(arg ${data_arg})
24 list(APPEND export ${arg}) 28 list(APPEND export ${arg})
25 endforeach() 29 endforeach()
30 elseif(check_arg STREQUAL archives)
31 set(extra_libs ${data_arg})
26 endif() 32 endif()
27 get_filename_component(dir ${wraplib} PATH) 33
28 add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} 34 string(REGEX REPLACE "[ ]+" ";" _flags ${CMAKE_SHARED_LINKER_FLAGS})
29 COMMAND cmake -E make_directory ${dir} 35 get_filename_component(dir ${wraplib} DIRECTORY)
36 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
37 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
30 COMMAND ${CMAKE_C_COMPILER} 38 COMMAND ${CMAKE_C_COMPILER}
31 ARGS -Wl,--whole-archive 39 ARGS ${_flags} -Wl,--whole-archive
32 ${link_lib} 40 "${link_lib}" ${extra_libs}
33 -Wl,--no-whole-archive -lm 41 -Wl,--no-whole-archive -lm
42 -Wl,-soname,${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
34 -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} 43 -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
35 ${export} 44 ${export}
36 DEPENDS ${target} wrapper.def wrapper) 45 DEPENDS ${target} wrapper.def wrapper)
37 list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) 46
38 set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE) 47 get_filename_component(libname ${wraplib} NAME_WE)
48 add_custom_target(wrap_${libname} ALL DEPENDS ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX})
49 set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped)
50 add_dependencies(${APP_NAME_LC}-libraries wrap_${libname})
51
52 set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} CACHE STRING "" FORCE)
39endfunction() 53endfunction()
40 54
41function(find_soname lib) 55function(find_soname lib)
@@ -70,7 +84,9 @@ function(find_soname lib)
70 OUTPUT_VARIABLE ${lib}_SONAME) 84 OUTPUT_VARIABLE ${lib}_SONAME)
71 string(REPLACE "SONAME " "" ${lib}_SONAME ${${lib}_SONAME}) 85 string(REPLACE "SONAME " "" ${lib}_SONAME ${${lib}_SONAME})
72 string(STRIP ${${lib}_SONAME} ${lib}_SONAME) 86 string(STRIP ${${lib}_SONAME} ${lib}_SONAME)
73 message(STATUS "${lib} soname: ${${lib}_SONAME}") 87 if(VERBOSE)
88 message(STATUS "${lib} soname: ${${lib}_SONAME}")
89 endif()
74 set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE) 90 set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE)
75 endif() 91 endif()
76 if(arg_REQUIRED AND NOT ${lib}_SONAME) 92 if(arg_REQUIRED AND NOT ${lib}_SONAME)
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 @@
1include(GNUInstallDirs)
2
3if(NOT prefix)
4 set(prefix ${CMAKE_INSTALL_PREFIX})
5else()
6 set(CMAKE_INSTALL_PREFIX ${prefix})
7endif()
8if(NOT exec_prefix)
9 set(exec_prefix ${prefix})
10endif()
11if(NOT libdir)
12 set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
13endif()
14if(NOT bindir)
15 set(bindir ${CMAKE_INSTALL_FULL_BINDIR})
16endif()
17if(NOT includedir)
18 set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
19endif()
20if(NOT datarootdir)
21 set(datarootdir ${CMAKE_INSTALL_FULL_DATAROOTDIR})
22endif()
23if(NOT datadir)
24 set(datadir ${CMAKE_INSTALL_FULL_DATADIR})
25endif()
26if(NOT docdir)
27 set(docdir ${CMAKE_INSTALL_FULL_DOCDIR})
28endif()
29
30list(APPEND final_message "-- PATH config --")
31list(APPEND final_message "Prefix: ${prefix}")
32list(APPEND final_message "Libdir: ${libdir}")
33list(APPEND final_message "Bindir: ${bindir}")
34list(APPEND final_message "Includedir: ${includedir}")
35list(APPEND final_message "Datarootdir: ${datarootdir}")
36list(APPEND final_message "Datadir: ${datadir}")
37
38set(PATH_DEFINES -DBIN_INSTALL_PATH=\"${libdir}/kodi\"
39 -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 @@
1set(ARCH_DEFINES -D_LINUX -DTARGET_POSIX -DTARGET_LINUX)
2set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED
3 -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64)
4set(PLATFORM_DIR linux)
5set(CMAKE_SYSTEM_NAME Linux)
6if(WITH_ARCH)
7 set(ARCH ${WITH_ARCH})
8else()
9 if(CPU STREQUAL x86_64)
10 set(ARCH x86_64-linux)
11 elseif(CPU MATCHES "i.86")
12 set(ARCH i486-linux)
13 else()
14 message(SEND_ERROR "Unknown CPU: ${CPU}")
15 endif()
16endif()
17
18find_package(CXX11 REQUIRED)
19
20set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
21set(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 @@
1if(X_FOUND)
2 set(USE_X11 1)
3else()
4 set(USE_X11 0)
5endif()
6if(OPENGL_FOUND)
7 set(USE_OPENGL 1)
8else()
9 set(USE_OPENGL 0)
10endif()
11if(OPENGLES_FOUND)
12 set(USE_OPENGLES 1)
13else()
14 set(USE_OPENGLES 0)
15endif()
16
17configure_file(${CORE_SOURCE_DIR}/project/cmake/${APP_NAME_LC}-config.cmake.in
18 ${CORE_BUILD_DIR}/${APP_NAME_LC}-config.cmake @ONLY)
19
20configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi.sh.in
21 ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC} @ONLY)
22
23# Set XBMC_STANDALONE_SH_PULSE so we can insert PulseAudio block into kodi-standalone
24if(EXISTS ${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse)
25 if(ENABLE_PULSEAUDIO AND PULSEAUDIO_FOUND)
26 file(READ "${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.pulse" pulse_content)
27 set(XBMC_STANDALONE_SH_PULSE ${pulse_content})
28 endif()
29endif()
30
31configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-standalone.sh.in
32 ${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone @ONLY)
33
34install(TARGETS ${APP_NAME_LC} DESTINATION ${libdir}/kodi)
35if(ENABLE_X11 AND XRANDR_FOUND)
36 install(TARGETS ${APP_NAME_LC}-xrandr DESTINATION ${libdir}/${APP_NAME_LC})
37endif()
38
39if(NOT EXISTS ${libdir}/xbmc)
40install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${libdir})")
41endif()
42install(FILES ${addon_bindings} DESTINATION ${includedir}/kodi)
43if(NOT EXISTS ${includedir}/xbmc)
44install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${includedir})")
45endif()
46
47install(FILES ${cmake_files}
48 DESTINATION ${libdir}/kodi)
49install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}-config.cmake
50 DESTINATION ${libdir}/${APP_NAME_LC})
51install(FILES ${CORE_SOURCE_DIR}/project/cmake/xbmc-config.cmake.in
52 RENAME xbmc-config.cmake
53 DESTINATION ${libdir}/${APP_NAME_LC})
54
55install(PROGRAMS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}
56 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/scripts/${APP_NAME_LC}-standalone
57 DESTINATION ${bindir})
58install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC} xbmc WORKING_DIRECTORY ${bindir})")
59install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}-standalone xbmc-standalone WORKING_DIRECTORY ${bindir})")
60
61configure_file(${CORE_SOURCE_DIR}/tools/Linux/kodi-xsession.desktop.in
62 ${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop)
63install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop
64 DESTINATION ${datarootdir}/xsessions)
65install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}.desktop xbmc.desktop WORKING_DIRECTORY ${datarootdir}/xsessions/)")
66
67if(NOT EXISTS ${datarootdir}/xbmc)
68install(CODE "execute_process (COMMAND ln -sf ${APP_NAME_LC}/ xbmc WORKING_DIRECTORY ${datarootdir})")
69endif()
70
71install(FILES ${CORE_SOURCE_DIR}/copying.txt
72 ${CORE_SOURCE_DIR}/LICENSE.GPL
73 ${CORE_SOURCE_DIR}/version.txt
74 ${CORE_SOURCE_DIR}/docs/README.linux
75 DESTINATION ${datarootdir}/doc/kodi)
76
77install(FILES ${CORE_SOURCE_DIR}/tools/Linux/kodi.desktop
78 DESTINATION ${datarootdir}/applications)
79
80foreach(texture ${XBT_FILES})
81 string(REPLACE "${CMAKE_BINARY_DIR}/" "" dir ${texture})
82 get_filename_component(dir ${dir} PATH)
83 install(FILES ${texture}
84 DESTINATION ${datarootdir}/kodi/${dir})
85endforeach()
86
87foreach(wraplib ${WRAP_FILES})
88 get_filename_component(dir ${wraplib} PATH)
89 install(PROGRAMS ${CMAKE_BINARY_DIR}/${wraplib}
90 DESTINATION ${libdir}/kodi/${dir})
91endforeach()
92
93foreach(file ${install_data})
94 get_filename_component(dir ${file} PATH)
95 install(FILES ${CMAKE_BINARY_DIR}/${file}
96 DESTINATION ${datarootdir}/kodi/${dir})
97endforeach()
98
99if(EXISTS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs)
100 install(CODE "file(STRINGS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/extra-installs dirs)
101 foreach(dir \${dirs})
102 file(GLOB_RECURSE FILES RELATIVE ${CMAKE_BINARY_DIR} \${dir}/*)
103 foreach(file \${FILES})
104 get_filename_component(dir \${file} PATH)
105 file(INSTALL \${file} DESTINATION ${datarootdir}/kodi/\${dir})
106 endforeach()
107 endforeach()")
108endif()
109
110if(NOT "$ENV{DESTDIR}" STREQUAL "")
111 set(DESTDIR ${CMAKE_BINARY_DIR}/$ENV{DESTDIR})
112endif()
113foreach(subdir ${build_dirs})
114 if(NOT subdir MATCHES kodi-platform)
115 string(REPLACE " " ";" subdir ${subdir})
116 list(GET subdir 0 id)
117 install(CODE "execute_process(COMMAND make -C ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${id}/src/${id}-build install DESTDIR=${DESTDIR})")
118 endif()
119endforeach()
120
121install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon16x16.png
122 RENAME ${APP_NAME_LC}.png
123 DESTINATION ${datarootdir}/icons/hicolor/16x16/apps)
124install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon22x22.png
125 RENAME ${APP_NAME_LC}.png
126 DESTINATION ${datarootdir}/icons/hicolor/22x22/apps)
127install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon24x24.png
128 RENAME ${APP_NAME_LC}.png
129 DESTINATION ${datarootdir}/icons/hicolor/24x24/apps)
130install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon32x32.png
131 RENAME ${APP_NAME_LC}.png
132 DESTINATION ${datarootdir}/icons/hicolor/32x32/apps)
133install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon48x48.png
134 RENAME ${APP_NAME_LC}.png
135 DESTINATION ${datarootdir}/icons/hicolor/48x48/apps)
136install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon64x64.png
137 RENAME ${APP_NAME_LC}.png
138 DESTINATION ${datarootdir}/icons/hicolor/64x64/apps)
139install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon128x128.png
140 RENAME ${APP_NAME_LC}.png
141 DESTINATION ${datarootdir}/icons/hicolor/128x128/apps)
142install(FILES ${CORE_SOURCE_DIR}/tools/Linux/packaging/media/icon256x256.png
143 RENAME ${APP_NAME_LC}.png
144 DESTINATION ${datarootdir}/icons/hicolor/256x256/apps)
145
146install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -q -t $ENV{DESTDIR}${datarootdir}/icons/hicolor ERROR_QUIET)")
diff --git a/project/cmake/scripts/darwin/archsetup.cmake b/project/cmake/scripts/osx/ArchSetup.cmake
index accb8ab..3047863 100644
--- a/project/cmake/scripts/darwin/archsetup.cmake
+++ b/project/cmake/scripts/osx/ArchSetup.cmake
@@ -1,5 +1,5 @@
1if(NOT CMAKE_TOOLCHAIN_FILE) 1if(NOT CMAKE_TOOLCHAIN_FILE)
2 message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for darwin. See ${PROJECT_SOURCE_DIR}/README.md") 2 message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for osx. See ${PROJECT_SOURCE_DIR}/README.md")
3endif() 3endif()
4 4
5set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp 5set(CORE_MAIN_SOURCE ${CORE_SOURCE_DIR}/xbmc/platform/posix/main.cpp
@@ -14,10 +14,9 @@ set(CMAKE_SYSTEM_NAME Darwin)
14if(WITH_ARCH) 14if(WITH_ARCH)
15 set(ARCH ${WITH_ARCH}) 15 set(ARCH ${WITH_ARCH})
16else() 16else()
17 if(CPU STREQUAL x86_64) 17 if(CPU STREQUAL x86_64 OR CPU STREQUAL i386)
18 set(ARCH x86_64-apple-darwin) 18 set(ARCH x86-osx)
19 elseif(CPU STREQUAL i386) 19 set(NEON False)
20 set(ARCH i386-apple-darwin)
21 else() 20 else()
22 message(SEND_ERROR "Unknown CPU: ${CPU}") 21 message(SEND_ERROR "Unknown CPU: ${CPU}")
23 endif() 22 endif()
@@ -31,4 +30,5 @@ list(APPEND DEPLIBS "-framework DiskArbitration" "-framework IOKit"
31 "-framework IOSurface" "-framework SystemConfiguration" 30 "-framework IOSurface" "-framework SystemConfiguration"
32 "-framework ApplicationServices" "-framework AppKit" 31 "-framework ApplicationServices" "-framework AppKit"
33 "-framework CoreAudio" "-framework AudioToolbox" 32 "-framework CoreAudio" "-framework AudioToolbox"
34 "-framework CoreGraphics") 33 "-framework CoreGraphics" "-framework CoreMedia"
34 "-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 @@
1# XBMCHelper
2add_subdirectory(${CORE_SOURCE_DIR}/tools/EventClients/Clients/OSXRemote build/XBMCHelper)
3add_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 @@
1# OSX packaging
2
3set(PACKAGE_OUTPUT_DIR ${CMAKE_BINARY_DIR}/build/${CORE_BUILD_CONFIG})
4
5configure_file(${CORE_SOURCE_DIR}/xbmc/platform/darwin/osx/Info.plist.in
6 ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist @ONLY)
7execute_process(COMMAND perl -p -i -e "s/r####/${APP_SCMID}/" ${CMAKE_BINARY_DIR}/xbmc/platform/darwin/osx/Info.plist)
8
9add_custom_target(bundle
10 COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${APP_NAME_LC}> ${PACKAGE_OUTPUT_DIR}/${APP_NAME}
11 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/DllPaths_generated.h
12 ${CMAKE_BINARY_DIR}/xbmc/DllPaths_generated.h
13 COMMAND "ACTION=build"
14 "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
15 "TARGET_NAME=${APP_NAME}.app"
16 "APP_NAME=${APP_NAME}"
17 "SRCROOT=${CMAKE_BINARY_DIR}"
18 ${CORE_SOURCE_DIR}/tools/darwin/Support/CopyRootFiles-osx.command
19 COMMAND "XBMC_DEPENDS=${DEPENDS_PATH}"
20 "TARGET_BUILD_DIR=${PACKAGE_OUTPUT_DIR}"
21 "TARGET_NAME=${APP_NAME}.app"
22 "APP_NAME=${APP_NAME}"
23 "FULL_PRODUCT_NAME=${APP_NAME}.app"
24 "SRCROOT=${CMAKE_BINARY_DIR}"
25 ${CORE_SOURCE_DIR}/tools/darwin/Support/copyframeworks-osx.command)
26set_target_properties(bundle PROPERTIES FOLDER "Build Utilities")
27add_dependencies(bundle ${APP_NAME_LC})
28
29configure_file(${CORE_SOURCE_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh.in
30 ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/mkdmg-osx.sh @ONLY)
31
32add_custom_target(dmg
33 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/darwin/packaging/osx/
34 ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx/
35 COMMAND ${CMAKE_COMMAND} -E copy_directory ${CORE_SOURCE_DIR}/tools/darwin/packaging/media/osx/
36 ${CMAKE_BINARY_DIR}/tools/darwin/packaging/media/osx/
37 COMMAND ./mkdmg-osx.sh ${CORE_BUILD_CONFIG}
38 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tools/darwin/packaging/osx)
39set_target_properties(dmg PROPERTIES FOLDER "Build Utilities")
40add_dependencies(dmg bundle)
diff --git a/project/cmake/scripts/darwin/macros.cmake b/project/cmake/scripts/osx/Macros.cmake
index 4ee17c2..0d04439 100644
--- a/project/cmake/scripts/darwin/macros.cmake
+++ b/project/cmake/scripts/osx/Macros.cmake
@@ -1,5 +1,5 @@
1function(core_link_library lib wraplib) 1function(core_link_library lib wraplib)
2 if(CMAKE_GENERATOR MATCHES "Unix Makefiles") 2 if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL Ninja)
3 set(wrapper_obj cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o) 3 set(wrapper_obj cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o)
4 elseif(CMAKE_GENERATOR MATCHES "Xcode") 4 elseif(CMAKE_GENERATOR MATCHES "Xcode")
5 set(wrapper_obj cores/dll-loader/exports/kodi.build/$(CONFIGURATION)/wrapper.build/Objects-$(CURRENT_VARIANT)/$(CURRENT_ARCH)/wrapper.o) 5 set(wrapper_obj cores/dll-loader/exports/kodi.build/$(CONFIGURATION)/wrapper.build/Objects-$(CURRENT_VARIANT)/$(CURRENT_ARCH)/wrapper.o)
@@ -8,8 +8,9 @@ function(core_link_library lib wraplib)
8 endif() 8 endif()
9 9
10 set(export -bundle -undefined dynamic_lookup -read_only_relocs suppress 10 set(export -bundle -undefined dynamic_lookup -read_only_relocs suppress
11 -Wl,-alias_list,${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def 11 -Wl,-alias_list,${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def
12 ${CORE_BUILD_DIR}/${wrapper_obj}) 12 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${wrapper_obj})
13 set(extension ${CMAKE_SHARED_MODULE_SUFFIX})
13 set(check_arg "") 14 set(check_arg "")
14 if(TARGET ${lib}) 15 if(TARGET ${lib})
15 set(target ${lib}) 16 set(target ${lib})
@@ -25,34 +26,34 @@ function(core_link_library lib wraplib)
25 if(check_arg STREQUAL export) 26 if(check_arg STREQUAL export)
26 set(export ${export} 27 set(export ${export}
27 -Wl,--version-script=${ARGV3}) 28 -Wl,--version-script=${ARGV3})
28 elseif(check_arg STREQUAL nowrap)
29 set(export ${data_arg})
30 elseif(check_arg STREQUAL extras) 29 elseif(check_arg STREQUAL extras)
31 foreach(arg ${data_arg}) 30 foreach(arg ${data_arg})
32 list(APPEND export ${arg}) 31 list(APPEND export ${arg})
33 endforeach() 32 endforeach()
33 elseif(check_arg STREQUAL archives)
34 set(extra_libs ${data_arg})
34 endif() 35 endif()
35 get_filename_component(dir ${wraplib} PATH) 36 get_filename_component(dir ${wraplib} DIRECTORY)
36 37
37 # We can't simply pass the linker flags to the args section of the custom command 38 # We can't simply pass the linker flags to the args section of the custom command
38 # because cmake will add quotes around it (and the linker will fail due to those). 39 # because cmake will add quotes around it (and the linker will fail due to those).
39 # We need to do this handstand first ... 40 # We need to do this handstand first ...
40 separate_arguments(CUSTOM_COMMAND_ARGS_LDFLAGS UNIX_COMMAND "${CMAKE_SHARED_LINKER_FLAGS}") 41 string(REPLACE " " ";" CUSTOM_COMMAND_ARGS_LDFLAGS ${CMAKE_SHARED_LINKER_FLAGS})
41 42
42 add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} 43 add_custom_command(OUTPUT ${wraplib}-${ARCH}${extension}
43 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} 44 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
44 COMMAND ${CMAKE_C_COMPILER} 45 COMMAND ${CMAKE_C_COMPILER}
45 ARGS ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} 46 ARGS ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} ${extra_libs}
46 -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX} 47 -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension}
47 DEPENDS ${target} wrapper.def wrapper 48 DEPENDS ${target} wrapper.def wrapper
48 VERBATIM) 49 VERBATIM)
49 50
50 # Uncomment to create wrap_<lib> targets for debugging 51 get_filename_component(libname ${wraplib} NAME_WE)
51 #get_filename_component(libname ${wraplib} NAME_WE) 52 add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${extension})
52 #add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) 53 set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped)
54 add_dependencies(${APP_NAME_LC}-libraries wrap_${libname})
53 55
54 list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}) 56 set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension} CACHE STRING "" FORCE)
55 set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE)
56endfunction() 57endfunction()
57 58
58function(find_soname lib) 59function(find_soname lib)
@@ -98,7 +99,9 @@ function(find_soname lib)
98 OUTPUT_VARIABLE filename 99 OUTPUT_VARIABLE filename
99 OUTPUT_STRIP_TRAILING_WHITESPACE) 100 OUTPUT_STRIP_TRAILING_WHITESPACE)
100 get_filename_component(${lib}_SONAME "${filename}" NAME) 101 get_filename_component(${lib}_SONAME "${filename}" NAME)
101 message(STATUS "${lib} soname: ${${lib}_SONAME}") 102 if(VERBOSE)
103 message(STATUS "${lib} soname: ${${lib}_SONAME}")
104 endif()
102 endif() 105 endif()
103 endforeach() 106 endforeach()
104 if(arg_REQUIRED AND NOT ${lib}_SONAME) 107 if(arg_REQUIRED AND NOT ${lib}_SONAME)
diff --git a/project/cmake/scripts/darwin/pathsetup.cmake b/project/cmake/scripts/osx/PathSetup.cmake
index 071dfd4..071dfd4 100644
--- a/project/cmake/scripts/darwin/pathsetup.cmake
+++ b/project/cmake/scripts/osx/PathSetup.cmake
diff --git a/project/cmake/scripts/rbpi/archsetup.cmake b/project/cmake/scripts/rbpi/ArchSetup.cmake
index 72a610f..fa1f9f4 100644
--- a/project/cmake/scripts/rbpi/archsetup.cmake
+++ b/project/cmake/scripts/rbpi/ArchSetup.cmake
@@ -1,7 +1,3 @@
1if(NOT CMAKE_TOOLCHAIN_FILE)
2 message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE required for rbpi. See ${PROJECT_SOURCE_DIR}/README.md")
3endif()
4
5set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI 1set(ARCH_DEFINES -DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI
6 -DHAS_OMXPLAYER -DHAVE_OMXLIB) 2 -DHAS_OMXPLAYER -DHAVE_OMXLIB)
7set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED 3set(SYSTEM_DEFINES -D__STDC_CONSTANT_MACROS -D_FILE_DEFINED
@@ -16,8 +12,10 @@ if(WITH_ARCH)
16else() 12else()
17 if(CPU STREQUAL arm1176jzf-s) 13 if(CPU STREQUAL arm1176jzf-s)
18 set(ARCH arm-linux-gnueabihf) 14 set(ARCH arm-linux-gnueabihf)
19 elseif(CPU MATCHES "cortex-a7") 15 set(NEON False)
16 elseif(CPU MATCHES "cortex-a7" OR CPU MATCHES "cortex-a53")
20 set(ARCH arm-linux-gnueabihf) 17 set(ARCH arm-linux-gnueabihf)
18 set(NEON True)
21 else() 19 else()
22 message(SEND_ERROR "Unknown CPU: ${CPU}") 20 message(SEND_ERROR "Unknown CPU: ${CPU}")
23 endif() 21 endif()
@@ -25,8 +23,6 @@ endif()
25 23
26find_package(CXX11 REQUIRED) 24find_package(CXX11 REQUIRED)
27 25
28set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
29set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE})
30set(MMAL_FOUND 1 CACHE INTERNAL "MMAL") 26set(MMAL_FOUND 1 CACHE INTERNAL "MMAL")
31set(OMX_FOUND 1 CACHE INTERNAL "OMX") 27set(OMX_FOUND 1 CACHE INTERNAL "OMX")
32set(OMXLIB_FOUND 1 CACHE INTERNAL "OMX") 28set(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/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 @@
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
deleted file mode 120000
index 28c77ca..0000000
--- a/project/cmake/scripts/rbpi/macros.cmake
+++ /dev/null
@@ -1 +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
deleted file mode 120000
index 26d7f17..0000000
--- a/project/cmake/scripts/rbpi/pathsetup.cmake
+++ /dev/null
@@ -1 +0,0 @@
1../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
index a54ab65..431b641 100644
--- a/project/cmake/scripts/windows/archsetup.cmake
+++ b/project/cmake/scripts/windows/ArchSetup.cmake
@@ -5,7 +5,7 @@ set(ARCH win32)
5 5
6# -------- Paths (mainly for find_package) --------- 6# -------- Paths (mainly for find_package) ---------
7 7
8set(PLATFORM_DIR win32) 8set(PLATFORM_DIR platform/win32)
9 9
10# Precompiled headers fail with per target output directory. (needs CMake 3.1) 10# Precompiled headers fail with per target output directory. (needs CMake 3.1)
11set(PRECOMPILEDHEADER_DIR ${PROJECT_BINARY_DIR}/${CORE_BUILD_CONFIG}/objs) 11set(PRECOMPILEDHEADER_DIR ${PROJECT_BINARY_DIR}/${CORE_BUILD_CONFIG}/objs)
@@ -16,7 +16,6 @@ list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpe
16list(APPEND CMAKE_SYSTEM_LIBRARY_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin) 16list(APPEND CMAKE_SYSTEM_LIBRARY_PATH ${PROJECT_SOURCE_DIR}/../../lib/win32/ffmpeg/bin)
17list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../BuildDependencies) 17list(APPEND CMAKE_SYSTEM_PREFIX_PATH ${PROJECT_SOURCE_DIR}/../BuildDependencies)
18 18
19set(JPEG_NAMES ${JPEG_NAMES} jpeg-static)
20set(PYTHON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../BuildDependencies/include/python) 19set(PYTHON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../BuildDependencies/include/python)
21 20
22 21
@@ -28,7 +27,6 @@ set(SYSTEM_DEFINES -DNOMINMAX -D_USE_32BIT_TIME_T -DHAS_DX -D__STDC_CONSTANT_MAC
28 -DTAGLIB_STATIC -DNPT_CONFIG_ENABLE_LOGGING 27 -DTAGLIB_STATIC -DNPT_CONFIG_ENABLE_LOGGING
29 -DPLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi" 28 -DPLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi"
30 -DPLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi" 29 -DPLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi"
31 -DBUILDING_WITH_CMAKE
32 $<$<CONFIG:Debug>:-DD3D_DEBUG_INFO -D_ITERATOR_DEBUG_LEVEL=0>) 30 $<$<CONFIG:Debug>:-DD3D_DEBUG_INFO -D_ITERATOR_DEBUG_LEVEL=0>)
33 31
34# Make sure /FS is set for Visual Studio in order to prevent simultanious access to pdb files. 32# Make sure /FS is set for Visual Studio in order to prevent simultanious access to pdb files.
@@ -36,6 +34,9 @@ if(CMAKE_GENERATOR MATCHES "Visual Studio")
36 set(CMAKE_CXX_FLAGS "/MP /FS ${CMAKE_CXX_FLAGS}") 34 set(CMAKE_CXX_FLAGS "/MP /FS ${CMAKE_CXX_FLAGS}")
37endif() 35endif()
38 36
37# Google Test needs to use shared version of runtime libraries
38set(gtest_force_shared_crt ON CACHE STRING "" FORCE)
39
39 40
40# -------- Linker options --------- 41# -------- Linker options ---------
41 42
@@ -78,4 +79,11 @@ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OP
78 79
79if(CMAKE_GENERATOR MATCHES "Visual Studio") 80if(CMAKE_GENERATOR MATCHES "Visual Studio")
80 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 81 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
82
83 # Generate a batch file that opens Visual Studio with the necessary env variables set.
84 file(WRITE ${CMAKE_BINARY_DIR}/kodi-sln.bat
85 "@echo off\n"
86 "set KODI_HOME=%~dp0\n"
87 "set PATH=%~dp0\\system\n"
88 "start %~dp0\\${PROJECT_NAME}.sln")
81endif() 89endif()
diff --git a/project/cmake/scripts/windows/c-flag-overrides.cmake b/project/cmake/scripts/windows/CFlagOverrides.cmake
index fd85f5c..3158e75 100644
--- a/project/cmake/scripts/windows/c-flag-overrides.cmake
+++ b/project/cmake/scripts/windows/CFlagOverrides.cmake
@@ -2,4 +2,4 @@ if(MSVC)
2 set(CMAKE_C_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /Zi /arch:SSE2") 2 set(CMAKE_C_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /Zi /arch:SSE2")
3 set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") 3 set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0")
4 set(CMAKE_C_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") 4 set(CMAKE_C_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG")
5endif(MSVC) 5endif()
diff --git a/project/cmake/scripts/windows/cxx-flag-overrides.cmake b/project/cmake/scripts/windows/CXXFlagOverrides.cmake
index 536b809..0b52dc6 100644
--- a/project/cmake/scripts/windows/cxx-flag-overrides.cmake
+++ b/project/cmake/scripts/windows/CXXFlagOverrides.cmake
@@ -2,4 +2,4 @@ if(MSVC)
2 set(CMAKE_CXX_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /GR /Zi /EHsc /arch:SSE2") 2 set(CMAKE_CXX_FLAGS_INIT "/MP /DWIN32 /D_WINDOWS /W3 /GR /Zi /EHsc /arch:SSE2")
3 set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0") 3 set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Ob0 /Od /RTC1 /D_ITERATOR_DEBUG_LEVEL=0")
4 set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG") 4 set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MD /Ox /Ob2 /Oi /Ot /Oy /GL /DNDEBUG")
5endif(MSVC) 5endif()
diff --git a/project/cmake/scripts/android/install.cmake b/project/cmake/scripts/windows/Install.cmake
index e69de29..e69de29 100644
--- a/project/cmake/scripts/android/install.cmake
+++ b/project/cmake/scripts/windows/Install.cmake
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 @@
1function(core_link_library lib wraplib)
2 message(AUTHOR_WARNING "core_link_library is not compatible with windows.")
3endfunction()
4
5function(find_soname lib)
6 # Windows uses hardcoded dlls in xbmc/DllPaths_win32.h.
7 # Therefore the output of this function is unused.
8endfunction()
9
10# Add precompiled header to target
11# Arguments:
12# target existing target that will be set up to compile with a precompiled header
13# pch_header the precompiled header file
14# pch_source the precompiled header source file
15# Optional Arguments:
16# PCH_TARGET build precompiled header as separate target with the given name
17# so that the same precompiled header can be used for multiple libraries
18# EXCLUDE_SOURCES if not all target sources shall use the precompiled header,
19# the relevant files can be listed here
20# On return:
21# Compiles the pch_source into a precompiled header and adds the header to
22# the given target
23function(add_precompiled_header target pch_header pch_source)
24 cmake_parse_arguments(PCH "" "PCH_TARGET" "EXCLUDE_SOURCES" ${ARGN})
25
26 if(PCH_PCH_TARGET)
27 set(pch_binary ${PRECOMPILEDHEADER_DIR}/${PCH_PCH_TARGET}.pch)
28 else()
29 set(pch_binary ${PRECOMPILEDHEADER_DIR}/${target}.pch)
30 endif()
31
32 # Set compile options and dependency for sources
33 get_target_property(sources ${target} SOURCES)
34 list(REMOVE_ITEM sources ${pch_source})
35 foreach(exclude_source IN LISTS PCH_EXCLUDE_SOURCES)
36 list(REMOVE_ITEM sources ${exclude_source})
37 endforeach()
38 set_source_files_properties(${sources}
39 PROPERTIES COMPILE_FLAGS "/Yu\"${pch_header}\" /Fp\"${pch_binary}\" /FI\"${pch_header}\""
40 OBJECT_DEPENDS "${pch_binary}")
41
42 # Set compile options for precompiled header
43 if(NOT PCH_PCH_TARGET OR NOT TARGET ${PCH_PCH_TARGET}_pch)
44 set_source_files_properties(${pch_source}
45 PROPERTIES COMPILE_FLAGS "/Yc\"${pch_header}\" /Fp\"${pch_binary}\""
46 OBJECT_OUTPUTS "${pch_binary}")
47 endif()
48
49 # Compile precompiled header
50 if(PCH_PCH_TARGET)
51 # As own target for usage in multiple libraries
52 if(NOT TARGET ${PCH_PCH_TARGET}_pch)
53 add_library(${PCH_PCH_TARGET}_pch STATIC ${pch_source})
54 set_target_properties(${PCH_PCH_TARGET}_pch PROPERTIES COMPILE_PDB_NAME vc140
55 COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR}
56 FOLDER "Build Utilities")
57 endif()
58 # From VS2012 onwards, precompiled headers have to be linked against (LNK2011).
59 target_link_libraries(${target} PUBLIC ${PCH_PCH_TARGET}_pch)
60 set_target_properties(${target} PROPERTIES COMPILE_PDB_NAME vc140
61 COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR})
62 else()
63 # As part of the target
64 target_sources(${target} PRIVATE ${pch_source})
65 endif()
66endfunction()
diff --git a/project/cmake/scripts/linux/pathsetup.cmake b/project/cmake/scripts/windows/PathSetup.cmake
index 8550616..8550616 100644
--- a/project/cmake/scripts/linux/pathsetup.cmake
+++ b/project/cmake/scripts/windows/PathSetup.cmake
diff --git a/project/cmake/scripts/windows/install.cmake b/project/cmake/scripts/windows/install.cmake
deleted file mode 100644
index e69de29..0000000
--- a/project/cmake/scripts/windows/install.cmake
+++ /dev/null
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 @@
1function(core_link_library lib wraplib)
2# set(export -Wl,--unresolved-symbols=ignore-all
3# `cat ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def`
4# ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/CMakeFiles/wrapper.dir/wrapper.c.o)
5# set(check_arg "")
6# if(TARGET ${lib})
7# set(target ${lib})
8# set(link_lib ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${lib}/${lib}.a)
9# set(check_arg ${ARGV2})
10# set(data_arg ${ARGV3})
11# else()
12# set(target ${ARGV2})
13# set(link_lib ${lib})
14# set(check_arg ${ARGV3})
15# set(data_arg ${ARGV4})
16# endif()
17# if(check_arg STREQUAL "export")
18# set(export ${export}
19# -Wl,--version-script=${ARGV3})
20# elseif(check_arg STREQUAL "nowrap")
21# set(export ${data_arg})
22# elseif(check_arg STREQUAL "extras")
23# foreach(arg ${data_arg})
24# list(APPEND export ${arg})
25# endforeach()
26# endif()
27# get_filename_component(dir ${wraplib} PATH)
28# add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
29# COMMAND cmake -E make_directory ${dir}
30# COMMAND ${CMAKE_C_COMPILER}
31# ARGS -Wl,--whole-archive
32# ${link_lib}
33# -Wl,--no-whole-archive -lm
34# -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
35# ${export}
36# DEPENDS ${target} wrapper.def wrapper)
37# list(APPEND WRAP_FILES ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX})
38# set(WRAP_FILES ${WRAP_FILES} PARENT_SCOPE)
39endfunction()
40
41function(find_soname lib)
42 # Windows uses hardcoded dlls in xbmc/DllPaths_win32.h.
43 # Therefore the output of this function is unused.
44endfunction()
45
46# Add precompiled header to target
47# Arguments:
48# target existing target that will be set up to compile with a precompiled header
49# pch_header the precompiled header file
50# pch_source the precompiled header source file
51# Optional Arguments:
52# PCH_TARGET build precompiled header as separate target with the given name
53# so that the same precompiled header can be used for multiple libraries
54# EXCLUDE_SOURCES if not all target sources shall use the precompiled header,
55# the relevant files can be listed here
56# On return:
57# Compiles the pch_source into a precompiled header and adds the header to
58# the given target
59function(add_precompiled_header target pch_header pch_source)
60 cmake_parse_arguments(PCH "" "PCH_TARGET" "EXCLUDE_SOURCES" ${ARGN})
61
62 if(PCH_PCH_TARGET)
63 set(pch_binary ${PRECOMPILEDHEADER_DIR}/${PCH_PCH_TARGET}.pch)
64 else()
65 set(pch_binary ${PRECOMPILEDHEADER_DIR}/${target}.pch)
66 endif()
67
68 # Set compile options and dependency for sources
69 get_target_property(sources ${target} SOURCES)
70 list(REMOVE_ITEM sources ${pch_source})
71 foreach(exclude_source IN LISTS PCH_EXCLUDE_SOURCES)
72 list(REMOVE_ITEM sources ${exclude_source})
73 endforeach()
74 set_source_files_properties(${sources}
75 PROPERTIES COMPILE_FLAGS "/Yu\"${pch_header}\" /Fp\"${pch_binary}\" /FI\"${pch_header}\""
76 OBJECT_DEPENDS "${pch_binary}")
77
78 # Set compile options for precompiled header
79 if(NOT PCH_PCH_TARGET OR NOT TARGET ${PCH_PCH_TARGET}_pch)
80 set_source_files_properties(${pch_source}
81 PROPERTIES COMPILE_FLAGS "/Yc\"${pch_header}\" /Fp\"${pch_binary}\""
82 OBJECT_OUTPUTS "${pch_binary}")
83 endif()
84
85 # Compile precompiled header
86 if(PCH_PCH_TARGET)
87 # As own target for usage in multiple libraries
88 if(NOT TARGET ${PCH_PCH_TARGET}_pch)
89 add_library(${PCH_PCH_TARGET}_pch STATIC ${pch_source})
90 set_target_properties(${PCH_PCH_TARGET}_pch PROPERTIES COMPILE_PDB_NAME vc140
91 COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR})
92 endif()
93 # From VS2012 onwards, precompiled headers have to be linked against (LNK2011).
94 target_link_libraries(${target} PUBLIC ${PCH_PCH_TARGET}_pch)
95 set_target_properties(${target} PROPERTIES COMPILE_PDB_NAME vc140
96 COMPILE_PDB_OUTPUT_DIRECTORY ${PRECOMPILEDHEADER_DIR})
97 else()
98 # As part of the target
99 target_sources(${target} PRIVATE ${pch_source})
100 endif()
101endfunction()
102
103# Adds an FX-compiled shader to a target
104# Creates a custom command that FX-compiles the given shader and adds the
105# generated header file to the given target.
106# Arguments:
107# target Target to add the FX-compiled shader to
108# hlsl HLSL shader input file
109# profile HLSL profile that specifies the shader model
110# entrypoint Shader entry point
111# On return:
112# FXC_FILE is set to the name of the generated header file.
113function(add_shader_dx target hlsl profile entrypoint)
114 get_filename_component(file ${hlsl} NAME_WE)
115 add_custom_command(OUTPUT ${file}.h
116 COMMAND ${FXC} /Fh ${file}.h
117 /E ${entrypoint}
118 /T ${profile}
119 /Vn ${file}
120 /Qstrip_reflect
121 ${hlsl}
122 DEPENDS ${hlsl}
123 COMMENT "FX compile ${hlsl}"
124 VERBATIM)
125 target_sources(${target} PRIVATE ${file}.h)
126 target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
127endfunction()
128
129# Copies the main dlls to the root of the buildtree
130# On return:
131# files added to ${install_data}, mirror in build tree
132function(copy_main_dlls_to_buildtree)
133 set(dir ${PROJECT_SOURCE_DIR}/../Win32BuildSetup/dependencies)
134 file(GLOB_RECURSE files ${dir}/*)
135 foreach(file ${files})
136 copy_file_to_buildtree(${file} ${dir})
137 endforeach()
138
139 if(D3DCOMPILER_DLL)
140 get_filename_component(d3dcompiler_dir ${D3DCOMPILER_DLL} DIRECTORY)
141 copy_file_to_buildtree(${D3DCOMPILER_DLL} ${d3dcompiler_dir})
142 endif()
143
144 set(install_data ${install_data} PARENT_SCOPE)
145endfunction()