aboutsummaryrefslogtreecommitdiff
path: root/CMakeModules
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeModules')
-rw-r--r--CMakeModules/CPM.cmake5
-rw-r--r--CMakeModules/CPMUtil.cmake222
-rw-r--r--CMakeModules/DownloadExternals.cmake271
3 files changed, 126 insertions, 372 deletions
diff --git a/CMakeModules/CPM.cmake b/CMakeModules/CPM.cmake
index 2d97f5493c..5544d8eefe 100644
--- a/CMakeModules/CPM.cmake
+++ b/CMakeModules/CPM.cmake
@@ -1,8 +1,3 @@
-# SPDX-FileCopyrightText: Copyright 2025 crueter
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-# This is a slightly modified version of CPM.cmake
-
# CPM.cmake - CMake's missing package manager
# ===========================================
# See https://github.com/cpm-cmake/CPM.cmake for usage and update instructions.
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()
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
deleted file mode 100644
index f6e3aaa4ad..0000000000
--- a/CMakeModules/DownloadExternals.cmake
+++ /dev/null
@@ -1,271 +0,0 @@
-# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-# This function downloads a binary library package from our external repo.
-# Params:
-# remote_path: path to the file to download, relative to the remote repository root
-# prefix_var: name of a variable which will be set with the path to the extracted contents
-set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
-function(download_bundled_external remote_path lib_name cpm_key prefix_var version)
- set(package_base_url "https://github.com/eden-emulator/")
- set(package_repo "no_platform")
- set(package_extension "no_platform")
- set(CACHE_KEY "")
-
- # TODO(crueter): Need to convert ffmpeg to a CI.
- if (WIN32 OR FORCE_WIN_ARCHIVES)
- if (ARCHITECTURE_arm64)
- set(CACHE_KEY "windows")
- set(package_repo "ext-windows-arm64-bin/raw/master/")
- set(package_extension ".zip")
- elseif(ARCHITECTURE_x86_64)
- set(CACHE_KEY "windows")
- set(package_repo "ext-windows-bin/raw/master/")
- set(package_extension ".7z")
- endif()
- elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
- set(CACHE_KEY "linux")
- set(package_repo "ext-linux-bin/raw/master/")
- set(package_extension ".tar.xz")
- elseif (ANDROID)
- set(CACHE_KEY "android")
- set(package_repo "ext-android-bin/raw/master/")
- set(package_extension ".tar.xz")
- else()
- message(FATAL_ERROR "No package available for this platform")
- endif()
- string(CONCAT package_url "${package_base_url}" "${package_repo}")
- string(CONCAT full_url "${package_url}" "${remote_path}" "${lib_name}" "${package_extension}")
- message(STATUS "Resolved bundled URL: ${full_url}")
-
- # TODO(crueter): DELETE THIS ENTIRELY, GLORY BE TO THE CI!
- AddPackage(
- NAME ${cpm_key}
- VERSION ${version}
- URL ${full_url}
- DOWNLOAD_ONLY YES
- KEY ${CACHE_KEY}
- BUNDLED_PACKAGE ON
- # TODO(crueter): hash
- )
-
- if (DEFINED ${cpm_key}_SOURCE_DIR)
- set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
- message(STATUS "Using bundled binaries at ${${cpm_key}_SOURCE_DIR}")
- else()
- message(FATAL_ERROR "AddPackage did not set ${cpm_key}_SOURCE_DIR")
- endif()
-endfunction()
-
-# Determine installation parameters for OS, architecture, and compiler
-function(determine_qt_parameters target host_out type_out arch_out arch_path_out host_type_out host_arch_out host_arch_path_out)
- if (WIN32)
- set(host "windows")
- set(type "desktop")
-
- if (NOT tool)
- if (MINGW)
- set(arch "win64_mingw")
- set(arch_path "mingw_64")
- elseif (MSVC)
- if ("arm64" IN_LIST ARCHITECTURE)
- set(arch_path "msvc2022_arm64")
- elseif ("x86_64" IN_LIST ARCHITECTURE)
- set(arch_path "msvc2022_64")
- else()
- message(FATAL_ERROR "Unsupported bundled Qt architecture. Disable YUZU_USE_BUNDLED_QT and provide your own.")
- endif()
- set(arch "win64_${arch_path}")
-
- if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64")
- set(host_arch_path "msvc2022_64")
- elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "ARM64")
- set(host_arch_path "msvc2022_arm64")
- endif()
- set(host_arch "win64_${host_arch_path}")
- else()
- message(FATAL_ERROR "Unsupported bundled Qt toolchain. Disable YUZU_USE_BUNDLED_QT and provide your own.")
- endif()
- endif()
- elseif (APPLE)
- set(host "mac")
- set(type "desktop")
- set(arch "clang_64")
- set(arch_path "macos")
- else()
- set(host "linux")
- set(type "desktop")
- set(arch "linux_gcc_64")
- set(arch_path "gcc_64")
- endif()
-
- set(${host_out} "${host}" PARENT_SCOPE)
- set(${type_out} "${type}" PARENT_SCOPE)
- set(${arch_out} "${arch}" PARENT_SCOPE)
- set(${arch_path_out} "${arch_path}" PARENT_SCOPE)
- if (DEFINED host_type)
- set(${host_type_out} "${host_type}" PARENT_SCOPE)
- else()
- set(${host_type_out} "${type}" PARENT_SCOPE)
- endif()
- if (DEFINED host_arch)
- set(${host_arch_out} "${host_arch}" PARENT_SCOPE)
- else()
- set(${host_arch_out} "${arch}" PARENT_SCOPE)
- endif()
- if (DEFINED host_arch_path)
- set(${host_arch_path_out} "${host_arch_path}" PARENT_SCOPE)
- else()
- set(${host_arch_path_out} "${arch_path}" PARENT_SCOPE)
- endif()
-endfunction()
-
-# Download Qt binaries for a specific configuration.
-function(download_qt_configuration prefix_out target host type arch arch_path base_path)
- if (target MATCHES "tools_.*")
- set(tool ON)
- else()
- set(tool OFF)
- endif()
-
- set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini")
- if (tool)
- set(prefix "${base_path}/Tools")
- list(APPEND install_args install-tool --outputdir "${base_path}" "${host}" desktop "${target}")
- else()
- set(prefix "${base_path}/${target}/${arch_path}")
- list(APPEND install_args install-qt --outputdir "${base_path}" "${host}" "${type}" "${target}" "${arch}" -m qt_base)
-
- if (YUZU_USE_QT_MULTIMEDIA)
- list(APPEND install_args qtmultimedia)
- endif()
-
- if (YUZU_USE_QT_WEB_ENGINE)
- list(APPEND install_args qtpositioning qtwebchannel qtwebengine)
- endif()
-
- if (NOT "${YUZU_QT_MIRROR}" STREQUAL "")
- message(STATUS "Using Qt mirror ${YUZU_QT_MIRROR}")
- list(APPEND install_args -b "${YUZU_QT_MIRROR}")
- endif()
- endif()
-
- message(STATUS "Install Args: ${install_args}")
-
- if (NOT EXISTS "${prefix}")
- message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}")
- set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.3.0")
- if (WIN32)
- set(aqt_path "${base_path}/aqt.exe")
- if (NOT EXISTS "${aqt_path}")
- file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt.exe" "${aqt_path}" SHOW_PROGRESS)
- endif()
- execute_process(COMMAND "${aqt_path}" ${install_args}
- WORKING_DIRECTORY "${base_path}"
- RESULT_VARIABLE aqt_res
- OUTPUT_VARIABLE aqt_out
- ERROR_VARIABLE aqt_err)
- if (NOT aqt_res EQUAL 0)
- message(FATAL_ERROR "aqt.exe failed: ${aqt_err}")
- endif()
- elseif (APPLE)
- set(aqt_path "${base_path}/aqt-macos")
- if (NOT EXISTS "${aqt_path}")
- file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt-macos" "${aqt_path}" SHOW_PROGRESS)
- endif()
- execute_process(COMMAND chmod +x "${aqt_path}")
- execute_process(COMMAND "${aqt_path}" ${install_args}
- WORKING_DIRECTORY "${base_path}"
- RESULT_VARIABLE aqt_res
- ERROR_VARIABLE aqt_err)
- if (NOT aqt_res EQUAL 0)
- message(FATAL_ERROR "aqt-macos failed: ${aqt_err}")
- endif()
- else()
- find_program(PYTHON3_EXECUTABLE python3)
- if (NOT PYTHON3_EXECUTABLE)
- message(FATAL_ERROR "python3 is required to install Qt using aqt (pip mode).")
- endif()
- set(aqt_install_path "${base_path}/aqt")
- file(MAKE_DIRECTORY "${aqt_install_path}")
-
- execute_process(COMMAND "${PYTHON3_EXECUTABLE}" -m pip install --target="${aqt_install_path}" aqtinstall
- WORKING_DIRECTORY "${base_path}"
- RESULT_VARIABLE pip_res
- ERROR_VARIABLE pip_err)
- if (NOT pip_res EQUAL 0)
- message(FATAL_ERROR "pip install aqtinstall failed: ${pip_err}")
- endif()
-
- execute_process(COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH="${aqt_install_path}" "${PYTHON3_EXECUTABLE}" -m aqt ${install_args}
- WORKING_DIRECTORY "${base_path}"
- RESULT_VARIABLE aqt_res
- ERROR_VARIABLE aqt_err)
- if (NOT aqt_res EQUAL 0)
- message(FATAL_ERROR "aqt (python) failed: ${aqt_err}")
- endif()
- endif()
-
- message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}")
- endif()
-
- set(${prefix_out} "${prefix}" PARENT_SCOPE)
-endfunction()
-
-# This function downloads Qt using aqt.
-# The path of the downloaded content will be added to the CMAKE_PREFIX_PATH.
-# QT_TARGET_PATH is set to the Qt for the compile target platform.
-# QT_HOST_PATH is set to a host-compatible Qt, for running tools.
-# Params:
-# target: Qt dependency to install. Specify a version number to download Qt, or "tools_(name)" for a specific build tool.
-function(download_qt target)
- determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path)
-
- set(base_path "${CMAKE_BINARY_DIR}/externals/qt")
- file(MAKE_DIRECTORY "${base_path}")
-
- download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}")
- if (DEFINED host_arch_path AND NOT "${host_arch_path}" STREQUAL "${arch_path}")
- download_qt_configuration(host_prefix "${target}" "${host}" "${host_type}" "${host_arch}" "${host_arch_path}" "${base_path}")
- else()
- set(host_prefix "${prefix}")
- endif()
-
- set(QT_TARGET_PATH "${prefix}" CACHE STRING "")
- set(QT_HOST_PATH "${host_prefix}" CACHE STRING "")
-
- list(APPEND CMAKE_PREFIX_PATH "${prefix}")
- set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
-endfunction()
-
-function(download_moltenvk version platform)
- if(NOT version)
- message(FATAL_ERROR "download_moltenvk: version argument is required")
- endif()
- if(NOT platform)
- message(FATAL_ERROR "download_moltenvk: platform argument is required")
- endif()
-
- set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
- set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
-
- if(NOT EXISTS "${MOLTENVK_DIR}")
- if(NOT EXISTS "${MOLTENVK_TAR}")
- file(DOWNLOAD "https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar"
- "${MOLTENVK_TAR}" SHOW_PROGRESS)
- endif()
-
- execute_process(
- COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
- WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals"
- RESULT_VARIABLE tar_res
- ERROR_VARIABLE tar_err
- )
- if(NOT tar_res EQUAL 0)
- message(FATAL_ERROR "Extracting MoltenVK failed: ${tar_err}")
- endif()
- endif()
- list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}")
- set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
-endfunction()
-