Browse Source

Merge topic 'install-namelink-no-rpath'

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

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8370
Brad King 2 years ago
parent
commit
f3e348b62e

+ 6 - 4
Source/cmInstallTargetGenerator.cxx

@@ -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;
   }
 

+ 4 - 0
Tests/RunCMake/install/RunCMakeTest.cmake

@@ -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"

+ 20 - 0
Tests/RunCMake/install/TARGETS-NAMELINK-No-Tweak.cmake

@@ -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
+  )