From de766bc7e0f4a856abc712e64e4248e966ced37f Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 24 Feb 2022 18:12:22 -0500 Subject: Xcode: Fix support for source tree symlink inside build tree Since commit 61495cdaae (Fix Xcode project references to the source tree, 2009-09-22, v2.8.0~43) we force source file references to use relative paths from the source tree. If the source tree path is a symbolic link inside the build tree, the relative `../` sequence goes to the wrong place. The problem with debug breakpoints motivating that change does not seem to occur in modern Xcode versions, so update the logic to use a relative path only when it does not need to start in any `../` sequence. --- Source/cmGlobalXCodeGenerator.cxx | 10 ++++++---- Tests/RunCMake/SymlinkTrees/RunCMakeTest.cmake | 6 ------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index b752c41..1e6624e 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -4695,10 +4695,12 @@ std::string cmGlobalXCodeGenerator::ConvertToRelativeForMake( std::string cmGlobalXCodeGenerator::RelativeToSource(const std::string& p) { - // We force conversion because Xcode breakpoints do not work unless - // they are in a file named relative to the source tree. - return cmSystemTools::ForceToRelativePath( - this->CurrentRootGenerator->GetCurrentSourceDirectory(), p); + std::string const& rootSrc = + this->CurrentRootGenerator->GetCurrentSourceDirectory(); + if (cmSystemTools::IsSubDirectory(p, rootSrc)) { + return cmSystemTools::ForceToRelativePath(rootSrc, p); + } + return p; } std::string cmGlobalXCodeGenerator::RelativeToBinary(const std::string& p) diff --git a/Tests/RunCMake/SymlinkTrees/RunCMakeTest.cmake b/Tests/RunCMake/SymlinkTrees/RunCMakeTest.cmake index 304e9de..3f3aafe 100644 --- a/Tests/RunCMake/SymlinkTrees/RunCMakeTest.cmake +++ b/Tests/RunCMake/SymlinkTrees/RunCMakeTest.cmake @@ -82,12 +82,6 @@ function (run_symlink_test case src bin src_from_bin bin_from_src) message(STATUS "${case}-exe-build - SKIPPED") return() endif() - if(case MATCHES "^(different|asymmetric)-src_in_bin$" AND RunCMake_GENERATOR STREQUAL "Xcode") - # FIXME: The Xcode generator computes an incorrect relative path. - message(STATUS "${case}-exe - SKIPPED") - message(STATUS "${case}-exe-build - SKIPPED") - return() - endif() unset(RunCMake_TEST_VARIANT_DESCRIPTION) run_symlink_test_case("${case}-exe" -S "${src}" -B "${bin}") if (RunCMake_GENERATOR MATCHES "Xcode") -- cgit v0.12