CPS: Support C++20 modules

Modify the PackageInfo exporters and commands to support C++20 modules
via the collator-generated module manifest.

Fixes #27548
This commit is contained in:
Vito Gamberini
2026-01-29 13:26:35 -05:00
parent b080922be6
commit 3771471310
49 changed files with 517 additions and 184 deletions
+2 -1
View File
@@ -149,7 +149,8 @@ Exporting Targets to the |CPS|
[LICENSE <license-string>]
[DEFAULT_LICENSE <license-string>]
[DESCRIPTION <description-string>]
[HOMEPAGE_URL <url-string>])
[HOMEPAGE_URL <url-string>]
[CXX_MODULES_DIRECTORY <directory>])
.. versionadded:: 4.3
.. note::
+1
View File
@@ -1000,6 +1000,7 @@ Signatures
[HOMEPAGE_URL <url-string>]
[PERMISSIONS <permission>...]
[CONFIGURATIONS <config>...]
[CXX_MODULES_DIRECTORY <directory>]
[COMPONENT <component>]
[EXCLUDE_FROM_ALL])
+6
View File
@@ -0,0 +1,6 @@
cps-cxx-modules
---------------
* The :command:`install(PACKAGE_INFO)` and :command:`export(PACKAGE_INFO)`
commands now support specifying `CXX_MODULES_DIRECTORY` for exporting C++20
modules.
+4 -3
View File
@@ -114,6 +114,9 @@ void cmExportBuildPackageInfoGenerator::GenerateInterfacePropertiesConfig(
Json::Value component =
this->GenerateInterfaceConfigProperties(suffix, properties);
this->GenerateCxxModules(component, target, this->FileDir, config);
if (!component.empty()) {
configurations[config.empty() ? std::string{ "noconfig" } : config] =
std::move(component);
@@ -122,7 +125,5 @@ void cmExportBuildPackageInfoGenerator::GenerateInterfacePropertiesConfig(
std::string cmExportBuildPackageInfoGenerator::GetCxxModulesDirectory() const
{
// TODO: Implement a not-CMake-specific mechanism for providing module
// information.
return {};
return this->CxxModulesDirectory;
}
@@ -46,5 +46,4 @@ protected:
std::string const& config);
std::string GetCxxModulesDirectory() const override;
// TODO: Generate C++ module info in a not-CMake-specific format.
};
+18 -8
View File
@@ -112,7 +112,7 @@ bool cmExportInstallPackageInfoGenerator::GenerateMainFile(std::ostream& os)
// Set configuration-agnostic properties for component.
this->GenerateInterfaceProperties(*component, gt, properties);
if (!this->GenerateFileSetProperties(*component, gt, te)) {
if (!this->GenerateFileSetProperties(*component, gt, te, packagePath)) {
return false;
}
}
@@ -143,6 +143,8 @@ void cmExportInstallPackageInfoGenerator::GenerateImportTargetsConfig(
root["name"] = this->GetPackageName();
root["configuration"] = (config.empty() ? "noconfig" : config);
std::string const& packagePath = this->GenerateImportPrefix();
Json::Value& components = root["components"];
for (auto const& te : this->GetExportSet()->GetTargetExports()) {
@@ -158,7 +160,8 @@ void cmExportInstallPackageInfoGenerator::GenerateImportTargetsConfig(
Json::Value component =
this->GenerateInterfaceConfigProperties(suffix, properties);
this->GenerateFileSetProperties(component, te->Target, te.get(), config);
this->GenerateFileSetProperties(component, te->Target, te.get(),
packagePath, config);
if (!component.empty()) {
components[te->Target->GetExportName()] = std::move(component);
@@ -212,10 +215,7 @@ std::string cmExportInstallPackageInfoGenerator::InstallNameDir(
std::string cmExportInstallPackageInfoGenerator::GetCxxModulesDirectory() const
{
// TODO: Implement a not-CMake-specific mechanism for providing module
// information.
// return IEGen->GetCxxModuleDirectory();
return {};
return IEGen->GetCxxModuleDirectory();
}
cm::optional<std::string>
@@ -265,8 +265,9 @@ cmExportInstallPackageInfoGenerator::GetFileSetDirectory(
bool cmExportInstallPackageInfoGenerator::GenerateFileSetProperties(
Json::Value& component, cmGeneratorTarget* gte, cmTargetExport const* te,
cm::optional<std::string> config)
std::string const& packagePath, cm::optional<std::string> config)
{
bool hasModules = false;
std::set<std::string> seenIncludeDirectories;
for (auto const& name : gte->Target->GetAllInterfaceFileSets()) {
cmFileSet* fileSet = gte->Target->GetFileSet(name);
@@ -290,9 +291,18 @@ bool cmExportInstallPackageInfoGenerator::GenerateFileSetProperties(
seenIncludeDirectories.insert(*fileSetDirectory);
}
} else if (fileSet->GetType() == "CXX_MODULES"_s) {
/* TODO: Handle the CXX_MODULE directory */
hasModules = true;
this->RequiresConfigFiles = true;
}
}
if (hasModules && config) {
std::string const manifestPath =
this->GenerateCxxModules(component, gte, packagePath, *config);
if (!manifestPath.empty()) {
this->ConfigCxxModuleFiles[*config] =
cmStrCat(this->FileDir, '/', manifestPath);
}
}
return true;
}
+1 -1
View File
@@ -69,7 +69,6 @@ protected:
std::string const& config) override;
std::string GetCxxModulesDirectory() const override;
// TODO: Generate C++ module info in a not-CMake-specific format.
cm::optional<std::string> GetFileSetDirectory(
cmGeneratorTarget* gte, cmTargetExport const* te, cmFileSet* fileSet,
@@ -78,5 +77,6 @@ protected:
bool GenerateFileSetProperties(Json::Value& component,
cmGeneratorTarget* gte,
cmTargetExport const* te,
std::string const& packagePath,
cm::optional<std::string> config = {});
};
+19
View File
@@ -576,3 +576,22 @@ Json::Value cmExportPackageInfoGenerator::GenerateInterfaceConfigProperties(
return component;
}
std::string cmExportPackageInfoGenerator::GenerateCxxModules(
Json::Value& component, cmGeneratorTarget* target,
std::string const& packagePath, std::string const& config)
{
std::string manifestPath;
std::string const cxxModulesDirName = this->GetCxxModulesDirectory();
if (cxxModulesDirName.empty() || !target->HaveCxx20ModuleSources()) {
return manifestPath;
}
manifestPath =
cmStrCat(cxxModulesDirName, "/target-", target->GetFilesystemExportName(),
'-', config.empty() ? "noconfig" : config, ".modules.json");
component["cpp_module_metadata"] = cmStrCat(packagePath, '/', manifestPath);
return manifestPath;
}
+8 -2
View File
@@ -70,16 +70,22 @@ protected:
std::string GetCxxModuleFile(std::string const& /*name*/) const override
{
// TODO
// CPS does not have a general CxxModuleFile, we use the config-specific
// manifests directly
return {};
}
void GenerateCxxModuleConfigInformation(std::string const& /*name*/,
std::ostream& /*os*/) const override
{
// TODO
// We embed this directly in the CPS json
}
std::string GenerateCxxModules(Json::Value& component,
cmGeneratorTarget* target,
std::string const& packagePath,
std::string const& config);
bool NoteLinkedTarget(cmGeneratorTarget const* target,
std::string const& linkedName,
cmGeneratorTarget const* linkedTarget) override;
+1 -1
View File
@@ -2339,7 +2339,7 @@ bool HandlePackageInfoMode(std::vector<std::string> const& args,
arguments.Bind(ica);
ica.Bind("EXPORT"_s, exportName);
// ica.Bind("CXX_MODULES_DIRECTORY"_s, cxxModulesDirectory); TODO?
ica.Bind("CXX_MODULES_DIRECTORY"_s, cxxModulesDirectory);
std::vector<std::string> unknownArgs;
ArgumentParser::ParseResult result = ica.Parse(args, &unknownArgs);
+32
View File
@@ -18,6 +18,7 @@
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
#include "cmCxxModuleMetadata.h"
#include "cmExecutionStatus.h"
#include "cmList.h"
#include "cmListFileCache.h"
@@ -780,6 +781,12 @@ void cmPackageInfoReader::SetTargetProperties(
AppendProperty(makefile, target, "LINK_LIBRARIES"_s, configuration, lib);
}
// TODO: Handle non-configuration modules
// once IMPORTED_CXX_MODULES supports it
if (!configuration.empty()) {
this->ReadCxxModulesMetadata(makefile, target, configuration, data);
}
// Add other information.
if (configuration.empty()) {
this->SetMetaProperty(makefile, target, "SPDX_LICENSE", data, "license",
@@ -787,6 +794,31 @@ void cmPackageInfoReader::SetTargetProperties(
}
}
void cmPackageInfoReader::ReadCxxModulesMetadata(
cmMakefile* makefile, cmTarget* target, cm::string_view configuration,
Json::Value const& object) const
{
#ifndef CMAKE_BOOTSTRAP
Json::Value const& path = object["cpp_module_metadata"];
if (!path.isString()) {
return;
}
cmCxxModuleMetadata::ParseResult result =
cmCxxModuleMetadata::LoadFromFile(this->ResolvePath(path.asString()));
if (!result) {
makefile->IssueMessage(
MessageType::WARNING,
cmStrCat("Error parsing module manifest:\n"_s, result.Error));
return;
}
cmCxxModuleMetadata::PopulateTarget(*target, *result.Meta, configuration);
#endif
}
cmTarget* cmPackageInfoReader::AddLibraryComponent(
cmMakefile* makefile, cmStateEnums::TargetType type, std::string const& name,
Json::Value const& data, std::string const& package, bool global) const
+3
View File
@@ -108,6 +108,9 @@ private:
std::string const& property, Json::Value const& object,
std::string const& attribute,
std::string const& defaultValue = {}) const;
void ReadCxxModulesMetadata(cmMakefile* makefile, cmTarget* target,
cm::string_view configuration,
Json::Value const& object) const;
std::string ResolvePath(std::string path) const;
@@ -274,19 +274,22 @@ function (run_cxx_module_import_test type name)
run_cxx_module_test(imp-mods "imp-mods-${name}" "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/${name}-${type}" ${ARGN})
endfunction ()
set(export_cps "-DCMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO=7fa7d13b-8308-4dc7-af39-9e450456d68f")
set(import_cps "-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261")
# Tests which install BMIs
if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
run_cxx_module_test(exp-iface-no-props-build)
run_cxx_module_test(exp-iface-build)
run_cxx_module_test(exp-incdirs-build)
run_cxx_module_test(exp-iface-build exp-iface-build ${export_cps})
run_cxx_module_test(exp-incdirs-build exp-incdirs-build ${export_cps})
run_cxx_module_test(exp-incdirs-old-cmake-build)
run_cxx_module_test(exp-usage-build)
run_cxx_module_test(exp-bmi-and-iface-build)
run_cxx_module_test(exp-command-sepdir-build)
run_cxx_module_test(exp-command-sepdir-build exp-command-sepdir-build ${export_cps})
run_cxx_module_test(exp-trans-targets-build)
run_cxx_module_test(exp-trans-mods1-build)
run_cxx_module_test(exp-trans-mods-build exp-trans-mods-build "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/exp-trans-mods1-build-build" )
run_cxx_module_test(exp-with-headers-build)
run_cxx_module_test(exp-trans-mods1-build exp-trans-mods1-build ${export_cps})
run_cxx_module_test(exp-trans-mods-build exp-trans-mods-build "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/exp-trans-mods1-build-build" "-Dexport_transitive_modules1_cps_DIR=${RunCMake_BINARY_DIR}/exp-trans-mods1-build-build" ${export_cps} ${import_cps})
run_cxx_module_test(exp-with-headers-build exp-with-headers-build ${export_cps})
if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION AND
"bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION)
@@ -319,16 +322,16 @@ if ("install_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION)
run_cxx_module_test(exp-iface-no-props-install)
run_cxx_module_test(exp-iface-install)
run_cxx_module_test(exp-incdirs-install)
run_cxx_module_test(exp-iface-install exp-iface-install ${export_cps})
run_cxx_module_test(exp-incdirs-install exp-incdirs-install ${export_cps})
run_cxx_module_test(exp-incdirs-old-cmake-install)
run_cxx_module_test(exp-usage-install)
run_cxx_module_test(exp-bmi-and-iface-install)
run_cxx_module_test(exp-command-sepdir-install)
run_cxx_module_test(exp-command-sepdir-install exp-command-sepdir-install ${export_cps})
run_cxx_module_test(exp-trans-targets-install)
run_cxx_module_test(exp-trans-mods1-install)
run_cxx_module_test(exp-trans-mods-install exp-trans-mods-install "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/exp-trans-mods1-install-install" )
run_cxx_module_test(exp-with-headers-install)
run_cxx_module_test(exp-trans-mods1-install exp-trans-mods1-install ${export_cps})
run_cxx_module_test(exp-trans-mods-install exp-trans-mods-install "-DCMAKE_PREFIX_PATH=${RunCMake_BINARY_DIR}/exp-trans-mods1-install-install" "-Dexport_transitive_modules1_cps_DIR=${RunCMake_BINARY_DIR}/exp-trans-mods1-install-install/lib/cmake/export_transitive_modules1_cps" ${export_cps} ${import_cps})
run_cxx_module_test(exp-with-headers-install exp-with-headers-install ${export_cps})
if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION AND
"bmionly" IN_LIST CMake_TEST_MODULE_COMPILATION)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -11,6 +11,9 @@ install(TARGETS export_sepdir
export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_sepdir-targets.cmake")
export(PACKAGE_INFO export_sepdir_cps
EXPORT CXXModules
CXX_MODULES_DIRECTORY "export_sepdir-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_sepdir-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_sepdir-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -32,6 +35,8 @@ add_test(NAME export_sepdir_build
"${CMAKE_COMMAND}"
"-Dexpected_dir=${CMAKE_CURRENT_SOURCE_DIR}"
"-Dexport_sepdir_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_sepdir_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,15 +2,23 @@ cmake_minimum_required(VERSION 3.24...3.28)
project(cxx_modules_library NONE)
find_package(export_sepdir REQUIRED)
find_package(export_sepdir_cps REQUIRED)
if (NOT TARGET CXXModules::export_sepdir)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_target target)
get_property(modules TARGET CXXModules::export_sepdir
PROPERTY "IMPORTED_CXX_MODULES_NOCONFIG")
if (modules STREQUAL "")
message(SEND_ERROR
"Expected non-empty property value for IMPORTED_CXX_MODULES_NOCONFIG")
endif ()
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(modules TARGET ${target}
PROPERTY "IMPORTED_CXX_MODULES_NOCONFIG")
if (modules STREQUAL "")
message(SEND_ERROR
"Expected non-empty property value for IMPORTED_CXX_MODULES_NOCONFIG")
endif ()
endfunction()
test_target(CXXModules::export_sepdir)
test_target(export_sepdir_cps::export_sepdir)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -12,6 +12,10 @@ install(EXPORT CXXModules
NAMESPACE CXXModules::
DESTINATION "lib/cmake/export_sepdir"
FILE "export_sepdir-targets.cmake")
install(PACKAGE_INFO "export_sepdir_cps"
EXPORT CXXModules
DESTINATION "lib/cmake/export_sepdir_cps"
CXX_MODULES_DIRECTORY "export_sepdir-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_sepdir-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_sepdir-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -35,6 +39,8 @@ add_test(NAME export_sepdir_build
"${CMAKE_COMMAND}"
"-Dexpected_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu"
"-Dexport_sepdir_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_sepdir"
"-Dexport_sepdir_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_sepdir_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,15 +2,23 @@ cmake_minimum_required(VERSION 3.24...3.28)
project(cxx_modules_library NONE)
find_package(export_sepdir REQUIRED)
find_package(export_sepdir_cps REQUIRED)
if (NOT TARGET CXXModules::export_sepdir)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_target target)
get_property(modules TARGET CXXModules::export_sepdir
PROPERTY "IMPORTED_CXX_MODULES_NOCONFIG")
if (modules STREQUAL "")
message(SEND_ERROR
"Expected non-empty property value for IMPORTED_CXX_MODULES_NOCONFIG")
endif ()
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(modules TARGET ${target}
PROPERTY "IMPORTED_CXX_MODULES_NOCONFIG")
if (modules STREQUAL "")
message(SEND_ERROR
"Expected non-empty property value for IMPORTED_CXX_MODULES_NOCONFIG")
endif ()
endfunction()
test_target(CXXModules::export_sepdir)
test_target(export_sepdir_cps::export_sepdir)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -32,6 +32,9 @@ export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_interfaces-targets.cmake"
CXX_MODULES_DIRECTORY "export_interfaces-cxx-modules")
export(PACKAGE_INFO export_interfaces_cps
EXPORT CXXModules
CXX_MODULES_DIRECTORY "export_interfaces-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_interfaces-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_interfaces-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -54,6 +57,8 @@ add_test(NAME export_interfaces_build
"-Dexpected_source_dir=${CMAKE_CURRENT_SOURCE_DIR}"
"-Dexpected_binary_dir=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_interfaces_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_interfaces_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,41 +2,54 @@ cmake_minimum_required(VERSION 3.24...3.28)
project(cxx_modules_library NONE)
find_package(export_interfaces REQUIRED)
find_package(export_interfaces_cps REQUIRED)
if (NOT TARGET CXXModules::export_interfaces)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_target target set_name has_bmi)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(file_sets TARGET CXXModules::export_interfaces
PROPERTY INTERFACE_CXX_MODULE_SETS)
if (NOT file_sets STREQUAL "modules")
message(FATAL_ERROR
"Incorrect exported file sets in CXXModules::export_interfaces:\n ${file_sets}")
endif ()
get_property(file_sets TARGET ${target}
PROPERTY INTERFACE_CXX_MODULE_SETS)
if (NOT file_sets STREQUAL "${set_name}")
message(FATAL_ERROR
"Incorrect exported file sets in ${target}:\n ${file_sets}")
endif ()
get_property(file_set_files TARGET CXXModules::export_interfaces
PROPERTY CXX_MODULE_SET_modules)
set(expected_file_set_files
"${expected_source_dir}/importable.cxx"
"${expected_source_dir}/subdir/importable.cxx"
)
if (NOT file_set_files STREQUAL "${expected_file_set_files}")
message(FATAL_ERROR
"Incorrect exported file set paths in CXXModules::export_interfaces:\n ${file_set_files}")
endif ()
get_property(file_set_files TARGET ${target}
PROPERTY CXX_MODULE_SET_${set_name})
set(expected_file_set_files
"${expected_source_dir}/importable.cxx"
"${expected_source_dir}/subdir/importable.cxx"
)
if (NOT file_set_files STREQUAL "${expected_file_set_files}")
message(FATAL_ERROR
"Incorrect exported file set paths in ${target}:\n ${file_set_files}")
endif ()
get_property(imported_modules TARGET CXXModules::export_interfaces
PROPERTY IMPORTED_CXX_MODULES_DEBUG)
set(expected_imported_modules
"importable=${expected_source_dir}/importable.cxx,${expected_binary_dir}/CMakeFiles/export_interfaces.dir(/Debug)?/importable.(gcm|pcm|ifc)"
"subdir_importable=${expected_source_dir}/subdir/importable.cxx,${expected_binary_dir}/CMakeFiles/export_interfaces.dir(/Debug)?/subdir_importable.(gcm|pcm|ifc)"
)
if (NOT imported_modules MATCHES "^${expected_imported_modules}$")
message(FATAL_ERROR
"Incorrect exported modules in CXXModules::export_interfaces:\n"
" ${imported_modules}\n"
"does not match:\n"
" ${expected_imported_modules}"
)
endif ()
get_property(imported_modules TARGET ${target}
PROPERTY IMPORTED_CXX_MODULES_DEBUG)
if(has_bmi)
set(expected_imported_modules
"importable=${expected_source_dir}/importable.cxx,${expected_binary_dir}/CMakeFiles/export_interfaces.dir(/Debug)?/importable.(gcm|pcm|ifc)"
"subdir_importable=${expected_source_dir}/subdir/importable.cxx,${expected_binary_dir}/CMakeFiles/export_interfaces.dir(/Debug)?/subdir_importable.(gcm|pcm|ifc)"
)
else()
set(expected_imported_modules
"importable=${expected_source_dir}/importable.cxx"
"subdir_importable=${expected_source_dir}/subdir/importable.cxx"
)
endif()
if (NOT imported_modules MATCHES "^${expected_imported_modules}$")
message(FATAL_ERROR
"Incorrect exported modules in ${target}:\n"
" ${imported_modules}\n"
"does not match:\n"
" ${expected_imported_modules}"
)
endif ()
endfunction()
test_target(CXXModules::export_interfaces "modules" TRUE)
test_target(export_interfaces_cps::export_interfaces "CXX_MODULES" FALSE)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -33,6 +33,10 @@ install(EXPORT CXXModules
DESTINATION "lib/cmake/export_interfaces"
FILE "export_interfaces-targets.cmake"
CXX_MODULES_DIRECTORY "export_interfaces-cxx-modules")
install(PACKAGE_INFO "export_interfaces_cps"
EXPORT CXXModules
DESTINATION "lib/cmake/export_interfaces_cps"
CXX_MODULES_DIRECTORY "export_interfaces-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_interfaces-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_interfaces-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -57,6 +61,8 @@ add_test(NAME export_interfaces_build
"-Dexpected_source_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu"
"-Dexpected_binary_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/bmi"
"-Dexport_interfaces_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_interfaces"
"-Dexport_interfaces_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_interfaces_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,41 +2,48 @@ cmake_minimum_required(VERSION 3.24...3.28)
project(cxx_modules_library NONE)
find_package(export_interfaces REQUIRED)
find_package(export_interfaces_cps CONFIG REQUIRED)
if (NOT TARGET CXXModules::export_interfaces)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_target target set_name)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(file_sets TARGET CXXModules::export_interfaces
PROPERTY INTERFACE_CXX_MODULE_SETS)
if (NOT file_sets STREQUAL "modules")
message(FATAL_ERROR
"Incorrect exported file sets in CXXModules::export_interfaces:\n ${file_sets}")
endif ()
get_property(file_sets TARGET ${target}
PROPERTY INTERFACE_CXX_MODULE_SETS)
get_property(file_set_files TARGET CXXModules::export_interfaces
PROPERTY CXX_MODULE_SET_modules)
set(expected_file_set_files
"${expected_source_dir}/importable.cxx"
"${expected_source_dir}/subdir/importable.cxx"
)
if (NOT file_set_files STREQUAL "${expected_file_set_files}")
message(FATAL_ERROR
"Incorrect exported file set paths in CXXModules::export_interfaces:\n ${file_set_files}")
endif ()
if (NOT file_sets STREQUAL set_name)
message(FATAL_ERROR
"Incorrect exported file sets in ${target}:\n ${file_sets}")
endif ()
get_property(imported_modules TARGET CXXModules::export_interfaces
PROPERTY IMPORTED_CXX_MODULES_DEBUG)
set(expected_imported_modules
"importable=${expected_source_dir}/importable.cxx"
"subdir_importable=${expected_source_dir}/subdir/importable.cxx"
)
if (NOT imported_modules STREQUAL "${expected_imported_modules}")
message(FATAL_ERROR
"Incorrect exported modules in CXXModules::export_interfaces:\n"
" ${imported_modules}\n"
"does not match:\n"
" ${expected_imported_modules}"
)
endif ()
get_property(file_set_files TARGET ${target}
PROPERTY CXX_MODULE_SET_${set_name})
set(expected_file_set_files
"${expected_source_dir}/importable.cxx"
"${expected_source_dir}/subdir/importable.cxx"
)
if (NOT file_set_files STREQUAL "${expected_file_set_files}")
message(FATAL_ERROR
"Incorrect exported file set paths in ${target}:\n ${file_set_files}")
endif ()
get_property(imported_modules TARGET ${target}
PROPERTY IMPORTED_CXX_MODULES_DEBUG)
set(expected_imported_modules
"importable=${expected_source_dir}/importable.cxx"
"subdir_importable=${expected_source_dir}/subdir/importable.cxx"
)
if (NOT imported_modules STREQUAL "${expected_imported_modules}")
message(FATAL_ERROR
"Incorrect exported modules in ${target}:\n"
" ${imported_modules}\n"
"does not match:\n"
" ${expected_imported_modules}"
)
endif ()
endfunction()
test_target(CXXModules::export_interfaces "modules")
test_target(export_interfaces_cps::export_interfaces "CXX_MODULES")
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -38,6 +38,9 @@ export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_include_directories-targets.cmake"
CXX_MODULES_DIRECTORY "export_include_directories-cxx-modules")
export(PACKAGE_INFO export_include_directories_cps
EXPORT CXXModules
CXX_MODULES_DIRECTORY "export_include_directories-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_include_directories-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_include_directories-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -60,6 +63,8 @@ add_test(NAME export_include_directories_build
"-Dexpected_source_dir=${CMAKE_CURRENT_SOURCE_DIR}"
"-Dexpected_binary_dir=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_include_directories_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_include_directories_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,17 +2,23 @@ cmake_minimum_required(VERSION 3.24)
project(cxx_modules_library NONE)
find_package(export_include_directories REQUIRED)
find_package(export_include_directories_cps REQUIRED)
if (NOT TARGET CXXModules::export_include_directories)
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(include_directories TARGET CXXModules::export_include_directories
PROPERTY IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES)
foreach (include_directory IN LISTS include_directories)
if (NOT EXISTS "${include_directory}")
function(test_target target)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing include directory in C++ module interface CXXModules::export_include_directories:\n ${include_directory}")
"Missing imported target")
endif ()
endforeach ()
get_property(include_directories TARGET ${target}
PROPERTY IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES)
foreach (include_directory IN LISTS include_directories)
if (NOT EXISTS "${include_directory}")
message(FATAL_ERROR
"Missing include directory in C++ module interface ${target}:\n ${include_directory}")
endif ()
endforeach ()
endfunction()
test_target(CXXModules::export_include_directories)
test_target(export_include_directories_cps::export_include_directories)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -45,6 +45,10 @@ install(EXPORT CXXModules
DESTINATION "lib/cmake/export_include_directories"
FILE "export_include_directories-targets.cmake"
CXX_MODULES_DIRECTORY "export_include_directories-cxx-modules")
install(PACKAGE_INFO export_include_directories_cps
EXPORT CXXModules
DESTINATION "lib/cmake/export_include_directories_cps"
CXX_MODULES_DIRECTORY "export_include_directories-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_include_directories-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_include_directories-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -69,6 +73,8 @@ add_test(NAME export_include_directories_build
"-Dexpected_source_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu"
"-Dexpected_binary_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/bmi"
"-Dexport_include_directories_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_include_directories"
"-Dexport_include_directories_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_include_directories_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,15 +2,21 @@ cmake_minimum_required(VERSION 3.24...3.28)
project(cxx_modules_library NONE)
find_package(export_include_directories REQUIRED)
find_package(export_include_directories_cps REQUIRED)
if (NOT TARGET CXXModules::export_include_directories)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_target target set_name)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(file_sets TARGET CXXModules::export_include_directories
PROPERTY INTERFACE_CXX_MODULE_SETS)
if (NOT file_sets STREQUAL "modules")
message(FATAL_ERROR
"Incorrect exported file sets in CXXModules::export_include_directories:\n ${file_sets}")
endif ()
get_property(file_sets TARGET ${target}
PROPERTY INTERFACE_CXX_MODULE_SETS)
if (NOT file_sets STREQUAL ${set_name})
message(FATAL_ERROR
"Incorrect exported file sets in ${target}:\n ${file_sets}")
endif ()
endfunction()
test_target(CXXModules::export_include_directories "modules")
test_target(export_include_directories_cps::export_include_directories "CXX_MODULES")
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -4,6 +4,7 @@ project(cxx_modules_export_transitive_modules CXX)
include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake")
find_package(export_transitive_modules1 REQUIRED)
find_package(export_transitive_modules1_cps REQUIRED)
add_library(export_transitive_modules STATIC)
target_sources(export_transitive_modules
@@ -17,13 +18,32 @@ target_sources(export_transitive_modules
target_compile_features(export_transitive_modules PUBLIC cxx_std_20)
target_link_libraries(export_transitive_modules PRIVATE CXXModules::export_transitive_modules1)
add_library(export_transitive_modules_cps STATIC)
target_sources(export_transitive_modules_cps
PUBLIC
FILE_SET modules TYPE CXX_MODULES
BASE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}"
FILES
importable.cxx
)
target_compile_features(export_transitive_modules_cps PUBLIC cxx_std_20)
target_link_libraries(export_transitive_modules_cps PRIVATE export_transitive_modules1_cps::export_transitive_modules1)
set_target_properties(export_transitive_modules_cps PROPERTIES EXPORT_NAME export_transitive_modules)
install(TARGETS export_transitive_modules
EXPORT CXXModules
FILE_SET modules DESTINATION "lib/cxx/miu")
install(TARGETS export_transitive_modules_cps
EXPORT CXXModules_cps
FILE_SET modules DESTINATION "lib/cxx/miu")
export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules-targets.cmake"
CXX_MODULES_DIRECTORY "export_transitive_modules-cxx-modules")
export(PACKAGE_INFO export_transitive_modules_cps
EXPORT CXXModules_cps
CXX_MODULES_DIRECTORY "export_transitive_modules-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules-config.cmake"
"include(CMakeFindDependencyMacro)
set(export_transitive_modules1_DIR \"${export_transitive_modules1_DIR}\")
@@ -49,6 +69,9 @@ add_test(NAME export_transitive_modules_build
"-Dexpected_source_dir=${CMAKE_CURRENT_SOURCE_DIR}"
"-Dexpected_binary_dir=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_transitive_modules_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_transitive_modules1_cps_DIR=${CMAKE_PREFIX_PATH}"
"-Dexport_transitive_modules_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,13 +2,19 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_transitive_modules REQUIRED)
find_package(export_transitive_modules_cps REQUIRED)
if (NOT TARGET CXXModules::export_transitive_modules1)
message(FATAL_ERROR
"Missing transitive imported target")
endif ()
function(test_namespace namespace namespace1)
if (NOT TARGET ${namespace1}::export_transitive_modules1)
message(FATAL_ERROR
"Missing transitive imported target")
endif ()
if (NOT TARGET CXXModules::export_transitive_modules)
message(FATAL_ERROR
"Missing imported target")
endif ()
if (NOT TARGET ${namespace}::export_transitive_modules)
message(FATAL_ERROR
"Missing imported target")
endif ()
endfunction()
test_namespace(CXXModules CXXModules)
test_namespace(export_transitive_modules_cps export_transitive_modules1_cps)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -4,6 +4,7 @@ project(cxx_modules_export_transitive_modules CXX)
include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake")
find_package(export_transitive_modules1 REQUIRED)
find_package(export_transitive_modules1_cps REQUIRED)
add_library(export_transitive_modules STATIC)
target_sources(export_transitive_modules
@@ -17,14 +18,34 @@ target_sources(export_transitive_modules
target_compile_features(export_transitive_modules PUBLIC cxx_std_20)
target_link_libraries(export_transitive_modules PRIVATE CXXModules::export_transitive_modules1)
add_library(export_transitive_modules_cps STATIC)
target_sources(export_transitive_modules_cps
PUBLIC
FILE_SET modules TYPE CXX_MODULES
BASE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}"
FILES
importable.cxx
)
target_compile_features(export_transitive_modules_cps PUBLIC cxx_std_20)
target_link_libraries(export_transitive_modules_cps PRIVATE export_transitive_modules1_cps::export_transitive_modules1)
set_target_properties(export_transitive_modules_cps PROPERTIES EXPORT_NAME export_transitive_modules)
install(TARGETS export_transitive_modules
EXPORT CXXModules
FILE_SET modules DESTINATION "lib/cxx/miu")
install(TARGETS export_transitive_modules_cps
EXPORT CXXModules_cps
FILE_SET modules DESTINATION "lib/cxx/miu")
install(EXPORT CXXModules
NAMESPACE CXXModules::
DESTINATION "lib/cmake/export_transitive_modules"
FILE "export_transitive_modules-targets.cmake"
CXX_MODULES_DIRECTORY "export_transitive_modules-cxx-modules")
install(PACKAGE_INFO "export_transitive_modules_cps"
EXPORT CXXModules_cps
DESTINATION "lib/cmake/export_transitive_modules_cps"
CXX_MODULES_DIRECTORY "export_transitive_modules-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules-config.cmake"
"include(CMakeFindDependencyMacro)
set(export_transitive_modules1_DIR \"${export_transitive_modules1_DIR}\")
@@ -52,6 +73,9 @@ add_test(NAME export_transitive_modules_build
"-Dexpected_source_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu"
"-Dexpected_binary_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/bmi"
"-Dexport_transitive_modules_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_transitive_modules"
"-Dexport_transitive_modules1_cps_DIR=${CMAKE_PREFIX_PATH}/lib/cmake/export_transitive_modules1_cps"
"-Dexport_transitive_modules_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_transitive_modules_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,13 +2,19 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_transitive_modules REQUIRED)
find_package(export_transitive_modules_cps REQUIRED)
if (NOT TARGET CXXModules::export_transitive_modules1)
message(FATAL_ERROR
"Missing transitive imported target")
endif ()
function(test_namespace namespace namespace1)
if (NOT TARGET ${namespace1}::export_transitive_modules1)
message(FATAL_ERROR
"Missing transitive imported target")
endif ()
if (NOT TARGET CXXModules::export_transitive_modules)
message(FATAL_ERROR
"Missing imported target")
endif ()
if (NOT TARGET ${namespace}::export_transitive_modules)
message(FATAL_ERROR
"Missing imported target")
endif ()
endfunction()
test_namespace(CXXModules CXXModules)
test_namespace(export_transitive_modules_cps export_transitive_modules1_cps)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -21,6 +21,9 @@ export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules1-targets.cmake"
CXX_MODULES_DIRECTORY "export_transitive_modules1-cxx-modules")
export(PACKAGE_INFO export_transitive_modules1_cps
EXPORT CXXModules
CXX_MODULES_DIRECTORY "export_transitive_modules1-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules1-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_transitive_modules1-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -43,6 +46,8 @@ add_test(NAME export_transitive_modules1_build
"-Dexpected_source_dir=${CMAKE_CURRENT_SOURCE_DIR}"
"-Dexpected_binary_dir=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_transitive_modules1_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_transitive_modules1_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,8 +2,14 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_transitive_modules1 REQUIRED)
find_package(export_transitive_modules1_cps REQUIRED)
if (NOT TARGET CXXModules::export_transitive_modules1)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_namespace namespace)
if (NOT TARGET ${namespace}::export_transitive_modules1)
message(FATAL_ERROR
"Missing imported target")
endif ()
endfunction()
test_namespace(CXXModules)
test_namespace(export_transitive_modules1_cps)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -22,6 +22,10 @@ install(EXPORT CXXModules
DESTINATION "lib/cmake/export_transitive_modules1"
FILE "export_transitive_modules1-targets.cmake"
CXX_MODULES_DIRECTORY "export_transitive_modules1-cxx-modules")
install(PACKAGE_INFO "export_transitive_modules1_cps"
EXPORT CXXModules
DESTINATION "lib/cmake/export_transitive_modules1_cps"
CXX_MODULES_DIRECTORY "export_transitive_modules1-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_transitive_modules1-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_transitive_modules1-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -46,6 +50,8 @@ add_test(NAME export_transitive_modules1_build
"-Dexpected_source_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu"
"-Dexpected_binary_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/bmi"
"-Dexport_transitive_modules1_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_transitive_modules1"
"-Dexport_transitive_modules1_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_transitive_modules1_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,8 +2,14 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_transitive_modules1 REQUIRED)
find_package(export_transitive_modules1_cps REQUIRED)
if (NOT TARGET CXXModules::export_transitive_modules1)
message(FATAL_ERROR
"Missing imported target")
endif ()
function(test_namespace namespace)
if (NOT TARGET ${namespace}::export_transitive_modules1)
message(FATAL_ERROR
"Missing imported target")
endif ()
endfunction()
test_namespace(CXXModules)
test_namespace(export_transitive_modules1_cps)
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -24,6 +24,9 @@ export(EXPORT CXXModules
NAMESPACE CXXModules::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export_with_headers-targets.cmake"
CXX_MODULES_DIRECTORY "export_with_headers-cxx-modules")
export(PACKAGE_INFO export_with_headers_cps
EXPORT CXXModules
CXX_MODULES_DIRECTORY "export_with_headers-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_with_headers-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_with_headers-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -44,6 +47,8 @@ add_test(NAME export_with_headers_build
COMMAND
"${CMAKE_COMMAND}"
"-Dexport_with_headers_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-Dexport_with_headers_cps_DIR=${CMAKE_CURRENT_BINARY_DIR}"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,18 +2,27 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_with_headers REQUIRED)
find_package(export_with_headers_cps REQUIRED)
if (NOT TARGET CXXModules::export_with_headers)
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(iface_includes TARGET CXXModules::export_with_headers
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
set(include_dir "${CMAKE_CURRENT_SOURCE_DIR}")
cmake_path(GET include_dir PARENT_PATH include_dir)
string(APPEND include_dir "/include")
if (NOT iface_includes STREQUAL "${include_dir};$<BUILD_INTERFACE:${include_dir}>")
message(FATAL_ERROR
"Incorrect include interface for CXXModules::export_with_headers:\n ${iface_includes}")
endif ()
function(test_target target incdir)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(iface_includes TARGET ${target}
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
if (NOT iface_includes STREQUAL incdir)
message(FATAL_ERROR
"Incorrect include interface for ${target}:\n ${iface_includes}")
endif ()
endfunction(test_target)
test_target(CXXModules::export_with_headers "${include_dir};$<BUILD_INTERFACE:${include_dir}>")
test_target(export_with_headers_cps::export_with_headers "${include_dir}")
@@ -0,0 +1,5 @@
CMake Warning \(dev\) at CMakeLists\.txt:[0-9]+ \(project\):
CMake's support for exporting package information in the Common Package
Specification format is experimental\. It is meant only for experimentation
and feedback to CMake developers\.
This warning is for project developers\. Use -Wno-dev to suppress it
@@ -24,6 +24,10 @@ install(EXPORT CXXModules
NAMESPACE CXXModules::
DESTINATION "lib/cmake/export_with_headers"
FILE "export_with_headers-targets.cmake")
install(PACKAGE_INFO "export_with_headers_cps"
EXPORT CXXModules
DESTINATION "lib/cmake/export_with_headers_cps"
CXX_MODULES_DIRECTORY "export_with_headers-cxx-modules-cps")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_with_headers-config.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/export_with_headers-targets.cmake\")
set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1)
@@ -46,6 +50,8 @@ add_test(NAME export_with_headers_build
COMMAND
"${CMAKE_COMMAND}"
"-Dexport_with_headers_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_with_headers"
"-Dexport_with_headers_cps_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/export_with_headers_cps"
"-DCMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES=e82e467b-f997-4464-8ace-b00808fff261"
${generator}
-S "${CMAKE_CURRENT_SOURCE_DIR}/test"
-B "${CMAKE_CURRENT_BINARY_DIR}/test")
@@ -2,20 +2,29 @@ cmake_minimum_required(VERSION 3.28)
project(cxx_modules_library NONE)
find_package(export_with_headers REQUIRED)
find_package(export_with_headers_cps REQUIRED)
if (NOT TARGET CXXModules::export_with_headers)
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(iface_includes TARGET CXXModules::export_with_headers
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
set(include_dir "${export_with_headers_DIR}")
cmake_path(GET include_dir PARENT_PATH include_dir)
cmake_path(GET include_dir PARENT_PATH include_dir)
cmake_path(GET include_dir PARENT_PATH include_dir)
string(APPEND include_dir "/include")
if (NOT iface_includes STREQUAL "$<BUILD_INTERFACE:${include_dir}>")
message(FATAL_ERROR
"Incorrect include interface for CXXModules::export_with_headers:\n ${iface_includes}")
endif ()
function(test_target target incdir)
if (NOT TARGET ${target})
message(FATAL_ERROR
"Missing imported target")
endif ()
get_property(iface_includes TARGET ${target}
PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
if (NOT iface_includes STREQUAL incdir)
message(FATAL_ERROR
"Incorrect include interface for ${target}:\n ${iface_includes}")
endif ()
endfunction(test_target)
test_target(CXXModules::export_with_headers "$<BUILD_INTERFACE:${include_dir}>")
test_target(export_with_headers_cps::export_with_headers "${include_dir}")