[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#831426: marked as done (jessie-pu: package ccache/3.1.12-1)



Your message dated Sat, 17 Sep 2016 13:08:06 +0100
with message-id <1474114086.2011.126.camel@adam-barratt.org.uk>
and subject line Closing p-u bugs for updates in 8.6
has caused the Debian Bug report #831426,
regarding jessie-pu: package ccache/3.1.12-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
831426: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=831426
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
User: release.debian.org@packages.debian.org
Usertags: pu
Tags: jessie
Severity: normal

As suggested by Stefan Fritsch in #829088 ("ccache may silently
miscompile symlinked source files"), I propose to upgrade ccache from
3.1.10 to 3.1.12 in jessie. I'm the upstream maintainer of ccache as
well and I made the 3.1.12 release specifically for Debian stable to fix
#829088. Upgrading from 3.1.10 to 3.1.12 would also include three other
bug fixes that I think would be good to have in jessie.

Here's a summary of the bug fixes:

>From 3.1.12:

- Fixes a bug where (due to ccache rewriting paths) the compiler could
  choose incorrect include files if CCACHE_BASEDIR is used and the
  source file path is absolute and is a symlink. (Closes: #829088.)

>From 3.1.11:

- Fixes a bug which could result in false cache hits when source code
  contains '"' followed by " /*" or " //" (with variations).
- Makes hash of cached result created with and without CCACHE_CPP2
  different. This makes it possible to rebuild with CCACHE_CPP2 set
  without having to clear the cache to get new results.
- Fixes a bug which could result in "No such file or directory" messages
  in the ccache log when the cache directory doesn't exist.

See attachment for the proposed update diff.

-- Joel
diff -Nru ccache-3.1.10/AUTHORS.html ccache-3.1.12/AUTHORS.html
--- ccache-3.1.10/AUTHORS.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/AUTHORS.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>ccache authors</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -915,8 +915,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2014-10-19 19:05:10 CEST
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/INSTALL.html ccache-3.1.12/INSTALL.html
--- ccache-3.1.10/INSTALL.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/INSTALL.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>ccache installation</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -843,8 +843,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2014-10-19 19:02:09 CEST
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/LICENSE.html ccache-3.1.12/LICENSE.html
--- ccache-3.1.10/LICENSE.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/LICENSE.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>ccache copyright and license</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -776,7 +776,7 @@
 <div class="listingblock">
 <div class="content">
 <pre><code>  Copyright (C) 2002-2007 Andrew Tridgell
-  Copyright (C) 2009-2011 Joel Rosdahl</code></pre>
+  Copyright (C) 2009-2016 Joel Rosdahl</code></pre>
 </div></div>
 </div>
 </div>
@@ -1210,8 +1210,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2014-10-19 19:02:09 CEST
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/LICENSE.txt ccache-3.1.12/LICENSE.txt
--- ccache-3.1.10/LICENSE.txt	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/LICENSE.txt	2016-07-12 21:34:50.000000000 +0200
@@ -38,7 +38,7 @@
 
 -------------------------------------------------------------------------------
   Copyright (C) 2002-2007 Andrew Tridgell
-  Copyright (C) 2009-2011 Joel Rosdahl
+  Copyright (C) 2009-2016 Joel Rosdahl
 -------------------------------------------------------------------------------
 
 
diff -Nru ccache-3.1.10/MANUAL.html ccache-3.1.12/MANUAL.html
--- ccache-3.1.10/MANUAL.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/MANUAL.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>CCACHE(1)</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -2014,8 +2014,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2014-10-19 19:02:09 CEST
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/NEWS.html ccache-3.1.12/NEWS.html
--- ccache-3.1.10/NEWS.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/NEWS.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>ccache news</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -742,6 +742,55 @@
 </div>
 <div id="content">
 <div class="sect1">
+<h2 id="_ccache_3_1_12">ccache 3.1.12</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Release date: 2016-07-12</p></div>
+<div class="sect2">
+<h3 id="_bug_fixes">Bug fixes</h3>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed a bug where (due to ccache rewriting paths) the compiler could choose
+  incorrect include files if <code>CCACHE_BASEDIR</code> is used and the source file path
+  is absolute and is a symlink.
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_ccache_3_1_11">ccache 3.1.11</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Release date: 2015-03-07</p></div>
+<div class="sect2">
+<h3 id="_bug_fixes_2">Bug fixes</h3>
+<div class="ulist"><ul>
+<li>
+<p>
+Fixed bug which could result in false cache hits when source code contains
+  <code>'"'</code> followed by <code>" /*"</code> or <code>" //"</code> (with variations).
+</p>
+</li>
+<li>
+<p>
+Made hash of cached result created with and without <code>CCACHE_CPP2</code> different.
+  This makes it possible to rebuild with <code>CCACHE_CPP2</code> set without having to
+  clear the cache to get new results.
+</p>
+</li>
+<li>
+<p>
+Don&#8217;t try to reset a non-existing stats file. This avoids &#8220;No such file or
+  directory&#8221; messages in the ccache log when the cache directory doesn&#8217;t
+  exist.
+</p>
+</li>
+</ul></div>
+</div>
+</div>
+</div>
+<div class="sect1">
 <h2 id="_ccache_3_1_10">ccache 3.1.10</h2>
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2014-10-19</p></div>
@@ -785,7 +834,7 @@
 <p>
 To enable support for precompiled headers (PCH), <code>CCACHE_SLOPPINESS</code> now also
   needs to include the new <code>pch_defines</code> sloppiness. This is because ccache
-  can&#8217;t detect changes in the source code when only `#define`s have been
+  can&#8217;t detect changes in the source code when only defined macros have been
   changed.
 </p>
 </li>
@@ -798,7 +847,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes">Bug fixes</h3>
+<h3 id="_bug_fixes_3">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -838,7 +887,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2013-01-06</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_2">Bug fixes</h3>
+<h3 id="_bug_fixes_4">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -909,7 +958,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes_3">Bug fixes</h3>
+<h3 id="_bug_fixes_5">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -957,7 +1006,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2012-01-08</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_4">Bug fixes</h3>
+<h3 id="_bug_fixes_6">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1040,7 +1089,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes_5">Bug fixes</h3>
+<h3 id="_bug_fixes_7">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1093,7 +1142,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes_6">Bug fixes</h3>
+<h3 id="_bug_fixes_8">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1126,7 +1175,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2011-01-09</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_7">Bug fixes</h3>
+<h3 id="_bug_fixes_9">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1159,7 +1208,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2010-11-28</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_8">Bug fixes</h3>
+<h3 id="_bug_fixes_10">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1186,7 +1235,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2010-11-21</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_9">Bug fixes</h3>
+<h3 id="_bug_fixes_11">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1234,7 +1283,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2010-11-07</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_10">Bug fixes</h3>
+<h3 id="_bug_fixes_12">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1356,7 +1405,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes_11">Bug fixes</h3>
+<h3 id="_bug_fixes_13">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1442,7 +1491,7 @@
 <div class="sectionbody">
 <div class="paragraph"><p>Release date: 2010-07-15</p></div>
 <div class="sect2">
-<h3 id="_bug_fixes_12">Bug fixes</h3>
+<h3 id="_bug_fixes_14">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1631,7 +1680,7 @@
 </ul></div>
 </div>
 <div class="sect2">
-<h3 id="_bug_fixes_13">Bug fixes</h3>
+<h3 id="_bug_fixes_15">Bug fixes</h3>
 <div class="ulist"><ul>
 <li>
 <p>
@@ -1776,8 +1825,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2014-10-19 19:03:56 CEST
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/NEWS.txt ccache-3.1.12/NEWS.txt
--- ccache-3.1.10/NEWS.txt	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/NEWS.txt	2016-07-12 21:34:50.000000000 +0200
@@ -2,6 +2,39 @@
 ===========
 
 
+ccache 3.1.12
+-------------
+Release date: 2016-07-12
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a bug where (due to ccache rewriting paths) the compiler could choose
+  incorrect include files if `CCACHE_BASEDIR` is used and the source file path
+  is absolute and is a symlink.
+
+
+ccache 3.1.11
+-------------
+Release date: 2015-03-07
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed bug which could result in false cache hits when source code contains
+  `'"'` followed by `" /*"` or `" //"` (with variations).
+
+- Made hash of cached result created with and without `CCACHE_CPP2` different.
+  This makes it possible to rebuild with `CCACHE_CPP2` set without having to
+  clear the cache to get new results.
+
+- Don't try to reset a non-existing stats file. This avoids ``No such file or
+  directory'' messages in the ccache log when the cache directory doesn't
+  exist.
+
+
 ccache 3.1.10
 -------------
 Release date: 2014-10-19
@@ -27,7 +60,7 @@
 
 - To enable support for precompiled headers (PCH), `CCACHE_SLOPPINESS` now also
   needs to include the new `pch_defines` sloppiness. This is because ccache
-  can't detect changes in the source code when only `#define`s have been
+  can't detect changes in the source code when only defined macros have been
   changed.
 
 - Stale files in the internal temporary directory (`<ccache_dir>/tmp`) are now
diff -Nru ccache-3.1.10/README.html ccache-3.1.12/README.html
--- ccache-3.1.10/README.html	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/README.html	2016-07-12 21:34:50.000000000 +0200
@@ -734,7 +734,7 @@
 <body class="article">
 <div id="header">
 <h1>ccache README</h1>
-<span id="revnumber">version 3.1.10</span>
+<span id="revnumber">version 3.1.12</span>
 <div id="toc">
   <div id="toctitle">Table of Contents</div>
   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
@@ -830,8 +830,9 @@
 <div id="footnotes"><hr /></div>
 <div id="footer">
 <div id="footer-text">
-Version 3.1.10<br />
-Last updated 2012-11-07 19:42:42 CET
+Version 3.1.12<br />
+Last updated
+ 2016-07-12 21:34:27 CEST
 </div>
 </div>
 </body>
diff -Nru ccache-3.1.10/ccache.1 ccache-3.1.12/ccache.1
--- ccache-3.1.10/ccache.1	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/ccache.1	2016-07-12 21:34:50.000000000 +0200
@@ -2,12 +2,12 @@
 .\"     Title: ccache
 .\"    Author: [see the "Author" section]
 .\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\"      Date: 10/19/2014
+.\"      Date: 07/12/2016
 .\"    Manual: ccache Manual
-.\"    Source: ccache 3.1.10
+.\"    Source: ccache 3.1.12
 .\"  Language: English
 .\"
-.TH "CCACHE" "1" "10/19/2014" "ccache 3\&.1\&.10" "ccache Manual"
+.TH "CCACHE" "1" "07/12/2016" "ccache 3\&.1\&.12" "ccache Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -Nru ccache-3.1.10/ccache.c ccache-3.1.12/ccache.c
--- ccache-3.1.10/ccache.c	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/ccache.c	2016-07-12 21:34:50.000000000 +0200
@@ -2,7 +2,7 @@
  * ccache -- a fast C/C++ compiler cache
  *
  * Copyright (C) 2002-2007 Andrew Tridgell
- * Copyright (C) 2009-2014 Joel Rosdahl
+ * Copyright (C) 2009-2016 Joel Rosdahl
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -36,7 +36,7 @@
 MYNAME " version %s\n"
 "\n"
 "Copyright (C) 2002-2007 Andrew Tridgell\n"
-"Copyright (C) 2009-2011 Joel Rosdahl\n"
+"Copyright (C) 2009-2016 Joel Rosdahl\n"
 "\n"
 "This program is free software; you can redistribute it and/or modify it under\n"
 "the terms of the GNU General Public License as published by the Free Software\n"
@@ -878,6 +878,8 @@
 		 */
 		cpp_stderr = path_stderr;
 	} else {
+		hash_delimiter(hash, "runsecondcpp");
+		hash_string(hash, "false");
 		free(path_stderr);
 	}
 
@@ -1745,8 +1747,17 @@
 			goto out;
 		}
 
