This patch is a combination of the following commits::

  https://git.samba.org/?p=ccache.git;a=commit;h=b5d63f81c1a83fd4c50b769a96a04f581b7db70c
  https://git.samba.org/?p=ccache.git;a=commit;h=a11f5688748ecb49f590b3f4bc0e9b3458f9a56f
  https://git.samba.org/?p=ccache.git;a=commit;h=5a9322c56ed0cd16255966e99077843aae57ab3e

from the general discussion at
http://comments.gmane.org/gmane.comp.compilers.ccache/1089

--- a/test.sh
+++ b/test.sh
@@ -562,6 +562,12 @@
 EOF
     backdate test1.h test2.h test3.h
 
+    $COMPILER -c -Wp,-MD,expected.d test.c
+    expected_d_content=`cat expected.d`
+
+    $COMPILER -c -Wp,-MMD,expected_mmd.d test.c
+    expected_mmd_d_content=`cat expected_mmd.d`
+
     ##################################################################
     # First compilation is a miss.
     testname="first compilation"
@@ -677,7 +683,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     rm -f other.d
 
@@ -685,7 +691,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     rm -f other.d
 
@@ -698,7 +704,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_mmd_d_content"
 
     rm -f other.d
 
@@ -706,7 +712,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_mmd_d_content"
 
     rm -f other.d
 
@@ -760,7 +766,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     rm -f test.d
 
@@ -768,7 +774,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     ##################################################################
     # Check the scenario of running a ccache with direct mode on a cache
@@ -780,7 +786,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     rm -f test.d
 
@@ -788,7 +794,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 1
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     rm -f test.d
 
@@ -796,7 +802,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 2
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     rm -f test.d
 
@@ -804,7 +810,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 2
     checkstat 'cache miss' 1
-    checkfile test.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile test.d "$expected_d_content"
 
     ##################################################################
     # Check that -MF works.
@@ -815,7 +821,7 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     rm -f other.d
 
@@ -823,7 +829,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     ##################################################################
     # Check that a missing .d file in the cache is handled correctly.
@@ -835,13 +841,13 @@
     checkstat 'cache hit (direct)' 0
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     $CCACHE $COMPILER -c -MD test.c
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     find $CCACHE_DIR -name '*.d' -exec rm -f '{}' \;
 
@@ -849,7 +855,7 @@
     checkstat 'cache hit (direct)' 1
     checkstat 'cache hit (preprocessed)' 1
     checkstat 'cache miss' 1
-    checkfile other.d "test.o: test.c test1.h test3.h test2.h"
+    checkfile other.d "$expected_d_content"
 
     ##################################################################
     # Check that stderr from both the preprocessor and the compiler is emitted