Index: kde-modules/KDECompilerSettings.cmake =================================================================== --- kde-modules/KDECompilerSettings.cmake +++ kde-modules/KDECompilerSettings.cmake @@ -186,6 +186,49 @@ # Language and toolchain features ############################################################ +include(CheckCXXCompilerFlag) +include(CheckCCompilerFlag) + +# usage: kde_add_supported_cxx_compilerflag(-foo Compiler_Expression) +# where Compiler_Expression is an expression you'd pass to if(), e.g. +# CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0.0 +# Adds the given flag to CMAKE_CXX_FLAGS if the current C++ compiler supports it +# according to Compiler_Expression. When using clang on APPLE an actual test +# is run after the Compiler_Expression check. +macro (KDE_ADD_SUPPORTED_CXX_COMPILER_FLAG _FLAG) + # treat the arguments following _FLAG as a boolean expression + # to determine if we're dealing with a compiler/version that + # is expected to support _FLAG. + if (${ARGN}) + if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # Clang on APPLE needs verification because of Apple's + # llvm versions which cannot be matched easily to + # stock llvm versions. + set(HASFLAG "${CMAKE_CXX_COMPILER_ID}++_ACCEPTS${_FLAG}") + check_cxx_compiler_flag(${_FLAG} ${HASFLAG}) + if ({${HASFLAG}}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_FLAG}") + endif() + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_FLAG}") + endif() + endif() +endmacro() + +macro (KDE_ADD_SUPPORTED_C_COMPILER_FLAG _RESULT _FLAG) + if (${ARGN}) + if(APPLE AND CMAKE_C_COMPILER_ID MATCHES "Clang") + set(HASFLAG "${CMAKE_C_COMPILER_ID}_ACCEPTS${_FLAG}") + check_cx_compiler_flag(${_FLAG} ${HASFLAG}) + if ({${HASFLAG}}) + set(CMAKE_CX_FLAGS "${CMAKE_CX_FLAGS} ${_FLAG}") + endif() + else() + set(CMAKE_CX_FLAGS "${CMAKE_CX_FLAGS} ${_FLAG}") + endif() + endif() +endmacro() + # Pick sensible versions of the C and C++ standards. # Note that MSVC does not have equivalent flags; the features are either # supported or they are not. @@ -369,20 +412,12 @@ # Make some warnings errors set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-type") endif() -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR +kde_add_supported_cxx_compiler_flag(-Wvla + CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)) - # -Wvla: use of variable-length arrays (an extension to C++) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wvla") -endif() -if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR +kde_add_supported_cxx_compiler_flag(-Wdate-time + (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)) - include(CheckCXXCompilerFlag) - check_cxx_compiler_flag(-Wdate-time HAVE_DATE_TIME) - if (HAVE_DATE_TIME) - # -Wdate-time: warn if we use __DATE__ or __TIME__ (we want to be able to reproduce the exact same binary) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wdate-time") - endif() -endif() # -w1 turns on warnings and errors # FIXME: someone needs to have a closer look at the Intel compiler options @@ -486,12 +521,12 @@ set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--export-all-symbols") endif() -if (CMAKE_GENERATOR STREQUAL "Ninja" AND - ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) OR - (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5))) +if (CMAKE_GENERATOR STREQUAL "Ninja") # Force colored warnings in Ninja's output, if the compiler has -fdiagnostics-color support. # Rationale in https://github.com/ninja-build/ninja/issues/814 - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always") + kde_add_supported_cxx_compiler_flag(-fdiagnostics-color=always + ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) OR + (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5))) endif() include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake") Index: kde-modules/KDEFrameworkCompilerSettings.cmake =================================================================== --- kde-modules/KDEFrameworkCompilerSettings.cmake +++ kde-modules/KDEFrameworkCompilerSettings.cmake @@ -71,8 +71,4 @@ endif() endif() -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant" ) - endif() -endif() +kde_add_supported_cxx_compiler_flag("-Wzero-as-null-pointer-constant" CMAKE_CXX_COMPILER_ID MATCHES "Clang")