-		/* Rewrite to relative to increase hit rate. */
-		input_file = make_relative_path(x_strdup(argv[i]));
+		lstat(argv[i], &st);
+		if (S_ISLNK(st.st_mode)) {
+			/* Don't rewrite source file path if it's a symlink since
+			   make_relative_path resolves symlinks using realpath(3) and this leads
+			   to potentially choosing incorrect relative header files. See the
+			   "symlink to source file" test. */
+			input_file = x_strdup(argv[i]);
+		} else {
+			/* Rewrite to relative to increase hit rate. */
+			input_file = make_relative_path(x_strdup(argv[i]));
+		}
 	}
 
 	if (!input_file) {
diff -Nru ccache-3.1.10/debian/changelog ccache-3.1.12/debian/changelog
--- ccache-3.1.10/debian/changelog	2014-10-22 21:21:46.000000000 +0200
+++ ccache-3.1.12/debian/changelog	2016-07-15 19:54:06.000000000 +0200
@@ -1,3 +1,20 @@
+ccache (3.1.12-1) stable; urgency=medium
+
+  * New upstream release 3.1.12 containing important bug fixes (and only
+    bug fixes) made since 3.1.10:
+    - Fixes a bug where (due to ccache rewriting paths) the compiler could
+      choose incorrect include files if CCACHE_BASEDIR is used and the
+      source file path is absolute and is a symlink. (Closes: #829088.)
+    - Fixes a bug which could result in false cache hits when source code
+      contains '"' followed by " /*" or " //" (with variations).
+    - Makes hash of cached result created with and without CCACHE_CPP2
+      different. This makes it possible to rebuild with CCACHE_CPP2 set
+      without having to clear the cache to get new results.
+    - Fixes a bug which could result in "No such file or directory"
+      messages in the ccache log when the cache directory doesn't exist.
+
+ -- Joel Rosdahl <joel@debian.org>  Fri, 15 Jul 2016 19:47:17 +0200
+
 ccache (3.1.10-1) unstable; urgency=medium
 
   * Update Vcs-git and Vcs-Browser to use anonscm.debian.org
@@ -390,4 +407,3 @@
   * Initial Release.
 
  -- Paul Russell <prussell@debian.org>  Sun, 31 Mar 2002 14:08:57 +0200
-
diff -Nru ccache-3.1.10/hashutil.c ccache-3.1.12/hashutil.c
--- ccache-3.1.10/hashutil.c	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/hashutil.c	2016-07-12 21:34:50.000000000 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010, 2012 Joel Rosdahl
+ * Copyright (C) 2009-2015 Joel Rosdahl
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -18,6 +18,7 @@
 
 #include "ccache.h"
 #include "hashutil.h"
+#include "macroskip.h"
 #include "murmurhashneutral2.h"
 
 unsigned
@@ -56,124 +57,82 @@
 	} while (0)
 
 /*
- * Hash a string ignoring comments. Returns a bitmask of HASH_SOURCE_CODE_*
- * results.
+ * Search for the strings "__DATE__" and "__TIME__" in str.
+ *
+ * Returns a bitmask with HASH_SOURCE_CODE_FOUND_DATE and
+ * HASH_SOURCE_CODE_FOUND_TIME set appropriately.
  */
 int
-hash_source_code_string(
-	struct mdfour *hash, const char *str, size_t len, const char *path)
+check_for_temporal_macros(const char *str, size_t len)
 {
-	const char *p;
-	const char *end;
-	char hashbuf[64];
-	size_t hashbuflen = 0;
-	int result = HASH_SOURCE_CODE_OK;
-	extern unsigned sloppiness;
-	bool seen_backslash;
+	int result = 0;
 
-	p = str;
-	end = str + len;
-	while (1) {
-		if (p >= end) {
-			goto end;
-		}
-		switch (*p) {
-		/* Potential start of comment. */
-		case '/':
-			if (p+1 == end) {
-				break;
-			}
-			switch (*(p+1)) {
-			case '*':
-				HASH(' '); /* Don't paste tokens together when removing the comment. */
-				p += 2;
-				while (p+1 < end && (*p != '*' || *(p+1) != '/')) {
-					if (*p == '\n') {
-						/* Keep line numbers. */
-						HASH('\n');
-					}
-					p++;
-				}
-				if (p+1 == end) {
-					goto end;
-				}
-				p += 2;
-				continue;
-
-			case '/':
-				p += 2;
-				while (p < end && (*p != '\n' || *(p-1) == '\\')) {
-					p++;
-				}
-				continue;
-
-			default:
-				break;
-			}
-			break;
+	/*
+	 * We're using the Boyer-Moore-Horspool algorithm, which searches starting
+	 * from the *end* of the needle. Our needles are 8 characters long, so i
+	 * starts at 7.
+	 */
+	size_t i = 7;
 
-		/* Start of string. */
-		case '"':
-			HASH(*p);
-			p++;
-			seen_backslash = false;
-			while (p < end) {
-				if (seen_backslash) {
-					seen_backslash = false;
-				} else if (*p == '"') {
-					/* Found end of string. */
-					HASH(*p);
-					p++;
-					break;
-				} else if (*p == '\\') {
-					seen_backslash = true;
-				}
-				HASH(*p);
-				p++;
-			}
-			if (p == end) {
-				goto end;
+	while (i < len) {
+		/*
+		 * Check whether the substring ending at str[i] has the form "__...E__". On
+		 * the assumption that 'E' is less common in source than '_', we check
+		 * str[i-2] first.
+		 */
+		if (str[i - 2] == 'E' &&
+		    str[i - 0] == '_' &&
+		    str[i - 7] == '_' &&
+		    str[i - 1] == '_' &&
+		    str[i - 6] == '_') {
+			/*
+			 * Check the remaining characters to see if the substring is "__DATE__"
+			 * or "__TIME__".
+			 */
+			if (str[i - 5] == 'D' && str[i - 4] == 'A' &&
+			    str[i - 3] == 'T') {
+				result |= HASH_SOURCE_CODE_FOUND_DATE;
 			}
-			break;
-
-		/* Potential start of volatile macro. */
-		case '_':
-			if (p + 7 < end
-			    && p[1] == '_' && p[5] == 'E'
-			    && p[6] == '_' && p[7] == '_') {
-				if (p[2] == 'D' && p[3] == 'A'
-				    && p[4] == 'T') {
-					result |= HASH_SOURCE_CODE_FOUND_DATE;
-				} else if (p[2] == 'T' && p[3] == 'I'
-				           && p[4] == 'M') {
-					result |= HASH_SOURCE_CODE_FOUND_TIME;
-				}
-				/*
-				 * Of course, we can't be sure that we have found a __{DATE,TIME}__
-				 * that's actually used, but better safe than sorry. And if you do
-				 * something like
-				 *
-				 * #define TIME __TI ## ME__
-				 *
-				 * in your code, you deserve to get a false cache hit.
-				 */
+			else if (str[i - 5] == 'T' && str[i - 4] == 'I' &&
+			         str[i - 3] == 'M') {
+				result |= HASH_SOURCE_CODE_FOUND_TIME;
 			}
-			break;
-
-		default:
-			break;
 		}
 
-		HASH(*p);
-		p++;
+		/*
+		 * macro_skip tells us how far we can skip forward upon seeing str[i] at
+		 * the end of a substring.
+		 */
+		i += macro_skip[(uint8_t)str[i]];
 	}
 
-end:
-	hash_buffer(hash, hashbuf, hashbuflen);
+	return result;
+}
 
-	if (sloppiness & SLOPPY_TIME_MACROS) {
-		return 0;
+/*
+ * Hash a string ignoring comments. Returns a bitmask of HASH_SOURCE_CODE_*
+ * results.
+ */
+int
+hash_source_code_string(
+	struct mdfour *hash, const char *str, size_t len, const char *path)
+{
+	int result = HASH_SOURCE_CODE_OK;
+	extern unsigned sloppiness;
+
+	/*
+	 * Check for __DATE__ and __TIME__ if the sloppiness configuration tells us
+	 * we should.
+	 */
+	if (!(sloppiness & SLOPPY_TIME_MACROS)) {
+		result |= check_for_temporal_macros(str, len);
 	}
+
+	/*
+	 * Hash the source string.
+	 */
+	hash_buffer(hash, str, len);
+
 	if (result & HASH_SOURCE_CODE_FOUND_DATE) {
 		/*
 		 * Make sure that the hash sum changes if the (potential) expansion of
diff -Nru ccache-3.1.10/hashutil.h ccache-3.1.12/hashutil.h
--- ccache-3.1.10/hashutil.h	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/hashutil.h	2016-07-12 21:34:50.000000000 +0200
@@ -20,6 +20,7 @@
 #define	HASH_SOURCE_CODE_FOUND_DATE 2
 #define	HASH_SOURCE_CODE_FOUND_TIME 4
 
+int check_for_temporal_macros(const char *str, size_t len);
 int hash_source_code_string(
 	struct mdfour *hash, const char *str, size_t len, const char *path);
 int hash_source_code_file(struct mdfour *hash, const char *path);
diff -Nru ccache-3.1.10/macroskip.h ccache-3.1.12/macroskip.h
--- ccache-3.1.10/macroskip.h	1970-01-01 01:00:00.000000000 +0100
+++ ccache-3.1.12/macroskip.h	2016-07-12 21:34:50.000000000 +0200
@@ -0,0 +1,56 @@
+/*
+ * A Boyer-Moore-Horspool skip table used for searching for the strings
+ * "__TIME__" and "__DATE__".
+ *
+ * macro_skip[c] = 8 for all c not in "__TIME__" and "__DATE__".
+ *
+ * The other characters map as follows:
+ *
+ *   _ -> 1
+ *   A -> 4
+ *   D -> 5
+ *   E -> 2
+ *   I -> 4
+ *   M -> 3
+ *   T -> 3
+ *
+ *
+ * This was generated with the following Python script:
+ *
+ * m = {'_': 1,
+ *      'A': 4,
+ *      'D': 5,
+ *      'E': 2,
+ *      'I': 4,
+ *      'M': 3,
+ *      'T': 3}
+ *
+ * for i in range(0, 256):
+ *     if chr(i) in m:
+ *         num = m[chr(i)]
+ *     else:
+ *         num = 8
+ *     print ("%d, " % num),
+ *
+ *     if i % 16 == 15:
+ *         print ""
+ */
+
+static const uint32_t macro_skip[] = {
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  4,  8,  8,  5,  2,  8,  8,  8,  4,  8,  8,  8,  3,  8,  8,
+	8,  8,  8,  8,  3,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  1,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+};
diff -Nru ccache-3.1.10/stats.c ccache-3.1.12/stats.c
--- ccache-3.1.10/stats.c	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/stats.c	2016-07-12 21:34:50.000000000 +0200
@@ -347,7 +347,13 @@
 
 	for (dir = 0; dir <= 0xF; dir++) {
 		struct counters *counters = counters_init(STATS_END);
+		struct stat st;
 		fname = format("%s/%1x/stats", cache_dir, dir);
+		if (stat(fname, &st) != 0) {
+			/* No point in trying to reset the stats file if it doesn't exist. */
+			free(fname);
+			continue;
+		}
 		if (lockfile_acquire(fname, lock_staleness_limit)) {
 			stats_read(fname, counters);
 			for (i = 0; stats_info[i].message; i++) {
diff -Nru ccache-3.1.10/test/test_hashutil.c ccache-3.1.12/test/test_hashutil.c
--- ccache-3.1.10/test/test_hashutil.c	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/test/test_hashutil.c	2016-07-12 21:34:50.000000000 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 Joel Rosdahl
+ * Copyright (C) 2010-2015 Joel Rosdahl
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -109,83 +109,82 @@
 	CHECK_STR_EQ_FREE2("a448017aaf21d8525fc10ae87aa6729d-3", hash_result(&h));
 }
 
-TEST(hash_source_code_with_c_style_comment)
+TEST(check_for_temporal_macros)
 {
-	struct mdfour h;
-	char input[] = "a/*b*/c";
-	size_t input_len = strlen(input);
-
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("1c2c87080ee03418fb1279e3b1f09a68-3", hash_result(&h));
-
-	input[3] = 'd';
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("1c2c87080ee03418fb1279e3b1f09a68-3", hash_result(&h));
-}
-
-TEST(hash_source_code_with_cplusplus_style_comment)
-{
-	struct mdfour h;
-	char input[] = "a//b\nc";
-	size_t input_len = strlen(input);
-
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("4a3fbbe3c140fa193227dba3814db6e6-3", hash_result(&h));
-
-	input[3] = 'd';
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("4a3fbbe3c140fa193227dba3814db6e6-3", hash_result(&h));
-}
-
-TEST(hash_source_code_with_comment_inside_string)
-{
-	struct mdfour h;
-	char input[] = "a\"//b\"c";
-	size_t input_len = strlen(input);
-
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("4c2fa74b0843d8f93df5c04c98ccb0a4-7", hash_result(&h));
-
-	input[4] = 'd';
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("f0069218ec640008cbfa2d150c1061bb-7", hash_result(&h));
-}
-
-TEST(hash_source_code_with_quote_in_string)
-{
-	struct mdfour h;
-	char input[] = "a\"\\\"b//c\""; /* a"\"b//c" */
-	size_t input_len = strlen(input);
-
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("c4e45e7a7f6f29b000a51f187dc4cf06-9", hash_result(&h));
-
-	hash_start(&h);
-	input[7] = 'd';
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("bef8fb852dddcee189b91b068a621c55-9", hash_result(&h));
-}
-
-TEST(hash_source_code_with_backslash_at_string_end)
-{
-	struct mdfour h;
-	char input[] = "a\"\\\\\"b//c"; /* a"\\"b//c */
-	size_t input_len = strlen(input);
-
-	hash_start(&h);
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("7f3ccf27edadad1b90cb2cffb59775d6-6", hash_result(&h));
-
-	input[input_len - 1] = 'd';
-	hash_source_code_string(&h, input, input_len, "");
-	CHECK_STR_EQ_FREE2("7f3ccf27edadad1b90cb2cffb59775d6-6", hash_result(&h));
+	const char time_start[] =
+		"__TIME__\n"
+		"int a;\n";
+	const char time_middle[] =
+		"#define a __TIME__\n"
+		"int a;\n";
+	const char time_end[] =
+		"#define a __TIME__";
+
+	const char date_start[] =
+		"__DATE__\n"
+		"int ab;\n";
+	const char date_middle[] =
+		"#define ab __DATE__\n"
+		"int ab;\n";
+	const char date_end[] =
+		"#define ab __DATE__";
+
+	const char no_temporal[] =
+		"#define ab _ _DATE__\n"
+		"#define ab __ DATE__\n"
+		"#define ab __D ATE__\n"
+		"#define ab __DA TE__\n"
+		"#define ab __DAT E__\n"
+		"#define ab __DATE __\n"
+		"#define ab __DATE_ _\n"
+		"#define ab _ _TIME__\n"
+		"#define ab __ TIME__\n"
+		"#define ab __T IME__\n"
+		"#define ab __TI ME__\n"
+		"#define ab __TIM E__\n"
+		"#define ab __TIME __\n"
+		"#define ab __TIME_ _\n";
+
+	CHECK(check_for_temporal_macros(time_start + 0, sizeof(time_start) - 0));
+	CHECK(!check_for_temporal_macros(time_start + 1, sizeof(time_start) - 1));
+
+	CHECK(check_for_temporal_macros(time_middle + 0, sizeof(time_middle) - 0));
+	CHECK(check_for_temporal_macros(time_middle + 1, sizeof(time_middle) - 1));
+	CHECK(check_for_temporal_macros(time_middle + 2, sizeof(time_middle) - 2));
+	CHECK(check_for_temporal_macros(time_middle + 3, sizeof(time_middle) - 3));
+	CHECK(check_for_temporal_macros(time_middle + 4, sizeof(time_middle) - 4));
+	CHECK(check_for_temporal_macros(time_middle + 5, sizeof(time_middle) - 5));
+	CHECK(check_for_temporal_macros(time_middle + 6, sizeof(time_middle) - 6));
+	CHECK(check_for_temporal_macros(time_middle + 7, sizeof(time_middle) - 7));
+
+	CHECK(check_for_temporal_macros(time_end + 0, sizeof(time_end) - 0));
+	CHECK(check_for_temporal_macros(time_end + sizeof(time_end) - 9, 9));
+	CHECK(!check_for_temporal_macros(time_end + sizeof(time_end) - 8, 8));
+
+	CHECK(check_for_temporal_macros(date_start + 0, sizeof(date_start) - 0));
+	CHECK(!check_for_temporal_macros(date_start + 1, sizeof(date_start) - 1));
+
+	CHECK(check_for_temporal_macros(date_middle + 0, sizeof(date_middle) - 0));
+	CHECK(check_for_temporal_macros(date_middle + 1, sizeof(date_middle) - 1));
+	CHECK(check_for_temporal_macros(date_middle + 2, sizeof(date_middle) - 2));
+	CHECK(check_for_temporal_macros(date_middle + 3, sizeof(date_middle) - 3));
+	CHECK(check_for_temporal_macros(date_middle + 4, sizeof(date_middle) - 4));
+	CHECK(check_for_temporal_macros(date_middle + 5, sizeof(date_middle) - 5));
+	CHECK(check_for_temporal_macros(date_middle + 6, sizeof(date_middle) - 6));
+	CHECK(check_for_temporal_macros(date_middle + 7, sizeof(date_middle) - 7));
+
+	CHECK(check_for_temporal_macros(date_end + 0, sizeof(date_end) - 0));
+	CHECK(check_for_temporal_macros(date_end + sizeof(date_end) - 9, 9));
+	CHECK(!check_for_temporal_macros(date_end + sizeof(date_end) - 8, 8));
+
+	CHECK(!check_for_temporal_macros(no_temporal + 0, sizeof(no_temporal) - 0));
+	CHECK(!check_for_temporal_macros(no_temporal + 1, sizeof(no_temporal) - 1));
+	CHECK(!check_for_temporal_macros(no_temporal + 2, sizeof(no_temporal) - 2));
+	CHECK(!check_for_temporal_macros(no_temporal + 3, sizeof(no_temporal) - 3));
+	CHECK(!check_for_temporal_macros(no_temporal + 4, sizeof(no_temporal) - 4));
+	CHECK(!check_for_temporal_macros(no_temporal + 5, sizeof(no_temporal) - 5));
+	CHECK(!check_for_temporal_macros(no_temporal + 6, sizeof(no_temporal) - 6));
+	CHECK(!check_for_temporal_macros(no_temporal + 7, sizeof(no_temporal) - 7));
 }
 
 TEST_SUITE_END
diff -Nru ccache-3.1.10/test.sh ccache-3.1.12/test.sh
--- ccache-3.1.10/test.sh	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/test.sh	2016-07-12 21:34:50.000000000 +0200
@@ -3,7 +3,7 @@
 # A simple test suite for ccache.
 #
 # Copyright (C) 2002-2007 Andrew Tridgell
-# Copyright (C) 2009-2014 Joel Rosdahl
+# Copyright (C) 2009-2016 Joel Rosdahl
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of the GNU General Public License as published by the Free Software
@@ -219,7 +219,7 @@
     mv $CCACHE_DIR $CCACHE_DIR.saved
     CCACHE_DISABLE=1 $CCACHE_COMPILE -c test1.c 2> /dev/null
     if [ -d $CCACHE_DIR ]; then
-        test_failed "$CCACHE_DIR created dispite CCACHE_DISABLE being set"
+        test_failed "$CCACHE_DIR created despite CCACHE_DISABLE being set"
     fi
     mv $CCACHE_DIR.saved $CCACHE_DIR
     checkstat 'cache hit (preprocessed)' 3
@@ -245,10 +245,10 @@
     checkstat 'cache hit (preprocessed)' 5
     checkstat 'cache miss' 4
 
-    # strictly speaking should be 3 - RECACHE causes a double counting!
+    # strictly speaking should be 4 - RECACHE causes a double counting!
     checkstat 'files in cache' 4
     $CCACHE -c > /dev/null
-    checkstat 'files in cache' 3
+    checkstat 'files in cache' 4
 
     testname="CCACHE_HASHDIR"
     CCACHE_HASHDIR=1 $CCACHE_COMPILE -c test1.c -O -O
@@ -258,7 +258,7 @@
     CCACHE_HASHDIR=1 $CCACHE_COMPILE -c test1.c -O -O
     checkstat 'cache hit (preprocessed)' 6
     checkstat 'cache miss' 5
-    checkstat 'files in cache' 4
+    checkstat 'files in cache' 5
 
     testname="comments"
     echo '/* a silly comment */' > test1-comment.c
@@ -286,7 +286,7 @@
     done
     checkstat 'cache hit (preprocessed)' 8
     checkstat 'cache miss' 37
-    checkstat 'files in cache' 36
+    checkstat 'files in cache' 37
 
     $CCACHE -C >/dev/null
 
@@ -344,9 +344,15 @@
             CCACHE_CPP2=1 $CCACHE_COMPILE -c -finput-charset=latin1 latin1.c
             checkstat 'cache hit (preprocessed)' 14
             checkstat 'cache miss' 40
-            $CCACHE_COMPILE -c -finput-charset=latin1 latin1.c
+            CCACHE_CPP2=1 $CCACHE_COMPILE -c -finput-charset=latin1 latin1.c
             checkstat 'cache hit (preprocessed)' 15
             checkstat 'cache miss' 40
+            $CCACHE_COMPILE -c -finput-charset=latin1 latin1.c
+            checkstat 'cache hit (preprocessed)' 15
+            checkstat 'cache miss' 41
+            $CCACHE_COMPILE -c -finput-charset=latin1 latin1.c
+            checkstat 'cache hit (preprocessed)' 16
+            checkstat 'cache miss' 41
         fi
     fi
 
@@ -898,45 +904,6 @@
     checkfile stderr-mf.txt "`cat stderr-orig.txt`"
 
     ##################################################################
-    # Check that changes in comments are ignored when hashing.
-    testname="changes in comments"
-    $CCACHE -C >/dev/null
-    $CCACHE -z >/dev/null
-    cat <<EOF >comments.h
-/*
- * /* foo comment
- */
-EOF
-    backdate comments.h
-    cat <<'EOF' >comments.c
-#include "comments.h"
-char test[] = "\
-/* apple */ // banana"; // foo comment
-EOF
-
-    $CCACHE $COMPILER -c comments.c
-    checkstat 'cache hit (direct)' 0
-    checkstat 'cache hit (preprocessed)' 0
-    checkstat 'cache miss' 1
-
-    sed_in_place 's/foo/ignored/' comments.h comments.c
-    backdate comments.h
-
-    $CCACHE $COMPILER -c comments.c
-    checkstat 'cache hit (direct)' 1
-    checkstat 'cache hit (preprocessed)' 0
-    checkstat 'cache miss' 1
-
-    # Check that comment-like string contents are hashed.
-    sed_in_place 's/apple/orange/' comments.c
-    backdate comments.h
-
-    $CCACHE $COMPILER -c comments.c
-    checkstat 'cache hit (direct)' 1
-    checkstat 'cache hit (preprocessed)' 0
-    checkstat 'cache miss' 2
-
-    ##################################################################
     # Check that it's possible to compile and cache an empty source code file.
     testname="empty source file"
     $CCACHE -Cz >/dev/null
@@ -1203,6 +1170,23 @@
     checkstat 'cache hit (direct)' 2
     checkstat 'cache hit (preprocessed)' 0
     checkstat 'cache miss' 2
+
+    testname="comment in strings"
+    $CCACHE -Cz >/dev/null
+    echo 'char *comment = " /* \\\\u" "foo" " */";' >comment.c
+    $CCACHE $COMPILER -c comment.c
+    checkstat 'cache hit (direct)' 0
+    checkstat 'cache hit (preprocessed)' 0
+    checkstat 'cache miss' 1
+    $CCACHE $COMPILER -c comment.c
+    checkstat 'cache hit (direct)' 1
+    checkstat 'cache hit (preprocessed)' 0
+    checkstat 'cache miss' 1
+    echo 'char *comment = " /* \\\\u" "goo" " */";' >comment.c
+    $CCACHE $COMPILER -c comment.c
+    checkstat 'cache hit (direct)' 1
+    checkstat 'cache hit (preprocessed)' 0
+    checkstat 'cache miss' 2
 }
 
 basedir_suite() {
@@ -1853,6 +1837,59 @@
     checkstat 'cache miss' 2
 }
 
+symlinks_suite() {
+    ##################################################################
+    testname="symlink to source directory"
+
+    mkdir dir
+    cd dir
+    mkdir -p d1/d2
+    echo '#define A "OK"' >d1/h.h
+    cat <<EOF >d1/d2/c.c
+#include <stdio.h>
+#include "../h.h"
+int main() { printf("%s\n", A); }
+EOF
+    echo '#define A "BUG"' >h.h
+    ln -s d1/d2 d3
+
+    CCACHE_BASEDIR=/ $CCACHE $COMPILER -c $PWD/d3/c.c
+    $COMPILER -c $PWD/d3/c.c
+    $COMPILER c.o -o c
+    result=$(./c)
+    if [ "$result" != OK ]; then
+        test_failed "Incorrect header file used"
+    fi
+
+    cd ..
+    rm -rf dir
+
+    ##################################################################
+    testname="symlink to source file"
+
+    mkdir dir
+    cd dir
+    mkdir d
+    echo '#define A "BUG"' >d/h.h
+    cat <<EOF >d/c.c
+#include <stdio.h>
+#include "h.h"
+int main() { printf("%s\n", A); }
+EOF
+    echo '#define A "OK"' >h.h
+    ln -s d/c.c c.c
+
+    CCACHE_BASEDIR=/ $CCACHE $COMPILER -c $PWD/c.c
+    $COMPILER c.o -o c
+    result=$(./c)
+    if [ "$result" != OK ]; then
+        test_failed "Incorrect header file used"
+    fi
+
+    cd ..
+    rm -rf dir
+}
+
 ######################################################################
 # main program
 
@@ -1892,7 +1929,6 @@
 base
 link          !win32
 hardlink
-cpp2
 nlevels4
 nlevels1
 basedir       !win32
@@ -1902,6 +1938,7 @@
 extrafiles
 cleanup
 pch
+symlinks
 "
 
 host_os="`uname -s`"
diff -Nru ccache-3.1.10/version.c ccache-3.1.12/version.c
--- ccache-3.1.10/version.c	2014-10-19 19:12:05.000000000 +0200
+++ ccache-3.1.12/version.c	2016-07-12 21:34:50.000000000 +0200
@@ -1 +1 @@
-const char CCACHE_VERSION[] = "3.1.10";
+const char CCACHE_VERSION[] = "3.1.12";

--- End Message ---
--- Begin Message ---
Version: 8.6

The updates referred to in each of these bugs were included in today's
stable point release.

Regards,

Adam

--- End Message ---

Reply to: