install(TARGETS): Do not apply installation tweaks to NAMELINK files

These files are symlinks to the real binaries, and we already apply
tweaks to those.  Previously we generated installation tweak code
guarded by a `NOT IS_SYMLINK` condition that is never true.  Drop the
code altogether.

Add a test covering the motivating use case, in which a `POST_BUILD`
step modifies the namelink file to not actually be a symlink.

Fixes: #24647
This commit is contained in:
Brad King
2023-03-28 11:38:29 -04:00
parent f4b8176447
commit 9c14f14848
3 changed files with 30 additions and 4 deletions

View File

@@ -529,7 +529,7 @@ void cmInstallTargetGenerator::AddInstallNamePatchRule(
std::ostream& os, Indent indent, const std::string& config,
std::string const& toDestDirPath)
{
if (this->ImportLibrary ||
if (this->ImportLibrary || this->NamelinkMode == NamelinkModeOnly ||
!(this->Target->GetType() == cmStateEnums::SHARED_LIBRARY ||
this->Target->GetType() == cmStateEnums::MODULE_LIBRARY ||
this->Target->GetType() == cmStateEnums::EXECUTABLE)) {
@@ -626,7 +626,8 @@ void cmInstallTargetGenerator::AddRPathCheckRule(
std::string const& toDestDirPath)
{
// Skip the chrpath if the target does not need it.
if (this->ImportLibrary || !this->Target->IsChrpathUsed(config)) {
if (this->ImportLibrary || this->NamelinkMode == NamelinkModeOnly ||
!this->Target->IsChrpathUsed(config)) {
return;
}
// Skip if on Apple
@@ -677,7 +678,8 @@ void cmInstallTargetGenerator::AddChrpathPatchRule(
std::string const& toDestDirPath)
{
// Skip the chrpath if the target does not need it.
if (this->ImportLibrary || !this->Target->IsChrpathUsed(config)) {
if (this->ImportLibrary || this->NamelinkMode == NamelinkModeOnly ||
!this->Target->IsChrpathUsed(config)) {
return;
}
@@ -816,7 +818,7 @@ void cmInstallTargetGenerator::AddStripRule(std::ostream& os, Indent indent,
// don't strip static and import libraries, because it removes the only
// symbol table they have so you can't link to them anymore
if (this->Target->GetType() == cmStateEnums::STATIC_LIBRARY ||
this->ImportLibrary) {
this->ImportLibrary || this->NamelinkMode == NamelinkModeOnly) {
return;
}

View File

@@ -121,6 +121,10 @@ run_install_test(FILES-OPTIONAL)
run_install_test(DIRECTORY-OPTIONAL)
run_install_test(TARGETS-Defaults)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
run_install_test(TARGETS-NAMELINK-No-Tweak)
endif()
set(RunCMake_TEST_OPTIONS
"-DCMAKE_INSTALL_BINDIR:PATH=mybin"
"-DCMAKE_INSTALL_LIBDIR:PATH=mylib"

View File

@@ -0,0 +1,20 @@
enable_language(C)
add_library(foo SHARED obj1.c)
set_target_properties(foo PROPERTIES
VERSION 1.0
SOVERSION 1
INSTALL_RPATH "$ORIGIN"
)
install(TARGETS foo DESTINATION lib)
# Replace the .so "namelink" symlink with a linker script.
# It is no longer a symlink, so any install tweaks would break.
# This verifies that no install tweaks are added for the namelink.
set(linker_script "INPUT($<TARGET_SONAME_FILE_NAME:foo>)")
add_custom_command(TARGET foo POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E remove "$<TARGET_LINKER_FILE:foo>"
COMMAND "${CMAKE_COMMAND}" -E echo "${linker_script}" > "$<TARGET_LINKER_FILE:foo>"
COMMENT "Generating linker script: '${linker_script}' as file $<TARGET_LINKER_FILE:foo>"
VERBATIM
)