From 87f44b7525ebc9761b32b98f0c9e1276431e6ec1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 17 Feb 2016 13:34:15 -0500 Subject: [PATCH] Fix export of STATIC library PRIVATE non-target dependencies In commit v3.5.0-rc1~43^2 (Fix export of STATIC library PRIVATE dependencies with CMP0022 NEW, 2016-01-15) we taught target_link_libraries to generate `$>` in INTERFACE_LINK_LIBRARIES instead of `$` so that `dep` can be recognized as a target name and updated during export. However, this approach does not work when `dep` is just a plain library name and not a target because `$` requires the name of a reachable target. Since we do not know during target_link_libraries whether the name will correspond to a reachable target or not, we cannot inject the `$` expression. Revert this change and solve the original problem instead by teaching the export logic to recognize and update target names directly in `$` expressions. Reported-by: Ben Boeckel --- Source/cmExportFileGenerator.cxx | 21 +++++++++++++++++++ Source/cmTargetLinkLibrariesCommand.cxx | 7 ++----- .../target_link_libraries/RunCMakeTest.cmake | 2 ++ .../StaticPrivateDepNotExported-result.txt | 1 + .../StaticPrivateDepNotExported-stderr.txt | 1 + .../StaticPrivateDepNotExported.cmake | 7 +++++++ .../StaticPrivateDepNotTarget.cmake | 6 ++++++ 7 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-result.txt create mode 100644 Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-stderr.txt create mode 100644 Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported.cmake create mode 100644 Tests/RunCMake/target_link_libraries/StaticPrivateDepNotTarget.cmake diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index e8a2e6a52..c005995f7 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -772,6 +772,27 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpression( lastPos = endPos; } + pos = 0; + lastPos = pos; + while (errorString.empty() && + (pos = input.find("$", nameStartPos); + if (endPos == input.npos) + { + errorString = "$ expression incomplete"; + break; + } + std::string libName = input.substr(nameStartPos, endPos - nameStartPos); + if (cmGeneratorExpression::IsValidTargetName(libName) && + this->AddTargetNamespace(libName, target, missingTargets)) + { + input.replace(nameStartPos, endPos - nameStartPos, libName); + } + lastPos = nameStartPos + libName.size() + 1; + } + this->ReplaceInstallPrefix(input); if (!errorString.empty()) diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx index 5f3246ace..435346a30 100644 --- a/Source/cmTargetLinkLibrariesCommand.cxx +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -432,11 +432,8 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const std::string& lib, { std::string configLib = this->Target ->GetDebugGeneratorExpressions(lib, llt); - if (cmGeneratorExpression::IsValidTargetName(configLib)) - { - configLib = "$>"; - } - else if (cmGeneratorExpression::Find(configLib) != std::string::npos) + if (cmGeneratorExpression::IsValidTargetName(lib) + || cmGeneratorExpression::Find(lib) != std::string::npos) { configLib = "$"; } diff --git a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake index 8307607bc..1466fbf61 100644 --- a/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake @@ -8,3 +8,5 @@ run_cmake(MixedSignature) run_cmake(Separate-PRIVATE-LINK_PRIVATE-uses) run_cmake(SubDirTarget) run_cmake(SharedDepNotTarget) +run_cmake(StaticPrivateDepNotExported) +run_cmake(StaticPrivateDepNotTarget) diff --git a/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-result.txt b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-stderr.txt b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-stderr.txt new file mode 100644 index 000000000..6bb44ab4b --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported-stderr.txt @@ -0,0 +1 @@ +CMake Error: install\(EXPORT "Exp" ...\) includes target "foo" which requires target "not_exported" that is not in the export set. diff --git a/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported.cmake b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported.cmake new file mode 100644 index 000000000..9b97918a5 --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotExported.cmake @@ -0,0 +1,7 @@ +cmake_policy(SET CMP0022 NEW) +enable_language(C) +add_library(foo STATIC empty.c) +add_library(not_exported STATIC empty.c) +target_link_libraries(foo PRIVATE not_exported) +install(TARGETS foo EXPORT Exp DESTINATION lib) +install(EXPORT Exp DESTINATION lib/cmake/Exp) diff --git a/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotTarget.cmake b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotTarget.cmake new file mode 100644 index 000000000..7122ae91e --- /dev/null +++ b/Tests/RunCMake/target_link_libraries/StaticPrivateDepNotTarget.cmake @@ -0,0 +1,6 @@ +cmake_policy(SET CMP0022 NEW) +enable_language(C) +add_library(foo STATIC empty.c) +target_link_libraries(foo PRIVATE not_a_target) +install(TARGETS foo EXPORT Exp DESTINATION lib) +install(EXPORT Exp DESTINATION lib/cmake/Exp)