From 6274a8778890975af6f3938f779cdda954eef160 Mon Sep 17 00:00:00 2001 From: cjee21 <77721854+cjee21@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:05:11 +0800 Subject: [PATCH] CMake: Prefer latest C++ standard with min C++11 --- Project/CMake/CMakeLists.txt | 7 +++--- Project/CMake/Modules/EnableLatestCXX.cmake | 26 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 Project/CMake/Modules/EnableLatestCXX.cmake diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt index d4c98c8e..3f879d94 100644 --- a/Project/CMake/CMakeLists.txt +++ b/Project/CMake/CMakeLists.txt @@ -166,11 +166,10 @@ set_target_properties(zen PROPERTIES VERSION ${ZenLib_VERSION} SOVERSION ${ZenLib_MAJOR_VERSION} PUBLIC_HEADER "${ZenLib_HDRS}" - CXX_STANDARD 20 - CXX_EXTENSIONS NO - CXX_STANDARD_REQUIRED NO ) -target_compile_features(zen PRIVATE cxx_std_11) + +include(EnableLatestCXX) +enable_latest_cxx(zen) install(TARGETS zen EXPORT zen-export PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/ZenLib diff --git a/Project/CMake/Modules/EnableLatestCXX.cmake b/Project/CMake/Modules/EnableLatestCXX.cmake new file mode 100644 index 00000000..0d9a7683 --- /dev/null +++ b/Project/CMake/Modules/EnableLatestCXX.cmake @@ -0,0 +1,26 @@ +function(enable_latest_cxx target) + + set_target_properties(${target} PROPERTIES + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF + ) + + # User override + if(DEFINED CMAKE_CXX_STANDARD) + target_compile_features(${target} PRIVATE cxx_std_${CMAKE_CXX_STANDARD}) + return() + endif() + + # Select highest available from list of supported + set(_known_standards 26 23 20 17 14 11) + foreach(std ${_known_standards}) + if("cxx_std_${std}" IN_LIST CMAKE_CXX_COMPILE_FEATURES) + target_compile_features(${target} PRIVATE cxx_std_${std}) + message(STATUS "'${target}' is using latest available C++ standard: C++${std}") + return() + endif() + endforeach() + + # Unsupported C++ version + message(FATAL_ERROR "Compiler ${CMAKE_CXX_COMPILER_ID} does not support C++11 or newer.") +endfunction()