aboutsummaryrefslogtreecommitdiff
path: root/CMakeModules/CPMUtil.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeModules/CPMUtil.cmake')
-rw-r--r--CMakeModules/CPMUtil.cmake222
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()