summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Vandaƫle <joshua@vandaele.software>2026-07-14 17:58:52 +0200
committerJoshua Vandaƫle <joshua@vandaele.software>2026-07-25 06:10:43 +0200
commit24361f49d1f797e1662af4a5d45447cafbf25fa1 (patch)
tree1b21858b09ec867f35f9c0ed52849c2855af1588
parent13238340ae77350f7f7bb13f1e93e52afc450afe (diff)
CMake: Enforce minimum stdlib versions
-rw-r--r--CMake/DolphinLibraryTools.cmake21
-rw-r--r--CMakeLists.txt9
2 files changed, 30 insertions, 0 deletions
diff --git a/CMake/DolphinLibraryTools.cmake b/CMake/DolphinLibraryTools.cmake
index 7d62966fc7..99f5f7f8f4 100644
--- a/CMake/DolphinLibraryTools.cmake
+++ b/CMake/DolphinLibraryTools.cmake
@@ -1,3 +1,6 @@
+include(CheckCXXSourceCompiles)
+include(CheckCXXSymbolExists)
+
# like add_library(new ALIAS old) but avoids add_library cannot create ALIAS target "new" because target "old" is imported but not globally visible. on older cmake
# This can be replaced with a direct alias call once our minimum is cmake 3.18
function(dolphin_alias_library new old)
@@ -148,3 +151,21 @@ function(dolphin_check_toolset_version LABEL VERSION_VAR MIN_VERSION)
message(FATAL_ERROR "Requires ${LABEL} ${MIN_VERSION} or higher")
endif()
endfunction()
+
+
+function(dolphin_check_std_version LABEL VERSION_MACRO MIN_VERSION)
+ check_cxx_symbol_exists(${VERSION_MACRO} version IS_${LABEL})
+ if(NOT IS_${LABEL})
+ return()
+ endif()
+ check_cxx_source_compiles([[
+ #include <version>
+ #if ${VERSION_MACRO} < ${MIN_VERSION}
+ #error
+ #endif
+ int main(){}
+ ]] HAS_MINIMUM_${LABEL})
+ if(NOT HAS_MINIMUM_${LABEL})
+ message(FATAL_ERROR "Requires ${LABEL} ${MIN_VERSION} or higher")
+ endif()
+endfunction()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 389e8ae7ee..7258caeec8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -54,6 +54,9 @@ set(GCC_min_version 12)
set(Clang_min_version 15)
set(AppleClang_min_version 14.0.3)
set(MSVC_min_version 19.32)
+# Standard libraries
+set(libstdc++_min_version 12) # This should match GCC_min_version's major version.
+set(libc++_min_version 150000) # This should match Clang_min_version in the format "xxyyzz" instead of "xx.yy.zz"
dolphin_check_toolset_version("Xcode" XCODE_VERSION ${Xcode_min_version})
dolphin_check_toolset_version("MSVC Toolset" MSVC_TOOLSET_VERSION ${MSVC_toolset_min_version})
@@ -66,6 +69,12 @@ elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${${COMPILER}_min_version})
message(FATAL_ERROR "Requires ${COMPILER} ${${COMPILER}_min_version} or higher")
endif()
+# libstdc++ is almost always used on Linux, even when using clang as the compiler.
+# libc++ is used on the likes of Android, Apple devices, FreeBSD, and a few (very) rare Linux distros like Chimera Linux.
+# Windows uses its own standard library named STL, which we check as part of the toolset above. (outside of MinGW which can use either libstdc++ or libc++)
+dolphin_check_std_version("GNU_libstdc++" _GLIBCXX_RELEASE ${libstdc++_min_version})
+dolphin_check_std_version("LLVM_libc++" _LIBCPP_VERSION ${libc++_min_version})
+
# Name of the Dolphin distributor. If you redistribute Dolphin builds (forks,
# unofficial builds) please consider identifying your distribution with a
# unique name here.