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_target_compile_option_all_languages TARGET OPTION) target_compile_options(${TARGET} PRIVATE "$<$:${OPTION}>") if(CMAKE_OBJC_COMPILER) target_compile_options(${TARGET} PRIVATE "$<$:${OPTION}>") endif() endfunction() function(SDL_AddCommonCompilerFlags TARGET) option(SDL_WERROR "Enable -Werror" OFF) get_property(TARGET_TYPE TARGET "${TARGET}" PROPERTY TYPE) if(MSVC) cmake_push_check_state() check_c_compiler_flag("/W3" COMPILER_SUPPORTS_W3) if(COMPILER_SUPPORTS_W3) target_compile_options(${TARGET} PRIVATE "/W3") endif() cmake_pop_check_state() endif() 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) sdl_target_compile_option_all_languages(${TARGET} "-Wall") if(HAIKU) sdl_target_compile_option_all_languages(${TARGET} "-Wno-multichar") endif() endif() check_c_compiler_flag(-Wundef HAVE_GCC_WUNDEF) if(HAVE_GCC_WUNDEF) sdl_target_compile_option_all_languages(${TARGET} "-Wundef") endif() check_c_compiler_flag(-Wfloat-conversion HAVE_GCC_WFLOAT_CONVERSION) if(HAVE_GCC_WFLOAT_CONVERSION) sdl_target_compile_option_all_languages(${TARGET} "-Wfloat-conversion") endif() check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING) if(HAVE_GCC_NO_STRICT_ALIASING) sdl_target_compile_option_all_languages(${TARGET} "-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) sdl_target_compile_option_all_languages(${TARGET} "-Werror=documentation") endif() endif() sdl_target_compile_option_all_languages(${TARGET} "-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) sdl_target_compile_option_all_languages(${TARGET} "-Werror=documentation-unknown-command") endif() endif() sdl_target_compile_option_all_languages(${TARGET} "-Wdocumentation-unknown-command") endif() check_c_compiler_flag(-fcomment-block-commands=threadsafety HAVE_GCC_COMMENT_BLOCK_COMMANDS) if(HAVE_GCC_COMMENT_BLOCK_COMMANDS) sdl_target_compile_option_all_languages(${TARGET} "-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) sdl_target_compile_option_all_languages(${TARGET} "/clang:-fcomment-block-commands=threadsafety") endif() endif() check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW) if(HAVE_GCC_WSHADOW) sdl_target_compile_option_all_languages(${TARGET} "-Wshadow") endif() check_c_compiler_flag(-Wunused-local-typedefs HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) if(HAVE_GCC_WUNUSED_LOCAL_TYPEDEFS) sdl_target_compile_option_all_languages(${TARGET} "-Wno-unused-local-typedefs") endif() check_c_compiler_flag(-Wimplicit-fallthrough HAVE_GCC_WIMPLICIT_FALLTHROUGH) if(HAVE_GCC_WIMPLICIT_FALLTHROUGH) sdl_target_compile_option_all_languages(${TARGET} "-Wimplicit-fallthrough") 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) sdl_target_compile_option_all_languages(${TARGET} "-Werror") endif() if(TARGET_TYPE STREQUAL "SHARED_LIBRARY") check_linker_flag(C "-Wl,--no-undefined-version" LINKER_SUPPORTS_NO_UNDEFINED_VERSION) if(LINKER_SUPPORTS_NO_UNDEFINED_VERSION) target_link_options(${TARGET} PRIVATE "-Wl,--no-undefined-version") endif() endif() endif() endif() if(USE_CLANG) check_c_compiler_flag("-fcolor-diagnostics" COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) if(COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS) sdl_target_compile_option_all_languages(${TARGET} "-fcolor-diagnostics") endif() else() check_c_compiler_flag("-fdiagnostics-color=always" COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) if(COMPILER_SUPPORTS_FDIAGNOSTICS_COLOR_ALWAYS) sdl_target_compile_option_all_languages(${TARGET} "-fdiagnostics-color=always") endif() endif() endfunction()