diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 9fff4dc62b..c020bdb86a 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/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); diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index b7ea6a9286..13526cc4de 100644 --- a/Source/cmGlobalGenerator.h +++ b/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; diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index fe07b925cd..baf92e3e69 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/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, "$", "$$"); diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 353d68b736..7e02541d9d 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/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 CreateLinkLineComputer( diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 369367150a..087c2c5ef7 100644 --- a/Source/cmLocalGenerator.cxx +++ b/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) { diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 2e00a91a9e..4dfdea5093 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/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}) diff --git a/Tests/RunCMake/target_link_libraries-LINKER-prefix/CheckRPath.cmake b/Tests/RunCMake/target_link_libraries-LINKER-prefix/CheckRPath.cmake new file mode 100644 index 0000000000..9ee403ff9e --- /dev/null +++ b/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() diff --git a/Tests/RunCMake/target_link_libraries-LINKER-prefix/RunCMakeTest.cmake b/Tests/RunCMake/target_link_libraries-LINKER-prefix/RunCMakeTest.cmake index 5cfd5193db..0f96fc0165 100644 --- a/Tests/RunCMake/target_link_libraries-LINKER-prefix/RunCMakeTest.cmake +++ b/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() diff --git a/Tests/RunCMake/target_link_libraries-LINKER-prefix/encode_literal.cmake b/Tests/RunCMake/target_link_libraries-LINKER-prefix/encode_literal.cmake new file mode 100644 index 0000000000..f65b1ac143 --- /dev/null +++ b/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=$" + "-Drpath=\$ORIGIN" + -P "${CMAKE_CURRENT_SOURCE_DIR}/CheckRPath.cmake" + VERBATIM)