aboutsummaryrefslogtreecommitdiff
path: root/CMakeModules
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2025-08-11 22:27:29 +0200
committercrueter <crueter@eden-emu.dev>2025-08-11 22:27:29 +0200
commit1551387739959d4a0ba23767a21664ea9a860848 (patch)
tree49c4b555e6c8418ad8ada5db2ed142d54063f6ed /CMakeModules
parent3f02d7713f1bfb36245486019bc014ecc49a1b19 (diff)
[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 <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/238
Diffstat (limited to 'CMakeModules')
-rw-r--r--CMakeModules/CPMUtil.cmake117
-rw-r--r--CMakeModules/DownloadExternals.cmake14
-rw-r--r--CMakeModules/GenerateDepHashes.cmake21
3 files changed, 145 insertions, 7 deletions
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})