Skip to content

Commit

Permalink
cxxmodules: detect and message about non-compiled sources
Browse files Browse the repository at this point in the history
Previously an internal error was raised which ended up causing an
internal exception to be thrown. This is a typo situation that should
fall into an explicit error.

Fixes: #25207
  • Loading branch information
mathstuf committed Sep 12, 2023
1 parent 8708b41 commit 458e397
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 4 deletions.
7 changes: 4 additions & 3 deletions Source/cmDyndepCollation.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,11 @@ Json::Value CollationInformationCxxModules(
auto lookup = sf_map.find(file);
if (lookup == sf_map.end()) {
gt->Makefile->IssueMessage(
MessageType::INTERNAL_ERROR,
cmStrCat("Target \"", tgt->GetName(), "\" has source file \"",
MessageType::FATAL_ERROR,
cmStrCat("Target \"", tgt->GetName(), "\" has source file\n ",
file,
R"(" which is not in any of its "FILE_SET BASE_DIRS".)"));
"\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
"scheduled for compilation."));
continue;
}

Expand Down
20 changes: 20 additions & 0 deletions Source/cmVisualStudio10TargetGenerator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2540,6 +2540,12 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
break;
}

std::string config;
if (!this->Configurations.empty()) {
config = this->Configurations[si.Configs[0]];
}
auto const* fs =
this->GeneratorTarget->GetFileSetForSource(config, si.Source);
if (tool) {
// Compute set of configurations to exclude, if any.
std::vector<size_t> const& include_configs = si.Configs;
Expand Down Expand Up @@ -2604,6 +2610,13 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
if (si.Kind == cmGeneratorTarget::SourceKindObjectSource ||
si.Kind == cmGeneratorTarget::SourceKindUnityBatched) {
this->OutputSourceSpecificFlags(e2, si.Source);
} else if (fs && fs->GetType() == "CXX_MODULES"_s) {
this->GeneratorTarget->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
cmStrCat("Target \"", this->GeneratorTarget->GetName(),
"\" has source file\n ", si.Source->GetFullPath(),
"\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
"scheduled for compilation."));
}
if (si.Source->GetPropertyAsBool("SKIP_PRECOMPILE_HEADERS")) {
e2.Element("PrecompiledHeader", "NotUsing");
Expand All @@ -2613,6 +2626,13 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0)
}

this->FinishWritingSource(e2, toolSettings);
} else if (fs && fs->GetType() == "CXX_MODULES"_s) {
this->GeneratorTarget->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
cmStrCat("Target \"", this->GeneratorTarget->GetName(),
"\" has source file\n ", si.Source->GetFullPath(),
"\nin a \"FILE_SET TYPE CXX_MODULES\" but it is not "
"scheduled for compilation."));
}
}

Expand Down
5 changes: 5 additions & 0 deletions Tests/RunCMake/CXXModules/NoCXX-stderr.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ CMake Error in CMakeLists.txt:
been enabled
| The "nocxx" target contains C\+\+ module sources which are not supported by
the generator
| Target "nocxx" has source file

.*/Tests/RunCMake/CXXModules/sources/module.cxx

in a "FILE_SET TYPE CXX_MODULES" but it is not scheduled for compilation.
)
)*
CMake Generate step failed. Build files cannot be regenerated correctly.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
16 changes: 16 additions & 0 deletions Tests/RunCMake/CXXModules/NotCompiledSourceModules-stderr.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
CMake Warning \(dev\) at NotCompiledSourceModules.cmake:5 \(target_sources\):
CMake's C\+\+ module support is experimental. It is meant only for
experimentation and feedback to CMake developers.
Call Stack \(most recent call first\):
CMakeLists.txt:6 \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.

(CMake Error in CMakeLists.txt:
Target "not-cxx-source" has source file

.*/Tests/RunCMake/CXXModules/sources/not-compiled.txt

in a "FILE_SET TYPE CXX_MODULES" but it is not scheduled for compilation.

)+
CMake Generate step failed. Build files cannot be regenerated correctly.
13 changes: 13 additions & 0 deletions Tests/RunCMake/CXXModules/NotCompiledSourceModules.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
enable_language(CXX)
set(CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE "")

add_library(not-cxx-source)
target_sources(not-cxx-source
PRIVATE
sources/cxx-anchor.cxx
PUBLIC
FILE_SET fs TYPE CXX_MODULES FILES
sources/not-compiled.txt)
target_compile_features(not-cxx-source
PRIVATE
cxx_std_20)
3 changes: 2 additions & 1 deletion Tests/RunCMake/CXXModules/RunCMakeTest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,9 @@ foreach (fileset_type IN LISTS fileset_types)
endforeach ()
run_cmake("FileSet${fileset_type}InterfaceImported")

# Test the error message when a non-C++ source file is found in the source
# Test the error messages when a non-C++ source file is found in the source
# list.
run_cmake("NotCompiledSource${fileset_type}")
run_cmake("NotCXXSource${fileset_type}")
endforeach ()

Expand Down
Empty file.

0 comments on commit 458e397

Please sign in to comment.