diff --git a/SystemTools.cxx b/SystemTools.cxx
index 106afe5070e27983c903f995745f4626592d9ed3..52f509ac77eee4e198d8f57ef091044c45bc8e67 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -3344,15 +3344,20 @@ std::string SystemTools::RelativePath(const std::string& local,
 static std::string GetCasePathName(std::string const& pathIn)
 {
   std::string casePath;
-  std::vector<std::string> path_components;
-  SystemTools::SplitPath(pathIn, path_components);
-  if (path_components[0].empty()) // First component always exists.
-  {
-    // Relative paths cannot be converted.
+
+  // First check if the file is relative. We don't fix relative paths since the
+  // real case depends on the root directory and the given path fragment may
+  // have meaning elsewhere in the project.
+  if (!SystemTools::FileIsFullPath(pathIn)) {
+    // This looks unnecessary, but it allows for the return value optimization
+    // since all return paths return the same local variable.
     casePath = pathIn;
     return casePath;
   }
 
+  std::vector<std::string> path_components;
+  SystemTools::SplitPath(pathIn, path_components);
+
   // Start with root component.
   std::vector<std::string>::size_type idx = 0;
   casePath = path_components[idx++];