瀏覽代碼

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.
Benjamin Sluis 3 年之前
父節點
當前提交
9e24437c91

+ 0 - 7
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",

+ 1 - 0
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)
 

+ 40 - 0
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 "^ *<LinkControlFlowGuard>([^<>]+)</LinkControlFlowGuard>")
+      set(RunCMake_TEST_FAILED "Project file ControlFlowGuardProject.vcxproj contains the invalid <LinkControlFlowGuard> link property.")
+      return()
+    break()
+  endif()
+  if(line MATCHES "^ *<Link>")
+    # The start of the link section of the vcxproj file
+    set(Is_in_link_section 1)
+    continue()
+  endif()
+  if(line MATCHES "^ *</Link>")
+    # 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 "^ *<AdditionalOptions>([^<>]+)</AdditionalOptions>")
+      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 <AdditionalOptions> property.")
+  return()
+endif()

+ 7 - 0
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)