diff options
author | Brad King <brad.king@kitware.com> | 2022-06-30 12:20:14 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-06-30 12:20:24 (GMT) |
commit | 5a460f32437b51cc9b765ae191957901232b3e0b (patch) | |
tree | 926a2dba9f8552109c657326ad9aef1ff04e9486 | |
parent | 4c2cead0c395bae3cb45ce02daf5dac1d38d0763 (diff) | |
parent | 3fee5398bd381e3721972220a8415b62bc96b172 (diff) | |
download | CMake-5a460f32437b51cc9b765ae191957901232b3e0b.zip CMake-5a460f32437b51cc9b765ae191957901232b3e0b.tar.gz CMake-5a460f32437b51cc9b765ae191957901232b3e0b.tar.bz2 |
Merge topic 'file-set-crash'
3fee5398bd install(EXPORT): Check for missing file sets at generate time
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !7420
10 files changed, 60 insertions, 4 deletions
diff --git a/Source/cmExportSet.cxx b/Source/cmExportSet.cxx index a20aa9a..3d4ef0a 100644 --- a/Source/cmExportSet.cxx +++ b/Source/cmExportSet.cxx @@ -2,10 +2,15 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmExportSet.h" +#include <algorithm> #include <tuple> #include <utility> +#include "cmGeneratorTarget.h" #include "cmLocalGenerator.h" +#include "cmMessageType.h" +#include "cmStringAlgorithms.h" +#include "cmTarget.h" #include "cmTargetExport.h" cmExportSet::cmExportSet(std::string name) @@ -15,11 +20,35 @@ cmExportSet::cmExportSet(std::string name) cmExportSet::~cmExportSet() = default; -void cmExportSet::Compute(cmLocalGenerator* lg) +bool cmExportSet::Compute(cmLocalGenerator* lg) { for (std::unique_ptr<cmTargetExport>& tgtExport : this->TargetExports) { tgtExport->Target = lg->FindGeneratorTargetToUse(tgtExport->TargetName); + + auto const interfaceFileSets = + tgtExport->Target->Target->GetAllInterfaceFileSets(); + auto const fileSetInTargetExport = + [&tgtExport, lg](const std::string& fileSetName) -> bool { + auto* fileSet = tgtExport->Target->Target->GetFileSet(fileSetName); + + if (!tgtExport->FileSetGenerators.count(fileSet)) { + lg->IssueMessage(MessageType::FATAL_ERROR, + cmStrCat("File set \"", fileSetName, + "\" is listed in interface file sets of ", + tgtExport->Target->GetName(), + " but has not been exported")); + return false; + } + return true; + }; + + if (!std::all_of(interfaceFileSets.begin(), interfaceFileSets.end(), + fileSetInTargetExport)) { + return false; + } } + + return true; } void cmExportSet::AddTargetExport(std::unique_ptr<cmTargetExport> te) diff --git a/Source/cmExportSet.h b/Source/cmExportSet.h index 07deb11..b75a26d 100644 --- a/Source/cmExportSet.h +++ b/Source/cmExportSet.h @@ -25,7 +25,7 @@ public: cmExportSet(const cmExportSet&) = delete; cmExportSet& operator=(const cmExportSet&) = delete; - void Compute(cmLocalGenerator* lg); + bool Compute(cmLocalGenerator* lg); void AddTargetExport(std::unique_ptr<cmTargetExport> tgt); diff --git a/Source/cmInstallExportGenerator.cxx b/Source/cmInstallExportGenerator.cxx index 8a48aa2..b80437d 100644 --- a/Source/cmInstallExportGenerator.cxx +++ b/Source/cmInstallExportGenerator.cxx @@ -48,8 +48,7 @@ cmInstallExportGenerator::~cmInstallExportGenerator() = default; bool cmInstallExportGenerator::Compute(cmLocalGenerator* lg) { this->LocalGenerator = lg; - this->ExportSet->Compute(lg); - return true; + return this->ExportSet->Compute(lg); } std::string cmInstallExportGenerator::TempDirCalculate() const diff --git a/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-result.txt b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-stderr.txt b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-stderr.txt new file mode 100644 index 0000000..b8d35af --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport-stderr.txt @@ -0,0 +1,6 @@ +^CMake Error in CMakeLists\.txt: + File set "a" is listed in interface file sets of lib1 but has not been + exported + + +CMake Generate step failed\. Build files cannot be regenerated correctly\.$ diff --git a/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport.cmake b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport.cmake new file mode 100644 index 0000000..72fab47 --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetExportMissingSetsInterfacePostExport.cmake @@ -0,0 +1,6 @@ +enable_language(C) + +add_library(lib1 STATIC empty.c) +install(TARGETS lib1 EXPORT a) +target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h) +export(EXPORT a) diff --git a/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-result.txt b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-stderr.txt b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-stderr.txt new file mode 100644 index 0000000..b8d35af --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall-stderr.txt @@ -0,0 +1,6 @@ +^CMake Error in CMakeLists\.txt: + File set "a" is listed in interface file sets of lib1 but has not been + exported + + +CMake Generate step failed\. Build files cannot be regenerated correctly\.$ diff --git a/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall.cmake b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall.cmake new file mode 100644 index 0000000..4e1edff --- /dev/null +++ b/Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterfacePostInstall.cmake @@ -0,0 +1,6 @@ +enable_language(C) + +add_library(lib1 STATIC empty.c) +install(TARGETS lib1 EXPORT a) +target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h) +install(EXPORT a DESTINATION lib/cmake/test) diff --git a/Tests/RunCMake/target_sources/RunCMakeTest.cmake b/Tests/RunCMake/target_sources/RunCMakeTest.cmake index 135777b..7c67c3f 100644 --- a/Tests/RunCMake/target_sources/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_sources/RunCMakeTest.cmake @@ -35,6 +35,8 @@ run_cmake(FileSetWrongBaseDirsRelative) run_cmake(FileSetOverlappingBaseDirs) run_cmake(FileSetInstallMissingSetsPrivate) run_cmake(FileSetInstallMissingSetsInterface) +run_cmake(FileSetInstallMissingSetsInterfacePostInstall) +run_cmake(FileSetExportMissingSetsInterfacePostExport) run_cmake(FileSetReadOnlyPrivate) run_cmake(FileSetReadOnlyInterface) run_cmake(FileSetNoExistInstall) |