aboutsummaryrefslogtreecommitdiff
path: root/project/cmake/addons/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'project/cmake/addons/CMakeLists.txt')
-rw-r--r--project/cmake/addons/CMakeLists.txt434
1 files changed, 0 insertions, 434 deletions
diff --git a/project/cmake/addons/CMakeLists.txt b/project/cmake/addons/CMakeLists.txt
deleted file mode 100644
index 96e544bb44..0000000000
--- a/project/cmake/addons/CMakeLists.txt
+++ /dev/null
@@ -1,434 +0,0 @@
-cmake_minimum_required(VERSION 3.1)
-project(kodi-addons)
-
-list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
-
-option(ADDON_TARBALL_CACHING "Cache downloaded addon source tarballs?" ON)
-if(ADDON_TARBALL_CACHING)
- message(STATUS "Addon source tarball caching is enabled")
-else()
- message(STATUS "Addon source tarball caching is disabled")
-endif()
-
-if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE Release)
-endif()
-
-if(NOT CORE_SYSTEM_NAME)
- if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- set(CORE_SYSTEM_NAME "osx")
- else()
- string(TOLOWER ${CMAKE_SYSTEM_NAME} CORE_SYSTEM_NAME)
- endif()
-endif()
-
-include(ExternalProject)
-
-### setup all the necessary paths
-if(APP_ROOT)
- set(CORE_SOURCE_DIR ${APP_ROOT})
- unset(APP_ROOT)
- message(WARNING "APP_ROOT is deprecated. Please use CORE_SOURCE_DIR instead.")
-endif()
-if(NOT CORE_SOURCE_DIR)
- set(CORE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../..)
-else()
- file(TO_CMAKE_PATH "${CORE_SOURCE_DIR}" CORE_SOURCE_DIR)
-endif()
-get_filename_component(CORE_SOURCE_DIR "${CORE_SOURCE_DIR}" ABSOLUTE)
-
-if(NOT BUILD_DIR)
- set(BUILD_DIR "${CMAKE_BINARY_DIR}/build")
-else()
- file(TO_CMAKE_PATH "${BUILD_DIR}" BUILD_DIR)
-endif()
-get_filename_component(BUILD_DIR "${BUILD_DIR}" ABSOLUTE)
-
-if(NOT ADDON_DEPENDS_PATH)
- set(ADDON_DEPENDS_PATH "${BUILD_DIR}/depends")
-else()
- file(TO_CMAKE_PATH "${ADDON_DEPENDS_PATH}" ADDON_DEPENDS_PATH)
-endif()
-get_filename_component(ADDON_DEPENDS_PATH "${ADDON_DEPENDS_PATH}" ABSOLUTE)
-
-if(NOT PLATFORM_DIR)
- set(PLATFORM_DIR ${CORE_SOURCE_DIR}/project/cmake/platform/${CORE_SYSTEM_NAME})
- file(TO_CMAKE_PATH "${PLATFORM_DIR}" PLATFORM_DIR)
-endif()
-
-# make sure CMAKE_PREFIX_PATH is set
-if(NOT CMAKE_PREFIX_PATH)
- set(CMAKE_PREFIX_PATH "${ADDON_DEPENDS_PATH}")
-else()
- file(TO_CMAKE_PATH "${CMAKE_PREFIX_PATH}" CMAKE_PREFIX_PATH)
- list(APPEND CMAKE_PREFIX_PATH "${ADDON_DEPENDS_PATH}")
-endif()
-
-# check for autoconf stuff to pass on
-if(AUTOCONF_FILES)
- string(REPLACE " " ";" AUTOCONF_FILES ${AUTOCONF_FILES})
- set(CROSS_AUTOCONF "yes")
-endif()
-
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR NOT CMAKE_INSTALL_PREFIX)
- set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/output/addons")
-endif()
-list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
-
-set(BUILD_ARGS -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
- -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
- -DPACKAGE_CONFIG_PATH=${ADDON_DEPENDS_PATH}/lib/pkgconfig
- -DADDON_DEPENDS_PATH=${ADDON_DEPENDS_PATH}
- -DOVERRIDE_PATHS=${OVERRIDE_PATHS}
- -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
- -DCMAKE_USER_MAKE_RULES_OVERRIDE=${CMAKE_USER_MAKE_RULES_OVERRIDE}
- -DCMAKE_USER_MAKE_RULES_OVERRIDE_CXX=${CMAKE_USER_MAKE_RULES_OVERRIDE_CXX}
- -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME}
- -DBUILD_SHARED_LIBS=1
- -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
- -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS})
-
-if(MSVC)
- # move cmake specific targets to a CMakePredefinedTargets folder in Visual Studio
- set_property(GLOBAL PROPERTY USE_FOLDERS ON)
-endif()
-
-option(PACKAGE_ZIP "Prepare built addons for packaging" OFF)
-if(PACKAGE_ZIP)
- # needed for project installing
- list(APPEND BUILD_ARGS -DPACKAGE_ZIP=ON)
-
- # figure out where to store the packaged ZIP archives
- if(NOT PACKAGE_DIR)
- set(PACKAGE_DIR "${BUILD_DIR}/zips")
- else()
- file(TO_CMAKE_PATH "${PACKAGE_DIR}" PACKAGE_DIR)
- endif()
- list(APPEND BUILD_ARGS -DPACKAGE_DIR=${PACKAGE_DIR})
-
- message(STATUS "ZIP packaging enabled (destination: ${PACKAGE_DIR})")
-endif()
-
-if(CMAKE_TOOLCHAIN_FILE)
- list(APPEND BUILD_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
- message(STATUS "Toolchain specified")
- message(STATUS ${BUILD_ARGS})
-endif()
-
-if(NOT ADDONS_TO_BUILD)
- set(ADDONS_TO_BUILD "all")
-else()
- string(STRIP "${ADDONS_TO_BUILD}" ADDONS_TO_BUILD)
- message(STATUS "Building following addons: ${ADDONS_TO_BUILD}")
- string(REPLACE " " ";" ADDONS_TO_BUILD ${ADDONS_TO_BUILD})
-endif()
-
-if(NOT ADDONS_DEFINITION_DIR)
- set(ADDONS_DEFINITION_DIR ${PROJECT_SOURCE_DIR}/addons)
-else()
- file(TO_CMAKE_PATH "${ADDONS_DEFINITION_DIR}" ADDONS_DEFINITION_DIR)
-endif()
-get_filename_component(ADDONS_DEFINITION_DIR "${ADDONS_DEFINITION_DIR}" ABSOLUTE)
-
-if(ADDON_SRC_PREFIX)
- if(NOT IS_ABSOLUTE ${ADDON_SRC_PREFIX})
- get_filename_component(ADDON_SRC_PREFIX "${CMAKE_BINARY_DIR}/${ADDON_SRC_PREFIX}" ABSOLUTE)
- endif()
- message(STATUS "Overriding addon source directory prefix: ${ADDON_SRC_PREFIX}")
-endif()
-
-if(NOT APP_LIB_DIR)
- set(APP_LIB_DIR "${ADDON_DEPENDS_PATH}/lib/kodi")
-else()
- file(TO_CMAKE_PATH "${APP_LIB_DIR}" APP_LIB_DIR)
-endif()
-
-set(APP_PREFIX "${CMAKE_INSTALL_PREFIX}")
-
-# check for platform specific stuff
-if(EXISTS ${PLATFORM_DIR}/defines.txt)
- file(STRINGS ${PLATFORM_DIR}/defines.txt platformdefines)
-
- if(NOT ARCH_DEFINES AND platformdefines)
- set(ARCH_DEFINES ${platformdefines})
- endif()
-endif()
-
-# include check_target_platform() function
-include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/CheckTargetPlatform.cmake)
-
-set(ADDON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
-if(NOT WIN32)
- # check install permissions
- check_install_permissions(${CMAKE_INSTALL_PREFIX} can_write)
- if(NOT ${can_write} AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
- set(NEED_SUDO TRUE)
- set(ADDON_INSTALL_DIR ${CMAKE_BINARY_DIR}/.install)
- list(APPEND BUILD_ARGS -DOVERRIDE_PATHS=ON)
- message(STATUS "NEED_SUDO: ${NEED_SUDO} (no write permission for ${CMAKE_INSTALL_PREFIX})")
- endif()
-endif()
-
-### prepare the build environment for the binary addons
-# copy the PrepareEnv.cmake script to the depends path so that we can include it
-file(COPY ${CORE_SOURCE_DIR}/project/cmake/scripts/common/PrepareEnv.cmake DESTINATION ${APP_LIB_DIR})
-
-# add the location of PrepareEnv.cmake to CMAKE_MODULE_PATH so that it is found
-list(APPEND CMAKE_MODULE_PATH ${APP_LIB_DIR})
-
-# include PrepareEnv.cmake which contains the logic to install the addon header bindings etc
-include(PrepareEnv)
-
-### add the depends subdirectory for any general dependencies
-message(STATUS "\n-- ---- Preparing general dependencies ----")
-add_subdirectory(depends)
-
-# add a custom target "package-addons" which will package and install all addons
-add_custom_target(package-addons)
-
-### get and build all the binary addons
-# look for all the addons to be built
-file(GLOB_RECURSE addons ${ADDONS_DEFINITION_DIR}/*.txt)
-
-#if there are no addons assume that bootstrapping hasn't happened yet
-if(NOT addons)
- message(STATUS "Bootstrapping all default repositories as no addons were found...")
- set(BOOTSTRAP_BUILD_DIR "${BUILD_DIR}/bootstrap")
-
- # make sure that the bootstraps build addon exists
- if(NOT EXISTS ${BOOTSTRAP_BUILD_DIR})
- file(MAKE_DIRECTORY ${BOOTSTRAP_BUILD_DIR})
- endif()
-
- string(REPLACE ";" " " ADDONS_TO_BUILD_STR "${ADDONS_TO_BUILD}")
- # generate the bootstrap buildsystem
- execute_process(COMMAND ${CMAKE_COMMAND} ${PROJECT_SOURCE_DIR}/bootstrap
- -DCMAKE_INSTALL_PREFIX:PATH=${ADDONS_DEFINITION_DIR}
- -DBUILD_DIR:PATH=${BOOTSTRAP_BUILD_DIR}
- -DADDONS_TO_BUILD:STRING=${ADDONS_TO_BUILD_STR}
- -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
- WORKING_DIRECTORY ${BOOTSTRAP_BUILD_DIR})
-
- # execute the generated bootstrap buildsystem
- execute_process(COMMAND ${CMAKE_COMMAND} --build ${BOOTSTRAP_BUILD_DIR}
- WORKING_DIRECTORY ${BOOTSTRAP_BUILD_DIR})
-
- # now look for all the addons to be built again
- file(GLOB_RECURSE addons ${ADDONS_DEFINITION_DIR}/*.txt)
-
- if(NOT addons)
- message(FATAL_ERROR "No addons available to be built")
- endif()
-endif()
-
-# Track if at least one addon has been found. Everything else is likely an
-# error either in ADDONS_TO_BUILD or in the directory configuration.
-set(SUPPORTED_ADDON_FOUND FALSE)
-
-foreach(addon ${addons})
- if(NOT (addon MATCHES platforms.txt))
- file(STRINGS ${addon} def)
- string(REPLACE " " ";" def ${def})
- list(GET def 0 id)
-
- set(ADDON_FOUND FALSE)
- # try to find a perfect match
- list(FIND ADDONS_TO_BUILD ${id} idx)
- if(idx GREATER -1 OR "${ADDONS_TO_BUILD}" STREQUAL "all")
- set(ADDON_FOUND TRUE)
- # Maybe we have a regex
- elseif(id MATCHES "${ADDONS_TO_BUILD}")
- message(STATUS "Pattern ${ADDONS_TO_BUILD} matches ${id}, building addon")
- set(ADDON_FOUND TRUE)
- endif()
-
- if(ADDON_FOUND)
- message(STATUS "\n-- ---- Configuring addon ${addon} ----")
- set(SUPPORTED_ADDON_FOUND TRUE)
-
- get_filename_component(dir ${addon} DIRECTORY)
-
- # check if the addon has a platforms.txt
- set(platform_found FALSE)
- check_target_platform(${dir} ${CORE_SYSTEM_NAME} platform_found)
-
- if(${platform_found})
- # make sure the output directory is clean
- file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/${id}/")
-
- # get the URL and revision of the addon
- list(LENGTH def deflength)
- list(GET def 1 url)
-
- set(archive_name ${id})
- if(ADDON_SRC_PREFIX)
- set(SOURCE_DIR ${ADDON_SRC_PREFIX}/${id})
- set(archive_name "")
- else()
- set(SOURCE_DIR "")
- endif()
-
- # if there is a 3rd parameter in the file, we consider it a git revision
- if(deflength GREATER 2 AND "${SOURCE_DIR}" STREQUAL "")
- list(GET def 2 revision)
-
- # we need access to a git executable
- find_package(Git REQUIRED)
-
- # resolve revision to git hash
- execute_process(COMMAND ${GIT_EXECUTABLE} ls-remote ${url} ${revision} OUTPUT_VARIABLE revision_hash)
- # git ls-remote only works on branches and tag names but not on revisions
- if(NOT "${revision_hash}" STREQUAL "")
- string(REPLACE "\t" ";" revision_list ${revision_hash})
- list(GET revision_list 0 revision_hash)
- message(STATUS "${id}: git branch/tag ${revision} resolved to hash: ${revision_hash}")
- set(revision ${revision_hash})
- endif()
-
- # Note: downloading specific revisions via http in the format below is probably github specific
- # if we ever use other repositories, this might need adapting
- set(url ${url}/archive/${revision}.tar.gz)
- set(archive_name ${archive_name}-${revision})
- elseif("${SOURCE_DIR}" STREQUAL "")
- # check if the URL starts with file://
- string(REGEX MATCH "^file://.*$" local_url "${url}")
-
- #if not we assume this to be a local directory
- if(local_url)
- # this is not an archive
- set(archive_name "")
-
- # remove the file:// protocol from the URL
- string(REPLACE "file://" "" SOURCE_DIR "${url}")
-
- # on win32 we may have to remove another leading /
- if(WIN32)
- # check if the path is a local path
- string(REGEX MATCH "^/.*$" local_path "${SOURCE_DIR}")
- if(local_path)
- string(SUBSTRING "${SOURCE_DIR}" 1 -1 SOURCE_DIR)
- endif()
- endif()
- endif()
- endif()
-
- # download the addon if necessary
- if(NOT "${archive_name}" STREQUAL "")
- # download and extract the addon
- if(NOT ADDON_TARBALL_CACHING OR NOT EXISTS ${BUILD_DIR}/download/${archive_name}.tar.gz)
- # cleanup any of the previously downloaded archives of this addon
- file(GLOB archives "${BUILD_DIR}/download/${id}*.tar.gz")
- if(archives)
- message(STATUS "Removing old archives of ${id}: ${archives}")
- file(REMOVE ${archives})
- endif()
-
- # download the addon
- file(DOWNLOAD "${url}" "${BUILD_DIR}/download/${archive_name}.tar.gz" STATUS dlstatus LOG dllog SHOW_PROGRESS)
- list(GET dlstatus 0 retcode)
- if(NOT ${retcode} EQUAL 0)
- message(FATAL_ERROR "ERROR downloading ${url} - status: ${dlstatus} log: ${dllog}")
- endif()
- endif()
-
- # remove any previously extracted version of the addon
- file(REMOVE_RECURSE "${BUILD_DIR}/${id}")
-
- # extract the addon from the archive
- execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf ${BUILD_DIR}/download/${archive_name}.tar.gz
- WORKING_DIRECTORY ${BUILD_DIR})
- file(GLOB extract_dir "${BUILD_DIR}/${archive_name}*")
- if(extract_dir STREQUAL "")
- message(FATAL_ERROR "${id}: error extracting ${BUILD_DIR}/download/${archive_name}.tar.gz")
- else()
- file(RENAME "${extract_dir}" "${BUILD_DIR}/${id}")
- endif()
-
- set(SOURCE_DIR ${BUILD_DIR}/${id})
- endif()
-
- if(NOT "${SOURCE_DIR}" STREQUAL "" AND EXISTS ${SOURCE_DIR})
- # create a list of addons we are building
- list(APPEND ALL_ADDONS_BUILDING ${id})
-
- # setup the buildsystem for the addon
- externalproject_add(${id}
- SOURCE_DIR ${SOURCE_DIR}
- INSTALL_DIR ${ADDON_INSTALL_DIR}
- CMAKE_ARGS ${BUILD_ARGS})
-
- # add a custom step to the external project between the configure and the build step which will always
- # be executed and therefore forces a re-build of all changed files
- externalproject_add_step(${id} forcebuild
- COMMAND ${CMAKE_COMMAND} -E echo "Force build of ${id}"
- DEPENDEES configure
- DEPENDERS build
- ALWAYS 1)
-
- # add "kodi-platform" as a dependency to every addon
- add_dependencies(${id} kodi-platform)
-
- set(${id}_DEPENDS_DIR ${SOURCE_DIR}/depends)
-
- if(EXISTS ${${id}_DEPENDS_DIR})
- include(${CORE_SOURCE_DIR}/project/cmake/scripts/common/HandleDepends.cmake)
- add_addon_depends(${id} ${${id}_DEPENDS_DIR})
- if(${id}_DEPS AND NOT "${${id}_DEPS}" STREQUAL "")
- message(STATUS "${id} DEPENDENCIES: ${${id}_DEPS}")
- add_dependencies(${id} ${${id}_DEPS})
- endif()
- endif()
-
- if(CROSS_AUTOCONF AND AUTOCONF_FILES)
- if(EXISTS ${SOURCE_DIR}/bootstrap/autoreconf.txt)
- file(STRINGS ${SOURCE_DIR}/bootstrap/autoreconf.txt conf_dirs)
- foreach(conf_dir ${conf_dirs})
- foreach(afile ${AUTOCONF_FILES})
- message(STATUS "copying ${afile} to ${SOURCE_DIR}/${conf_dir}")
- file(COPY ${afile} DESTINATION ${SOURCE_DIR}/${conf_dir})
- endforeach()
- endforeach()
- endif()
- endif()
-
- # create a forwarding target to the addon-package target
- add_custom_target(package-${id}
- COMMAND ${CMAKE_COMMAND} --build ${id}-prefix/src/${id}-build --target addon-package
- DEPENDS ${id})
- add_dependencies(package-addons package-${id})
-
- else()
- message(FATAL_ERROR "${id}: invalid or missing addon source directory at ${SOURCE_DIR}")
- endif()
- else()
- # add a dummy target for addons that are unsupported on this platform
- add_custom_target(${id} COMMAND ${CMAKE_COMMAND} -E echo "IGNORED ${id} - not supported on ${CORE_SYSTEM_NAME}\n")
- endif()
- endif()
- endif()
-endforeach()
-message(STATUS "")
-
-if(NEED_SUDO)
- add_custom_target(sudo-install
- COMMAND ${CMAKE_COMMAND} -E echo "sudo rights needed to install to ${CMAKE_INSTALL_PREFIX}\n"
- COMMAND sudo ${CMAKE_COMMAND} -E copy_directory ${ADDON_INSTALL_DIR}/ ${CMAKE_INSTALL_PREFIX}/
- COMMAND sudo -k)
-
- foreach(_id ${ALL_ADDONS_BUILDING})
- add_dependencies(sudo-install ${_id})
- endforeach()
- message(WARNING "sudo rights needed to install to ${CMAKE_INSTALL_PREFIX}")
- message(STATUS "\nplease type \"make sudo-install\"\n\n")
-endif()
-
-if(NOT SUPPORTED_ADDON_FOUND)
- message(FATAL_ERROR "${ADDONS_TO_BUILD} did not match any of the supported addons. \
- A list of supported addons can be viewed by building the 'supported_addons' target. \
- Addon definitions are loaded from ADDONS_DEFINITION_DIR (${ADDONS_DEFINITION_DIR}).")
-endif()
-
-# add custom target "supported_addons" that returns all addons that are supported on this platform
-string(REPLACE ";" " " ALL_ADDONS_BUILDING "${ALL_ADDONS_BUILDING}")
-add_custom_target(supported_addons COMMAND ${CMAKE_COMMAND} -E echo "ALL_ADDONS_BUILDING: ${ALL_ADDONS_BUILDING}" VERBATIM)
-add_custom_target(need-sudo COMMAND ${CMAKE_COMMAND} -E echo ${NEED_SUDO} VERBATIM)