1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4 5# This module is shared by multiple languages; use include blocker. 6if(__WINDOWS_MSVC) 7 return() 8endif() 9set(__WINDOWS_MSVC 1) 10 11set(CMAKE_LIBRARY_PATH_FLAG "-LIBPATH:") 12set(CMAKE_LINK_LIBRARY_FLAG "") 13set(MSVC 1) 14 15# hack: if a new cmake (which uses CMAKE_LINKER) runs on an old build tree 16# (where link was hardcoded) and where CMAKE_LINKER isn't in the cache 17# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun) 18# hardcode CMAKE_LINKER here to link, so it behaves as it did before, Alex 19if(NOT DEFINED CMAKE_LINKER) 20 set(CMAKE_LINKER link) 21endif() 22 23if(CMAKE_VERBOSE_MAKEFILE) 24 set(CMAKE_CL_NOLOGO) 25else() 26 set(CMAKE_CL_NOLOGO "/nologo") 27endif() 28 29if(CMAKE_SYSTEM_NAME STREQUAL "WindowsCE") 30 set(_PLATFORM_LINK_FLAGS " /subsystem:windowsce") 31else() 32 set(_PLATFORM_LINK_FLAGS "") 33endif() 34 35set(CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1) 36if(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio") 37 set (CMAKE_NO_BUILD_TYPE 1) 38endif() 39 40if("${CMAKE_GENERATOR}" MATCHES "Visual Studio") 41 set(MSVC_IDE 1) 42else() 43 set(MSVC_IDE 0) 44endif() 45 46if(NOT MSVC_VERSION) 47 if("x${CMAKE_C_COMPILER_ID}" STREQUAL "xMSVC") 48 set(_compiler_version ${CMAKE_C_COMPILER_VERSION}) 49 elseif("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xMSVC") 50 set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) 51 elseif(CMAKE_C_SIMULATE_VERSION) 52 set(_compiler_version ${CMAKE_C_SIMULATE_VERSION}) 53 elseif(CMAKE_CXX_SIMULATE_VERSION) 54 set(_compiler_version ${CMAKE_CXX_SIMULATE_VERSION}) 55 elseif(CMAKE_Fortran_SIMULATE_VERSION) 56 set(_compiler_version ${CMAKE_Fortran_SIMULATE_VERSION}) 57 elseif(CMAKE_CUDA_SIMULATE_VERSION) 58 set(_compiler_version ${CMAKE_CUDA_SIMULATE_VERSION}) 59 elseif(CMAKE_C_COMPILER_VERSION) 60 set(_compiler_version ${CMAKE_C_COMPILER_VERSION}) 61 else() 62 set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) 63 endif() 64 if("${_compiler_version}" MATCHES "^([0-9]+)\\.([0-9]+)") 65 math(EXPR MSVC_VERSION "${CMAKE_MATCH_1}*100 + ${CMAKE_MATCH_2}") 66 else() 67 message(FATAL_ERROR "MSVC compiler version not detected properly: ${_compiler_version}") 68 endif() 69 70 if(MSVC_VERSION GREATER_EQUAL 1930) 71 # VS 2022 or greater 72 set(MSVC_TOOLSET_VERSION 143) 73 elseif(MSVC_VERSION GREATER_EQUAL 1920) 74 # VS 2019 or greater 75 set(MSVC_TOOLSET_VERSION 142) 76 elseif(MSVC_VERSION GREATER_EQUAL 1910) 77 # VS 2017 or greater 78 set(MSVC_TOOLSET_VERSION 141) 79 elseif(MSVC_VERSION EQUAL 1900) 80 # VS 2015 81 set(MSVC_TOOLSET_VERSION 140) 82 elseif(MSVC_VERSION EQUAL 1800) 83 # VS 2013 84 set(MSVC_TOOLSET_VERSION 120) 85 elseif(MSVC_VERSION EQUAL 1700) 86 # VS 2012 87 set(MSVC_TOOLSET_VERSION 110) 88 elseif(MSVC_VERSION EQUAL 1600) 89 # VS 2010 90 set(MSVC_TOOLSET_VERSION 100) 91 elseif(MSVC_VERSION EQUAL 1500) 92 # VS 2008 93 set(MSVC_TOOLSET_VERSION 90) 94 elseif(MSVC_VERSION EQUAL 1400) 95 # VS 2005 96 set(MSVC_TOOLSET_VERSION 80) 97 else() 98 # We don't support MSVC_TOOLSET_VERSION for earlier compiler. 99 endif() 100 101 set(MSVC10) 102 set(MSVC11) 103 set(MSVC12) 104 set(MSVC14) 105 set(MSVC60) 106 set(MSVC70) 107 set(MSVC71) 108 set(MSVC80) 109 set(MSVC90) 110 set(CMAKE_COMPILER_2005) 111 set(CMAKE_COMPILER_SUPPORTS_PDBTYPE) 112 if(NOT "${_compiler_version}" VERSION_LESS 20) 113 # We no longer provide per-version variables. Use MSVC_VERSION instead. 114 elseif(NOT "${_compiler_version}" VERSION_LESS 19) 115 set(MSVC14 1) 116 elseif(NOT "${_compiler_version}" VERSION_LESS 18) 117 set(MSVC12 1) 118 elseif(NOT "${_compiler_version}" VERSION_LESS 17) 119 set(MSVC11 1) 120 elseif(NOT "${_compiler_version}" VERSION_LESS 16) 121 set(MSVC10 1) 122 elseif(NOT "${_compiler_version}" VERSION_LESS 15) 123 set(MSVC90 1) 124 elseif(NOT "${_compiler_version}" VERSION_LESS 14) 125 set(MSVC80 1) 126 set(CMAKE_COMPILER_2005 1) 127 elseif(NOT "${_compiler_version}" VERSION_LESS 13.10) 128 set(MSVC71 1) 129 elseif(NOT "${_compiler_version}" VERSION_LESS 13) 130 set(MSVC70 1) 131 else() 132 set(MSVC60 1) 133 set(CMAKE_COMPILER_SUPPORTS_PDBTYPE 1) 134 endif() 135endif() 136 137if(MSVC_C_ARCHITECTURE_ID MATCHES 64 OR MSVC_CXX_ARCHITECTURE_ID MATCHES 64) 138 set(CMAKE_CL_64 1) 139else() 140 set(CMAKE_CL_64 0) 141endif() 142if(CMAKE_FORCE_WIN64 OR CMAKE_FORCE_IA64) 143 set(CMAKE_CL_64 1) 144endif() 145 146if("${MSVC_VERSION}" GREATER 1599) 147 set(MSVC_INCREMENTAL_DEFAULT ON) 148endif() 149 150# default to Debug builds 151set(CMAKE_BUILD_TYPE_INIT Debug) 152 153# Compute an architecture family from the architecture id. 154foreach(lang C CXX) 155 set(_MSVC_${lang}_ARCHITECTURE_FAMILY "${MSVC_${lang}_ARCHITECTURE_ID}") 156 if(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^ARM64EC") 157 set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM64EC") 158 elseif(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^ARM64") 159 set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM64") 160 elseif(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^ARM") 161 set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM") 162 elseif(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^SH") 163 set(_MSVC_${lang}_ARCHITECTURE_FAMILY "SHx") 164 endif() 165endforeach() 166 167cmake_policy(GET CMP0117 __WINDOWS_MSVC_CMP0117) 168if(__WINDOWS_MSVC_CMP0117 STREQUAL "NEW") 169 set(_GR "") 170else() 171 set(_GR " /GR") 172endif() 173unset(__WINDOWS_MSVC_CMP0117) 174 175if(WINCE) 176 foreach(lang C CXX) 177 string(TOUPPER "${_MSVC_${lang}_ARCHITECTURE_FAMILY}" _MSVC_${lang}_ARCHITECTURE_FAMILY_UPPER) 178 endforeach() 179 180 if("${CMAKE_SYSTEM_VERSION}" MATCHES "^([0-9]+)\\.([0-9]+)") 181 math(EXPR _CE_VERSION "${CMAKE_MATCH_1}*100 + ${CMAKE_MATCH_2}") 182 elseif("${CMAKE_SYSTEM_VERSION}" STREQUAL "") 183 set(_CE_VERSION "500") 184 else() 185 message(FATAL_ERROR "Invalid Windows CE version: ${CMAKE_SYSTEM_VERSION}") 186 endif() 187 188 set(_PLATFORM_DEFINES "/D_WIN32_WCE=0x${_CE_VERSION} /DUNDER_CE /DWINCE") 189 set(_PLATFORM_DEFINES_C " /D${_MSVC_C_ARCHITECTURE_FAMILY} /D_${_MSVC_C_ARCHITECTURE_FAMILY_UPPER}_") 190 set(_PLATFORM_DEFINES_CXX " /D${_MSVC_CXX_ARCHITECTURE_FAMILY} /D_${_MSVC_CXX_ARCHITECTURE_FAMILY_UPPER}_") 191 192 set(_RTC1 "") 193 set(_FLAGS_C "") 194 set(_FLAGS_CXX "${_GR} /EHsc") 195 196 foreach(lang C CXX) 197 if(_MSVC_${lang}_ARCHITECTURE_FAMILY STREQUAL "ARM") 198 string(APPEND _PLATFORM_DEFINES_${lang} " /D${MSVC_${lang}_ARCHITECTURE_ID}") 199 if(MSVC_${lang}_ARCHITECTURE_ID MATCHES "^ARMV([45])I$") 200 string(APPEND _FLAGS_${lang} " /QRarch${CMAKE_MATCH_1}T") 201 endif() 202 endif() 203 endforeach() 204 205 set(CMAKE_C_STANDARD_LIBRARIES_INIT "coredll.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib") 206 foreach(t EXE SHARED MODULE) 207 string(APPEND CMAKE_${t}_LINKER_FLAGS_INIT " /NODEFAULTLIB:libc.lib /NODEFAULTLIB:oldnames.lib") 208 endforeach() 209 210 if (MSVC_VERSION LESS 1600) 211 string(APPEND CMAKE_C_STANDARD_LIBRARIES_INIT " corelibc.lib") 212 endif () 213elseif(WINDOWS_PHONE OR WINDOWS_STORE) 214 set(_PLATFORM_DEFINES "/DWIN32") 215 set(_FLAGS_C " /DUNICODE /D_UNICODE") 216 set(_FLAGS_CXX " /DUNICODE /D_UNICODE${_GR} /EHsc") 217 if(WINDOWS_STORE AND MSVC_VERSION GREATER 1899) 218 set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsApp.lib") 219 elseif(WINDOWS_PHONE) 220 set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib") 221 elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64") 222 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib") 223 else() 224 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib") 225 endif() 226else() 227 set(_PLATFORM_DEFINES "/DWIN32") 228 if((_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64EC") OR (_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64EC")) 229 set(_PLATFORM_DEFINES "${_PLATFORM_DEFINES} /D_AMD64_ /DAMD64 /D_ARM64EC_ /DARM64EC /D_ARM64EC_WORKAROUND_") 230 endif() 231 if(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM") 232 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib") 233 elseif(MSVC_VERSION GREATER 1310) 234 if(CMAKE_VS_PLATFORM_TOOLSET MATCHES "v[0-9]+_clang_.*") 235 # Clang/C2 in MSVC14 Update 1 seems to not support -fsantinize (yet?) 236 # set(_RTC1 "-fsantinize=memory,safe-stack") 237 set(_FLAGS_CXX " -frtti -fexceptions") 238 else() 239 set(_RTC1 "/RTC1") 240 set(_FLAGS_CXX "${_GR} /EHsc") 241 endif() 242 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib") 243 else() 244 set(_RTC1 "/GZ") 245 set(_FLAGS_CXX "${_GR} /GX") 246 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib") 247 endif() 248 249 if(MSVC_VERSION LESS 1310) 250 set(_FLAGS_C " /Zm1000${_FLAGS_C}") 251 set(_FLAGS_CXX " /Zm1000${_FLAGS_CXX}") 252 endif() 253endif() 254 255unset(_GR) 256 257set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}") 258 259# executable linker flags 260set (CMAKE_LINK_DEF_FILE_FLAG "/DEF:") 261# set the machine type 262if(MSVC_C_ARCHITECTURE_ID) 263 if(MSVC_C_ARCHITECTURE_ID MATCHES "^ARMV.I") 264 set(_MACHINE_ARCH_FLAG "/machine:THUMB") 265 elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64") 266 set(_MACHINE_ARCH_FLAG "/machine:ARM64") 267 elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64EC") 268 set(_MACHINE_ARCH_FLAG "/machine:ARM64EC") 269 elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM") 270 set(_MACHINE_ARCH_FLAG "/machine:ARM") 271 else() 272 set(_MACHINE_ARCH_FLAG "/machine:${MSVC_C_ARCHITECTURE_ID}") 273 endif() 274elseif(MSVC_CXX_ARCHITECTURE_ID) 275 if(MSVC_CXX_ARCHITECTURE_ID MATCHES "^ARMV.I") 276 set(_MACHINE_ARCH_FLAG "/machine:THUMB") 277 elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64") 278 set(_MACHINE_ARCH_FLAG "/machine:ARM64") 279 elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64EC") 280 set(_MACHINE_ARCH_FLAG "/machine:ARM64EC") 281 elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM") 282 set(_MACHINE_ARCH_FLAG "/machine:ARM") 283 else() 284 set(_MACHINE_ARCH_FLAG "/machine:${MSVC_CXX_ARCHITECTURE_ID}") 285 endif() 286elseif(MSVC_Fortran_ARCHITECTURE_ID) 287 set(_MACHINE_ARCH_FLAG "/machine:${MSVC_Fortran_ARCHITECTURE_ID}") 288endif() 289 290# add /debug and /INCREMENTAL:YES to DEBUG and RELWITHDEBINFO also add pdbtype 291# on versions that support it 292set( MSVC_INCREMENTAL_YES_FLAG "") 293if(NOT WINDOWS_PHONE AND NOT WINDOWS_STORE) 294 if(NOT MSVC_INCREMENTAL_DEFAULT) 295 set( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL:YES") 296 else() 297 set( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL" ) 298 endif() 299endif() 300 301foreach(t EXE SHARED MODULE) 302 string(APPEND CMAKE_${t}_LINKER_FLAGS_INIT " ${_MACHINE_ARCH_FLAG}") 303 if (CMAKE_COMPILER_SUPPORTS_PDBTYPE) 304 string(APPEND CMAKE_${t}_LINKER_FLAGS_DEBUG_INIT " /debug /pdbtype:sept ${MSVC_INCREMENTAL_YES_FLAG}") 305 string(APPEND CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO_INIT " /debug /pdbtype:sept ${MSVC_INCREMENTAL_YES_FLAG}") 306 else () 307 string(APPEND CMAKE_${t}_LINKER_FLAGS_DEBUG_INIT " /debug ${MSVC_INCREMENTAL_YES_FLAG}") 308 string(APPEND CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO_INIT " /debug ${MSVC_INCREMENTAL_YES_FLAG}") 309 endif () 310 # for release and minsize release default to no incremental linking 311 string(APPEND CMAKE_${t}_LINKER_FLAGS_MINSIZEREL_INIT " /INCREMENTAL:NO") 312 string(APPEND CMAKE_${t}_LINKER_FLAGS_RELEASE_INIT " /INCREMENTAL:NO") 313endforeach() 314 315if((_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64EC") OR (_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64EC")) 316 string(APPEND CMAKE_STATIC_LINKER_FLAGS_INIT " /machine:ARM64X") 317else() 318 string(APPEND CMAKE_STATIC_LINKER_FLAGS_INIT " ${_MACHINE_ARCH_FLAG}") 319endif() 320unset(_MACHINE_ARCH_FLAG) 321 322cmake_policy(GET CMP0091 __WINDOWS_MSVC_CMP0091) 323if(__WINDOWS_MSVC_CMP0091 STREQUAL "NEW") 324 set(CMAKE_MSVC_RUNTIME_LIBRARY_DEFAULT "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") 325else() 326 set(CMAKE_MSVC_RUNTIME_LIBRARY_DEFAULT "") 327endif() 328unset(__WINDOWS_MSVC_CMP0091) 329 330macro(__windows_compiler_msvc lang) 331 if(NOT MSVC_VERSION LESS 1400) 332 # for 2005 make sure the manifest is put in the dll with mt 333 set(_CMAKE_VS_LINK_DLL "<CMAKE_COMMAND> -E vs_link_dll --intdir=<OBJECT_DIR> --rc=<CMAKE_RC_COMPILER> --mt=<CMAKE_MT> --manifests <MANIFESTS> -- ") 334 set(_CMAKE_VS_LINK_EXE "<CMAKE_COMMAND> -E vs_link_exe --intdir=<OBJECT_DIR> --rc=<CMAKE_RC_COMPILER> --mt=<CMAKE_MT> --manifests <MANIFESTS> -- ") 335 endif() 336 set(CMAKE_${lang}_CREATE_SHARED_LIBRARY 337 "${_CMAKE_VS_LINK_DLL}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /dll /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}") 338 339 set(CMAKE_${lang}_CREATE_SHARED_MODULE ${CMAKE_${lang}_CREATE_SHARED_LIBRARY}) 340 set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ") 341 342 set(CMAKE_${lang}_COMPILE_OBJECT 343 "<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <DEFINES> <INCLUDES> <FLAGS> /Fo<OBJECT> /Fd<TARGET_COMPILE_PDB>${_FS_${lang}} -c <SOURCE>${CMAKE_END_TEMP_FILE}") 344 set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE 345 "<CMAKE_${lang}_COMPILER> > <PREPROCESSED_SOURCE> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE>${CMAKE_END_TEMP_FILE}") 346 set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE 347 "<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <DEFINES> <INCLUDES> <FLAGS> /FoNUL /FAs /Fa<ASSEMBLY_SOURCE> /c <SOURCE>${CMAKE_END_TEMP_FILE}") 348 349 set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1) 350 set(CMAKE_${lang}_LINK_EXECUTABLE 351 "${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}") 352 353 if(CMAKE_SYSTEM_NAME STREQUAL "WindowsCE") 354 set(CMAKE_${lang}_CREATE_WIN32_EXE "/entry:WinMainCRTStartup") 355 set(CMAKE_${lang}_CREATE_CONSOLE_EXE "/entry:mainACRTStartup") 356 else() 357 set(CMAKE_${lang}_CREATE_WIN32_EXE "/subsystem:windows") 358 set(CMAKE_${lang}_CREATE_CONSOLE_EXE "/subsystem:console") 359 endif() 360 361 set(CMAKE_PCH_EXTENSION .pch) 362 set(CMAKE_LINK_PCH ON) 363 if (CMAKE_${lang}_COMPILER_ID STREQUAL "Clang") 364 set(CMAKE_PCH_PROLOGUE "#pragma clang system_header") 365 366 # macOS paths usually start with /Users/*. Unfortunately, clang-cl interprets 367 # paths starting with /U as macro undefines, so we need to put a -- before the 368 # input file path to force it to be treated as a path. 369 string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_COMPILE_OBJECT "${CMAKE_${lang}_COMPILE_OBJECT}") 370 string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "${CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE}") 371 string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "${CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE}") 372 373 elseif(MSVC_VERSION GREATER_EQUAL 1913) 374 # At least MSVC toolet 14.13 from VS 2017 15.6 375 set(CMAKE_PCH_PROLOGUE "#pragma system_header") 376 endif() 377 if (NOT ${CMAKE_${lang}_COMPILER_ID} STREQUAL "Clang") 378 set(CMAKE_PCH_COPY_COMPILE_PDB ON) 379 endif() 380 set(CMAKE_${lang}_COMPILE_OPTIONS_USE_PCH /Yu<PCH_HEADER> /Fp<PCH_FILE> /FI<PCH_HEADER>) 381 set(CMAKE_${lang}_COMPILE_OPTIONS_CREATE_PCH /Yc<PCH_HEADER> /Fp<PCH_FILE> /FI<PCH_HEADER>) 382 383 if("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xMSVC") 384 set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES) 385 set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES) 386 387 set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "/GL") 388 set(CMAKE_${lang}_LINK_OPTIONS_IPO "/INCREMENTAL:NO" "/LTCG") 389 string(REPLACE "<LINK_FLAGS> " "/LTCG <LINK_FLAGS> " 390 CMAKE_${lang}_CREATE_STATIC_LIBRARY_IPO "${CMAKE_${lang}_CREATE_STATIC_LIBRARY}") 391 elseif("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang" OR 392 "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xFlang") 393 set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES) 394 set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES) 395 396 # '-flto=thin' available since Clang 3.9 and Xcode 8 397 # * http://clang.llvm.org/docs/ThinLTO.html#clang-llvm 398 # * https://trac.macports.org/wiki/XcodeVersionInfo 399 set(_CMAKE_LTO_THIN TRUE) 400 if(CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.9) 401 set(_CMAKE_LTO_THIN FALSE) 402 endif() 403 404 if(_CMAKE_LTO_THIN) 405 set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto=thin") 406 else() 407 set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto") 408 endif() 409 endif() 410 411 if("x${lang}" STREQUAL "xC" OR 412 "x${lang}" STREQUAL "xCXX") 413 if(CMAKE_MSVC_RUNTIME_LIBRARY_DEFAULT) 414 set(_MDd "") 415 set(_MD "") 416 else() 417 set(_MDd " /MDd") 418 set(_MD " /MD") 419 endif() 420 421 cmake_policy(GET CMP0092 _cmp0092) 422 if(_cmp0092 STREQUAL "NEW") 423 set(_W3 "") 424 set(_Wall "") 425 else() 426 set(_W3 " /W3") 427 set(_Wall " -Wall") 428 endif() 429 unset(_cmp0092) 430 431 if(CMAKE_VS_PLATFORM_TOOLSET MATCHES "v[0-9]+_clang_.*") 432 # note: MSVC 14 2015 Update 1 sets -fno-ms-compatibility by default, but this does not allow one to compile many projects 433 # that include MS's own headers. CMake itself is affected project too. 434 string(APPEND CMAKE_${lang}_FLAGS_INIT " ${_PLATFORM_DEFINES}${_PLATFORM_DEFINES_${lang}} -fms-extensions -fms-compatibility -D_WINDOWS${_Wall}${_FLAGS_${lang}}") 435 string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT "${_MDd} -gline-tables-only -fno-inline -O0 ${_RTC1}") 436 string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT "${_MD} -O2 -DNDEBUG") 437 string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT "${_MD} -gline-tables-only -O2 -fno-inline -DNDEBUG") 438 string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT "${_MD} -DNDEBUG") # TODO: Add '-Os' once VS generator maps it properly for Clang 439 else() 440 string(APPEND CMAKE_${lang}_FLAGS_INIT " ${_PLATFORM_DEFINES}${_PLATFORM_DEFINES_${lang}} /D_WINDOWS${_W3}${_FLAGS_${lang}}") 441 string(APPEND CMAKE_${lang}_FLAGS_DEBUG_INIT "${_MDd} /Zi /Ob0 /Od ${_RTC1}") 442 string(APPEND CMAKE_${lang}_FLAGS_RELEASE_INIT "${_MD} /O2 /Ob2 /DNDEBUG") 443 string(APPEND CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT "${_MD} /Zi /O2 /Ob1 /DNDEBUG") 444 string(APPEND CMAKE_${lang}_FLAGS_MINSIZEREL_INIT "${_MD} /O1 /Ob1 /DNDEBUG") 445 endif() 446 unset(_Wall) 447 unset(_W3) 448 unset(_MDd) 449 unset(_MD) 450 451 set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded -MT) 452 set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL -MD) 453 set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug -MTd) 454 set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL -MDd) 455 endif() 456 set(CMAKE_${lang}_LINKER_SUPPORTS_PDB ON) 457 458 __windows_compiler_msvc_enable_rc("${_PLATFORM_DEFINES} ${_PLATFORM_DEFINES_${lang}}") 459 460 # define generic information about compiler dependencies 461 if (MSVC_VERSION GREATER 1300) 462 set(CMAKE_DEPFILE_FLAGS_${lang} "/showIncludes") 463 set(CMAKE_${lang}_DEPFILE_FORMAT msvc) 464 endif() 465endmacro() 466 467macro(__windows_compiler_msvc_enable_rc flags) 468 if(NOT CMAKE_RC_COMPILER_INIT) 469 set(CMAKE_RC_COMPILER_INIT rc) 470 endif() 471 if(NOT CMAKE_RC_FLAGS_INIT) 472 # llvm-rc fails when flags are specified with /D and no space after 473 string(REPLACE " /D" " -D" fixed_flags " ${flags}") 474 string(APPEND CMAKE_RC_FLAGS_INIT " ${fixed_flags}") 475 endif() 476 if(NOT CMAKE_RC_FLAGS_DEBUG_INIT) 477 string(APPEND CMAKE_RC_FLAGS_DEBUG_INIT " -D_DEBUG") 478 endif() 479 480 enable_language(RC) 481 if(NOT DEFINED CMAKE_NINJA_CMCLDEPS_RC) 482 set(CMAKE_NINJA_CMCLDEPS_RC 1) 483 endif() 484endmacro() 485