diff options
Diffstat (limited to 'CMakeModules/CPMUtil.cmake')
| -rw-r--r-- | CMakeModules/CPMUtil.cmake | 222 |
1 files changed, 126 insertions, 96 deletions
diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index 6f36871b92..834e07e665 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -1,5 +1,5 @@ -# SPDX-FileCopyrightText: Copyright 2025 crueter -# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: Copyright 2026 crueter +# SPDX-License-Identifier: LGPL-3.0-or-later set(CPM_SOURCE_CACHE "${PROJECT_SOURCE_DIR}/.cache/cpm" CACHE STRING "" FORCE) @@ -23,8 +23,17 @@ set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json") if(EXISTS ${CPMUTIL_JSON_FILE}) file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT) + if (NOT TARGET cpmfiles) + add_custom_target(cpmfiles) + endif() + + target_sources(cpmfiles PRIVATE ${CPMUTIL_JSON_FILE}) + set_property(DIRECTORY APPEND PROPERTY + CMAKE_CONFIGURE_DEPENDS + "${CPMUTIL_JSON_FILE}") else() - message(WARNING "[CPMUtil] cpmfile ${CPMUTIL_JSON_FILE} does not exist, AddJsonPackage will be a no-op") + message(DEBUG "[CPMUtil] cpmfile ${CPMUTIL_JSON_FILE}" + "does not exist, AddJsonPackage will be a no-op") endif() # Utility stuff @@ -68,10 +77,10 @@ function(AddJsonPackage) set(oneValueArgs NAME - # these are overrides that can be generated at runtime, so can be defined separately from the json + # these are overrides that can be generated at runtime, + # so can be defined separately from the json DOWNLOAD_ONLY - BUNDLED_PACKAGE - ) + BUNDLED_PACKAGE) set(multiValueArgs OPTIONS) @@ -86,7 +95,8 @@ function(AddJsonPackage) endif() if(NOT DEFINED CPMFILE_CONTENT) - cpm_utils_message(WARNING ${name} "No cpmfile, AddJsonPackage is a no-op") + cpm_utils_message(WARNING ${name} + "No cpmfile, AddJsonPackage is a no-op") return() endif() @@ -94,7 +104,8 @@ function(AddJsonPackage) cpm_utils_message(FATAL_ERROR "json package" "No name specified") endif() - string(JSON object ERROR_VARIABLE err GET "${CPMFILE_CONTENT}" "${JSON_NAME}") + string(JSON object ERROR_VARIABLE + err GET "${CPMFILE_CONTENT}" "${JSON_NAME}") if(err) cpm_utils_message(FATAL_ERROR ${JSON_NAME} "Not found in cpmfile") @@ -112,7 +123,8 @@ function(AddJsonPackage) get_json_element("${object}" raw_disabled disabled_platforms "") if(raw_disabled) - array_to_list("${raw_disabled}" ${raw_disabled_LENGTH} disabled_platforms) + array_to_list("${raw_disabled}" + ${raw_disabled_LENGTH} disabled_platforms) else() set(disabled_platforms "") endif() @@ -124,8 +136,7 @@ function(AddJsonPackage) PACKAGE ${package} EXTENSION ${extension} MIN_VERSION ${min_version} - DISABLED_PLATFORMS ${disabled_platforms} - ) + DISABLED_PLATFORMS ${disabled_platforms}) # pass stuff to parent scope set(${package}_ADDED "${${package}_ADDED}" @@ -153,8 +164,10 @@ function(AddJsonPackage) get_json_element("${object}" raw_patches patches "") # okay here comes the fun part: REPLACEMENTS! - # first: tag gets %VERSION% replaced if applicable, with either git_version (preferred) or version - # second: artifact gets %VERSION% and %TAG% replaced accordingly (same rules for VERSION) + # first: tag gets %VERSION% replaced if applicable, + # with either git_version (preferred) or version + # second: artifact gets %VERSION% and %TAG% replaced + # accordingly (same rules for VERSION) if(git_version) set(version_replace ${git_version}) @@ -179,9 +192,11 @@ function(AddJsonPackage) foreach(IDX RANGE ${range}) string(JSON _patch GET "${raw_patches}" "${IDX}") - set(full_patch "${CMAKE_SOURCE_DIR}/.patch/${JSON_NAME}/${_patch}") + set(full_patch + "${PROJECT_SOURCE_DIR}/.patch/${JSON_NAME}/${_patch}") if(NOT EXISTS ${full_patch}) - cpm_utils_message(FATAL_ERROR ${JSON_NAME} "specifies patch ${full_patch} which does not exist") + cpm_utils_message(FATAL_ERROR ${JSON_NAME} + "specifies patch ${full_patch} which does not exist") endif() list(APPEND patches "${full_patch}") @@ -223,8 +238,7 @@ function(AddJsonPackage) GIT_HOST ${git_host} ARTIFACT ${artifact} - TAG ${tag} - ) + TAG ${tag}) # pass stuff to parent scope set(${package}_ADDED "${${package}_ADDED}" @@ -280,8 +294,7 @@ function(AddPackage) KEY BUNDLED_PACKAGE FORCE_BUNDLED_PACKAGE - FIND_PACKAGE_ARGUMENTS - ) + FIND_PACKAGE_ARGUMENTS) set(multiValueArgs OPTIONS PATCHES) @@ -292,8 +305,17 @@ function(AddPackage) cpm_utils_message(FATAL_ERROR "package" "No package name defined") endif() - option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}") - option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}") + set(${PKG_ARGS_NAME}_CUSTOM_DIR "" CACHE STRING + "Path to a separately-downloaded copy of ${PKG_ARGS_NAME}") + option(${PKG_ARGS_NAME}_FORCE_SYSTEM + "Force the system package for ${PKG_ARGS_NAME}") + option(${PKG_ARGS_NAME}_FORCE_BUNDLED + "Force the bundled package for ${PKG_ARGS_NAME}") + + if (DEFINED ${PKG_ARGS_NAME}_CUSTOM_DIR AND + NOT ${PKG_ARGS_NAME}_CUSTOM_DIR STREQUAL "") + set(CPM_${PKG_ARGS_NAME}_SOURCE ${${PKG_ARGS_NAME}_CUSTOM_DIR}) + endif() if(NOT DEFINED PKG_ARGS_GIT_HOST) set(git_host github.com) @@ -333,17 +355,19 @@ function(AddPackage) set(PKG_BRANCH ${PKG_ARGS_BRANCH}) else() cpm_utils_message(WARNING ${PKG_ARGS_NAME} - "REPO defined but no TAG, SHA, BRANCH, or URL specified, defaulting to master") + "REPO defined but no TAG, SHA, BRANCH, or URL" + "specified, defaulting to master") set(PKG_BRANCH master) endif() set(pkg_url ${pkg_git_url}/archive/refs/heads/${PKG_BRANCH}.tar.gz) endif() else() - cpm_utils_message(FATAL_ERROR ${PKG_ARGS_NAME} "No URL or repository defined") + cpm_utils_message(FATAL_ERROR ${PKG_ARGS_NAME} + "No URL or repository defined") endif() - cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}") + cpm_utils_message(DEBUG ${PKG_ARGS_NAME} "Download URL is ${pkg_url}") if(NOT DEFINED PKG_ARGS_KEY) if(DEFINED PKG_ARGS_SHA) @@ -402,7 +426,8 @@ function(AddPackage) # because "technically" the hash is invalidated each week # but it works for now kjsdnfkjdnfjksdn string(TOLOWER ${PKG_ARGS_NAME} lowername) - if(NOT EXISTS ${outfile} AND NOT EXISTS ${CPM_SOURCE_CACHE}/${lowername}/${pkg_key}) + if(NOT EXISTS ${outfile} AND NOT EXISTS + ${CPM_SOURCE_CACHE}/${lowername}/${pkg_key}) file(DOWNLOAD ${hash_url} ${outfile}) endif() @@ -428,7 +453,7 @@ function(AddPackage) - CPMUTIL_FORCE_BUNDLED - BUNDLED_PACKAGE - default to allow local - ]] # + ]] if(PKG_ARGS_FORCE_BUNDLED_PACKAGE) set_precedence(OFF OFF) elseif(${PKG_ARGS_NAME}_FORCE_SYSTEM) @@ -439,7 +464,8 @@ function(AddPackage) set_precedence(ON ON) elseif(CPMUTIL_FORCE_BUNDLED) set_precedence(OFF OFF) - elseif(DEFINED PKG_ARGS_BUNDLED_PACKAGE AND NOT PKG_ARGS_BUNDLED_PACKAGE STREQUAL "unset") + elseif(DEFINED PKG_ARGS_BUNDLED_PACKAGE AND + NOT PKG_ARGS_BUNDLED_PACKAGE STREQUAL "unset") if(PKG_ARGS_BUNDLED_PACKAGE) set(local OFF) else() @@ -453,8 +479,7 @@ function(AddPackage) if(DEFINED PKG_ARGS_VERSION) list(APPEND EXTRA_ARGS - VERSION ${PKG_ARGS_VERSION} - ) + VERSION ${PKG_ARGS_VERSION}) endif() CPMAddPackage( @@ -471,8 +496,7 @@ function(AddPackage) ${EXTRA_ARGS} - ${PKG_ARGS_UNPARSED_ARGUMENTS} - ) + ${PKG_ARGS_UNPARSED_ARGUMENTS}) set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME}) set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${pkg_git_url}) @@ -516,24 +540,6 @@ function(AddPackage) endfunction() -function(add_ci_package key) - set(ARTIFACT ${ARTIFACT_NAME}-${key}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}) - - AddPackage( - NAME ${ARTIFACT_PACKAGE} - REPO ${ARTIFACT_REPO} - TAG v${ARTIFACT_VERSION} - GIT_VERSION ${ARTIFACT_VERSION} - ARTIFACT ${ARTIFACT} - - KEY ${key}-${ARTIFACT_VERSION} - HASH_SUFFIX sha512sum - FORCE_BUNDLED_PACKAGE ON - ) - - set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE) -endfunction() - # TODO(crueter): we could do an AddMultiArchPackage, multiplatformpackage? # name is the artifact name, package is for find_package override function(AddCIPackage) @@ -543,12 +549,17 @@ function(AddCIPackage) REPO PACKAGE EXTENSION - MIN_VERSION - ) + MIN_VERSION) set(multiValueArgs DISABLED_PLATFORMS) - cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + set(optionArgs MODULE) + + cmake_parse_arguments(PKG_ARGS + "${optionArgs}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN}) if(NOT DEFINED PKG_ARGS_VERSION) message(FATAL_ERROR "[CPMUtil] VERSION is required") @@ -589,55 +600,74 @@ function(AddCIPackage) set(ARTIFACT_REPO ${PKG_ARGS_REPO}) set(ARTIFACT_PACKAGE ${PKG_ARGS_PACKAGE}) - if((MSVC AND ARCHITECTURE_x86_64) AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(windows-amd64) - endif() - - if((MSVC AND ARCHITECTURE_arm64) AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(windows-arm64) - endif() - - if((MINGW AND ARCHITECTURE_x86_64) AND NOT "mingw-amd64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(mingw-amd64) - endif() - - if((MINGW AND ARCHITECTURE_arm64) AND NOT "mingw-arm64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(mingw-arm64) - endif() - - if((ANDROID AND ARCHITECTURE_x86_64) AND NOT "android-x86_64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(android-x86_64) - endif() + if(MSVC AND ARCHITECTURE_x86_64) + set(pkgname windows-amd64) + elseif(MSVC AND ARCHITECTURE_arm64) + set(pkgname windows-arm64) + elseif(MINGW AND ARCHITECTURE_x86_64) + set(pkgname mingw-amd64) + elseif(MINGW AND ARCHITECTURE_arm64) + set(pkgname mingw-arm64) + elseif(ANDROID AND ARCHITECTURE_x86_64) + set(pkgname android-x86_64) + elseif(ANDROID AND ARCHITECTURE_arm64) + set(pkgname android-aarch64) + elseif(PLATFORM_SUN) + set(pkgname solaris-amd64) + elseif(PLATFORM_FREEBSD) + set(pkgname freebsd-amd64) + elseif(PLATFORM_LINUX AND ARCHITECTURE_x86_64) + set(pkgname linux-amd64) + elseif(PLATFORM_LINUX AND ARCHITECTURE_arm64) + set(pkgname linux-aarch64) + elseif(APPLE) + set(pkgname macos-universal) + endif() + + if (DEFINED pkgname AND NOT "${pkgname}" IN_LIST DISABLED_PLATFORMS) + set(ARTIFACT "${ARTIFACT_NAME}-${pkgname}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}") + + AddPackage( + NAME ${ARTIFACT_PACKAGE} + REPO ${ARTIFACT_REPO} + TAG "v${ARTIFACT_VERSION}" + GIT_VERSION ${ARTIFACT_VERSION} + ARTIFACT ${ARTIFACT} + + KEY "${pkgname}-${ARTIFACT_VERSION}" + HASH_SUFFIX sha512sum + FORCE_BUNDLED_PACKAGE ON + DOWNLOAD_ONLY ${PKG_ARGS_MODULE}) - if((ANDROID AND ARCHITECTURE_arm64) AND NOT "android-aarch64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(android-aarch64) - endif() - - if(PLATFORM_SUN AND NOT "solaris-amd64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(solaris-amd64) - endif() - - if(PLATFORM_FREEBSD AND NOT "freebsd-amd64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(freebsd-amd64) - endif() + set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) + set(${ARTIFACT_PACKAGE}_SOURCE_DIR + "${${ARTIFACT_PACKAGE}_SOURCE_DIR}" PARENT_SCOPE) - if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux-amd64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(linux-amd64) + if (PKG_ARGS_MODULE) + list(APPEND CMAKE_PREFIX_PATH "${${ARTIFACT_PACKAGE}_SOURCE_DIR}") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) + endif() + else() + find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED) endif() +endfunction() - if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS) - add_ci_package(linux-aarch64) +# Utility function for Qt +function(AddQt version) + if (NOT DEFINED version) + message(FATAL_ERROR "[CPMUtil] AddQt: version is required") endif() - # TODO(crueter): macOS amd64/aarch64 split mayhaps - if(APPLE AND NOT "macos-universal" IN_LIST DISABLED_PLATFORMS) - add_ci_package(macos-universal) - endif() + AddCIPackage( + NAME Qt + PACKAGE Qt6 + VERSION ${version} + MIN_VERSION 6 + REPO crueter-ci/Qt + DISABLED_PLATFORMS + android-x86_64 android-aarch64 + freebsd-amd64 solaris-amd64 openbsd-amd64 + MODULE) - if(DEFINED ARTIFACT_DIR) - set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) - set(${ARTIFACT_PACKAGE}_SOURCE_DIR "${ARTIFACT_DIR}" PARENT_SCOPE) - else() - find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED) - endif() + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) endfunction() |
