diff options
author | Brad King <brad.king@kitware.com> | 2024-10-02 12:09:15 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2024-10-02 12:09:33 (GMT) |
commit | d8bdc9f3af34173c240e7209f2a0c0303f832e8e (patch) | |
tree | 33dd7086f41c9f46dfb89cf24b7e873350d70b43 | |
parent | ffe07811064c850ff7c75d70965c81e4691bcbdc (diff) | |
parent | 55831faf5ba43650dcab14fbb08b51890cbe954c (diff) | |
download | CMake-d8bdc9f3af34173c240e7209f2a0c0303f832e8e.zip CMake-d8bdc9f3af34173c240e7209f2a0c0303f832e8e.tar.gz CMake-d8bdc9f3af34173c240e7209f2a0c0303f832e8e.tar.bz2 |
Merge topic 'vs-tool-override-fix'
55831faf5b VS: Honor VS_TOOL_OVERRIDE for known source file types too
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !9851
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 125 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/RunCMakeTest.cmake | 1 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/VsToolOverride-check.cmake | 64 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/VsToolOverride.cmake | 7 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/bar.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/VS10Project/foo.txt | 1 |
6 files changed, 140 insertions, 59 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 1e338b2..694976e 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2544,66 +2544,73 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0) } const char* tool = nullptr; - switch (si.Kind) { - case cmGeneratorTarget::SourceKindAppManifest: - tool = "AppxManifest"; - break; - case cmGeneratorTarget::SourceKindCertificate: - tool = "None"; - break; - case cmGeneratorTarget::SourceKindCustomCommand: - // Handled elsewhere. - break; - case cmGeneratorTarget::SourceKindExternalObject: - tool = "Object"; - break; - case cmGeneratorTarget::SourceKindExtra: - this->WriteExtraSource(e1, si.Source, toolSettings); - break; - case cmGeneratorTarget::SourceKindHeader: - this->WriteHeaderSource(e1, si.Source, toolSettings); - break; - case cmGeneratorTarget::SourceKindIDL: - tool = "Midl"; - break; - case cmGeneratorTarget::SourceKindManifest: - // Handled elsewhere. - break; - case cmGeneratorTarget::SourceKindModuleDefinition: - tool = "None"; - break; - case cmGeneratorTarget::SourceKindCxxModuleSource: - case cmGeneratorTarget::SourceKindUnityBatched: - case cmGeneratorTarget::SourceKindObjectSource: { - const std::string& lang = si.Source->GetLanguage(); - if (lang == "C"_s || lang == "CXX"_s) { - tool = "ClCompile"; - } else if (lang == "ASM_MARMASM"_s && - this->GlobalGenerator->IsMarmasmEnabled()) { - tool = "MARMASM"; - } else if (lang == "ASM_MASM"_s && - this->GlobalGenerator->IsMasmEnabled()) { - tool = "MASM"; - } else if (lang == "ASM_NASM"_s && - this->GlobalGenerator->IsNasmEnabled()) { - tool = "NASM"; - } else if (lang == "RC"_s) { - tool = "ResourceCompile"; - } else if (lang == "CSharp"_s) { - tool = "Compile"; - } else if (lang == "CUDA"_s && - this->GlobalGenerator->IsCudaEnabled()) { - tool = "CudaCompile"; - } else { + const cmValue toolOverride = si.Source->GetProperty("VS_TOOL_OVERRIDE"); + + if (cmNonempty(toolOverride)) { + // Custom tool specified: the file will be built in a user-defined way + this->WriteExtraSource(e1, si.Source, toolSettings); + } else { + switch (si.Kind) { + case cmGeneratorTarget::SourceKindAppManifest: + tool = "AppxManifest"; + break; + case cmGeneratorTarget::SourceKindCertificate: tool = "None"; - } - } break; - case cmGeneratorTarget::SourceKindResx: - this->ResxObjs.push_back(si.Source); - break; - case cmGeneratorTarget::SourceKindXaml: - this->XamlObjs.push_back(si.Source); - break; + break; + case cmGeneratorTarget::SourceKindCustomCommand: + // Handled elsewhere. + break; + case cmGeneratorTarget::SourceKindExternalObject: + tool = "Object"; + break; + case cmGeneratorTarget::SourceKindExtra: + this->WriteExtraSource(e1, si.Source, toolSettings); + break; + case cmGeneratorTarget::SourceKindHeader: + this->WriteHeaderSource(e1, si.Source, toolSettings); + break; + case cmGeneratorTarget::SourceKindIDL: + tool = "Midl"; + break; + case cmGeneratorTarget::SourceKindManifest: + // Handled elsewhere. + break; + case cmGeneratorTarget::SourceKindModuleDefinition: + tool = "None"; + break; + case cmGeneratorTarget::SourceKindCxxModuleSource: + case cmGeneratorTarget::SourceKindUnityBatched: + case cmGeneratorTarget::SourceKindObjectSource: { + const std::string& lang = si.Source->GetLanguage(); + if (lang == "C"_s || lang == "CXX"_s) { + tool = "ClCompile"; + } else if (lang == "ASM_MARMASM"_s && + this->GlobalGenerator->IsMarmasmEnabled()) { + tool = "MARMASM"; + } else if (lang == "ASM_MASM"_s && + this->GlobalGenerator->IsMasmEnabled()) { + tool = "MASM"; + } else if (lang == "ASM_NASM"_s && + this->GlobalGenerator->IsNasmEnabled()) { + tool = "NASM"; + } else if (lang == "RC"_s) { + tool = "ResourceCompile"; + } else if (lang == "CSharp"_s) { + tool = "Compile"; + } else if (lang == "CUDA"_s && + this->GlobalGenerator->IsCudaEnabled()) { + tool = "CudaCompile"; + } else { + tool = "None"; + } + } break; + case cmGeneratorTarget::SourceKindResx: + this->ResxObjs.push_back(si.Source); + break; + case cmGeneratorTarget::SourceKindXaml: + this->XamlObjs.push_back(si.Source); + break; + } } std::string config; diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake index 85fefbf..bbd8c8b 100644 --- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake +++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake @@ -50,6 +50,7 @@ run_cmake(VsSettings) run_cmake(VsSourceSettingsTool) run_cmake(VsPlatformToolset) run_cmake(VsControlFlowGuardLinkSetting) +run_cmake(VsToolOverride) run_cmake(VsWinRTByDefault) diff --git a/Tests/RunCMake/VS10Project/VsToolOverride-check.cmake b/Tests/RunCMake/VS10Project/VsToolOverride-check.cmake new file mode 100644 index 0000000..8d9adbb --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsToolOverride-check.cmake @@ -0,0 +1,64 @@ +# Figure out which build tool the test files in a project are using +macro(get_build_tools_from_project_file projectFile) + set(_s "[ \t\r\n]") # Whitespace character class + + set(ItemGroupBeginRegex "<${_s}*ItemGroup${_s}*>") + set(ItemGroupEndRegex "</${_s}*ItemGroup${_s}*>") + set(GroupItemRegex ".*<${_s}*([A-Za-z0-9_]+)${_s}+Include${_s}*=${_s}*\"([^\"]*)\".*") + + if(NOT EXISTS "${projectFile}") + set(RunCMake_TEST_FAILED "Project file ${projectFile} does not exist.") + return() + endif() + + file(STRINGS "${projectFile}" lines) + + foreach(line IN LISTS lines) + if(line MATCHES "${ItemGroupBeginRegex}") + set(InItemGroup TRUE) + elseif(line MATCHES "${ItemGroupEndRegex}") + set(InItemGroup FALSE) + elseif(line MATCHES "${GroupItemRegex}") + if(InItemGroup) + string(REGEX REPLACE "${GroupItemRegex}" "\\1" itemTool "${line}") + string(REGEX REPLACE "${GroupItemRegex}" "\\2" itemPath "${line}") + + if(itemPath MATCHES ".*foo\\.cpp") + set(fooCppTool "${itemTool}") + elseif(itemPath MATCHES ".*foo\\.txt") + set(fooTxtTool "${itemTool}") + elseif(itemPath MATCHES ".*bar\\.cpp") + set(barCppTool "${itemTool}") + elseif(itemPath MATCHES ".*bar\\.txt") + set(barTxtTool "${itemTool}") + endif() + endif() + endif() + endforeach() +endmacro() + +# Verify a build tool is as expected +macro(verify_build_tool fileName expectedBuildTool actualBuildTool) + if("${actualBuildTool}" STREQUAL "${expectedBuildTool}") + message(STATUS "File '${fileName}' in project file '${projectFile}' has expected build tool '${expectedBuildTool}'") + else() + set(RunCMake_TEST_FAILED "File '${fileName}' in project file '${projectFile}' has unexpected build tool '${actualBuildTool}'! Expected: '${expectedBuildTool}'" PARENT_SCOPE) + return() + endif() +endmacro() + +# Test using VS_TOOL_OVERRIDE +block() + set(projectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj") + get_build_tools_from_project_file("${projectFile}") + verify_build_tool("foo.cpp" "CustomFooCppTool" "${fooCppTool}") + verify_build_tool("foo.txt" "CustomFooTxtTool" "${fooTxtTool}") +endblock() + +# Test default behavior without using VS_TOOL_OVERRIDE +block() + set(projectFile "${RunCMake_TEST_BINARY_DIR}/bar.vcxproj") + get_build_tools_from_project_file("${projectFile}") + verify_build_tool("bar.cpp" "ClCompile" "${barCppTool}") + verify_build_tool("bar.txt" "None" "${barTxtTool}") +endblock() diff --git a/Tests/RunCMake/VS10Project/VsToolOverride.cmake b/Tests/RunCMake/VS10Project/VsToolOverride.cmake new file mode 100644 index 0000000..62ae5e8 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsToolOverride.cmake @@ -0,0 +1,7 @@ +enable_language(CXX) + +set_property(SOURCE "foo.cpp" PROPERTY VS_TOOL_OVERRIDE CustomFooCppTool) +set_property(SOURCE "foo.txt" PROPERTY VS_TOOL_OVERRIDE CustomFooTxtTool) +add_library(foo foo.cpp foo.txt) + +add_library(bar bar.cpp bar.txt) diff --git a/Tests/RunCMake/VS10Project/bar.txt b/Tests/RunCMake/VS10Project/bar.txt new file mode 100644 index 0000000..ebd7525 --- /dev/null +++ b/Tests/RunCMake/VS10Project/bar.txt @@ -0,0 +1 @@ +Bar diff --git a/Tests/RunCMake/VS10Project/foo.txt b/Tests/RunCMake/VS10Project/foo.txt new file mode 100644 index 0000000..bc56c4d --- /dev/null +++ b/Tests/RunCMake/VS10Project/foo.txt @@ -0,0 +1 @@ +Foo |