FILE_SET: Fix source group detection

Call MatchChildrenFiles() instead of MatchesFiles() in order to
account for files being in subgroups of source groups.

Fixes: #23880
This commit is contained in:
Kyle Edwards
2022-08-24 14:14:09 -04:00
parent bcc3965813
commit 970052fedd
6 changed files with 39 additions and 1 deletions

View File

@@ -1702,7 +1702,7 @@ void addFileSetEntry(cmGeneratorTarget const* headTarget,
}
bool found = false;
for (auto const& sg : headTarget->Makefile->GetSourceGroups()) {
if (sg.MatchesFiles(path)) {
if (sg.MatchChildrenFiles(path)) {
found = true;
break;
}

View File

@@ -124,6 +124,21 @@ cmSourceGroup* cmSourceGroup::MatchChildrenFiles(const std::string& name)
return nullptr;
}
const cmSourceGroup* cmSourceGroup::MatchChildrenFiles(
const std::string& name) const
{
if (this->MatchesFiles(name)) {
return this;
}
for (const cmSourceGroup& group : this->Internal->GroupChildren) {
const cmSourceGroup* result = group.MatchChildrenFiles(name);
if (result) {
return result;
}
}
return nullptr;
}
cmSourceGroup* cmSourceGroup::MatchChildrenRegex(const std::string& name)
{
for (cmSourceGroup& group : this->Internal->GroupChildren) {

View File

@@ -79,6 +79,12 @@ public:
*/
cmSourceGroup* MatchChildrenFiles(const std::string& name);
/**
* Check if the given name matches this group's explicit file list
* in children.
*/
const cmSourceGroup* MatchChildrenFiles(const std::string& name) const;
/**
* Check if the given name matches this group's regex in children.
*/

View File

@@ -16,6 +16,7 @@ run_cmake(NoImpLib)
run_cmake(RuntimeLibrary)
run_cmake(SourceGroupCMakeLists)
run_cmake(SourceGroupTreeCMakeLists)
run_cmake(SourceGroupFileSet)
run_cmake(VsConfigurationType)
run_cmake(VsTargetsFileReferences)
run_cmake(VsCustomProps)

View File

@@ -0,0 +1,13 @@
cmake_policy(SET CMP0011 NEW)
set(vcFiltersFile "${RunCMake_TEST_BINARY_DIR}/SourceGroupFileSet.vcxproj.filters")
if(NOT EXISTS "${vcFiltersFile}")
set(RunCMake_TEST_FAILED "Filters file ${vcFiltersFile} does not exist.")
return()
endif()
file(STRINGS "${vcFiltersFile}" lines)
include(${RunCMake_TEST_SOURCE_DIR}/SourceGroupHelpers.cmake)
find_source_group("${lines}" "Header Files\\SourceGroupFileSet")

View File

@@ -0,0 +1,3 @@
add_library(SourceGroupFileSet INTERFACE)
target_sources(SourceGroupFileSet PUBLIC FILE_SET HEADERS FILES iface.h)
source_group("Header Files/SourceGroupFileSet" FILES iface.h)