# Macro which contains all bits to setup the compile flags correctly. # # compile_flags() # macro(compile_flags) if(MSVC) if(VCPKG_TARGET_TRIPLET MATCHES "-static" AND NOT VCPKG_TARGET_TRIPLET MATCHES "-md") # Switch to MT (static) instead of MD (dynamic) binary # For MSVC two generators are available # - a command line generator (Ninja) using CMAKE_BUILD_TYPE to specify the # configuration of the build tree # - an IDE generator (Visual Studio) using CMAKE_CONFIGURATION_TYPES to # specify all configurations that will be available in the generated solution list(APPEND MSVC_CONFIGS "${CMAKE_BUILD_TYPE}" "${CMAKE_CONFIGURATION_TYPES}") # Set usage of static runtime for all configurations foreach(MSVC_CONFIG ${MSVC_CONFIGS}) string(TOUPPER "CMAKE_CXX_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") string(TOUPPER "CMAKE_C_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") endforeach() endif() # "If /Zc:rvalueCast is specified, the compiler follows section 5.4 of the # C++11 standard". We need C++11 for the way we use threads. add_compile_options(/Zc:rvalueCast) if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") add_compile_options( /MP # Enable multi-threaded compilation. /FC # Display the full path of source code files passed to the compiler in diagnostics. ) endif() endif() # Add some -D flags for Debug builds. We cannot use add_definitions(), because # it does not appear to support the $<> tags. add_compile_options( "$<$:-D_DEBUG>" "$<$>:-D_FORTIFY_SOURCE=2>" # FORTIFY_SOURCE should only be used in non-debug builds (requires -O1+) ) if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_options(-DFEWER_ASSERTS) endif() if(MINGW) add_link_options( "$<$>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0 ) if(CMAKE_SIZEOF_VOID_P EQUAL 8) add_compile_options( "$<$:-Wa,-mbig-obj>" # Switch to pe-bigobj-x86-64 as x64 Debug builds push pe-x86-64 to the limits (linking errors with ASLR, ...) ) endif() endif() # Prepare a generator that checks if we are not a debug, and don't have asserts # on. We need this later on to set some compile options for stable releases. #set(IS_STABLE_RELEASE "$>,$>>") if(MSVC) add_compile_options(/W3) if(MSVC_VERSION GREATER 1929) # Starting with version 19.30, there is an optimisation bug, see #9966 for details # This flag disables the broken optimisation to work around the bug add_compile_options(/d2ssa-rse-) endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_compile_options( -W -Wall -Wcast-qual -Wextra -Wsign-compare -Wundef -Wpointer-arith -Wwrite-strings -Wredundant-decls -Wformat-security -Wformat=2 -Winit-self "$<$:-Wnon-virtual-dtor>" # Often parameters are unused, which is fine. -Wno-unused-parameter # We use 'ABCD' multichar for SaveLoad chunks identifiers -Wno-multichar # Compilers complains about that we break strict-aliasing. # On most places we don't see how to fix it, and it doesn't # break anything. So disable strict-aliasing to make the # compiler all happy. -fno-strict-aliasing ) if(NOT CMAKE_BUILD_TYPE) # Sensible default if no build type specified add_compile_options(-O2) if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_compile_options(-DNDEBUG) endif() endif(NOT CMAKE_BUILD_TYPE) # When we are a stable release (Release build + USE_ASSERTS not set), # assertations are off, which trigger a lot of warnings. We disable # these warnings for these releases. #if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # add_compile_options( # "$<${IS_STABLE_RELEASE}:-Wno-unused-variable>" # "$<${IS_STABLE_RELEASE}:-Wno-unused-but-set-parameter>" # "$<${IS_STABLE_RELEASE}:-Wno-unused-but-set-variable>" # ) #else (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # add_compile_options( # "$<${IS_STABLE_RELEASE}:-Wno-unused-variable>" # "$<${IS_STABLE_RELEASE}:-Wno-unused-parameter>" # ) #endif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # Ninja processes the output so the output from the compiler # isn't directly to a terminal; hence, the default is # non-coloured output. We can override this to get nicely # coloured output, but since that might yield odd results with # IDEs, we extract it to an option. if(OPTION_FORCE_COLORED_OUTPUT) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") add_compile_options (-fdiagnostics-color=always) elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_compile_options (-fcolor-diagnostics) endif() endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-flifetime-dse=1" LIFETIME_DSE_FOUND) add_compile_options( # GCC 4.2+ automatically assumes that signed overflows do # not occur in signed arithmetics, whereas we are not # sure that they will not happen. It furthermore complains # about its own optimized code in some places. "-fno-strict-overflow" # Prevent optimisation supposing enums are in a range specified by the standard # For details, see http://gcc.gnu.org/PR43680 "-fno-tree-vrp" # -flifetime-dse=2 (default since GCC 6) doesn't play # well with our custom pool item allocator "$<$:-flifetime-dse=1>" ) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") if (NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") add_compile_options( -fno-stack-check ) include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-mno-sse4" NO_SSE4_FOUND) if(NO_SSE4_FOUND) add_compile_options( # Don't use SSE4 for general sources to increase compatibility. -mno-sse4 ) endif() endif() endif() if (OPTION_NO_WARN_UNINIT) add_compile_options(-Wno-maybe-uninitialized -Wno-uninitialized) endif (OPTION_NO_WARN_UNINIT) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") add_compile_options( -Wall # warning #873: function ... ::operator new ... has no corresponding operator delete ... -wd873 # warning #1292: unknown attribute "fallthrough" -wd1292 # warning #1899: multicharacter character literal (potential portability problem) -wd1899 # warning #2160: anonymous union qualifier is ignored -wd2160 ) else() message(FATAL_ERROR "No warning flags are set for this compiler yet; please consider creating a Pull Request to add support for this compiler.") endif() if(NOT WIN32 AND NOT HAIKU) # rdynamic is used to get useful stack traces from crash reports. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic") endif() endmacro()