From f2a699261b9d3d494bc791caad2d8f1fb21d6b4b Mon Sep 17 00:00:00 2001 From: Tyler Date: Fri, 12 May 2023 18:58:35 -0600 Subject: cxxmodules: Do not expect collator install scripts with no CXX_MODULES Calling `install(EXPORT)` with the `CXX_MODULES_DIRECTORY` parameter leads to installation rules being generated which `include()` CMake scripts that set the `IMPORTED_CXX_MODULES_[CONFIG]` target property for relevant targets. However, these scripts don't get generated for targets in an export set which don't have any C++20 modules. When the installation rules attempt to `include()` the missing scripts, the install fails. Co-authored-by: Brad King --- Source/cmExportBuildFileGenerator.cxx | 6 ++++++ Source/cmExportInstallFileGenerator.cxx | 6 ++++++ .../examples/export-bmi-and-interface-build/CMakeLists.txt | 4 +++- .../examples/export-bmi-and-interface-build/no_modules.cxx | 3 +++ .../examples/export-bmi-and-interface-install/CMakeLists.txt | 4 +++- .../examples/export-bmi-and-interface-install/no_modules.cxx | 3 +++ .../CXXModules/examples/export-interface-build/CMakeLists.txt | 4 +++- .../CXXModules/examples/export-interface-build/no_modules.cxx | 3 +++ .../CXXModules/examples/export-interface-install/CMakeLists.txt | 4 +++- .../CXXModules/examples/export-interface-install/no_modules.cxx | 3 +++ .../examples/export-interface-no-properties-build/CMakeLists.txt | 4 +++- .../examples/export-interface-no-properties-build/no_modules.cxx | 3 +++ .../examples/export-interface-no-properties-install/CMakeLists.txt | 4 +++- .../examples/export-interface-no-properties-install/no_modules.cxx | 3 +++ 14 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-interface-build/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-interface-install/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/no_modules.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/no_modules.cxx diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx index 437ae69..a3637d8 100644 --- a/Source/cmExportBuildFileGenerator.cxx +++ b/Source/cmExportBuildFileGenerator.cxx @@ -542,6 +542,12 @@ bool cmExportBuildFileGenerator::GenerateImportCxxModuleConfigTargetInclusion( os.SetCopyIfDifferent(true); for (auto const* tgt : this->ExportedTargets) { + // Only targets with C++ module sources will have a + // collator-generated install script. + if (!tgt->HaveCxx20ModuleSources()) { + continue; + } + os << "include(\"${CMAKE_CURRENT_LIST_DIR}/target-" << tgt->GetExportName() << '-' << config << ".cmake\")\n"; } diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx index 51c91f3..df119ae 100644 --- a/Source/cmExportInstallFileGenerator.cxx +++ b/Source/cmExportInstallFileGenerator.cxx @@ -752,6 +752,12 @@ bool cmExportInstallFileGenerator:: auto& prop_files = this->ConfigCxxModuleTargetFiles[config]; for (auto const* tgt : this->ExportedTargets) { + // Only targets with C++ module sources will have a + // collator-generated install script. + if (!tgt->HaveCxx20ModuleSources()) { + continue; + } + auto prop_filename = cmStrCat("target-", tgt->GetExportName(), '-', filename_config, ".cmake"); prop_files.emplace_back(cmStrCat(dest, prop_filename)); diff --git a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/CMakeLists.txt index a450b7e..62971a3 100644 --- a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_bmi_and_interfaces importable.cxx) target_compile_features(export_bmi_and_interfaces PUBLIC cxx_std_20) -install(TARGETS export_bmi_and_interfaces +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_bmi_and_interfaces no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu" CXX_MODULES_BMI DESTINATION "lib/cxx/bmi") diff --git a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-build/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/CMakeLists.txt index a5574fe..bc19d93 100644 --- a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_bmi_and_interfaces importable.cxx) target_compile_features(export_bmi_and_interfaces PUBLIC cxx_std_20) -install(TARGETS export_bmi_and_interfaces +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_bmi_and_interfaces no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu" CXX_MODULES_BMI DESTINATION "lib/cxx/bmi") diff --git a/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-bmi-and-interface-install/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-build/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-interface-build/CMakeLists.txt index 8584dce..62352ff 100644 --- a/Tests/RunCMake/CXXModules/examples/export-interface-build/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-interface-build/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_interfaces importable.cxx) target_compile_features(export_interfaces PUBLIC cxx_std_20) -install(TARGETS export_interfaces +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_interfaces no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu") export(EXPORT CXXModules diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-build/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-interface-build/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-interface-build/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-install/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-interface-install/CMakeLists.txt index b5c6224..15c91d9 100644 --- a/Tests/RunCMake/CXXModules/examples/export-interface-install/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-interface-install/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_interfaces importable.cxx) target_compile_features(export_interfaces PUBLIC cxx_std_20) -install(TARGETS export_interfaces +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_interfaces no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu") install(EXPORT CXXModules diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-install/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-interface-install/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-interface-install/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/CMakeLists.txt index 7633bec..7d04c50 100644 --- a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_interfaces_no_properties importable.cxx) target_compile_features(export_interfaces_no_properties PUBLIC cxx_std_20) -install(TARGETS export_interfaces_no_properties +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_interfaces_no_properties no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu") export(EXPORT CXXModules diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-build/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/CMakeLists.txt index 75f2440..c0db766 100644 --- a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/CMakeLists.txt +++ b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/CMakeLists.txt @@ -21,7 +21,9 @@ target_sources(export_interfaces_no_properties importable.cxx) target_compile_features(export_interfaces_no_properties PUBLIC cxx_std_20) -install(TARGETS export_interfaces_no_properties +add_library(no_modules STATIC no_modules.cxx) + +install(TARGETS export_interfaces_no_properties no_modules EXPORT CXXModules FILE_SET modules DESTINATION "lib/cxx/miu") install(EXPORT CXXModules diff --git a/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/no_modules.cxx b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/no_modules.cxx new file mode 100644 index 0000000..eea854f --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/export-interface-no-properties-install/no_modules.cxx @@ -0,0 +1,3 @@ +void no_modules() +{ +} -- cgit v0.12