diff options
Diffstat (limited to 'cmake/scripts/common/ModuleHelpers.cmake')
-rw-r--r-- | cmake/scripts/common/ModuleHelpers.cmake | 185 |
1 files changed, 133 insertions, 52 deletions
diff --git a/cmake/scripts/common/ModuleHelpers.cmake b/cmake/scripts/common/ModuleHelpers.cmake index e659d6a86d..916e30dd22 100644 --- a/cmake/scripts/common/ModuleHelpers.cmake +++ b/cmake/scripts/common/ModuleHelpers.cmake @@ -1,74 +1,121 @@ # This script provides helper functions for FindModules # Parse and set variables from VERSION dependency file -# Arguments: -# module_name name of the library (currently must match tools/depends/target/${module_name}) # On return: -# ARCHIVE will be set to parent scope +# MODULENAME_ARCHIVE will be set to parent scope # MODULENAME_VER will be set to parent scope (eg FFMPEG_VER, DAV1D_VER) # MODULENAME_BASE_URL will be set to parent scope if exists in VERSION file (eg FFMPEG_BASE_URL) -function(get_versionfile_data module_name) - string(TOUPPER ${module_name} UPPER_MODULE_NAME) +# MODULENAME_HASH will be set if either SHA256 or SHA512 exists in VERSION file +# MODULENAME_BYPRODUCT will be set to parent scope +function(get_versionfile_data) # Dependency path - set(MODULE_PATH "${CMAKE_SOURCE_DIR}/tools/depends/target/${module_name}") - if(NOT EXISTS "${MODULE_PATH}/${UPPER_MODULE_NAME}-VERSION") - MESSAGE(FATAL_ERROR "${UPPER_MODULE_NAME}-VERSION does not exist at ${MODULE_PATH}.") + set(MODULE_PATH "${PROJECTSOURCE}/tools/depends/${LIB_TYPE}/${MODULE_LC}") + + if(NOT EXISTS "${MODULE_PATH}/${MODULE}-VERSION") + MESSAGE(FATAL_ERROR "${MODULE}-VERSION does not exist at ${MODULE_PATH}.") else() - set(${UPPER_MODULE_NAME}_FILE "${MODULE_PATH}/${UPPER_MODULE_NAME}-VERSION") + set(${MODULE}_FILE "${MODULE_PATH}/${MODULE}-VERSION") endif() - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_LNAME REGEX "^[ \t]*LIBNAME=") - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_VER REGEX "^[ \t]*VERSION=") - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_ARCHIVE REGEX "^[ \t]*ARCHIVE=") - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_BASE_URL REGEX "^[ \t]*BASE_URL=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_LNAME REGEX "^[ \t]*LIBNAME=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_VER REGEX "^[ \t]*VERSION=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_ARCHIVE REGEX "^[ \t]*ARCHIVE=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_BASE_URL REGEX "^[ \t]*BASE_URL=") if(WIN32 OR WINDOWS_STORE) - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_BYPRODUCT REGEX "^[ \t]*BYPRODUCT_WIN=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_BYPRODUCT REGEX "^[ \t]*BYPRODUCT_WIN=") else() - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_BYPRODUCT REGEX "^[ \t]*BYPRODUCT=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_BYPRODUCT REGEX "^[ \t]*BYPRODUCT=") endif() # Tarball Hash - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_HASH_SHA256 REGEX "^[ \t]*SHA256=") - file(STRINGS ${${UPPER_MODULE_NAME}_FILE} ${UPPER_MODULE_NAME}_HASH_SHA512 REGEX "^[ \t]*SHA512=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_HASH_SHA256 REGEX "^[ \t]*SHA256=") + file(STRINGS ${${MODULE}_FILE} ${MODULE}_HASH_SHA512 REGEX "^[ \t]*SHA512=") - string(REGEX REPLACE ".*LIBNAME=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_LNAME "${${UPPER_MODULE_NAME}_LNAME}") - string(REGEX REPLACE ".*VERSION=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_VER "${${UPPER_MODULE_NAME}_VER}") - string(REGEX REPLACE ".*ARCHIVE=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_ARCHIVE "${${UPPER_MODULE_NAME}_ARCHIVE}") - string(REGEX REPLACE ".*BASE_URL=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_BASE_URL "${${UPPER_MODULE_NAME}_BASE_URL}") + string(REGEX REPLACE ".*LIBNAME=([^ \t]*).*" "\\1" ${MODULE}_LNAME "${${MODULE}_LNAME}") + string(REGEX REPLACE ".*VERSION=([^ \t]*).*" "\\1" ${MODULE}_VER "${${MODULE}_VER}") + string(REGEX REPLACE ".*ARCHIVE=([^ \t]*).*" "\\1" ${MODULE}_ARCHIVE "${${MODULE}_ARCHIVE}") + string(REGEX REPLACE ".*BASE_URL=([^ \t]*).*" "\\1" ${MODULE}_BASE_URL "${${MODULE}_BASE_URL}") if(WIN32 OR WINDOWS_STORE) - string(REGEX REPLACE ".*BYPRODUCT_WIN=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_BYPRODUCT "${${UPPER_MODULE_NAME}_BYPRODUCT}") + string(REGEX REPLACE ".*BYPRODUCT_WIN=([^ \t]*).*" "\\1" ${MODULE}_BYPRODUCT "${${MODULE}_BYPRODUCT}") else() - string(REGEX REPLACE ".*BYPRODUCT=([^ \t]*).*" "\\1" ${UPPER_MODULE_NAME}_BYPRODUCT "${${UPPER_MODULE_NAME}_BYPRODUCT}") + string(REGEX REPLACE ".*BYPRODUCT=([^ \t]*).*" "\\1" ${MODULE}_BYPRODUCT "${${MODULE}_BYPRODUCT}") endif() - string(REGEX REPLACE "\\$\\(LIBNAME\\)" "${${UPPER_MODULE_NAME}_LNAME}" ${UPPER_MODULE_NAME}_ARCHIVE "${${UPPER_MODULE_NAME}_ARCHIVE}") - string(REGEX REPLACE "\\$\\(VERSION\\)" "${${UPPER_MODULE_NAME}_VER}" ${UPPER_MODULE_NAME}_ARCHIVE "${${UPPER_MODULE_NAME}_ARCHIVE}") + string(REGEX REPLACE "\\$\\(LIBNAME\\)" "${${MODULE}_LNAME}" ${MODULE}_ARCHIVE "${${MODULE}_ARCHIVE}") + string(REGEX REPLACE "\\$\\(VERSION\\)" "${${MODULE}_VER}" ${MODULE}_ARCHIVE "${${MODULE}_ARCHIVE}") - set(${UPPER_MODULE_NAME}_ARCHIVE ${${UPPER_MODULE_NAME}_ARCHIVE} PARENT_SCOPE) + set(${MODULE}_ARCHIVE ${${MODULE}_ARCHIVE} PARENT_SCOPE) - set(${UPPER_MODULE_NAME}_INCLUDE_DIR ${DEPENDS_PATH}/include PARENT_SCOPE) - set(${UPPER_MODULE_NAME}_VER ${${UPPER_MODULE_NAME}_VER} PARENT_SCOPE) + set(${MODULE}_VER ${${MODULE}_VER} PARENT_SCOPE) - if (${UPPER_MODULE_NAME}_BASE_URL) - set(${UPPER_MODULE_NAME}_BASE_URL ${${UPPER_MODULE_NAME}_BASE_URL} PARENT_SCOPE) + if (${MODULE}_BASE_URL) + set(${MODULE}_BASE_URL ${${MODULE}_BASE_URL} PARENT_SCOPE) else() - set(${UPPER_MODULE_NAME}_BASE_URL "http://mirrors.kodi.tv/build-deps/sources" PARENT_SCOPE) + set(${MODULE}_BASE_URL "http://mirrors.kodi.tv/build-deps/sources" PARENT_SCOPE) endif() - set(${UPPER_MODULE_NAME}_BYPRODUCT ${${UPPER_MODULE_NAME}_BYPRODUCT} PARENT_SCOPE) + set(${MODULE}_BYPRODUCT ${${MODULE}_BYPRODUCT} PARENT_SCOPE) - if (${UPPER_MODULE_NAME}_HASH_SHA256) - set(${UPPER_MODULE_NAME}_HASH ${${UPPER_MODULE_NAME}_HASH_SHA256} PARENT_SCOPE) - elseif(${UPPER_MODULE_NAME}_HASH_SHA512) - set(${UPPER_MODULE_NAME}_HASH ${${UPPER_MODULE_NAME}_HASH_SHA512} PARENT_SCOPE) + if (${MODULE}_HASH_SHA256) + set(${MODULE}_HASH ${${MODULE}_HASH_SHA256} PARENT_SCOPE) + elseif(${MODULE}_HASH_SHA512) + set(${MODULE}_HASH ${${MODULE}_HASH_SHA512} PARENT_SCOPE) endif() endfunction() +# Function to loop through list of patch files (full path) +# Sets to a PATCH_COMMAND variable and set to parent scope (caller) +# Used to test windows line endings and set appropriate patch commands +function(generate_patchcommand _patchlist) + # find the path to the patch executable + find_package(Patch MODULE REQUIRED) + + # Loop through patches and add to PATCH_COMMAND + # for windows, check CRLF/LF state + + set(_count 0) + foreach(patch ${_patchlist}) + if(WIN32 OR WINDOWS_STORE) + PATCH_LF_CHECK(${patch}) + endif() + if(${_count} EQUAL "0") + set(_patch_command ${PATCH_EXECUTABLE} -p1 -i ${patch}) + else() + list(APPEND _patch_command COMMAND ${PATCH_EXECUTABLE} -p1 -i ${patch}) + endif() + + math(EXPR _count "${_count}+1") + endforeach() + set(PATCH_COMMAND ${_patch_command} PARENT_SCOPE) + unset(_count) + unset(_patch_command) +endfunction() + # Macro to factor out the repetitive URL setup macro(SETUP_BUILD_VARS) - get_versionfile_data(${MODULE_LC}) string(TOUPPER ${MODULE_LC} MODULE) + # Fall through to target build module dir if not explicitly set + if(NOT DEFINED LIB_TYPE) + set(LIB_TYPE "target") + endif() + + # Location for build type, native or target + if(LIB_TYPE STREQUAL "target") + set(DEP_LOCATION "${DEPENDS_PATH}") + else() + set(DEP_LOCATION "${NATIVEPREFIX}") + endif() + + # PROJECTSOURCE used in native toolchain to provide core project sourcedir + # to externalproject_add targets that have a different CMAKE_SOURCE_DIR (eg jsonschema/texturepacker in-tree) + if(NOT PROJECTSOURCE) + set(PROJECTSOURCE ${CMAKE_SOURCE_DIR}) + endif() + + # populate variables of data from VERSION file for MODULE + get_versionfile_data() + # allow user to override the download URL with a local tarball # needed for offline build envs if(${MODULE}_URL) @@ -77,10 +124,16 @@ macro(SETUP_BUILD_VARS) set(${MODULE}_URL ${${MODULE}_BASE_URL}/${${MODULE}_ARCHIVE}) endif() if(VERBOSE) + message(STATUS "MODULE: ${MODULE}") + message(STATUS "LIB_TYPE: ${LIB_TYPE}") + message(STATUS "DEP_LOCATION: ${DEP_LOCATION}") + message(STATUS "PROJECTSOURCE: ${PROJECTSOURCE}") message(STATUS "${MODULE}_URL: ${${MODULE}_URL}") endif() # unset all build_dep_target variables to insure clean state + unset(BUILD_NAME) + unset(INSTALL_DIR) unset(CMAKE_ARGS) unset(PATCH_COMMAND) unset(CONFIGURE_COMMAND) @@ -107,12 +160,20 @@ macro(BUILD_DEP_TARGET) if(CMAKE_ARGS) set(CMAKE_ARGS CMAKE_ARGS ${CMAKE_ARGS} - -DCMAKE_INSTALL_PREFIX=${DEPENDS_PATH} -DCMAKE_INSTALL_LIBDIR=lib + -DPROJECTSOURCE=${PROJECTSOURCE} "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}") - if(CMAKE_TOOLCHAIN_FILE) - list(APPEND CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") + if(${MODULE}_INSTALL_PREFIX) + list(APPEND CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${${MODULE}_INSTALL_PREFIX}) + else() + list(APPEND CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEP_LOCATION}) + endif() + + if(DEFINED ${MODULE}_TOOLCHAIN_FILE) + list(APPEND CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${${MODULE}_TOOLCHAIN_FILE}) + elseif(CMAKE_TOOLCHAIN_FILE) + list(APPEND CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}) endif() # Set build type for dep build. @@ -184,14 +245,18 @@ macro(BUILD_DEP_TARGET) set(_POSTFIX ${${MODULE}_DEBUG_POSTFIX}) string(REGEX REPLACE "\\.[^.]*$" "" _LIBNAME ${${MODULE}_BYPRODUCT}) string(REGEX REPLACE "^.*\\." "" _LIBEXT ${${MODULE}_BYPRODUCT}) - set(${MODULE}_LIBRARY_DEBUG ${DEPENDS_PATH}/lib/${_LIBNAME}${${MODULE}_DEBUG_POSTFIX}.${_LIBEXT}) + set(${MODULE}_LIBRARY_DEBUG ${DEP_LOCATION}/lib/${_LIBNAME}${${MODULE}_DEBUG_POSTFIX}.${_LIBEXT}) endif() # set <MODULE>_LIBRARY_RELEASE for use of select_library_configurations # any modules that dont use select_library_configurations, we set <MODULE>_LIBRARY # No harm in having either set for both potential paths - set(${MODULE}_LIBRARY_RELEASE ${DEPENDS_PATH}/lib/${${MODULE}_BYPRODUCT}) + set(${MODULE}_LIBRARY_RELEASE ${DEP_LOCATION}/lib/${${MODULE}_BYPRODUCT}) set(${MODULE}_LIBRARY ${${MODULE}_LIBRARY_RELEASE}) + if(NOT ${MODULE}_INCLUDE_DIR) + set(${MODULE}_INCLUDE_DIR ${DEP_LOCATION}/include) + endif() + if(BUILD_BYPRODUCTS) set(BUILD_BYPRODUCTS BUILD_BYPRODUCTS ${BUILD_BYPRODUCTS}) else() @@ -214,14 +279,32 @@ macro(BUILD_DEP_TARGET) endif() endif() - externalproject_add(${MODULE_LC} - URL ${${MODULE}_URL} - URL_HASH ${${MODULE}_HASH} - DOWNLOAD_DIR ${TARBALL_DIR} - DOWNLOAD_NAME ${${MODULE}_ARCHIVE} - PREFIX ${CORE_BUILD_DIR}/${MODULE_LC} - INSTALL_DIR ${DEPENDS_PATH} + if(NOT BUILD_NAME) + set(BUILD_NAME ${MODULE_LC}) + endif() + + if(NOT INSTALL_DIR) + set(INSTALL_DIR ${DEP_LOCATION}) + endif() + + # Allow a target to supply in-tree source location. eg TexturePacker, JsonSchemaBuilder + if(${MODULE}_SOURCE_DIR) + set(BUILD_DOWNLOAD_STEPS SOURCE_DIR "${${MODULE}_SOURCE_DIR}") + else() + set(BUILD_DOWNLOAD_STEPS URL ${${MODULE}_URL} + URL_HASH ${${MODULE}_HASH} + DOWNLOAD_DIR ${TARBALL_DIR} + DOWNLOAD_NAME ${${MODULE}_ARCHIVE}) + endif() + + externalproject_add(${BUILD_NAME} + ${BUILD_DOWNLOAD_STEPS} + PREFIX ${CORE_BUILD_DIR}/${BUILD_NAME} + INSTALL_DIR ${INSTALL_DIR} + ${${MODULE}_LIST_SEPARATOR} ${CMAKE_ARGS} + ${${MODULE}_GENERATOR} + ${${MODULE}_GENERATOR_PLATFORM} ${PATCH_COMMAND} ${CONFIGURE_COMMAND} ${BUILD_COMMAND} @@ -229,7 +312,7 @@ macro(BUILD_DEP_TARGET) ${BUILD_BYPRODUCTS} ${BUILD_IN_SOURCE}) - set_target_properties(${MODULE_LC} PROPERTIES FOLDER "External Projects") + set_target_properties(${BUILD_NAME} PROPERTIES FOLDER "External Projects") endmacro() # Macro to test format of line endings of a patch @@ -254,5 +337,3 @@ macro(PATCH_LF_CHECK patch) endif() unset(patch_content_hex) endmacro() - - |