export: Allow compatible build-tree exports

Modify how cmExportBuildFileGenerator::FindExportInfo collects target
export information to properly record the export sets which export a
target. (The old behavior treated every invocation as a separate set,
which is reasonable for export(TARGETS) but does not allow referencing a
target exported multiple times via export(EXPORT). This reflects recent
changes to allow this for installed exports.)
This commit is contained in:
Matthew Woehlke 2025-02-24 14:54:50 -05:00
parent 8b8cf1ac8e
commit 26691689a3
9 changed files with 46 additions and 10 deletions

View File

@ -186,15 +186,20 @@ cmExportFileGenerator::ExportInfo cmExportBuildFileGenerator::FindExportInfo(
target->GetLocalGenerator()->GetGlobalGenerator()->GetBuildExportSets();
for (auto const& exp : allExportSets) {
auto const& exportSet = exp.second;
cmExportBuildFileGenerator const* const bfg = exp.second;
cmExportSet const* const exportSet = bfg->GetExportSet();
std::vector<TargetExport> targets;
exportSet->GetTargets(targets);
bfg->GetTargets(targets);
if (std::any_of(
targets.begin(), targets.end(),
[&name](TargetExport const& te) { return te.Name == name; })) {
exportSets.insert(exp.first);
if (exportSet) {
exportSets.insert(exportSet->GetName());
} else {
exportSets.insert(exp.first);
}
exportFiles.push_back(exp.first);
namespaces.insert(exportSet->GetNamespace());
namespaces.insert(bfg->GetNamespace());
}
}

View File

@ -0,0 +1,13 @@
CMake Error in CMakeLists.txt:
export called with target "exported" which requires target "doubleexported"
that is not in this export set, but in another export set which is exported
multiple times with different namespaces:.*
.*/Tests/RunCMake/export/DependOnDifferentNamespaceExport-build/export1.cmake,.*
.*/Tests/RunCMake/export/DependOnDifferentNamespaceExport-build/export2.cmake.
+
An exported target cannot depend upon another target which is exported in
more than one export set or with more than one namespace. Consider
consolidating the exports of the "doubleexported" target to a single
export.
+
CMake Generate step failed. Build files cannot be regenerated correctly.

View File

@ -0,0 +1,9 @@
add_library(doubleexported INTERFACE)
install(TARGETS doubleexported EXPORT exportset)
export(EXPORT exportset
FILE "${CMAKE_CURRENT_BINARY_DIR}/export1.cmake")
export(EXPORT exportset NAMESPACE test::
FILE "${CMAKE_CURRENT_BINARY_DIR}/export2.cmake")
add_library(exported INTERFACE)
target_link_libraries(exported INTERFACE doubleexported)
export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake")

View File

@ -0,0 +1 @@
1

View File

@ -1,13 +1,12 @@
CMake Error in CMakeLists.txt:
export called with target "exported" which requires target "doubleexported"
that is not in this export set, but in multiple other export sets:.*
.*/Tests/RunCMake/export/DependOnDoubleExport-build/exportset.cmake,.*
.*/Tests/RunCMake/export/DependOnDoubleExport-build/manual.cmake.
.*/Tests/RunCMake/export/DependOnDifferentSetExport-build/exportset.cmake,.*
.*/Tests/RunCMake/export/DependOnDifferentSetExport-build/manual.cmake.
+
An exported target cannot depend upon another target which is exported in
more than one export set or with more than one namespace. Consider
consolidating the exports of the "doubleexported" target to a single
export.
+
CMake Generate step failed. Build files cannot be regenerated correctly.

View File

@ -0,0 +1,7 @@
add_library(doubleexported INTERFACE)
install(TARGETS doubleexported EXPORT exportset)
export(TARGETS doubleexported FILE "${CMAKE_CURRENT_BINARY_DIR}/manual.cmake")
export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/exportset.cmake")
add_library(exported INTERFACE)
target_link_libraries(exported INTERFACE doubleexported)
export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake")

View File

@ -1,7 +1,7 @@
add_library(doubleexported INTERFACE)
install(TARGETS doubleexported EXPORT exportset)
export(TARGETS doubleexported FILE "${CMAKE_CURRENT_BINARY_DIR}/manual.cmake")
export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/exportset.cmake")
export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/export1.cmake")
export(EXPORT exportset FILE "${CMAKE_CURRENT_BINARY_DIR}/export2.cmake")
add_library(exported INTERFACE)
target_link_libraries(exported INTERFACE doubleexported)
export(TARGETS exported FILE "${CMAKE_CURRENT_BINARY_DIR}/exports.cmake")

View File

@ -15,6 +15,8 @@ run_cmake(ForbiddenToExportPropertyWithGenExp)
run_cmake(ExportPropertiesUndefined)
run_cmake(DependOnNotExport)
run_cmake(DependOnDoubleExport)
run_cmake(DependOnDifferentSetExport)
run_cmake(DependOnDifferentNamespaceExport)
run_cmake(UnknownExport)
run_cmake(NamelinkOnlyExport)
run_cmake(SeparateNamelinkExport)