From 1551387739959d4a0ba23767a21664ea9a860848 Mon Sep 17 00:00:00 2001 From: crueter Date: Mon, 11 Aug 2025 22:27:29 +0200 Subject: [cmake, frontend] feat: CPMUtil + dependency viewer (#238) - creates a CPMUtil.cmake module that makes my job 10x easier and removes boilerplate - also lets us generate dependency names/versions at compiletime, thus letting the frontend display each dependency's versions. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/238 --- CMakeModules/CPMUtil.cmake | 117 +++++++++++++++++++++++++++++++++++ CMakeModules/DownloadExternals.cmake | 14 ++--- CMakeModules/GenerateDepHashes.cmake | 21 +++++++ 3 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 CMakeModules/CPMUtil.cmake create mode 100644 CMakeModules/GenerateDepHashes.cmake (limited to 'CMakeModules') diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake new file mode 100644 index 0000000000..bd1a15b0cc --- /dev/null +++ b/CMakeModules/CPMUtil.cmake @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# Created-By: crueter +# Docs will come at a later date, mostly this is to just reduce boilerplate +# and some cmake magic to allow for runtime viewing of dependency versions + +cmake_minimum_required(VERSION 3.22) +include(CPM) + +function(AddPackage) + cpm_set_policies() + + set(oneValueArgs + NAME + VERSION + REPO + SHA + HASH + KEY + URL # Only for custom non-GitHub urls + DOWNLOAD_ONLY + FIND_PACKAGE_ARGUMENTS + SYSTEM_PACKAGE + BUNDLED_PACKAGE + ) + + set(multiValueArgs OPTIONS PATCHES) + + cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") + + if (NOT DEFINED PKG_ARGS_NAME) + message(FATAL_ERROR "CPMUtil: No package name defined") + 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: No custom URL and no repository + sha defined") + endif() + else() + set(PKG_URL ${PKG_ARGS_URL}) + set(PKG_GIT_URL ${PKG_URL}) + endif() + + message(STATUS "CPMUtil: Downloading package ${PKG_ARGS_NAME} from ${PKG_URL}") + + if (NOT DEFINED PKG_ARGS_KEY) + if (DEFINED PKG_ARGS_SHA) + string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY) + message(STATUS "CPMUtil: No custom key defined, using ${PKG_KEY} from sha") + else() + message(FATAL_ERROR "CPMUtil: No custom key and no commit sha defined") + endif() + else() + set(PKG_KEY ${PKG_ARGS_KEY}) + endif() + + if (DEFINED PKG_ARGS_HASH) + set(PKG_HASH "SHA512=${PKG_ARGS_HASH}") + endif() + + # Default behavior is bundled + if (DEFINED PKG_ARGS_SYSTEM_PACKAGE) + set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE}) + elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE) + if (PKG_ARGS_BUNDLED_PACKAGE) + set(CPM_USE_LOCAL_PACKAGES OFF) + else() + set(CPM_USE_LOCAL_PACKAGES ON) + endif() + else() + set(CPM_USE_LOCAL_PACKAGES OFF) + endif() + + CPMAddPackage( + NAME ${PKG_ARGS_NAME} + VERSION ${PKG_ARGS_VERSION} + URL ${PKG_URL} + URL_HASH ${PKG_HASH} + CUSTOM_CACHE_KEY ${PKG_KEY} + DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY} + FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS} + + OPTIONS ${PKG_ARGS_OPTIONS} + PATCHES ${PKG_ARGS_PATCHES} + + ${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}) + + if (${PKG_ARGS_NAME}_ADDED) + 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}) + else() + message(WARNING "CPMUtil: Package ${PKG_ARGS_NAME} has no specified sha or version") + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown") + endif() + else() + if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)") + else() + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)") + endif() + endif() + + # 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) +endfunction() diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index d4c1042740..62cf2689ab 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -6,7 +6,7 @@ # 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) +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") @@ -29,13 +29,13 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var) set(package_url "${package_base_url}${package_repo}") set(full_url ${package_url}${remote_path}${lib_name}${package_extension}) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME ${cpm_key} + VERSION ${version} URL ${full_url} DOWNLOAD_ONLY YES - CUSTOM_CACHE_KEY ${CACHE_KEY} + KEY ${CACHE_KEY} + # TODO(crueter): hash ) set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) @@ -46,11 +46,11 @@ function(download_win_archives) set(FORCE_WIN_ARCHIVES ON) set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "") + download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) # TODO(crueter): separate handling for arm64 set(SDL2_VER "SDL2-2.32.8") - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "") + download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8) set(FORCE_WIN_ARCHIVES OFF) endfunction() diff --git a/CMakeModules/GenerateDepHashes.cmake b/CMakeModules/GenerateDepHashes.cmake new file mode 100644 index 0000000000..d0d59bd22f --- /dev/null +++ b/CMakeModules/GenerateDepHashes.cmake @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +get_property(NAMES GLOBAL PROPERTY CPM_PACKAGE_NAMES) +get_property(SHAS GLOBAL PROPERTY CPM_PACKAGE_SHAS) +get_property(URLS GLOBAL PROPERTY CPM_PACKAGE_URLS) + +list(LENGTH NAMES DEPS_LENGTH) + +list(JOIN NAMES "\",\n\t\"" DEP_NAME_DIRTY) +set(DEP_NAMES "\t\"${DEP_NAME_DIRTY}\"") + +list(JOIN SHAS "\",\n\t\"" DEP_SHAS_DIRTY) +set(DEP_SHAS "\t\"${DEP_SHAS_DIRTY}\"") + +list(JOIN URLS "\",\n\t\"" DEP_URLS_DIRTY) +set(DEP_URLS "\t\"${DEP_URLS_DIRTY}\"") + +configure_file(dep_hashes.h.in dep_hashes.h @ONLY) +target_sources(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/dep_hashes.h) +target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) -- cgit v1.2.3