|
|
@ -6,22 +6,58 @@ |
|
|
# and some cmake magic to allow for runtime viewing of dependency versions |
|
|
# and some cmake magic to allow for runtime viewing of dependency versions |
|
|
|
|
|
|
|
|
include(CMakeDependentOption) |
|
|
include(CMakeDependentOption) |
|
|
CMAKE_DEPENDENT_OPTION(CPMUTIL_DEFAULT_SYSTEM "Allow usage of system packages for CPM dependencies" ON "NOT ANDROID" OFF) |
|
|
|
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(CPMUTIL_DEFAULT_SYSTEM |
|
|
|
|
|
"Allow usage of system packages for CPM dependencies" ON |
|
|
|
|
|
"NOT ANDROID" OFF) |
|
|
|
|
|
|
|
|
cmake_minimum_required(VERSION 3.22) |
|
|
cmake_minimum_required(VERSION 3.22) |
|
|
include(CPM) |
|
|
include(CPM) |
|
|
|
|
|
|
|
|
|
|
|
function(cpm_utils_message level name message) |
|
|
|
|
|
message(${level} "[CPMUtil] ${name}: ${message}") |
|
|
|
|
|
endfunction() |
|
|
|
|
|
|
|
|
function(AddPackage) |
|
|
function(AddPackage) |
|
|
cpm_set_policies() |
|
|
cpm_set_policies() |
|
|
|
|
|
|
|
|
|
|
|
# TODO(crueter): docs, git clone |
|
|
|
|
|
|
|
|
|
|
|
#[[ |
|
|
|
|
|
URL configurations, descending order of precedence: |
|
|
|
|
|
- URL [+ GIT_URL] -> bare URL fetch |
|
|
|
|
|
- REPO + TAG + ARTIFACT -> github release artifact |
|
|
|
|
|
- REPO + TAG -> github release archive |
|
|
|
|
|
- REPO + SHA -> github commit archive |
|
|
|
|
|
- REPO + BRANCH -> github branch |
|
|
|
|
|
|
|
|
|
|
|
Hash configurations, descending order of precedence: |
|
|
|
|
|
- HASH -> bare sha512sum |
|
|
|
|
|
- HASH_SUFFIX -> hash grabbed from the URL + this suffix |
|
|
|
|
|
- HASH_URL -> hash grabbed from a URL |
|
|
|
|
|
* technically this is unsafe since a hacker can attack that url |
|
|
|
|
|
|
|
|
|
|
|
NOTE: hash algo defaults to sha512 |
|
|
|
|
|
#]] |
|
|
set(oneValueArgs |
|
|
set(oneValueArgs |
|
|
NAME |
|
|
NAME |
|
|
VERSION |
|
|
VERSION |
|
|
|
|
|
GIT_VERSION |
|
|
|
|
|
|
|
|
REPO |
|
|
REPO |
|
|
|
|
|
TAG |
|
|
|
|
|
ARTIFACT |
|
|
SHA |
|
|
SHA |
|
|
|
|
|
BRANCH |
|
|
|
|
|
|
|
|
HASH |
|
|
HASH |
|
|
|
|
|
HASH_SUFFIX |
|
|
|
|
|
HASH_URL |
|
|
|
|
|
HASH_ALGO |
|
|
|
|
|
|
|
|
|
|
|
URL |
|
|
|
|
|
GIT_URL |
|
|
|
|
|
|
|
|
KEY |
|
|
KEY |
|
|
URL # Only for custom non-GitHub urls |
|
|
|
|
|
DOWNLOAD_ONLY |
|
|
DOWNLOAD_ONLY |
|
|
FIND_PACKAGE_ARGUMENTS |
|
|
FIND_PACKAGE_ARGUMENTS |
|
|
SYSTEM_PACKAGE |
|
|
SYSTEM_PACKAGE |
|
|
@ -30,46 +66,122 @@ function(AddPackage) |
|
|
|
|
|
|
|
|
set(multiValueArgs OPTIONS PATCHES) |
|
|
set(multiValueArgs OPTIONS PATCHES) |
|
|
|
|
|
|
|
|
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") |
|
|
|
|
|
|
|
|
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" |
|
|
|
|
|
"${ARGN}") |
|
|
|
|
|
|
|
|
if (NOT DEFINED PKG_ARGS_NAME) |
|
|
if (NOT DEFINED PKG_ARGS_NAME) |
|
|
message(FATAL_ERROR "[CPMUtil] ${PKG_ARGS_NAME}: No package name defined") |
|
|
|
|
|
|
|
|
cpm_utils_message(FATAL_ERROR "package" "No package name defined") |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
if (NOT DEFINED PKG_ARGS_URL) |
|
|
|
|
|
if (DEFINED PKG_ARGS_REPO AND DEFINED PKG_ARGS_SHA) |
|
|
|
|
|
set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO}) |
|
|
|
|
|
set(PKG_URL "${PKG_GIT_URL}/archive/${PKG_ARGS_SHA}.zip") |
|
|
|
|
|
else() |
|
|
|
|
|
message(FATAL_ERROR "[CPMUtil] ${PKG_ARGS_NAME}: No custom URL and no repository + sha defined") |
|
|
|
|
|
endif() |
|
|
|
|
|
else() |
|
|
|
|
|
set(PKG_URL ${PKG_ARGS_URL}) |
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_URL) |
|
|
|
|
|
set(pkg_url ${PKG_ARGS_URL}) |
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_REPO) |
|
|
if (DEFINED PKG_ARGS_REPO) |
|
|
set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO}) |
|
|
|
|
|
|
|
|
set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) |
|
|
|
|
|
else() |
|
|
|
|
|
if (DEFINED PKG_ARGS_GIT_URL) |
|
|
|
|
|
set(pkg_git_url ${PKG_ARGS_GIT_URL}) |
|
|
|
|
|
else() |
|
|
|
|
|
set(pkg_git_url ${pkg_url}) |
|
|
|
|
|
endif() |
|
|
|
|
|
endif() |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_REPO) |
|
|
|
|
|
set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) |
|
|
|
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_TAG) |
|
|
|
|
|
set(pkg_key ${PKG_ARGS_TAG}) |
|
|
|
|
|
|
|
|
|
|
|
if(DEFINED PKG_ARGS_ARTIFACT) |
|
|
|
|
|
set(pkg_url |
|
|
|
|
|
${pkg_git_url}/releases/download/${PKG_ARGS_TAG}/${PKG_ARGS_ARTIFACT}) |
|
|
|
|
|
else() |
|
|
|
|
|
set(pkg_url |
|
|
|
|
|
${pkg_git_url}/archive/refs/tags/${PKG_ARGS_TAG}.tar.gz) |
|
|
|
|
|
endif() |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_SHA) |
|
|
|
|
|
set(pkg_url "${pkg_git_url}/archive/${PKG_ARGS_SHA}.zip") |
|
|
|
|
|
else() |
|
|
|
|
|
if (DEFINED PKG_ARGS_BRANCH) |
|
|
|
|
|
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") |
|
|
|
|
|
set(PKG_BRANCH master) |
|
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
set(pkg_url ${pkg_git_url}/archive/refs/heads/${PKG_BRANCH}.zip) |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
else() |
|
|
|
|
|
cpm_utils_message(FATAL_ERROR ${PKG_ARGS_NAME} "No URL or repository defined") |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
message(STATUS "[CPMUtil] ${PKG_ARGS_NAME}: Downloading package from ${PKG_URL}") |
|
|
|
|
|
|
|
|
cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}") |
|
|
|
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_GIT_VERSION) |
|
|
|
|
|
set(git_version ${PKG_ARGS_VERSION}) |
|
|
|
|
|
elseif(DEFINED PKG_ARGS_VERSION) |
|
|
|
|
|
set(git_version ${PKG_ARGS_GIT_VERSION}) |
|
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
if (NOT DEFINED PKG_ARGS_KEY) |
|
|
if (NOT DEFINED PKG_ARGS_KEY) |
|
|
if (DEFINED PKG_ARGS_SHA) |
|
|
if (DEFINED PKG_ARGS_SHA) |
|
|
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY) |
|
|
|
|
|
message(STATUS "[CPMUtil] ${PKG_ARGS_NAME}: No custom key defined, using ${PKG_KEY} from sha") |
|
|
|
|
|
|
|
|
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key) |
|
|
|
|
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} |
|
|
|
|
|
"No custom key defined, using ${pkg_key} from sha") |
|
|
|
|
|
elseif (DEFINED git_version) |
|
|
|
|
|
set(pkg_key ${git_version}) |
|
|
|
|
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} |
|
|
|
|
|
"No custom key defined, using ${pkg_key}") |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_TAG) |
|
|
|
|
|
set(pkg_key ${PKG_ARGS_TAG}) |
|
|
|
|
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME} |
|
|
|
|
|
"No custom key defined, using ${pkg_key}") |
|
|
else() |
|
|
else() |
|
|
message(FATAL_ERROR "[CPMUtil] ${PKG_ARGS_NAME}: No custom key and no commit sha defined") |
|
|
|
|
|
|
|
|
cpm_utils_message(WARNING ${PKG_ARGS_NAME} |
|
|
|
|
|
"Could not determine cache key, using CPM defaults") |
|
|
endif() |
|
|
endif() |
|
|
else() |
|
|
else() |
|
|
set(PKG_KEY ${PKG_ARGS_KEY}) |
|
|
|
|
|
|
|
|
set(pkg_key ${PKG_ARGS_KEY}) |
|
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_HASH_ALGO) |
|
|
|
|
|
set(hash_algo ${PKG_ARGS_HASH_ALGO}) |
|
|
|
|
|
else() |
|
|
|
|
|
set(hash_algo SHA512) |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
if (DEFINED PKG_ARGS_HASH) |
|
|
if (DEFINED PKG_ARGS_HASH) |
|
|
set(PKG_HASH "SHA512=${PKG_ARGS_HASH}") |
|
|
|
|
|
|
|
|
set(pkg_hash "${hash_algo}=${PKG_ARGS_HASH}") |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_HASH_SUFFIX) |
|
|
|
|
|
# funny sanity check |
|
|
|
|
|
string(TOLOWER ${hash_algo} hash_algo_lower) |
|
|
|
|
|
string(TOLOWER ${PKG_ARGS_HASH_SUFFIX} suffix_lower) |
|
|
|
|
|
if (NOT ${suffix_lower} MATCHES ${hash_algo_lower}) |
|
|
|
|
|
cpm_utils_message(WARNING |
|
|
|
|
|
"Hash algorithm and hash suffix do not match, errors may occur") |
|
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
set(hash_url ${pkg_url}.${PKG_ARGS_HASH_SUFFIX}) |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_HASH_URL) |
|
|
|
|
|
set(hash_url ${PKG_ARGS_HASH_URL}) |
|
|
|
|
|
else() |
|
|
|
|
|
cpm_utils_message(WARNING ${PKG_ARGS_NAME} |
|
|
|
|
|
"No hash or hash URL found") |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
# Default behavior is bundled |
|
|
|
|
|
if (DEFINED PKG_ARGS_SYSTEM_PACKAGE) |
|
|
|
|
|
|
|
|
if (DEFINED hash_url) |
|
|
|
|
|
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/${PKG_ARGS_NAME}.hash) |
|
|
|
|
|
|
|
|
|
|
|
file(DOWNLOAD ${hash_url} ${outfile}) |
|
|
|
|
|
file(READ ${outfile} pkg_hash_tmp) |
|
|
|
|
|
file(REMOVE ${outfile}) |
|
|
|
|
|
|
|
|
|
|
|
set(pkg_hash "${hash_algo}=${pkg_hash_tmp}") |
|
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
if (NOT CPMUTIL_DEFAULT_SYSTEM) |
|
|
|
|
|
set(CPM_USE_LOCAL_PACKAGES OFF) |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_SYSTEM_PACKAGE) |
|
|
set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE}) |
|
|
set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE}) |
|
|
elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE) |
|
|
elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE) |
|
|
if (PKG_ARGS_BUNDLED_PACKAGE) |
|
|
if (PKG_ARGS_BUNDLED_PACKAGE) |
|
|
@ -78,15 +190,15 @@ function(AddPackage) |
|
|
set(CPM_USE_LOCAL_PACKAGES ON) |
|
|
set(CPM_USE_LOCAL_PACKAGES ON) |
|
|
endif() |
|
|
endif() |
|
|
else() |
|
|
else() |
|
|
set(CPM_USE_LOCAL_PACKAGES ${CPMUTIL_DEFAULT_SYSTEM}) |
|
|
|
|
|
|
|
|
set(CPM_USE_LOCAL_PACKAGES ON) |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
CPMAddPackage( |
|
|
CPMAddPackage( |
|
|
NAME ${PKG_ARGS_NAME} |
|
|
NAME ${PKG_ARGS_NAME} |
|
|
VERSION ${PKG_ARGS_VERSION} |
|
|
VERSION ${PKG_ARGS_VERSION} |
|
|
URL ${PKG_URL} |
|
|
|
|
|
URL_HASH ${PKG_HASH} |
|
|
|
|
|
CUSTOM_CACHE_KEY ${PKG_KEY} |
|
|
|
|
|
|
|
|
URL ${pkg_url} |
|
|
|
|
|
URL_HASH ${pkg_hash} |
|
|
|
|
|
CUSTOM_CACHE_KEY ${pkg_key} |
|
|
DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY} |
|
|
DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY} |
|
|
FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS} |
|
|
FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS} |
|
|
|
|
|
|
|
|
@ -97,27 +209,40 @@ function(AddPackage) |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME}) |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME}) |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${PKG_GIT_URL}) |
|
|
|
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${pkg_git_url}) |
|
|
|
|
|
|
|
|
if (${PKG_ARGS_NAME}_ADDED) |
|
|
if (${PKG_ARGS_NAME}_ADDED) |
|
|
if (DEFINED PKG_ARGS_SHA) |
|
|
if (DEFINED PKG_ARGS_SHA) |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA}) |
|
|
|
|
|
elseif(DEFINED PKG_ARGS_VERSION) |
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_VERSION}) |
|
|
|
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS |
|
|
|
|
|
${PKG_ARGS_SHA}) |
|
|
|
|
|
elseif(DEFINED git_version) |
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS |
|
|
|
|
|
${git_version}) |
|
|
|
|
|
elseif (DEFINED PKG_ARGS_TAG) |
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS |
|
|
|
|
|
${PKG_ARGS_TAG}) |
|
|
else() |
|
|
else() |
|
|
message(WARNING "[CPMUtil] Package ${PKG_ARGS_NAME} has no specified sha or version") |
|
|
|
|
|
|
|
|
cpm_utils_message(WARNING ${PKG_ARGS_NAME} |
|
|
|
|
|
"Package has no specified sha, tag, or version") |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown") |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown") |
|
|
endif() |
|
|
endif() |
|
|
else() |
|
|
else() |
|
|
if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION AND NOT "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION}" STREQUAL "") |
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)") |
|
|
|
|
|
|
|
|
if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION AND NOT |
|
|
|
|
|
"${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION}" STREQUAL "") |
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS |
|
|
|
|
|
"${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)") |
|
|
else() |
|
|
else() |
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)") |
|
|
|
|
|
|
|
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS |
|
|
|
|
|
"unknown (system)") |
|
|
endif() |
|
|
endif() |
|
|
endif() |
|
|
endif() |
|
|
|
|
|
|
|
|
# pass stuff to parent scope |
|
|
# pass stuff to parent scope |
|
|
set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" PARENT_SCOPE) |
|
|
|
|
|
set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE) |
|
|
|
|
|
set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE) |
|
|
|
|
|
|
|
|
set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" |
|
|
|
|
|
PARENT_SCOPE) |
|
|
|
|
|
set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" |
|
|
|
|
|
PARENT_SCOPE) |
|
|
|
|
|
set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" |
|
|
|
|
|
PARENT_SCOPE) |
|
|
|
|
|
|
|
|
endfunction() |
|
|
endfunction() |