| 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() |