aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Popov <6yearold@gmail.com>2016-08-25 11:16:01 +0300
committerGleb Popov <6yearold@gmail.com>2016-09-30 11:02:47 +0300
commit4b8e8dcc8856d8f438860783e7641d02d1c05630 (patch)
treec703cb299f1b768eb26d0aa217bb1d225002981b
parent0cc2de65d111ee1244f3d3ce53c83b3b55b58dfb (diff)
downloadextra-cmake-modules-4b8e8dcc8856d8f438860783e7641d02d1c05630.tar.gz
extra-cmake-modules-4b8e8dcc8856d8f438860783e7641d02d1c05630.tar.bz2
Teach KDECompilerSettings about clang-cl, a mode of Clang compiler that simulates MSVC.
REVIEW: 128779
-rw-r--r--kde-modules/KDECompilerSettings.cmake40
-rw-r--r--kde-modules/KDEFrameworkCompilerSettings.cmake2
2 files changed, 25 insertions, 17 deletions
diff --git a/kde-modules/KDECompilerSettings.cmake b/kde-modules/KDECompilerSettings.cmake
index dfa29f7e..290c2dac 100644
--- a/kde-modules/KDECompilerSettings.cmake
+++ b/kde-modules/KDECompilerSettings.cmake
@@ -84,6 +84,8 @@ macro(_kde_compiler_min_version min_version)
endif()
endmacro()
+set(CLANG_AS_MSVC (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC"))
+
if (MSVC)
# MSVC_VERSION 1600 = VS 10.0 = Windows SDK 7
# See: cmake --help-variable MSVC_VERSION
@@ -189,15 +191,17 @@ endif()
# 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.
-if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
- # We use the C89 standard because that is what is common to all our
- # compilers (in particular, MSVC 2010 does not support C99)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=iso9899:1990")
-endif()
-if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
-elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+if (NOT CLANG_AS_MSVC)
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ # We use the C89 standard because that is what is common to all our
+ # compilers (in particular, MSVC 2010 does not support C99)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=iso9899:1990")
+ endif()
+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+ endif()
endif()
# Do not merge uninitialized global variables.
@@ -255,7 +259,7 @@ endif()
# Turn off exceptions by default
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
-elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CLANG_AS_MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
@@ -267,7 +271,7 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32)
endif()
macro(_kdecompilersettings_append_exception_flag VAR)
- if (MSVC)
+ if (MSVC OR CLANG_AS_MSVC)
set(${VAR} "${${VAR}} -EHsc")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
if (WIN32)
@@ -300,13 +304,17 @@ endfunction()
function(KDE_TARGET_ENABLE_EXCEPTIONS target mode)
target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:MSVC>:-EHsc>")
+ target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:GNU>:-fexceptions>")
if (WIN32)
target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:Intel>:-EHsc>")
else()
target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:Intel>:-fexceptions>")
endif()
- target_compile_options(${target} ${mode}
- "$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-fexceptions>")
+ if(CLANG_AS_MSVC)
+ target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:Clang>:-EHsc>")
+ else()
+ target_compile_options(${target} ${mode} "$<$<CXX_COMPILER_ID:Clang>:-fexceptions>")
+ endif()
endfunction()
function(KDE_ENABLE_EXCEPTIONS)
@@ -333,7 +341,7 @@ endfunction()
############################################################
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
- (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT APPLE) OR
+ (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT APPLE AND NOT "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") OR
(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32))
# Linker warnings should be treated as errors
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings ${CMAKE_SHARED_LINKER_FLAGS}")
@@ -365,7 +373,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -w1 -Wpointer-arith")
endif()
-if (MSVC)
+if (MSVC OR CLANG_AS_MSVC)
# FIXME: do we not want to set the warning level up to level 3? (/W3)
# Disable warnings:
# C4250: 'class1' : inherits 'class2::member' via dominance
@@ -419,7 +427,7 @@ if (APPLE)
endif()
if (WIN32)
- if (MSVC OR CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
+ if (MSVC OR CLANG_AS_MSVC OR CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
# MSVC has four incompatible C runtime libraries: static (libcmt),
# static debug (libcmtd), shared (msvcrt) and shared debug (msvcrtd):
# see http://support.microsoft.com/kb/154753
diff --git a/kde-modules/KDEFrameworkCompilerSettings.cmake b/kde-modules/KDEFrameworkCompilerSettings.cmake
index 038ddc3b..3fb32694 100644
--- a/kde-modules/KDEFrameworkCompilerSettings.cmake
+++ b/kde-modules/KDEFrameworkCompilerSettings.cmake
@@ -63,7 +63,7 @@ endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
-elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CLANG_AS_MSVC)
# -Wgnu-zero-variadic-macro-arguments is triggered by every qCDebug() call and therefore results
# in a lot of noise. This warning is only notifying us that clang is emulating the GCC behaviour
# instead of the exact standard wording so we can safely ignore it