@@ -117,6 +117,8 @@ if(NOT DAEMON_EXTERNAL_APP)
117117 option (USE_MUMBLE "Build Daemon with mumblelink sumpport" ON )
118118 endif ()
119119
120+ option (USE_CPP23 "Use C++23 standard where possible" ON )
121+
120122 option (USE_SMP "Compile with support for running the renderer in a separate thread" ON )
121123 option (USE_BREAKPAD "Generate Daemon crash dumps (which require Breakpad tools to read)" OFF )
122124endif ()
@@ -562,6 +564,15 @@ if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP)
562564 endif ()
563565endif ()
564566
567+ # Required for <stacktrace> on Clang/GCC
568+ if ( USE_CPP23 )
569+ if ( DAEMON_CXX_COMPILER_GCC_COMPATIBILITY OR DAEMON_CXX_COMPILER_Clang_COMPATIBILITY )
570+ set ( CPP23SupportLibrary "-lstdc++exp" )
571+ else ()
572+ set ( CPP23SupportLibrary "" )
573+ endif ()
574+ endif ()
575+
565576# Look for OpenGL here before we potentially switch to looking for static libs.
566577if (BUILD_CLIENT)
567578 if (LINUX OR FREEBSD)
@@ -853,7 +864,7 @@ endif()
853864################################################################################
854865macro (AddApplicationInternal Target Executable )
855866 add_executable (${Target} ${Sources} )
856- target_link_libraries (${Target} ${A_Target} -objects )
867+ target_link_libraries (${Target} ${A_Target} -objects ${CPP23SupportLibrary} )
857868
858869 if (DEPS_DIR)
859870 add_dependencies (${Target} runtime_deps )
@@ -878,17 +889,22 @@ endmacro()
878889
879890function (AddApplication )
880891 set (oneValueArgs Target ExecutableName)
881- set (multiValueArgs ApplicationMain Definitions Flags Files Libs Tests)
892+ set (multiValueArgs ApplicationMain Definitions Flags CompileFeatures Files Libs Tests)
882893 cmake_parse_arguments (A "" "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
883894
884895 # Reuse object files between the real application and the test one
885896 add_library (${A_Target} -objects OBJECT EXCLUDE_FROM_ALL ${A_Files} ${PCH_FILE} )
886- target_link_libraries (${A_Target} -objects engine-lib ${A_Libs} ${LIBS_BASE} )
897+ target_link_libraries (${A_Target} -objects engine-lib ${A_Libs} ${LIBS_BASE} ${CPP23SupportLibrary} )
887898 set_property (TARGET ${A_Target} -objects APPEND PROPERTY COMPILE_OPTIONS ${A_Flags} )
888899 set_property (TARGET ${A_Target} -objects APPEND PROPERTY INCLUDE_DIRECTORIES ${ENGINE_DIR} ${MOUNT_DIR} ${LIB_DIR} )
889900 set_property (TARGET ${A_Target} -objects APPEND PROPERTY COMPILE_DEFINITIONS ${A_Definitions} )
901+
890902 set_target_properties (${A_Target} -objects PROPERTIES FOLDER "engine/objects" )
891903
904+ if ( DEFINED A_CompileFeatures AND NOT $A_CompileFeatures STREQUAL "" )
905+ target_compile_features ( ${A_Target} -objects PRIVATE ${A_CompileFeatures} )
906+ endif ()
907+
892908 set (Sources WIN32 ${A_ApplicationMain} )
893909 AddApplicationInternal (${A_Target} ${A_ExecutableName} )
894910 if (BUILD_TESTS)
@@ -900,30 +916,41 @@ function(AddApplication)
900916 # -Wl,--whole-archive -l<library path> -Wl,--no-whole-archive
901917 set (Sources ${A_ApplicationMain} ${A_Tests} )
902918 AddApplicationInternal (test -${A_Target} test -${A_Target} )
903- target_link_libraries (test -${A_Target} GTest::gmock )
919+ target_link_libraries (test -${A_Target} ${CPP23SupportLibrary} GTest::gmock )
904920 endif ()
905921
906922 ADD_PRECOMPILED_HEADER (${A_Target} -objects )
907923endfunction ()
908924
909925daemon_write_buildinfo ("Engine" )
910926
927+ if ( USE_CPP23 )
928+ set ( COMPILE_FEATURES "cxx_std_23" )
929+ else ()
930+ set ( COMPILE_FEATURES )
931+ endif ()
932+
911933if (NOT NACL)
912934 add_library (engine-lib EXCLUDE_FROM_ALL ${PCH_FILE} ${BUILDINFOLIST} ${COMMONLIST} ${ENGINELIST} )
913- target_link_libraries (engine-lib ${LIBS_BASE} ${LIBS_ENGINE_BASE} )
935+ target_link_libraries (engine-lib ${LIBS_BASE} ${LIBS_ENGINE_BASE} ${CPP23SupportLibrary} )
914936 set_property (TARGET engine-lib APPEND PROPERTY COMPILE_DEFINITIONS BUILD_ENGINE )
915937 set_property (TARGET engine-lib APPEND PROPERTY INCLUDE_DIRECTORIES ${ENGINE_DIR} ${MOUNT_DIR} ${LIB_DIR} )
916938 set_property (TARGET engine-lib APPEND PROPERTY COMPILE_OPTIONS ${WARNINGS} )
917939 set_target_properties (engine-lib PROPERTIES FOLDER "engine/objects" )
918940 ADD_PRECOMPILED_HEADER (engine-lib )
919941
942+ if ( USE_CPP23 )
943+ target_compile_features ( engine-lib PRIVATE "cxx_std_23" )
944+ endif ()
945+
920946 if (BUILD_DUMMY_APP)
921947 AddApplication (
922948 Target dummyapp
923949 ExecutableName dummyapp
924950 Definitions USELESS_DEFINITION_TO_AVOID_PCH_ISSUE
925951 ApplicationMain ${ENGINE_DIR} /null/NullApplication.cpp
926952 Flags ${WARNINGS}
953+ CompileFeatures ${COMPILE_FEATURES}
927954 Files ${COMMON_DIR} /Util.h # must be nonempty
928955 Tests ${ENGINETESTLIST}
929956 )
@@ -943,6 +970,7 @@ if (BUILD_CLIENT)
943970 ApplicationMain ${ENGINE_DIR} /client/ClientApplication.cpp
944971 Definitions ${Definitions}
945972 Flags ${WARNINGS}
973+ CompileFeatures ${COMPILE_FEATURES}
946974 Files ${WIN_RC} ${BUILDINFOLIST} ${QCOMMONLIST} ${SERVERLIST} ${CLIENTBASELIST} ${CLIENTLIST}
947975 Libs ${LIBS_CLIENT} ${LIBS_CLIENTBASE} ${LIBS_ENGINE}
948976 Tests ${ENGINETESTLIST}
@@ -974,6 +1002,7 @@ if (BUILD_SERVER)
9741002 ApplicationMain ${ENGINE_DIR} /server/ServerApplication.cpp
9751003 Definitions BUILD_ENGINE BUILD_SERVER
9761004 Flags ${WARNINGS}
1005+ CompileFeatures ${COMPILE_FEATURES}
9771006 Files ${WIN_RC} ${BUILDINFOLIST} ${QCOMMONLIST} ${SERVERLIST} ${DEDSERVERLIST}
9781007 Libs ${LIBS_ENGINE}
9791008 Tests ${ENGINETESTLIST}
@@ -987,6 +1016,7 @@ if (BUILD_TTY_CLIENT)
9871016 ApplicationMain ${ENGINE_DIR} /client/ClientApplication.cpp
9881017 Definitions BUILD_ENGINE BUILD_TTY_CLIENT
9891018 Flags ${WARNINGS}
1019+ CompileFeatures ${COMPILE_FEATURES}
9901020 Files ${WIN_RC} ${BUILDINFOLIST} ${QCOMMONLIST} ${SERVERLIST} ${CLIENTBASELIST} ${TTYCLIENTLIST}
9911021 Libs ${LIBS_CLIENTBASE} ${LIBS_ENGINE}
9921022 Tests ${ENGINETESTLIST}
0 commit comments