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)