Просмотр исходного кода

Ninja generator: restore correct encoding for policy CMP0181=OLD

Fixes: #26857
Marc Chevrier 10 месяцев назад
Родитель
Сommit
2e9648e0de

+ 6 - 0
Source/cmGlobalGenerator.cxx

@@ -3891,6 +3891,12 @@ cmGlobalGenerator::StripCommandStyle cmGlobalGenerator::GetStripCommandStyle(
 #endif
 }
 
+std::string cmGlobalGenerator::GetEncodedLiteral(std::string const& lit)
+{
+  std::string result = lit;
+  return this->EncodeLiteral(result);
+}
+
 void cmGlobalGenerator::AddInstallScript(std::string const& file)
 {
   this->InstallScripts.push_back(file);

+ 1 - 0
Source/cmGlobalGenerator.h

@@ -666,6 +666,7 @@ public:
   };
   StripCommandStyle GetStripCommandStyle(std::string const& strip);
 
+  std::string GetEncodedLiteral(std::string const& lit);
   virtual std::string& EncodeLiteral(std::string& lit) { return lit; }
 
   bool CheckCMP0171() const;

+ 0 - 6
Source/cmGlobalNinjaGenerator.cxx

@@ -184,12 +184,6 @@ std::string cmGlobalNinjaGenerator::EncodeRuleName(std::string const& name)
   return encoded;
 }
 
-std::string cmGlobalNinjaGenerator::GetEncodedLiteral(std::string const& lit)
-{
-  std::string result = lit;
-  return this->EncodeLiteral(result);
-}
-
 std::string& cmGlobalNinjaGenerator::EncodeLiteral(std::string& lit)
 {
   cmSystemTools::ReplaceString(lit, "$", "$$");

+ 0 - 1
Source/cmGlobalNinjaGenerator.h

@@ -77,7 +77,6 @@ public:
 
   static std::string EncodeRuleName(std::string const& name);
   std::string& EncodeLiteral(std::string& lit) override;
-  std::string GetEncodedLiteral(std::string const& lit);
   std::string EncodePath(std::string const& path);
 
   std::unique_ptr<cmLinkLineComputer> CreateLinkLineComputer(

+ 2 - 1
Source/cmLocalGenerator.cxx

@@ -2639,7 +2639,8 @@ void cmLocalGenerator::AppendFlags(std::string& flags,
       }
       CM_FALLTHROUGH;
     case cmPolicies::OLD:
-      this->AppendFlags(flags, newFlags);
+      this->AppendFlags(
+        flags, this->GetGlobalGenerator()->GetEncodedLiteral(newFlags));
       break;
     case cmPolicies::NEW:
       if (compileOrLink == cmBuildStep::Link) {

+ 2 - 0
Tests/RunCMake/CMakeLists.txt

@@ -896,6 +896,8 @@ add_RunCMake_test(target_link_libraries-LINK_GROUP -DCMAKE_SYSTEM_NAME=${CMAKE_S
                                                    -DCMAKE_IMPORT_LIBRARY_SUFFIX=${CMAKE_IMPORT_LIBRARY_SUFFIX}
                                                    -DCMAKE_LINK_LIBRARY_FLAG=${CMAKE_LINK_LIBRARY_FLAG})
 add_RunCMake_test(target_link_libraries-LINKER-prefix -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
+                                                      -DCMAKE_EXECUTABLE_FORMAT=${CMAKE_EXECUTABLE_FORMAT}
+                                                      -DCMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN=${CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN}
                                                       -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
                                                       -DCMAKE_C_COMPILER_FRONTEND_VARIANT=${CMAKE_C_COMPILER_FRONTEND_VARIANT})
 add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})

+ 4 - 0
Tests/RunCMake/target_link_libraries-LINKER-prefix/CheckRPath.cmake

@@ -0,0 +1,4 @@
+file(RPATH_CHECK FILE "${file}" RPATH "${rpath}")
+if(NOT EXISTS "${file}")
+  message(FATAL_ERROR "RPATH for ${file} did not contain the expected value")
+endif()

+ 14 - 0
Tests/RunCMake/target_link_libraries-LINKER-prefix/RunCMakeTest.cmake

@@ -57,3 +57,17 @@ if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Xcode|Visual Studio"
     endif()
   endforeach()
 endif()
+
+if(RunCMake_GENERATOR MATCHES "Makefiles|Ninja" AND
+    CMAKE_EXECUTABLE_FORMAT STREQUAL "ELF" AND CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN)
+  foreach(policy IN ITEMS OLD NEW)
+    set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/encode_literal-CMP0181-${policy}-build)
+    run_cmake_with_options(encode_literal -DCMP0181=${policy})
+
+    set(RunCMake_TEST_NO_CLEAN 1)
+    run_cmake_command(encode_literal-CMP0181-${policy} "${CMAKE_COMMAND}" --build . --target encode_literal)
+
+    unset(RunCMake_TEST_BINARY_DIR)
+    unset(RunCMake_TEST_NO_CLEAN)
+  endforeach()
+endif()

+ 15 - 0
Tests/RunCMake/target_link_libraries-LINKER-prefix/encode_literal.cmake

@@ -0,0 +1,15 @@
+
+enable_language(C)
+
+cmake_policy(SET CMP0181 ${CMP0181})
+
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-rpath=\\\$ORIGIN")
+
+add_library(encode_literal SHARED LinkOptionsLib.c)
+
+add_custom_command(TARGET encode_literal
+                   POST_BUILD
+                   COMMAND "${CMAKE_COMMAND}" "-Dfile=$<TARGET_FILE:encode_literal>"
+                                              "-Drpath=\$ORIGIN"
+                                              -P "${CMAKE_CURRENT_SOURCE_DIR}/CheckRPath.cmake"
+                    VERBATIM)