diff --git a/CMakeLists.txt b/CMakeLists.txt index 0add2f7..5adfb01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,9 @@ option(BUILD_TOOLS "Build meshconvert" ON) # Includes the support for DirectX 12 input layouts option(BUILD_DX12 "Build with DirectX12 Runtime support" ON) +# https://devblogs.microsoft.com/cppblog/spectre-mitigations-in-msvc/ +option(ENABLE_SPECTRE_MITIGATION "Build using /Qspectre for MSVC" OFF) + option(ENABLE_CODE_ANALYSIS "Use Static Code Analysis on build" OFF) set(CMAKE_CXX_STANDARD 17) @@ -80,7 +83,7 @@ if(NOT MINGW) endif() if(MINGW OR (NOT WIN32) OR VCPKG_TOOLCHAIN) - message("INFO: Using VCPKG for DirectX-Headers and DirectXMath.") + message(STATUS "Using VCPKG for DirectX-Headers and DirectXMath") find_package(directx-headers CONFIG REQUIRED) find_package(directxmath CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectX-Headers Microsoft::DirectXMath) @@ -176,12 +179,23 @@ if(MSVC) endforeach() if((${CMAKE_SIZEOF_VOID_P} EQUAL 4) AND (NOT ${DIRECTX_ARCH} MATCHES "^arm")) - foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME}) - target_link_options(${t} PRIVATE /SAFESEH) - endforeach() + foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME}) + target_link_options(${t} PRIVATE /SAFESEH) + endforeach() endif() - if((MSVC_VERSION GREATER_EQUAL 1928) AND (CMAKE_SIZEOF_VOID_P EQUAL 8) + if(ENABLE_SPECTRE_MITIGATION + AND (MSVC_VERSION GREATER_EQUAL 1913) + AND (NOT WINDOWS_STORE) + AND (NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))) + message(STATUS "Using Spectre-mitigated libraries") + foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME}) + target_compile_options(${t} PRIVATE "/Qspectre") + endforeach() + endif() + + if((MSVC_VERSION GREATER_EQUAL 1928) + AND (CMAKE_SIZEOF_VOID_P EQUAL 8) AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0))) foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME}) target_compile_options(${t} PRIVATE "$<$>:/guard:ehcont>") @@ -263,12 +277,12 @@ if(WIN32) endif() if(BUILD_DX12 OR WINDOWS_STORE OR (${DIRECTX_ARCH} MATCHES "^arm64")) - message("INFO: Building with DirectX 12 Runtime support") + message(STATUS "Building with DirectX 12 Runtime support") set(WINVER 0x0A00) elseif(${DIRECTX_ARCH} MATCHES "^arm") set(WINVER 0x0602) else() - message("INFO: Building with Windows 7 compatibility") + message(STATUS "Building with Windows 7 compatibility") set(WINVER 0x0601) endif() diff --git a/build/DirectXMesh-GitHub-CMake-Dev17.yml b/build/DirectXMesh-GitHub-CMake-Dev17.yml index f5d9509..d21c79b 100644 --- a/build/DirectXMesh-GitHub-CMake-Dev17.yml +++ b/build/DirectXMesh-GitHub-CMake-Dev17.yml @@ -136,3 +136,43 @@ jobs: inputs: cwd: '' cmakeArgs: --build out8 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Config x64' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A x64 -B out9 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=OFF' + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build x64 Debug' + inputs: + cwd: '' + cmakeArgs: --build out9 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build x64 Release' + inputs: + cwd: '' + cmakeArgs: --build out9 -v --config RelWithDebInfo + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Config ARM64' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A ARM64 -B out10 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=OFF' + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build ARM64 Debug' + inputs: + cwd: '' + cmakeArgs: --build out10 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build ARM64 Release' + inputs: + cwd: '' + cmakeArgs: --build out10 -v --config RelWithDebInfo + - task: CMake@1 + displayName: 'CMake (Win10 Spectre): Config' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A x64 -B out11 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=ON' + - task: CMake@1 + displayName: 'CMake (Win10 Spectre): Build' + inputs: + cwd: '' + cmakeArgs: --build out11 -v --config Debug diff --git a/build/DirectXMesh-GitHub-CMake.yml b/build/DirectXMesh-GitHub-CMake.yml index ab0e60a..858dbfc 100644 --- a/build/DirectXMesh-GitHub-CMake.yml +++ b/build/DirectXMesh-GitHub-CMake.yml @@ -136,3 +136,43 @@ jobs: inputs: cwd: '' cmakeArgs: --build out8 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Config x64' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A x64 -B out9 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=OFF' + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build x64 Debug' + inputs: + cwd: '' + cmakeArgs: --build out9 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build x64 Release' + inputs: + cwd: '' + cmakeArgs: --build out9 -v --config RelWithDebInfo + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Config ARM64' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A ARM64 -B out10 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=OFF' + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build ARM64 Debug' + inputs: + cwd: '' + cmakeArgs: --build out10 -v --config Debug + - task: CMake@1 + displayName: 'CMake (MSVC Spectre): Build ARM64 Release' + inputs: + cwd: '' + cmakeArgs: --build out10 -v --config RelWithDebInfo + - task: CMake@1 + displayName: 'CMake (Win10 Spectre): Config' + inputs: + cwd: '' + cmakeArgs: '-G "$(VS_GENERATOR)" -A x64 -B out11 -DENABLE_SPECTRE_MITIGATION=ON -DCMAKE_SYSTEM_VERSION=$(WIN10_SDK) -DBUILD_DX12=ON' + - task: CMake@1 + displayName: 'CMake (Win10 Spectre): Build' + inputs: + cwd: '' + cmakeArgs: --build out11 -v --config Debug diff --git a/build/DirectXMesh-GitHub-Dev17.yml b/build/DirectXMesh-GitHub-Dev17.yml index ed8a119..67e09f1 100644 --- a/build/DirectXMesh-GitHub-Dev17.yml +++ b/build/DirectXMesh-GitHub-Dev17.yml @@ -115,6 +115,95 @@ jobs: configuration: Release msbuildArchitecture: x64 +- job: DESKTOP_BUILD_SPECTRE + displayName: 'Win32 Desktop (Spectre-mitigated)' + timeoutInMinutes: 120 + cancelTimeoutInMinutes: 1 + steps: + - checkout: self + clean: true + fetchTags: false + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022.sln 32dbg + inputs: + solution: DirectXMesh_Desktop_2022.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Debug + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022.sln 32rel + inputs: + solution: DirectXMesh_Desktop_2022.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Release + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022.sln 64dbg + inputs: + solution: DirectXMesh_Desktop_2022.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Debug + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022.sln 64rel + inputs: + solution: DirectXMesh_Desktop_2022.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Release + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln 32dbg + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Debug + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln 32rel + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Release + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln 64dbg + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Debug + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln 64rel + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Release + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln arm64dbg + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: ARM64 + configuration: Debug + msbuildArchitecture: x64 + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2022_Win10.sln arm64rel + inputs: + solution: DirectXMesh_Desktop_2022_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: ARM64 + configuration: Release + msbuildArchitecture: x64 + - job: UWP_BUILD displayName: 'Universal Windows Platform (UWP)' timeoutInMinutes: 120 diff --git a/build/DirectXMesh-GitHub.yml b/build/DirectXMesh-GitHub.yml index 040c427..3089df9 100644 --- a/build/DirectXMesh-GitHub.yml +++ b/build/DirectXMesh-GitHub.yml @@ -105,6 +105,85 @@ jobs: platform: ARM64 configuration: Release +- job: DESKTOP_BUILD_SPECTRE + displayName: 'Win32 Desktop (Spectre-mitigated)' + timeoutInMinutes: 120 + cancelTimeoutInMinutes: 1 + steps: + - checkout: self + clean: true + fetchTags: false + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019.sln 32dbg + inputs: + solution: DirectXMesh_Desktop_2019.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Debug + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019.sln 32rel + inputs: + solution: DirectXMesh_Desktop_2019.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Release + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019.sln 64dbg + inputs: + solution: DirectXMesh_Desktop_2019.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Debug + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019.sln 64rel + inputs: + solution: DirectXMesh_Desktop_2019.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Release + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln 32dbg + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Debug + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln 32rel + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x86 + configuration: Release + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln 64dbg + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Debug + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln 64rel + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: x64 + configuration: Release + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln arm64dbg + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: ARM64 + configuration: Debug + - task: VSBuild@1 + displayName: Build solution DirectXMesh_Desktop_2019_Win10.sln arm64rel + inputs: + solution: DirectXMesh_Desktop_2019_Win10.sln + msbuildArgs: /p:PreferredToolArchitecture=x64 /p:SpectreMitigation=Spectre + platform: ARM64 + configuration: Release + - job: UWP_BUILD displayName: 'Universal Windows Platform (UWP)' timeoutInMinutes: 120