From 83630d491888705dc650f2ae62de9943181b50df Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 May 2018 12:52:38 -0400 Subject: cmSystemTools: Revert GetRealPath implementation on Windows The use of `uv_fs_realpath` introduced by commit v3.11.0-rc1~445^2~1 (cmSystemTools: Implement GetRealPath on Windows, 2017-10-02) causes `subst` drives to be expanded on Windows, breaking existing use cases. Revert its use until an alternative implementation can be chosen. Preserve the behavior introduced by commit v3.11.0-rc1~445^2 (cmTimestamp: For symlinks switch to timestamp of resolved path, 2017-10-02) by retaining use of `uv_fs_realpath` in a function of a different name. Fixes: #18033 Issue: #17206 --- Help/release/3.11.rst | 7 +++++++ Source/cmSystemTools.cxx | 10 +++++++--- Source/cmSystemTools.h | 10 ++++++---- Source/cmTimestamp.cxx | 3 ++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Help/release/3.11.rst b/Help/release/3.11.rst index 971b3e2..214da0d 100644 --- a/Help/release/3.11.rst +++ b/Help/release/3.11.rst @@ -298,3 +298,10 @@ Changes made since CMake 3.11.0 include the following. :prop_sf:`SKIP_AUTOUIC` on their generated files. These files never need to be processed by moc or uic, and we must say so explicitly to account for policy :policy:`CMP0071`. + +3.11.3 +------ + +* CMake 3.11.0 introduced support for resolving symbolic links on + Windows in code paths that typically do so on UNIX. This has been + reverted due to breakage on ``subst`` drives. diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index eeb73c3..6f326de 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -949,10 +949,12 @@ cmSystemTools::WindowsFileRetry cmSystemTools::GetWindowsFileRetry() } return retry; } +#endif -std::string cmSystemTools::GetRealPath(const std::string& path, - std::string* errorMessage) +std::string cmSystemTools::GetRealPathResolvingWindowsSubst( + const std::string& path, std::string* errorMessage) { +#ifdef _WIN32 // uv_fs_realpath uses Windows Vista API so fallback to kwsys if not found std::string resolved_path; uv_fs_t req; @@ -981,8 +983,10 @@ std::string cmSystemTools::GetRealPath(const std::string& path, resolved_path = path; } return resolved_path; -} +#else + return cmsys::SystemTools::GetRealPath(path, errorMessage); #endif +} void cmSystemTools::InitializeLibUV() { diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index a53afde..4390c86 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -500,12 +500,14 @@ public: unsigned int Delay; }; static WindowsFileRetry GetWindowsFileRetry(); - - /** Get the real path for a given path, removing all symlinks. */ - static std::string GetRealPath(const std::string& path, - std::string* errorMessage = 0); #endif + /** Get the real path for a given path, removing all symlinks. + This variant of GetRealPath also works on Windows but will + resolve subst drives too. */ + static std::string GetRealPathResolvingWindowsSubst( + const std::string& path, std::string* errorMessage = nullptr); + /** Perform one-time initialization of libuv. */ static void InitializeLibUV(); diff --git a/Source/cmTimestamp.cxx b/Source/cmTimestamp.cxx index f1e9283..14cf6e9 100644 --- a/Source/cmTimestamp.cxx +++ b/Source/cmTimestamp.cxx @@ -33,7 +33,8 @@ std::string cmTimestamp::FileModificationTime(const char* path, const std::string& formatString, bool utcFlag) { - std::string real_path = cmSystemTools::GetRealPath(path); + std::string real_path = + cmSystemTools::GetRealPathResolvingWindowsSubst(path); if (!cmsys::SystemTools::FileExists(real_path)) { return std::string(); -- cgit v0.12