diff --git a/Source/cmDyndepCollation.cxx b/Source/cmDyndepCollation.cxx index 1c05f25fe0..f42136f7ea 100644 --- a/Source/cmDyndepCollation.cxx +++ b/Source/cmDyndepCollation.cxx @@ -127,11 +127,23 @@ TdiSourceInfo CollationInformationSources(cmGeneratorTarget const* gt, } } + // Detect duplicate sources. + std::set visited_sources; + for (auto const& files_per_dir : files_per_dirs) { for (auto const& file : files_per_dir.second) { auto const full_file = cmSystemTools::CollapseFullPath(file); auto lookup = sf_map.find(full_file); if (lookup == sf_map.end()) { + if (visited_sources.count(full_file)) { + // Duplicate source; raise an author warning. + gt->Makefile->IssueMessage( + MessageType::AUTHOR_WARNING, + cmStrCat( + "Target \"", tgt->GetName(), "\" has source file\n ", file, + "\nin a \"FILE_SET TYPE CXX_MODULES\" multiple times.")); + continue; + } gt->Makefile->IssueMessage( MessageType::FATAL_ERROR, cmStrCat("Target \"", tgt->GetName(), "\" has source file\n ", @@ -140,6 +152,7 @@ TdiSourceInfo CollationInformationSources(cmGeneratorTarget const* gt, "scheduled for compilation.")); continue; } + visited_sources.insert(full_file); auto const* sf = lookup->second.first; CompileType const ct = lookup->second.second; diff --git a/Tests/RunCMake/CXXModules/examples/duplicate-sources-stderr.txt b/Tests/RunCMake/CXXModules/examples/duplicate-sources-stderr.txt new file mode 100644 index 0000000000..bf964dd73c --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/duplicate-sources-stderr.txt @@ -0,0 +1,8 @@ +CMake Warning \(dev\) in CMakeLists.txt: + Target "duplicate_sources" has source file + + [^ +]*/Tests/RunCMake/CXXModules/examples/duplicate-sources/duplicate.cxx + + in a "FILE_SET TYPE CXX_MODULES" multiple times. +This warning is for project developers. Use -Wno-dev to suppress it.