Browse Source
[ci] Fix update-deps workflow
[ci] Fix update-deps workflow
me when spaces Signed-off-by: crueter <crueter@eden-emu.dev>fix-update-deps-ci
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
6 changed files with 433 additions and 36 deletions
-
2.forgejo/workflows/translations.yml
-
13.forgejo/workflows/update-deps.yml
-
66CMakeModules/CPMUtil.cmake
-
221CMakeModules/DetectArchitecture.cmake
-
152CMakeModules/DetectPlatform.cmake
-
15tools/cpm/package/update.sh
@ -0,0 +1,221 @@ |
|||
# SPDX-FileCopyrightText: Copyright 2025 crueter |
|||
# SPDX-License-Identifier: LGPL-3.0-or-later |
|||
|
|||
## DetectArchitecture ## |
|||
#[[ |
|||
Does exactly as it sounds. Detects common symbols defined for different architectures and |
|||
adds compile definitions thereof. Namely: |
|||
- arm64 |
|||
- arm |
|||
- x86_64 |
|||
- x86 |
|||
- ia64 |
|||
- mips64 |
|||
- mips |
|||
- ppc64 |
|||
- ppc |
|||
- riscv |
|||
- riscv64 |
|||
- loongarch64 |
|||
- wasm |
|||
|
|||
Unsupported architectures: |
|||
- ARMv2-6 |
|||
- m68k |
|||
- PIC |
|||
|
|||
This file WILL NOT detect endian-ness for you. |
|||
|
|||
This file is based off of Yuzu and Dynarmic. |
|||
]] |
|||
|
|||
# multiarch builds are a special case and also very difficult |
|||
# this is what I have for now, but it's not ideal |
|||
|
|||
# Do note that situations where multiple architectures are defined |
|||
# should NOT be too dependent on the architecture |
|||
# otherwise, you may end up with duplicate code |
|||
if (CMAKE_OSX_ARCHITECTURES) |
|||
set(MULTIARCH_BUILD 1) |
|||
set(ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}") |
|||
|
|||
# hope and pray the architecture names match |
|||
foreach(ARCH IN ${CMAKE_OSX_ARCHITECTURES}) |
|||
set(ARCHITECTURE_${ARCH} 1 PARENT_SCOPE) |
|||
add_definitions(-DARCHITECTURE_${ARCH}=1) |
|||
endforeach() |
|||
|
|||
return() |
|||
endif() |
|||
|
|||
include(CheckSymbolExists) |
|||
function(detect_architecture symbol arch) |
|||
# The output variable needs to be unset between invocations otherwise |
|||
# CMake's crazy scope rules will keep it defined |
|||
unset(SYMBOL_EXISTS CACHE) |
|||
|
|||
if (NOT DEFINED ARCHITECTURE) |
|||
set(CMAKE_REQUIRED_QUIET 1) |
|||
check_symbol_exists("${symbol}" "" SYMBOL_EXISTS) |
|||
unset(CMAKE_REQUIRED_QUIET) |
|||
|
|||
if (SYMBOL_EXISTS) |
|||
set(ARCHITECTURE "${arch}" PARENT_SCOPE) |
|||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE) |
|||
add_definitions(-DARCHITECTURE_${arch}=1) |
|||
endif() |
|||
endif() |
|||
endfunction() |
|||
|
|||
function(detect_architecture_symbols) |
|||
if (DEFINED ARCHITECTURE) |
|||
return() |
|||
endif() |
|||
|
|||
set(oneValueArgs ARCH) |
|||
set(multiValueArgs SYMBOLS) |
|||
|
|||
cmake_parse_arguments(ARGS "" "${oneValueArgs}" "${multiValueArgs}" |
|||
"${ARGN}") |
|||
|
|||
set(arch "${ARGS_ARCH}") |
|||
foreach(symbol ${ARGS_SYMBOLS}) |
|||
detect_architecture("${symbol}" "${arch}") |
|||
|
|||
if (ARCHITECTURE_${arch}) |
|||
message(DEBUG "[DetectArchitecture] Found architecture symbol ${symbol} for ${arch}") |
|||
set(ARCHITECTURE "${arch}" PARENT_SCOPE) |
|||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE) |
|||
add_definitions(-DARCHITECTURE_${arch}=1) |
|||
|
|||
return() |
|||
endif() |
|||
endforeach() |
|||
endfunction() |
|||
|
|||
# arches here are put in a sane default order of importance |
|||
# notably, amd64, arm64, and riscv (in order) are BY FAR the most common |
|||
# mips is pretty popular in embedded |
|||
# ppc64 is pretty popular in supercomputing |
|||
# sparc is uh |
|||
# ia64 exists |
|||
# the rest exist, but are probably less popular than ia64 |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH arm64 |
|||
SYMBOLS |
|||
"__ARM64__" |
|||
"__aarch64__" |
|||
"_M_ARM64") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH x86_64 |
|||
SYMBOLS |
|||
"__x86_64" |
|||
"__x86_64__" |
|||
"__amd64" |
|||
"_M_X64" |
|||
"_M_AMD64") |
|||
|
|||
# riscv is interesting since it generally does not define a riscv64-specific symbol |
|||
# We can, however, check for the rv32 zcf extension which is good enough of a heuristic on GCC |
|||
detect_architecture_symbols( |
|||
ARCH riscv |
|||
SYMBOLS |
|||
"__riscv_zcf") |
|||
|
|||
# if zcf doesn't exist we can safely assume it's riscv64 |
|||
detect_architecture_symbols( |
|||
ARCH riscv64 |
|||
SYMBOLS |
|||
"__riscv") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH x86 |
|||
SYMBOLS |
|||
"__i386" |
|||
"__i386__" |
|||
"_M_IX86") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH arm |
|||
SYMBOLS |
|||
"__arm__" |
|||
"__TARGET_ARCH_ARM" |
|||
"_M_ARM") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH ia64 |
|||
SYMBOLS |
|||
"__ia64" |
|||
"__ia64__" |
|||
"_M_IA64") |
|||
|
|||
# mips is probably the least fun to detect due to microMIPS |
|||
# Because microMIPS is such cancer I'm considering it out of scope for now |
|||
detect_architecture_symbols( |
|||
ARCH mips64 |
|||
SYMBOLS |
|||
"__mips64") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH mips |
|||
SYMBOLS |
|||
"__mips" |
|||
"__mips__" |
|||
"_M_MRX000") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH ppc64 |
|||
SYMBOLS |
|||
"__ppc64__" |
|||
"__powerpc64__" |
|||
"_ARCH_PPC64" |
|||
"_M_PPC64") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH ppc |
|||
SYMBOLS |
|||
"__ppc__" |
|||
"__ppc" |
|||
"__powerpc__" |
|||
"_ARCH_COM" |
|||
"_ARCH_PWR" |
|||
"_ARCH_PPC" |
|||
"_M_MPPC" |
|||
"_M_PPC") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH sparc64 |
|||
SYMBOLS |
|||
"__sparc_v9__") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH sparc |
|||
SYMBOLS |
|||
"__sparc__" |
|||
"__sparc") |
|||
|
|||
# I don't actually know about loongarch32 since crossdev does not support it, only 64 |
|||
detect_architecture_symbols( |
|||
ARCH loongarch64 |
|||
SYMBOLS |
|||
"__loongarch__" |
|||
"__loongarch64") |
|||
|
|||
detect_architecture_symbols( |
|||
ARCH wasm |
|||
SYMBOLS |
|||
"__EMSCRIPTEN__") |
|||
|
|||
# "generic" target |
|||
# If you have reached this point, you're on some as-of-yet unsupported architecture. |
|||
# See the docs up above for known unsupported architectures |
|||
# If you're not in the list... I think you know what you're doing. |
|||
if (NOT DEFINED ARCHITECTURE) |
|||
set(ARCHITECTURE "GENERIC") |
|||
set(ARCHITECTURE_GENERIC 1) |
|||
add_definitions(-DARCHITECTURE_GENERIC=1) |
|||
endif() |
|||
|
|||
message(STATUS "[DetectArchitecture] Target architecture: ${ARCHITECTURE}") |
|||
@ -0,0 +1,152 @@ |
|||
# SPDX-FileCopyrightText: Copyright 2025 crueter |
|||
# SPDX-License-Identifier: LGPL-3.0-or-later |
|||
|
|||
## DetectPlatform ## |
|||
|
|||
# This is a small helper that sets PLATFORM_<platform> variables for various |
|||
# operating systems and distributions. Note that Apple, Windows, Android, etc. |
|||
# are not covered, as CMake already does that for us. |
|||
|
|||
# It also sets CXX_<compiler> for the C++ compiler. |
|||
|
|||
# Furthermore, some platforms have really silly requirements/quirks, so this |
|||
# also does a few of those. |
|||
|
|||
# This module contains contributions from the Eden Emulator Project, |
|||
# notably from crueter and Lizzie. |
|||
|
|||
if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS") |
|||
set(PLATFORM_SUN ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") |
|||
set(PLATFORM_FREEBSD ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") |
|||
set(PLATFORM_OPENBSD ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "NetBSD") |
|||
set(PLATFORM_NETBSD ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "DragonFly") |
|||
set(PLATFORM_DRAGONFLYBSD ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Haiku") |
|||
set(PLATFORM_HAIKU ON) |
|||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") |
|||
set(PLATFORM_LINUX ON) |
|||
endif() |
|||
|
|||
# dumb heuristic to detect msys2 |
|||
if (CMAKE_COMMAND MATCHES "msys64") |
|||
set(PLATFORM_MSYS ON) |
|||
endif() |
|||
|
|||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") |
|||
set(CXX_CLANG ON) |
|||
if (MSVC) |
|||
set(CXX_CLANG_CL ON) |
|||
endif() |
|||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|||
set(CXX_GCC ON) |
|||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") |
|||
set(CXX_CL ON) |
|||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") |
|||
set(CXX_ICC ON) |
|||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") |
|||
set(CXX_APPLE ON) |
|||
endif() |
|||
|
|||
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/11112 |
|||
# This works totally fine on MinGW64, but not CLANG{,ARM}64 |
|||
if(MINGW AND CXX_CLANG) |
|||
set(CMAKE_SYSTEM_VERSION 10.0.0) |
|||
endif() |
|||
|
|||
# NB: this does not account for SPARC |
|||
if (PLATFORM_SUN) |
|||
# Terrific OpenIndiana pkg shenanigans |
|||
list(APPEND CMAKE_PREFIX_PATH |
|||
"${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake") |
|||
list(APPEND CMAKE_MODULE_PATH |
|||
"${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake") |
|||
|
|||
# Amazing - absolutely incredible |
|||
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake") |
|||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake") |
|||
|
|||
# For some mighty reason, doing a normal release build sometimes |
|||
# may not trigger the proper -O3 switch to materialize |
|||
if (CMAKE_BUILD_TYPE MATCHES "Release") |
|||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") |
|||
endif() |
|||
if (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") |
|||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") |
|||
endif() |
|||
endif() |
|||
|
|||
# MSYS2 utilities |
|||
|
|||
# Sometimes, PkgConfig modules will incorrectly reference / when CMake |
|||
# wants you to reference it as C:/msys64/. This function corrects that. |
|||
# Example in a Find module: |
|||
#[[ |
|||
if (PLATFORM_MSYS) |
|||
FixMsysPath(PkgConfig::OPUS) |
|||
endif() |
|||
]] |
|||
|
|||
function(FixMsysPath target) |
|||
get_target_property(include_dir ${target} INTERFACE_INCLUDE_DIRECTORIES) |
|||
|
|||
if (NOT (include_dir MATCHES "^/")) |
|||
return() |
|||
endif() |
|||
|
|||
set(root_default $ENV{MSYS2_LOCATION}) |
|||
if (root_default STREQUAL "") |
|||
set(root_default "C:/msys64") |
|||
endif() |
|||
|
|||
set(MSYS_ROOT_PATH ${root_default} |
|||
CACHE STRING "Location of the MSYS2 root") |
|||
|
|||
set(include_dir "C:/msys64${include_dir}") |
|||
set_target_properties(${target} PROPERTIES |
|||
INTERFACE_INCLUDE_DIRECTORIES ${include_dir}) |
|||
endfunction() |
|||
|
|||
# MSYSTEM handling + program_path |
|||
if (PLATFORM_MSYS) |
|||
# really, really dumb heuristic to detect what environment we are in |
|||
macro(system var) |
|||
if (CMAKE_COMMAND MATCHES ${var}) |
|||
set(MSYSTEM ${var}) |
|||
endif() |
|||
endmacro() |
|||
|
|||
system(mingw64) |
|||
system(clang64) |
|||
system(clangarm64) |
|||
system(ucrt64) |
|||
|
|||
if (NOT DEFINED MSYSTEM) |
|||
set(MSYSTEM msys2) |
|||
endif() |
|||
|
|||
# We generally want to prioritize environment-specific binaries if possible |
|||
# some, like autoconf, are not present on environments besides msys2 though |
|||
set(CMAKE_PROGRAM_PATH C:/msys64/${MSYSTEM}/bin C:/msys64/usr/bin) |
|||
set(ENV{PKG_CONFIG_PATH} C:/msys64/${MSYSTEM}/lib/pkgconfig) |
|||
endif() |
|||
|
|||
# This saves a truly ridiculous amount of time during linking |
|||
# In my tests, without this, Eden takes 2 mins, with this, it takes 3-5 seconds |
|||
# or on GitHub Actions, 10 minutes -> 3 seconds |
|||
if (MINGW) |
|||
set(MINGW_FLAGS "-Wl,--strip-all -Wl,--gc-sections") |
|||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE |
|||
"${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MINGW_FLAGS}") |
|||
endif() |
|||
|
|||
# awesome |
|||
if (PLATFORM_FREEBSD OR PLATFORM_DRAGONFLYBSD) |
|||
set(CMAKE_EXE_LINKER_FLAGS |
|||
"${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/local/lib") |
|||
endif() |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue