diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 6376376..5f3aa97 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -671,12 +671,30 @@ std::string
 cmVisualStudio10TargetGenerator::ConvertPath(std::string const& path,
                                              bool forceRelative)
 {
+  // NOTE:
+  // Use optionalConversion = true here to allow absolute paths to be
+  // generated by default.
+  // Visual studio has a bug in it that means a maximum of 260 characters
+  // may be used to specify a source file. This means that in order to support
+  // the longest possible file paths, we need to supply absolute paths by
+  // default. Relative paths mean that this limit is reached earlier than
+  // necessary as the string: "<build file path>\<relative source path>" must
+  // be less than 260 characters. The nature of CMAKE means that these
+  // build file paths can often become quite deep and verbose. By supplying
+  // absolute paths, these paths often can be simplified by more than 100
+  // characters and avoid the limit.
+  // If the user really needs relative paths to be generated in visual studio
+  // build files, they may use the CMAKE_USE_RELATIVE_PATHS flag in their
+  // CMakeLists.txt file.
+  const bool optionalConversion = true;
+
   return forceRelative
     ? cmSystemTools::RelativePath(
       this->Makefile->GetCurrentOutputDirectory(), path.c_str())
     : this->LocalGenerator->Convert(path.c_str(),
                                     cmLocalGenerator::START_OUTPUT,
-                                    cmLocalGenerator::UNCHANGED);
+                                    cmLocalGenerator::UNCHANGED,
+                                    optionalConversion);
 }
 
 void cmVisualStudio10TargetGenerator::ConvertToWindowsSlash(std::string& s)
