Browse Source

Merge topic 'windows-symlink-dir'

5101d586c4 Windows: Prefer junctions for directory symlinks

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7013
Brad King 3 years ago
parent
commit
63a461d818
1 changed files with 12 additions and 2 deletions
  1. 12 2
      Source/cmSystemTools.cxx

+ 12 - 2
Source/cmSystemTools.cxx

@@ -3314,12 +3314,22 @@ cmsys::Status cmSystemTools::CreateSymlink(std::string const& origName,
   uv_fs_t req;
   int flags = 0;
 #if defined(_WIN32)
-  if (cmsys::SystemTools::FileIsDirectory(origName)) {
-    flags |= UV_FS_SYMLINK_DIR;
+  bool const isDir = cmsys::SystemTools::FileIsDirectory(origName);
+  if (isDir) {
+    flags |= UV_FS_SYMLINK_JUNCTION;
   }
 #endif
   int err = uv_fs_symlink(nullptr, &req, origName.c_str(), newName.c_str(),
                           flags, nullptr);
+#if defined(_WIN32)
+  if (err && uv_fs_get_system_error(&req) == ERROR_NOT_SUPPORTED && isDir) {
+    // Try fallback to symlink for network (requires additional permissions).
+    flags ^= UV_FS_SYMLINK_JUNCTION | UV_FS_SYMLINK_DIR;
+    err = uv_fs_symlink(nullptr, &req, origName.c_str(), newName.c_str(),
+                        flags, nullptr);
+  }
+#endif
+
   cmsys::Status status;
   if (err) {
 #if defined(_WIN32)