From bddb51bf1ab0e7687b287ce2743bd4c1d9ad17c6 Mon Sep 17 00:00:00 2001 From: crueter Date: Thu, 11 Jun 2026 02:57:50 -0400 Subject: [PATCH] Oopsies Signed-off-by: crueter --- CMakeModules/DetectArchitecture.cmake | 221 -------------------------- CMakeModules/DetectPlatform.cmake | 152 ------------------ 2 files changed, 373 deletions(-) delete mode 100644 CMakeModules/DetectArchitecture.cmake delete mode 100644 CMakeModules/DetectPlatform.cmake diff --git a/CMakeModules/DetectArchitecture.cmake b/CMakeModules/DetectArchitecture.cmake deleted file mode 100644 index 105963c8c2..0000000000 --- a/CMakeModules/DetectArchitecture.cmake +++ /dev/null @@ -1,221 +0,0 @@ -# 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}") \ No newline at end of file diff --git a/CMakeModules/DetectPlatform.cmake b/CMakeModules/DetectPlatform.cmake deleted file mode 100644 index 0ad695066b..0000000000 --- a/CMakeModules/DetectPlatform.cmake +++ /dev/null @@ -1,152 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2025 crueter -# SPDX-License-Identifier: LGPL-3.0-or-later - -## DetectPlatform ## - -# This is a small helper that sets 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_ 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() \ No newline at end of file