No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
2 changed files with 0 additions and 373 deletions
@ -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}") |
|
||||
@ -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_<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