|
| 1 | +# This modules provides variables with recommended Compiler and Linker switches |
| 2 | +# |
| 3 | +# Copyright (c) Microsoft Corporation. |
| 4 | +# Licensed under the MIT License. |
| 5 | + |
| 6 | +set(COMPILER_DEFINES "") |
| 7 | +set(COMPILER_SWITCHES "") |
| 8 | +set(LINKER_SWITCHES "") |
| 9 | + |
| 10 | +#--- Determines target architecture if not explicitly set |
| 11 | +if(DEFINED VCPKG_TARGET_ARCHITECTURE) |
| 12 | + set(DIRECTX_ARCH ${VCPKG_TARGET_ARCHITECTURE}) |
| 13 | +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$") |
| 14 | + set(DIRECTX_ARCH x86) |
| 15 | +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$") |
| 16 | + set(DIRECTX_ARCH x64) |
| 17 | +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$") |
| 18 | + set(DIRECTX_ARCH arm) |
| 19 | +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$") |
| 20 | + set(DIRECTX_ARCH arm64) |
| 21 | +elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64EC$") |
| 22 | + set(DIRECTX_ARCH arm64ec) |
| 23 | +elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Ww][Ii][Nn]32$") |
| 24 | + set(DIRECTX_ARCH x86) |
| 25 | +elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Xx]64$") |
| 26 | + set(DIRECTX_ARCH x64) |
| 27 | +elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]$") |
| 28 | + set(DIRECTX_ARCH arm) |
| 29 | +elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64$") |
| 30 | + set(DIRECTX_ARCH arm64) |
| 31 | +elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64EC$") |
| 32 | + set(DIRECTX_ARCH arm64ec) |
| 33 | +endif() |
| 34 | + |
| 35 | +#--- Determines host architecture |
| 36 | +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "[Aa][Rr][Mm]64|aarch64|arm64") |
| 37 | + set(DIRECTX_HOST_ARCH arm64) |
| 38 | +else() |
| 39 | + set(DIRECTX_HOST_ARCH x64) |
| 40 | +endif() |
| 41 | + |
| 42 | +#--- This legacy tool still uses MB instead of UNICODE |
| 43 | +if(WIN32) |
| 44 | + list(APPEND COMPILER_DEFINES _MBCS) |
| 45 | +endif() |
| 46 | + |
| 47 | +#--- General MSVC-like SDL options |
| 48 | +if(MSVC) |
| 49 | + list(APPEND COMPILER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>") |
| 50 | + list(APPEND LINKER_SWITCHES /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO) |
| 51 | + |
| 52 | + if((${DIRECTX_ARCH} STREQUAL "x86") |
| 53 | + OR ((CMAKE_SIZEOF_VOID_P EQUAL 4) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm")))) |
| 54 | + list(APPEND LINKER_SWITCHES /SAFESEH) |
| 55 | + endif() |
| 56 | + |
| 57 | + if((MSVC_VERSION GREATER_EQUAL 1928) |
| 58 | + AND (CMAKE_SIZEOF_VOID_P EQUAL 8) |
| 59 | + AND (NOT (TARGET OpenEXR::OpenEXR)) |
| 60 | + AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang|IntelLLVM")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0))) |
| 61 | + list(APPEND COMPILER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>") |
| 62 | + list(APPEND LINKER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>") |
| 63 | + endif() |
| 64 | +else() |
| 65 | + list(APPEND COMPILER_DEFINES $<IF:$<CONFIG:DEBUG>,_DEBUG,NDEBUG>) |
| 66 | +endif() |
| 67 | + |
| 68 | +#--- Target architecture switches |
| 69 | +if(NOT (${DIRECTX_ARCH} MATCHES "^arm")) |
| 70 | + if((${DIRECTX_ARCH} STREQUAL "x86") OR (CMAKE_SIZEOF_VOID_P EQUAL 4)) |
| 71 | + set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC,Intel>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC,Intel>>:-msse2>) |
| 72 | + else() |
| 73 | + set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC,Intel>>:-msse2>) |
| 74 | + endif() |
| 75 | + |
| 76 | + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") |
| 77 | + list(APPEND ARCH_SSE2 -mfpmath=sse) |
| 78 | + endif() |
| 79 | + |
| 80 | + list(APPEND COMPILER_SWITCHES ${ARCH_SSE2}) |
| 81 | +endif() |
| 82 | + |
| 83 | +#--- Compiler-specific switches |
| 84 | +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|IntelLLVM") |
| 85 | + if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)) |
| 86 | + list(APPEND COMPILER_SWITCHES /ZH:SHA_256) |
| 87 | + endif() |
| 88 | +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") |
| 89 | + list(APPEND COMPILER_SWITCHES /Zc:__cplusplus /Zc:inline /fp:fast /Qdiag-disable:161) |
| 90 | +elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") |
| 91 | + list(APPEND COMPILER_SWITCHES /sdl /Zc:inline /fp:fast) |
| 92 | + |
| 93 | + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) |
| 94 | + message(STATUS "Building using Whole Program Optimization") |
| 95 | + list(APPEND COMPILER_SWITCHES $<$<NOT:$<CONFIG:Debug>>:/Gy /Gw>) |
| 96 | + endif() |
| 97 | + |
| 98 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.10) |
| 99 | + list(APPEND COMPILER_SWITCHES /permissive-) |
| 100 | + endif() |
| 101 | + |
| 102 | + if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.11) |
| 103 | + AND OpenMP_CXX_FOUND) |
| 104 | + # OpenMP in MSVC is not compatible with /permissive- unless you disable two-phase lookup |
| 105 | + list(APPEND COMPILER_SWITCHES /Zc:twoPhase-) |
| 106 | + endif() |
| 107 | + |
| 108 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.14) |
| 109 | + list(APPEND COMPILER_SWITCHES /Zc:__cplusplus) |
| 110 | + endif() |
| 111 | + |
| 112 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.15) |
| 113 | + list(APPEND COMPILER_SWITCHES /JMC-) |
| 114 | + endif() |
| 115 | + |
| 116 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.24) |
| 117 | + list(APPEND COMPILER_SWITCHES /ZH:SHA_256) |
| 118 | + endif() |
| 119 | + |
| 120 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.26) |
| 121 | + list(APPEND COMPILER_SWITCHES /Zc:preprocessor /wd5104 /wd5105) |
| 122 | + endif() |
| 123 | + |
| 124 | + if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm"))) |
| 125 | + list(APPEND LINKER_SWITCHES /CETCOMPAT) |
| 126 | + endif() |
| 127 | + |
| 128 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28) |
| 129 | + list(APPEND COMPILER_SWITCHES /Zc:lambda) |
| 130 | + endif() |
| 131 | + |
| 132 | + if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29) |
| 133 | + AND (NOT VCPKG_TOOLCHAIN)) |
| 134 | + list(APPEND COMPILER_SWITCHES /external:W4) |
| 135 | + endif() |
| 136 | + |
| 137 | + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35) |
| 138 | + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) |
| 139 | + list(APPEND COMPILER_SWITCHES $<$<NOT:$<CONFIG:Debug>>:/Zc:checkGwOdr>) |
| 140 | + endif() |
| 141 | + |
| 142 | + list(APPEND COMPILER_SWITCHES $<$<VERSION_GREATER_EQUAL:${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION},10.0.22000>:/Zc:templateScope>) |
| 143 | + endif() |
| 144 | +endif() |
0 commit comments