diff -ru make-3.82.90.orig/config/dospaths.m4 make-3.82.90/config/dospaths.m4
--- make-3.82.90.orig/config/dospaths.m4	2010-07-13 06:20:43.000000000 +0500
+++ make-3.82.90/config/dospaths.m4	2013-08-06 18:25:05.408534700 +0500
@@ -36,3 +36,38 @@
                          [Define if the system uses DOS-style pathnames.])
     fi
   ])
+
+AC_DEFUN([pds_AC_NATIVE_DOS_PATHS],
+  [
+    AC_CACHE_CHECK([whether MSDOS-style paths are native for the system], [ac_cv_native_dos_paths],
+      [
+        dnl Some known OSes for cross-compilation
+        case $host_os in
+          msdos*)
+            maybe=yes
+            ;;
+          mingw*)
+            maybe=yes
+            ;;
+          *)
+            maybe=no
+            ;;
+        esac
+
+        AC_TRY_RUN([
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+static char buf[PATH_MAX];
+main(){getcwd(buf, PATH_MAX); exit((buf[0] && buf[1] == ':') ? 0 : 1);}
+],
+        [ac_cv_native_dos_paths=yes],
+        [ac_cv_native_dos_paths=no],
+        [ac_cv_native_dos_paths=$maybe])
+     ])
+
+    if test x"$ac_cv_native_dos_paths" = xyes; then
+      AC_DEFINE_UNQUOTED([NATIVE_DOS_PATHS], 1,
+                         [Define if DOS-style pathnames are native for the system.])
+    fi
+  ])
diff -ru make-3.82.90.orig/config.h.W32.template make-3.82.90/config.h.W32.template
--- make-3.82.90.orig/config.h.W32.template	2011-12-02 20:35:49.000000000 +0400
+++ make-3.82.90/config.h.W32.template	2013-08-08 12:35:09.651963800 +0500
@@ -95,6 +95,7 @@
 
 /* Use platform specific coding */
 #define HAVE_DOS_PATHS 1
+#define NATIVE_DOS_PATHS 1
 
 /* Define to 1 if you have the `dup2' function. */
 #define HAVE_DUP2 1
diff -ru make-3.82.90.orig/configh.dos.template make-3.82.90/configh.dos.template
--- make-3.82.90.orig/configh.dos.template	2010-08-07 13:15:45.000000000 +0500
+++ make-3.82.90/configh.dos.template	2013-08-08 12:16:50.433244700 +0500
@@ -122,3 +122,4 @@
 
 /* Grok DOS paths (drive specs and backslash path element separators) */
 #define HAVE_DOS_PATHS
+#define NATIVE_DOS_PATHS
diff -ru make-3.82.90.orig/configure.in make-3.82.90/configure.in
--- make-3.82.90.orig/configure.in	2011-12-02 20:35:49.000000000 +0400
+++ make-3.82.90/configure.in	2013-08-06 18:14:06.376534700 +0500
@@ -126,6 +126,7 @@
 
 # Check for DOS-style pathnames.
 pds_AC_DOS_PATHS
+pds_AC_NATIVE_DOS_PATHS
 
 # See if we have a standard version of gettimeofday().  Since actual
 # implementations can differ, just make sure we have the most common
diff -ru make-3.82.90.orig/function.c make-3.82.90/function.c
--- make-3.82.90.orig/function.c	2011-12-02 20:35:49.000000000 +0400
+++ make-3.82.90/function.c	2013-08-06 18:34:59.154034700 +0500
@@ -1902,15 +1902,7 @@
   return o;
 }
 #endif
-
 
-#ifdef HAVE_DOS_PATHS
-#define IS_ABSOLUTE(n) (n[0] && n[1] == ':')
-#define ROOT_LEN 3
-#else
-#define IS_ABSOLUTE(n) (n[0] == '/')
-#define ROOT_LEN 1
-#endif
 
 /* Return the absolute name of file NAME which does not contain any `.',
    `..' components nor any repeated path separators ('/').   */
@@ -1920,15 +1912,56 @@
 {
   char *dest;
   const char *start, *end, *apath_limit;
-  unsigned long root_len = ROOT_LEN;
+  unsigned long root_len;
 
   if (name[0] == '\0' || apath == NULL)
     return NULL;
 
   apath_limit = apath + GET_PATH_MAX;
 
-  if (!IS_ABSOLUTE(name))
+#ifdef HAVE_DOS_PATHS
+  if (name[0] && name[1] == ':')
     {
+      /* DOS-style absolute path */
+      root_len = 3;
+      strncpy (apath, name, root_len);
+      apath[root_len] = '\0';
+      dest = apath + root_len;
+      /* Get past the root, since we already copied it.  */
+      name += root_len;
+      if (!IS_PATHSEP(apath[2]))
+	{
+	  /* Convert d:foo into d:./foo and increase root_len.  */
+	  apath[2] = '.';
+	  apath[3] = '/';
+	  dest++;
+	  root_len++;
+	  /* strncpy above copied one character too many.  */
+	  name--;
+	}
+      else
+	apath[2] = '/';	/* make sure it's a forward slash */
+    }
+  else
+#endif
+#ifndef NATIVE_DOS_PATHS
+  if (name[0] == '/')
+    {
+      /* UNIX-style absolute path */
+      root_len = 1;
+      dest = apath;
+      *dest++ = *name++;
+      *dest = '\0';
+    }
+  else
+#endif
+    {
+      /* Relative path */
+#ifdef NATIVE_DOS_PATHS
+      root_len = 3;
+#else
+      root_len = 1;
+#endif
       /* It is unlikely we would make it until here but just to make sure. */
       if (!starting_directory)
 	return NULL;
@@ -1955,28 +1988,6 @@
 
       dest = strchr (apath, '\0');
     }
-  else
-    {
-      strncpy (apath, name, root_len);
-      apath[root_len] = '\0';
-      dest = apath + root_len;
-      /* Get past the root, since we already copied it.  */
-      name += root_len;
-#ifdef HAVE_DOS_PATHS
-      if (!IS_PATHSEP(apath[2]))
-	{
-	  /* Convert d:foo into d:./foo and increase root_len.  */
-	  apath[2] = '.';
-	  apath[3] = '/';
-	  dest++;
-	  root_len++;
-	  /* strncpy above copied one character too many.  */
-	  name--;
-	}
-      else
-	apath[2] = '/';	/* make sure it's a forward slash */
-#endif
-    }
 
   for (start = end = name; *start != '\0'; start = end)
     {
diff -ru make-3.82.90.orig/make.h make-3.82.90/make.h
--- make-3.82.90.orig/make.h	2011-12-02 20:35:49.000000000 +0400
+++ make-3.82.90/make.h	2013-08-06 18:14:29.308034700 +0500
@@ -317,7 +317,7 @@
 
 /* Handle other OSs.  */
 #ifndef PATH_SEPARATOR_CHAR
-# if defined(HAVE_DOS_PATHS)
+# if defined(NATIVE_DOS_PATHS)
 #  define PATH_SEPARATOR_CHAR ';'
 # elif defined(VMS)
 #  define PATH_SEPARATOR_CHAR ','
