diff --git i/config/prep_buildtree w/config/prep_buildtree
index a0eabd3dee2..d26de429e61 100644
--- i/config/prep_buildtree
+++ w/config/prep_buildtree
@@ -26,19 +26,30 @@ buildtree=`cd ${2:-'.'} && pwd`
 # If we did, it would interfere with installation of prebuilt docs from
 # the source tree, if a VPATH build is done from a distribution tarball.
 # See bug #5595.
-for item in `find "$sourcetree" -type d \( \( -name CVS -prune \) -o \( -name .git -prune \) -o -print \) | grep -v "$sourcetree/doc/src/sgml/\+"`; do
-    subdir=`expr "$item" : "$sourcetree\(.*\)"`
-    if test ! -d "$buildtree/$subdir"; then
-        mkdir -p "$buildtree/$subdir" || exit 1
-    fi
-done
+
+mkdir -p $(
+    for item in `find "$sourcetree" -type d \( \( -name CVS -prune \) -o \( -name .git -prune \) -o -print \) | grep -v "$sourcetree/doc/src/sgml/\+"`; do
+        subdir=${item#$sourcetree}
+
+        if test ! -d "$buildtree/$subdir"; then
+            echo "$buildtree/$subdir"
+        fi
+    done
+)
 
 for item in `find "$sourcetree" -name Makefile -print -o -name GNUmakefile -print | grep -v "$sourcetree/doc/src/sgml/images/"`; do
-    filename=`expr "$item" : "$sourcetree\(.*\)"`
-    if test ! -f "${item}.in"; then
-        if cmp "$item" "$buildtree/$filename" >/dev/null 2>&1; then : ; else
-            ln -fs "$item" "$buildtree/$filename" || exit 1
-        fi
+    filename=${item#$sourcetree}
+
+    if test -f "${item}.in"; then
+        continue;
+    fi
+
+    if test ! -e "$buildtree/$filename"; then
+        ln -s "$item" "$buildtree/$filename" || exit 1;
+    elif cmp "$item" "$buildtree/$filename" >/dev/null 2>&1; then
+        : ;
+    else
+        ln -fs "$item" "$buildtree/$filename" || exit 1
     fi
 done
 
