From 92a0abd16419b5da50bee2cfa3b86ab4c2a6573f Mon Sep 17 00:00:00 2001 From: Matthew Woehlke Date: Thu, 29 Jan 2026 14:38:38 -0500 Subject: [PATCH] CPS: Support exporting "link dependent libraries". Teach CPS export to fill the `dyld_requires` attribute based on the equivalent of the `IMPORTED_LINK_DEPENDENT_LIBRARIES` CMake property. (Note that, in practice, I don't believe this can ever contain non-targets, and CPS does not anyway support the `dyld_libraries` attribute that those would require at this time. Issue: #27501 --- Source/cmExportPackageInfoGenerator.cxx | 18 +++++++++++++++++- .../LinkDependentLibraries-check.cmake | 15 +++++++++++++++ .../LinkDependentLibraries.cmake | 16 ++++++++++++++++ .../ExportPackageInfo/RunCMakeTest.cmake | 1 + 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries-check.cmake create mode 100644 Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries.cmake diff --git a/Source/cmExportPackageInfoGenerator.cxx b/Source/cmExportPackageInfoGenerator.cxx index 1e32b32834..a30b0b030d 100644 --- a/Source/cmExportPackageInfoGenerator.cxx +++ b/Source/cmExportPackageInfoGenerator.cxx @@ -30,7 +30,7 @@ #include "cmSystemTools.h" #include "cmTarget.h" -static std::string const kCPS_VERSION_STR = "0.14.0"; +static std::string const kCPS_VERSION_STR = "0.14.1"; cmExportPackageInfoGenerator::cmExportPackageInfoGenerator( cmPackageInfoArguments arguments) @@ -565,6 +565,22 @@ Json::Value cmExportPackageInfoGenerator::GenerateInterfaceConfigProperties( component["location"] = p.second; } else if (prop == "IMPLIB") { component["link_location"] = p.second; + } else if (prop == "LINK_DEPENDENT_LIBRARIES") { + bool result; + std::vector libraries; + std::vector components = + this->ExtractRequirements(cmList{ p.second }, result, libraries); + BuildArray(component, "dyld_requires", components); + if (!libraries.empty()) { + // In theory this can never happen? + this->IssueMessage( + MessageType::AUTHOR_WARNING, + cmStrCat("Package \""_s, this->GetPackageName(), + "\" has IMPORTED_LINK_DEPENDENT_LIBRARIES \""_s, + cmJoin(libraries, ";"_s), this->PackageVersionSchema, + "\". These cannot be exported. " + "Consumers may encounter link errors."_s)); + } } else if (prop == "LINK_INTERFACE_LANGUAGES") { std::vector languages; for (auto const& lang : cmList{ p.second }) { diff --git a/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries-check.cmake b/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries-check.cmake new file mode 100644 index 0000000000..19eb3f135c --- /dev/null +++ b/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries-check.cmake @@ -0,0 +1,15 @@ +include(${CMAKE_CURRENT_LIST_DIR}/Assertions.cmake) + +set(out_dir "${RunCMake_BINARY_DIR}/LinkDependentLibraries-build") + +file(READ "${out_dir}/dyld.cps" content) +expect_value("${content}" "dyld" "name") +expect_value("${content}" "dylib" "components" "private" "type") +expect_value("${content}" "dylib" "components" "public" "type") + +expect_array( + "${content}" 1 + "components" "public" "configurations" "generic" "dyld_requires") +expect_value( + "${content}" ":private" + "components" "public" "configurations" "generic" "dyld_requires" 0) diff --git a/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries.cmake b/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries.cmake new file mode 100644 index 0000000000..1867ae69ce --- /dev/null +++ b/Tests/RunCMake/ExportPackageInfo/LinkDependentLibraries.cmake @@ -0,0 +1,16 @@ +project(dyld CXX) + +get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(_isMultiConfig) + set(CMAKE_CONFIGURATION_TYPES "generic" CACHE STRING "" FORCE) +else() + set(CMAKE_BUILD_TYPE "generic" CACHE STRING "" FORCE) +endif() + +add_library(private SHARED foo.cxx) +add_library(public SHARED foo.cxx) + +target_link_libraries(public PRIVATE private) + +install(TARGETS private public EXPORT dyld DESTINATION .) +export(PACKAGE_INFO dyld EXPORT dyld) diff --git a/Tests/RunCMake/ExportPackageInfo/RunCMakeTest.cmake b/Tests/RunCMake/ExportPackageInfo/RunCMakeTest.cmake index 3454a69517..15ee02fcd5 100644 --- a/Tests/RunCMake/ExportPackageInfo/RunCMakeTest.cmake +++ b/Tests/RunCMake/ExportPackageInfo/RunCMakeTest.cmake @@ -43,6 +43,7 @@ run_cmake(Minimal) run_cmake(MinimalVersion) run_cmake(LowerCaseFile) run_cmake(Requirements) +run_cmake(LinkDependentLibraries) run_cmake(ExportSymbolicComponent) run_cmake(TargetTypes) run_cmake(DependsMultiple)