Skip to content

Commit 9528fb2

Browse files
committed
Add CPP23 option to CMake
1 parent ca1e6ca commit 9528fb2

1 file changed

Lines changed: 35 additions & 5 deletions

File tree

CMakeLists.txt

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
122124
endif()
@@ -562,6 +564,15 @@ if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP)
562564
endif()
563565
endif()
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.
566577
if (BUILD_CLIENT)
567578
if (LINUX OR FREEBSD)
@@ -853,7 +864,7 @@ endif()
853864
################################################################################
854865
macro(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

879890
function(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)
907923
endfunction()
908924

909925
daemon_write_buildinfo("Engine")
910926

927+
if ( USE_CPP23 )
928+
set( COMPILE_FEATURES "cxx_std_23" )
929+
else()
930+
set( COMPILE_FEATURES )
931+
endif()
932+
911933
if (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

Comments
 (0)