macro(SDL_DetectCompiler) set(USE_CLANG FALSE) set(USE_GCC FALSE) set(USE_INTELCC FALSE) set(USE_QCC FALSE) if(CMAKE_C_COMPILER_ID MATCHES "Clang|IntelLLVM") set(USE_CLANG TRUE) # Visual Studio 2019 v16.2 added support for Clang/LLVM. # Check if a Visual Studio project is being generated with the Clang toolset. if(MSVC) set(MSVC_CLANG TRUE) endif() elseif(CMAKE_COMPILER_IS_GNUCC) set(USE_GCC TRUE) elseif(CMAKE_C_COMPILER_ID MATCHES "^Intel$") set(USE_INTELCC TRUE) elseif(CMAKE_C_COMPILER_ID MATCHES "QCC") set(USE_QCC TRUE) endif() endmacro() function(SDL_AddCommonCompilerFlags TARGET) option(SDL_WERROR "Enable -Werror" OFF) if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC) if(MINGW) # See if GCC's -gdwarf-4 is supported # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101377 for why this is needed on Windows cmake_push_check_state() check_c_compiler_flag("-gdwarf-4" HAVE_GDWARF_4) if(HAVE_GDWARF_4) target_compile_options(${TARGET} PRIVATE "-gdwarf-4") endif() cmake_pop_check_state() endif() # Check for -Wall first, so later things can override pieces of it. # Note: clang-cl treats -Wall as -Weverything (which is very loud), # /W3 as -Wall, and /W4 as -Wall -Wextra. So: /W3 is enough. check_c_compiler_flag(-Wall HAVE_GCC_WALL) if(MSVC_CLANG) target_compile_options(${TARGET} PRIVATE "/W3") elseif(HAVE_GCC_WALL) target_compile_options(${TARGET} PRIVATE "-Wall") if(HAIKU) target_compile_options(${TARGET} PRIVATE "-Wno-multichar") endif() endif() check_c_compiler_flag(-Wundef HAVE_GCC_WUNDEF) if(HAVE_GCC_WUNDEF) target_compile_options(${TARGET} PRIVATE "-Wundef") endif() check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING) if(HAVE_GCC_NO_STRICT_ALIASING) target_compile_options(${TARGET} PRIVATE "-fno-strict-aliasing") endif() check_c_compiler_flag(-Wdocumentation HAVE_GCC_WDOCUMENTATION) if(HAVE_GCC_WDOCUMENTATION) if(SDL_WERROR) check_c_compiler_flag(-Werror=documentation HAVE_GCC_WERROR_DOCUMENTATION) if(HAVE_GCC_WERROR_DOCUMENTATION) target_compile_options(${TARGET} PRIVATE "-Werror=documentation") endif() endif() target_compile_options(${TARGET} PRIVATE "-Wdocumentation") endif() check_c_compiler_flag(-Wdocumentation-unknown-command HAVE_GCC_WDOCUMENTATION_UNKNOWN_COMMAND) if(HAVE_GCC_WDOCUMENTATION_UNKNOWN_COMMAND) if(SDL_WERROR) check_c_compiler_flag(-Werror=documentation-unknown-command HAVE_GCC_WERROR_DOCUMENTATION_UNKNOWN_COMMAND) if(HAVE_GCC_WERROR_DOCUMENTATION_UNKNOWN_COMMAND) target_compile_options(${TARGET} PRIVATE "-Werror=documentation-unknown-command") endif() endif() target_compile_options(${TARGET} PRIVATE "-Wdocumentation-unknown-command") endif() check_c_compiler_flag(-fcomment-block-commands=threadsafety HAVE_GCC_COMMENT_BLOCK_COMMANDS) if(HAVE_GCC_COMMENT_BLOCK_COMMANDS) target_compile_options(${TARGET} PRIVATE "-fcomment-block-commands=threadsafety") else() check_c_compiler_flag(/clang:-fcomment-block-commands=threadsafety HAVE_CLANG_COMMENT_BLOCK_COMMANDS) if(HAVE_CLANG_COMMENT_BLOCK_COMMANDS) target_compile_options(${TARGET} PRIVATE "/clang:-fcomment-block-commands=threadsafety") endif() endif() check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW) if(HAVE_GCC_WSHADOW) target_compile_options(${TARGET} PRIVATE "-Wshadow") endif() check_c_compiler_flag(-Wunused-local-typedefs HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) if(HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) target_compile_options(${TARGET} PRIVATE "-Wno-unused-local-typedefs") endif() endif() if(SDL_WERROR) if(MSVC) check_c_compiler_flag(/WX HAVE_WX) if(HAVE_WX) target_compile_options(${TARGET} PRIVATE "/WX") endif() elseif(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QNX) check_c_compiler_flag(-Werror HAVE_WERROR) if(HAVE_WERROR) target_compile_options(${TARGET} PRIVATE "-Werror") endif() endif() endif() if(USE_CLANG) check_c_compiler_flag("-fcolor-diagnostics" COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) if(COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) target_compile_options(${TARGET} PRIVATE "-fcolor-diagnostics") endif() else() check_c_compiler_flag("-fdiagnostics-color=always" COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) if(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) target_compile_options(${TARGET} PRIVATE "-fdiagnostics-color=always") endif() endif() endfunction()