target_link_libraries: Fix out-of-dir calls with debug/optimized keywords

In commit a1ad0a699b (target_link_libraries: Allow use with targets in
other directories, 2018-09-07, v3.13.0-rc1~94^2) we added use of `<...>`
to encode a directory id, but the closing `>` can incorrectly terminate
a surrounding generator expression early.  Encode the directory id using
`(...)` instead.

Fixes: #20202
This commit is contained in:
Brad King
2020-01-10 10:50:40 -05:00
parent c40229968c
commit 09721ca078
7 changed files with 8 additions and 8 deletions

View File

@@ -2,8 +2,8 @@
A call to :command:`target_link_libraries(<target> ...)` may update this A call to :command:`target_link_libraries(<target> ...)` may update this
property on ``<target>``. If ``<target>`` was not created in the same property on ``<target>``. If ``<target>`` was not created in the same
directory as the call then :command:`target_link_libraries` will add a directory as the call then :command:`target_link_libraries` will add a
suffix of the form ``::@<directory-id>`` to each entry, where the suffix of the form ``::@(directory-id)`` to each entry, where the
``::@`` is a separator and the ``<directory-id>`` is unspecified. ``::@`` is a separator and the ``(directory-id)`` is unspecified.
This tells the generators that the named libraries must be looked up in This tells the generators that the named libraries must be looked up in
the scope of the caller rather than in the scope in which the the scope of the caller rather than in the scope in which the
``<target>`` was created. Valid directory ids are stripped on export ``<target>`` was created. Valid directory ids are stripped on export

View File

@@ -139,7 +139,7 @@ cmDirectoryId cmMakefile::GetDirectoryId() const
// If we ever need to expose this to CMake language code we should // If we ever need to expose this to CMake language code we should
// add a read-only property in cmMakefile::GetProperty. // add a read-only property in cmMakefile::GetProperty.
char buf[32]; char buf[32];
sprintf(buf, "<%p>", sprintf(buf, "(%p)",
static_cast<void const*>(this)); // cast avoids format warning static_cast<void const*>(this)); // cast avoids format warning
return std::string(buf); return std::string(buf);
} }

View File

@@ -2,7 +2,7 @@ add_executable(SubDirB SubDirB.c)
# Link to a target imported in this directory that would not normally # Link to a target imported in this directory that would not normally
# be visible to the directory in which TopDir is defined. # be visible to the directory in which TopDir is defined.
target_link_libraries(TopDir PUBLIC SameNameImported) target_link_libraries(TopDir PUBLIC debug SameNameImported optimized SameNameImported)
#FIXME: Demonstrate known issue #20204. #FIXME: Demonstrate known issue #20204.
#target_link_libraries(TopDir PUBLIC "$<1:SameNameImported;SameNameImported>") #target_link_libraries(TopDir PUBLIC "$<1:SameNameImported;SameNameImported>")

View File

@@ -1 +1 @@
-- INTERFACE_LINK_LIBRARIES='foo::@<[Xx0-9A-Fa-f]+>' -- INTERFACE_LINK_LIBRARIES='foo::@\([Xx0-9A-Fa-f]+\)'

View File

@@ -1,5 +1,5 @@
^CMake Error at CMP0079-link-NEW-bogus.cmake:[0-9]+ \(add_executable\): ^CMake Error at CMP0079-link-NEW-bogus.cmake:[0-9]+ \(add_executable\):
Target "top" links to target "foo::@<0xdeadbeef>" but the target was not Target "top" links to target "foo::@\(0xdeadbeef\)" but the target was not
found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or found. Perhaps a find_package\(\) call is missing for an IMPORTED target, or
an ALIAS target is missing\? an ALIAS target is missing\?
Call Stack \(most recent call first\): Call Stack \(most recent call first\):

View File

@@ -3,4 +3,4 @@ cmake_policy(SET CMP0079 NEW)
enable_language(C) enable_language(C)
add_executable(top empty.c) add_executable(top empty.c)
set_property(TARGET top APPEND PROPERTY LINK_LIBRARIES "foo::@<0xdeadbeef>") set_property(TARGET top APPEND PROPERTY LINK_LIBRARIES "foo::@(0xdeadbeef)")

View File

@@ -1 +1 @@
-- LINK_LIBRARIES='foo::@<[Xx0-9A-Fa-f]+>' -- LINK_LIBRARIES='foo::@\([Xx0-9A-Fa-f]+\)'