From 9e24437c912f52a7afcba58cdd51b74c7dab3861 Mon Sep 17 00:00:00 2001 From: Benjamin Sluis Date: Tue, 11 Jan 2022 07:43:23 -0800 Subject: VS: Remove the '/guard:cf' flag from v143 link flag table Apply the change from commit db35e3cfd6 (VS: Fix support for '/guard:cf' linker flag for v142, 2019-01-24, v3.14.0-rc1~74^2~2) to the v143 flag table. The entry for `LinkControlFlowGuard` in `v143_Link.json` does not work when used in a `.vcxproj` file. Drop our link flag table entries for this toolset so that the flag will be passed via `AdditionalOptions`. Also add a test case. --- Templates/MSBuild/FlagTables/v143_Link.json | 7 ---- Tests/RunCMake/VS10Project/RunCMakeTest.cmake | 1 + .../VsControlFlowGuardLinkSetting-check.cmake | 40 ++++++++++++++++++++++ .../VsControlFlowGuardLinkSetting.cmake | 7 ++++ 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting-check.cmake create mode 100644 Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting.cmake diff --git a/Templates/MSBuild/FlagTables/v143_Link.json b/Templates/MSBuild/FlagTables/v143_Link.json index 71d58f885a..4422f55bda 100644 --- a/Templates/MSBuild/FlagTables/v143_Link.json +++ b/Templates/MSBuild/FlagTables/v143_Link.json @@ -977,13 +977,6 @@ "value": "true", "flags": [] }, - { - "name": "LinkControlFlowGuard", - "switch": "guard:cf", - "comment": "Control Flow Guard", - "value": "true", - "flags": [] - }, { "name": "LinkGuardEHContMetadata", "switch": "guard:ehcont", diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake index d5ed136ac1..e11a24a96e 100644 --- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake +++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake @@ -41,6 +41,7 @@ run_cmake(VsDeployEnabled) run_cmake(VsSettings) run_cmake(VsSourceSettingsTool) run_cmake(VsPlatformToolset) +run_cmake(VsControlFlowGuardLinkSetting) run_cmake(VsWinRTByDefault) diff --git a/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting-check.cmake b/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting-check.cmake new file mode 100644 index 0000000000..c13858bd95 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting-check.cmake @@ -0,0 +1,40 @@ +set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/ControlFlowGuardProject.vcxproj") +if(NOT EXISTS "${vcProjectFile}") + set(RunCMake_TEST_FAILED "Project file ControlFlowGuardProject.vcxproj does not exist.") + return() +endif() + +set(Is_in_link_section 0) +set(HAS_ControlFlowGuardSetting 0) + +file(STRINGS "${vcProjectFile}" lines) +foreach(line IN LISTS lines) + if(line MATCHES "^ *([^<>]+)") + set(RunCMake_TEST_FAILED "Project file ControlFlowGuardProject.vcxproj contains the invalid link property.") + return() + break() + endif() + if(line MATCHES "^ *") + # The start of the link section of the vcxproj file + set(Is_in_link_section 1) + continue() + endif() + if(line MATCHES "^ *") + # The end of the link section of the vcxproj file + set(Is_in_link_section 0) + continue() + endif() + if(Is_in_link_section) + if(line MATCHES "^ *([^<>]+)") + if("${CMAKE_MATCH_1}" MATCHES ".*/guard:cf.*") + set(HAS_ControlFlowGuardSetting 1) + break() + endif() + endif() + endif() +endforeach() + +if(NOT HAS_ControlFlowGuardSetting) + set(RunCMake_TEST_FAILED "Project file ControlFlowGuardProject.vcxproj does not have '/guard:cf' specified in the property.") + return() +endif() diff --git a/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting.cmake b/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting.cmake new file mode 100644 index 0000000000..31e69acd37 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsControlFlowGuardLinkSetting.cmake @@ -0,0 +1,7 @@ +enable_language(CXX) + +# Add the Control Flow Guard compiler and linker option +add_compile_options("/guard:cf") +string(APPEND CMAKE_SHARED_LINKER_FLAGS " /guard:cf") + +add_library(ControlFlowGuardProject SHARED foo.cpp) -- cgit v1.2.1