You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.7 KiB
151 lines
4.7 KiB
# SPDX-FileCopyrightText: Copyright 2025 crueter
|
|
# SPDX-License-Identifier: GPL-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()
|