+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.9" />\r
-<title>ccache authors</title>\r
-<style type="text/css">\r
-/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
-\r
-/* Default font. */\r
-body {\r
- font-family: Georgia,serif;\r
-}\r
-\r
-/* Title font. */\r
-h1, h2, h3, h4, h5, h6,\r
-div.title, caption.title,\r
-thead, p.table.header,\r
-#toctitle,\r
-#author, #revnumber, #revdate, #revremark,\r
-#footer {\r
- font-family: Arial,Helvetica,sans-serif;\r
-}\r
-\r
-body {\r
- margin: 1em 5% 1em 5%;\r
-}\r
-\r
-a {\r
- color: blue;\r
- text-decoration: underline;\r
-}\r
-a:visited {\r
- color: fuchsia;\r
-}\r
-\r
-em {\r
- font-style: italic;\r
- color: navy;\r
-}\r
-\r
-strong {\r
- font-weight: bold;\r
- color: #083194;\r
-}\r
-\r
-h1, h2, h3, h4, h5, h6 {\r
- color: #527bbd;\r
- margin-top: 1.2em;\r
- margin-bottom: 0.5em;\r
- line-height: 1.3;\r
-}\r
-\r
-h1, h2, h3 {\r
- border-bottom: 2px solid silver;\r
-}\r
-h2 {\r
- padding-top: 0.5em;\r
-}\r
-h3 {\r
- float: left;\r
-}\r
-h3 + * {\r
- clear: left;\r
-}\r
-h5 {\r
- font-size: 1.0em;\r
-}\r
-\r
-div.sectionbody {\r
- margin-left: 0;\r
-}\r
-\r
-hr {\r
- border: 1px solid silver;\r
-}\r
-\r
-p {\r
- margin-top: 0.5em;\r
- margin-bottom: 0.5em;\r
-}\r
-\r
-ul, ol, li > p {\r
- margin-top: 0;\r
-}\r
-ul > li { color: #aaa; }\r
-ul > li > * { color: black; }\r
-\r
-.monospaced, code, pre {\r
- font-family: "Courier New", Courier, monospace;\r
- font-size: inherit;\r
- color: navy;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-pre {\r
- white-space: pre-wrap;\r
-}\r
-\r
-#author {\r
- color: #527bbd;\r
- font-weight: bold;\r
- font-size: 1.1em;\r
-}\r
-#email {\r
-}\r
-#revnumber, #revdate, #revremark {\r
-}\r
-\r
-#footer {\r
- font-size: small;\r
- border-top: 2px solid silver;\r
- padding-top: 0.5em;\r
- margin-top: 4.0em;\r
-}\r
-#footer-text {\r
- float: left;\r
- padding-bottom: 0.5em;\r
-}\r
-#footer-badges {\r
- float: right;\r
- padding-bottom: 0.5em;\r
-}\r
-\r
-#preamble {\r
- margin-top: 1.5em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.imageblock, div.exampleblock, div.verseblock,\r
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
-div.admonitionblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.admonitionblock {\r
- margin-top: 2.0em;\r
- margin-bottom: 2.0em;\r
- margin-right: 10%;\r
- color: #606060;\r
-}\r
-\r
-div.content { /* Block element content. */\r
- padding: 0;\r
-}\r
-\r
-/* Block element titles. */\r
-div.title, caption.title {\r
- color: #527bbd;\r
- font-weight: bold;\r
- text-align: left;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.5em;\r
-}\r
-div.title + * {\r
- margin-top: 0;\r
-}\r
-\r
-td div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content + div.title {\r
- margin-top: 0.0em;\r
-}\r
-\r
-div.sidebarblock > div.content {\r
- background: #ffffee;\r
- border: 1px solid #dddddd;\r
- border-left: 4px solid #f0f0f0;\r
- padding: 0.5em;\r
-}\r
-\r
-div.listingblock > div.content {\r
- border: 1px solid #dddddd;\r
- border-left: 5px solid #f0f0f0;\r
- background: #f8f8f8;\r
- padding: 0.5em;\r
-}\r
-\r
-div.quoteblock, div.verseblock {\r
- padding-left: 1.0em;\r
- margin-left: 1.0em;\r
- margin-right: 10%;\r
- border-left: 5px solid #f0f0f0;\r
- color: #888;\r
-}\r
-\r
-div.quoteblock > div.attribution {\r
- padding-top: 0.5em;\r
- text-align: right;\r
-}\r
-\r
-div.verseblock > pre.content {\r
- font-family: inherit;\r
- font-size: inherit;\r
-}\r
-div.verseblock > div.attribution {\r
- padding-top: 0.75em;\r
- text-align: left;\r
-}\r
-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
-div.verseblock + div.attribution {\r
- text-align: left;\r
-}\r
-\r
-div.admonitionblock .icon {\r
- vertical-align: top;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- text-decoration: underline;\r
- color: #527bbd;\r
- padding-right: 0.5em;\r
-}\r
-div.admonitionblock td.content {\r
- padding-left: 0.5em;\r
- border-left: 3px solid #dddddd;\r
-}\r
-\r
-div.exampleblock > div.content {\r
- border-left: 3px solid #dddddd;\r
- padding-left: 0.5em;\r
-}\r
-\r
-div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; vertical-align: text-bottom; }\r
-a.image:visited { color: white; }\r
-\r
-dl {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-dt {\r
- margin-top: 0.5em;\r
- margin-bottom: 0;\r
- font-style: normal;\r
- color: navy;\r
-}\r
-dd > *:first-child {\r
- margin-top: 0.1em;\r
-}\r
-\r
-ul, ol {\r
- list-style-position: outside;\r
-}\r
-ol.arabic {\r
- list-style-type: decimal;\r
-}\r
-ol.loweralpha {\r
- list-style-type: lower-alpha;\r
-}\r
-ol.upperalpha {\r
- list-style-type: upper-alpha;\r
-}\r
-ol.lowerroman {\r
- list-style-type: lower-roman;\r
-}\r
-ol.upperroman {\r
- list-style-type: upper-roman;\r
-}\r
-\r
-div.compact ul, div.compact ol,\r
-div.compact p, div.compact p,\r
-div.compact div, div.compact div {\r
- margin-top: 0.1em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-tfoot {\r
- font-weight: bold;\r
-}\r
-td > div.verse {\r
- white-space: pre;\r
-}\r
-\r
-div.hdlist {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-div.hdlist tr {\r
- padding-bottom: 15px;\r
-}\r
-dt.hdlist1.strong, td.hdlist1.strong {\r
- font-weight: bold;\r
-}\r
-td.hdlist1 {\r
- vertical-align: top;\r
- font-style: normal;\r
- padding-right: 0.8em;\r
- color: navy;\r
-}\r
-td.hdlist2 {\r
- vertical-align: top;\r
-}\r
-div.hdlist.compact tr {\r
- margin: 0;\r
- padding-bottom: 0;\r
-}\r
-\r
-.comment {\r
- background: yellow;\r
-}\r
-\r
-.footnote, .footnoteref {\r
- font-size: 0.8em;\r
-}\r
-\r
-span.footnote, span.footnoteref {\r
- vertical-align: super;\r
-}\r
-\r
-#footnotes {\r
- margin: 20px 0 20px 0;\r
- padding: 7px 0 0 0;\r
-}\r
-\r
-#footnotes div.footnote {\r
- margin: 0 0 5px 0;\r
-}\r
-\r
-#footnotes hr {\r
- border: none;\r
- border-top: 1px solid silver;\r
- height: 1px;\r
- text-align: left;\r
- margin-left: 0;\r
- width: 20%;\r
- min-width: 100px;\r
-}\r
-\r
-div.colist td {\r
- padding-right: 0.5em;\r
- padding-bottom: 0.3em;\r
- vertical-align: top;\r
-}\r
-div.colist td img {\r
- margin-top: 0.3em;\r
-}\r
-\r
-@media print {\r
- #footer-badges { display: none; }\r
-}\r
-\r
-#toc {\r
- margin-bottom: 2.5em;\r
-}\r
-\r
-#toctitle {\r
- color: #527bbd;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
- margin-top: 0;\r
- margin-bottom: 0;\r
-}\r
-div.toclevel2 {\r
- margin-left: 2em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel3 {\r
- margin-left: 4em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel4 {\r
- margin-left: 6em;\r
- font-size: 0.9em;\r
-}\r
-\r
-span.aqua { color: aqua; }\r
-span.black { color: black; }\r
-span.blue { color: blue; }\r
-span.fuchsia { color: fuchsia; }\r
-span.gray { color: gray; }\r
-span.green { color: green; }\r
-span.lime { color: lime; }\r
-span.maroon { color: maroon; }\r
-span.navy { color: navy; }\r
-span.olive { color: olive; }\r
-span.purple { color: purple; }\r
-span.red { color: red; }\r
-span.silver { color: silver; }\r
-span.teal { color: teal; }\r
-span.white { color: white; }\r
-span.yellow { color: yellow; }\r
-\r
-span.aqua-background { background: aqua; }\r
-span.black-background { background: black; }\r
-span.blue-background { background: blue; }\r
-span.fuchsia-background { background: fuchsia; }\r
-span.gray-background { background: gray; }\r
-span.green-background { background: green; }\r
-span.lime-background { background: lime; }\r
-span.maroon-background { background: maroon; }\r
-span.navy-background { background: navy; }\r
-span.olive-background { background: olive; }\r
-span.purple-background { background: purple; }\r
-span.red-background { background: red; }\r
-span.silver-background { background: silver; }\r
-span.teal-background { background: teal; }\r
-span.white-background { background: white; }\r
-span.yellow-background { background: yellow; }\r
-\r
-span.big { font-size: 2em; }\r
-span.small { font-size: 0.6em; }\r
-\r
-span.underline { text-decoration: underline; }\r
-span.overline { text-decoration: overline; }\r
-span.line-through { text-decoration: line-through; }\r
-\r
-div.unbreakable { page-break-inside: avoid; }\r
-\r
-\r
-/*\r
- * xhtml11 specific\r
- *\r
- * */\r
-\r
-div.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.tableblock > table {\r
- border: 3px solid #527bbd;\r
-}\r
-thead, p.table.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.table {\r
- margin-top: 0;\r
-}\r
-/* Because the table frame attribute is overriden by CSS in most browsers. */\r
-div.tableblock > table[frame="void"] {\r
- border-style: none;\r
-}\r
-div.tableblock > table[frame="hsides"] {\r
- border-left-style: none;\r
- border-right-style: none;\r
-}\r
-div.tableblock > table[frame="vsides"] {\r
- border-top-style: none;\r
- border-bottom-style: none;\r
-}\r
-\r
-\r
-/*\r
- * html5 specific\r
- *\r
- * */\r
-\r
-table.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-thead, p.tableblock.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.tableblock {\r
- margin-top: 0;\r
-}\r
-table.tableblock {\r
- border-width: 3px;\r
- border-spacing: 0px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
- border-collapse: collapse;\r
-}\r
-th.tableblock, td.tableblock {\r
- border-width: 1px;\r
- padding: 4px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
-}\r
-\r
-table.tableblock.frame-topbot {\r
- border-left-style: hidden;\r
- border-right-style: hidden;\r
-}\r
-table.tableblock.frame-sides {\r
- border-top-style: hidden;\r
- border-bottom-style: hidden;\r
-}\r
-table.tableblock.frame-none {\r
- border-style: hidden;\r
-}\r
-\r
-th.tableblock.halign-left, td.tableblock.halign-left {\r
- text-align: left;\r
-}\r
-th.tableblock.halign-center, td.tableblock.halign-center {\r
- text-align: center;\r
-}\r
-th.tableblock.halign-right, td.tableblock.halign-right {\r
- text-align: right;\r
-}\r
-\r
-th.tableblock.valign-top, td.tableblock.valign-top {\r
- vertical-align: top;\r
-}\r
-th.tableblock.valign-middle, td.tableblock.valign-middle {\r
- vertical-align: middle;\r
-}\r
-th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
- vertical-align: bottom;\r
-}\r
-\r
-\r
-/*\r
- * manpage specific\r
- *\r
- * */\r
-\r
-body.manpage h1 {\r
- padding-top: 0.5em;\r
- padding-bottom: 0.5em;\r
- border-top: 2px solid silver;\r
- border-bottom: 2px solid silver;\r
-}\r
-body.manpage h2 {\r
- border-style: none;\r
-}\r
-body.manpage div.sectionbody {\r
- margin-left: 3em;\r
-}\r
-\r
-@media print {\r
- body.manpage div#toc { display: none; }\r
-}\r
-\r
-\r
-</style>\r
-<script type="text/javascript">\r
-/*<+'])');\r
- // Function that scans the DOM tree for header elements (the DOM2\r
- // nodeIterator API would be a better technique but not supported by all\r
- // browsers).\r
- var iterate = function (el) {\r
- for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
- if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
- var mo = re.exec(i.tagName);\r
- if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
- }\r
- iterate(i);\r
- }\r
- }\r
- }\r
- iterate(el);\r
- return result;\r
- }\r
-\r
- var toc = document.getElementById("toc");\r
- if (!toc) {\r
- return;\r
- }\r
-\r
- // Delete existing TOC entries in case we're reloading the TOC.\r
- var tocEntriesToRemove = [];\r
- var i;\r
- for (i = 0; i < toc.childNodes.length; i++) {\r
- var entry = toc.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div'\r
- && entry.getAttribute("class")\r
- && entry.getAttribute("class").match(/^toclevel/))\r
- tocEntriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < tocEntriesToRemove.length; i++) {\r
- toc.removeChild(tocEntriesToRemove[i]);\r
- }\r
-\r
- // Rebuild TOC entries.\r
- var entries = tocEntries(document.getElementById("content"), toclevels);\r
- for (var i = 0; i < entries.length; ++i) {\r
- var entry = entries[i];\r
- if (entry.element.id == "")\r
- entry.element.id = "_toc_" + i;\r
- var a = document.createElement("a");\r
- a.href = "#" + entry.element.id;\r
- a.appendChild(document.createTextNode(entry.text));\r
- var div = document.createElement("div");\r
- div.appendChild(a);\r
- div.className = "toclevel" + entry.toclevel;\r
- toc.appendChild(div);\r
- }\r
- if (entries.length == 0)\r
- toc.parentNode.removeChild(toc);\r
-},\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Footnotes generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Based on footnote generation code from:\r
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
- */\r
-\r
-footnotes: function () {\r
- // Delete existing footnote entries in case we're reloading the footnodes.\r
- var i;\r
- var noteholder = document.getElementById("footnotes");\r
- if (!noteholder) {\r
- return;\r
- }\r
- var entriesToRemove = [];\r
- for (i = 0; i < noteholder.childNodes.length; i++) {\r
- var entry = noteholder.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
- entriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < entriesToRemove.length; i++) {\r
- noteholder.removeChild(entriesToRemove[i]);\r
- }\r
-\r
- // Rebuild footnote entries.\r
- var cont = document.getElementById("content");\r
- var spans = cont.getElementsByTagName("span");\r
- var refs = {};\r
- var n = 0;\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnote") {\r
- n++;\r
- var note = spans[i].getAttribute("data-note");\r
- if (!note) {\r
- // Use [\s\S] in place of . so multi-line matches work.\r
- // Because JavaScript has no s (dotall) regex flag.\r
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
- spans[i].innerHTML =\r
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- spans[i].setAttribute("data-note", note);\r
- }\r
- noteholder.innerHTML +=\r
- "<div class='footnote' id='_footnote_" + n + "'>" +\r
- "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
- n + "</a>. " + note + "</div>";\r
- var id =spans[i].getAttribute("id");\r
- if (id != null) refs["#"+id] = n;\r
- }\r
- }\r
- if (n == 0)\r
- noteholder.parentNode.removeChild(noteholder);\r
- else {\r
- // Process footnoterefs.\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnoteref") {\r
- var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
- href = href.match(/#.*/)[0]; // Because IE return full URL.\r
- n = refs[href];\r
- spans[i].innerHTML =\r
- "[<a href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- }\r
- }\r
- }\r
-},\r
-\r
-install: function(toclevels) {\r
- var timerId;\r
-\r
- function reinstall() {\r
- asciidoc.footnotes();\r
- if (toclevels) {\r
- asciidoc.toc(toclevels);\r
- }\r
- }\r
-\r
- function reinstallAndRemoveTimer() {\r
- clearInterval(timerId);\r
- reinstall();\r
- }\r
-\r
- timerId = setInterval(reinstall, 500);\r
- if (document.addEventListener)\r
- document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
- else\r
- window.onload = reinstallAndRemoveTimer;\r
-}\r
-\r
-}\r
-asciidoc.install(2);\r
-/*]]>*/\r
-</script>\r
-</head>\r
-<body class="article">\r
-<div id="header">\r
-<h1>ccache authors</h1>\r
-<span id="revnumber">version 3.4.1</span>\r
-<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>
-</div>\r
-</div>\r
-<div id="content">\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache was originally written by Andrew Tridgell and is currently developed and\r
-maintained by Joel Rosdahl.</p></div>\r
-<div class="paragraph"><p>ccache is a collective work with contributions from many people, including:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Alexey Tourbin <<a href="mailto:alexey.tourbin@gmail.com">alexey.tourbin@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Alfred Landrum <<a href="mailto:alfred.landrum@riverbed.com">alfred.landrum@riverbed.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Anders F Björklund <<a href="mailto:anders.f.bjorklund@gmail.com">anders.f.bjorklund@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Andrea Bittau <<a href="mailto:a.bittau@cs.ucl.ac.uk">a.bittau@cs.ucl.ac.uk</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Andreas Huber <<a href="mailto:andreas.huber@deltaww.com">andreas.huber@deltaww.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-André Klitzing <<a href="mailto:aklitzing@gmail.com">aklitzing@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Andrew P Boie <<a href="mailto:andrew.p.boie@intel.com">andrew.p.boie@intel.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Andrew Stubbs <<a href="mailto:ams@codesourcery.com">ams@codesourcery.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Andrew Tridgell <<a href="mailto:tridge@samba.org">tridge@samba.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bernhard Bauer <<a href="mailto:bauerb@chromium.org">bauerb@chromium.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Björn Jacke <<a href="mailto:bj@sernet.de">bj@sernet.de</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Chiaki Ishikawa <<a href="mailto:ishikawa@yk.rim.or.jp">ishikawa@yk.rim.or.jp</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Chris AtLee <<a href="mailto:catlee@mozilla.com">catlee@mozilla.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Clemens Rabe <<a href="mailto:clemens.rabe@gmail.com">clemens.rabe@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-David Givone <<a href="mailto:david@givone.net">david@givone.net</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Edward Z. Yang <<a href="mailto:ezyang@fb.com">ezyang@fb.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Francois Marier <<a href="mailto:francois@debian.org">francois@debian.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Geert Bosch <<a href="mailto:geert@mongodb.com">geert@mongodb.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Grigory Entin <<a href="mailto:grigorye@dins.ru">grigorye@dins.ru</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Hongli Lai <<a href="mailto:hongli@phusion.nl">hongli@phusion.nl</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Ivan Vaigult <<a href="mailto:i.vaigult@gmail.com">i.vaigult@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Jiang Jiang <<a href="mailto:jiangj@opera.com">jiangj@opera.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Joel Rosdahl <<a href="mailto:joel@rosdahl.net">joel@rosdahl.net</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-John Basila <<a href="mailto:jbasila@checkpoint.com">jbasila@checkpoint.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-John Coiner <<a href="mailto:john.coiner@amd.com">john.coiner@amd.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Jon Bernard <<a href="mailto:jbernard@tuxion.com">jbernard@tuxion.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Jørgen P. Tjernø <<a href="mailto:jorgen@valvesoftware.com">jorgen@valvesoftware.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Justin Lebar <<a href="mailto:justin.lebar@gmail.com">justin.lebar@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Karl Chen <<a href="mailto:quarl@cs.berkeley.edu">quarl@cs.berkeley.edu</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Kona Blend <<a href="mailto:kona8lend@gmail.com">kona8lend@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Kovarththanan Rajaratnam <<a href="mailto:kovarththanan.rajaratnam@gmail.com">kovarththanan.rajaratnam@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Lalit Chhabra <<a href="mailto:lchhabra@linuxmail.org">lchhabra@linuxmail.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Lars Gustäbel <<a href="mailto:lars@gustaebel.de">lars@gustaebel.de</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Leanid Chaika <<a href="mailto:leanid.chaika@gmail.com">leanid.chaika@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Luboš Luňák <<a href="mailto:l.lunak@centrum.cz">l.lunak@centrum.cz</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mark Starovoytov <<a href="mailto:starovoytov.mark@googlemail.com">starovoytov.mark@googlemail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Martin Ettl <<a href="mailto:ettl.martin78@gmail.com">ettl.martin78@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Martin Pool <<a href="mailto:mbp@sourcefrog.net">mbp@sourcefrog.net</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mathias De Maré <<a href="mailto:mathias.de_mare@nokia.com">mathias.de_mare@nokia.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Matthias Kretz <<a href="mailto:kretz@kde.org">kretz@kde.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Melven Roehrig-Zoellner <<a href="mailto:Melven.Roehrig-Zoellner@DLR.de">Melven.Roehrig-Zoellner@DLR.de</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Michael Marineau <<a href="mailto:michael.marineau@coreos.com">michael.marineau@coreos.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Michael Meeks <<a href="mailto:michael.meeks@suse.com">michael.meeks@suse.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mihai Serban <<a href="mailto:mihai.serban@intel.com">mihai.serban@intel.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mike Frysinger <<a href="mailto:vapier@gentoo.org">vapier@gentoo.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mikhail Kolomeytsev <<a href="mailto:mkolom@yandex-team.ru">mkolom@yandex-team.ru</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mostyn Bramley-Moore <<a href="mailto:mostyn@antipode.se">mostyn@antipode.se</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Neil Mushell <<a href="mailto:nmushell@bloomberg.net">nmushell@bloomberg.net</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Nick Schultz <<a href="mailto:nick.schultz@intel.com">nick.schultz@intel.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Norbert Lange <<a href="mailto:nolange79@gmail.com">nolange79@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Oded Shimon <<a href="mailto:oded@istraresearch.com">oded@istraresearch.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Orgad Shaneh <<a href="mailto:orgad.shaneh@audiocodes.com">orgad.shaneh@audiocodes.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Orion Poplawski <<a href="mailto:orion@cora.nwra.com">orion@cora.nwra.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Owen Mann <<a href="mailto:owen@mann.org">owen@mann.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Patrick von Reth <<a href="mailto:vonreth@kde.org">vonreth@kde.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Paul Griffith <<a href="mailto:paulg@cse.yorku.ca">paulg@cse.yorku.ca</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Pavel Boldin <<a href="mailto:pboldin@cloudlinux.com">pboldin@cloudlinux.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Per Nordlöw <<a href="mailto:per.nordlow@autoliv.com">per.nordlow@autoliv.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Philippe Proulx <<a href="mailto:eeppeliteloop@gmail.com">eeppeliteloop@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Ramiro Polla <<a href="mailto:ramiro.polla@gmail.com">ramiro.polla@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Robin H. Johnson <<a href="mailto:robbat2@gentoo.org">robbat2@gentoo.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Rolf Bjarne Kvinge <<a href="mailto:rolf@xamarin.com">rolf@xamarin.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-RW <<a href="mailto:fbsd06@mlists.homeunix.com">fbsd06@mlists.homeunix.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Ryan Brown <<a href="mailto:ryb@ableton.com">ryb@ableton.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Sam Gross <<a href="mailto:sgross@fb.com">sgross@fb.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Thomas Röfer <<a href="mailto:Thomas.Roefer@dfki.de">Thomas.Roefer@dfki.de</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Tim Potter <<a href="mailto:tpot@samba.org">tpot@samba.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Tom Hughes <<a href="mailto:tomtheengineer@gmail.com">tomtheengineer@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Tor Arne Vestbø <<a href="mailto:tor.arne.vestbo@qt.io">tor.arne.vestbo@qt.io</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Vadim Petrochenkov <<a href="mailto:vadim.petrochenkov@gmail.com">vadim.petrochenkov@gmail.com</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Ville Skyttä <<a href="mailto:ville.skytta@iki.fi">ville.skytta@iki.fi</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-William S Fulton <<a href="mailto:wsf@fultondesigns.co.uk">wsf@fultondesigns.co.uk</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Wilson Snyder <<a href="mailto:wsnyder@wsnyder.org">wsnyder@wsnyder.org</a>>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Yiding Jia <<a href="mailto:yiding@fb.com">yiding@fb.com</a>>\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>Thanks!</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 3.4.1<br />\r
-Last updated\r
- 2018-02-11 15:24:06 CET\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
--- /dev/null
+ccache copyright and license
+============================
+
+Overall license
+---------------
+
+The license for ccache as a whole is as follows:
+
+-------------------------------------------------------------------------------
+ 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
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+ Street, Fifth Floor, Boston, MA 02110-1301 USA
+-------------------------------------------------------------------------------
+
+The full license text can be found in GPL-3.0.txt and at
+http://www.gnu.org/licenses/gpl-3.0.html.
+
+
+Copyright and authors
+---------------------
+
+ccache is a collective work with contributions from many people, listed in
+AUTHORS.adoc and at https://ccache.samba.org/authors.html. Subsequent additions
+by contributing authors are implicitly licensed to the public under the same
+terms (GNU GPL version 3 or later), but the contributing authors retain
+copyrights on their portions of the work.
+
+The copyright for ccache as a whole is as follows:
+
+-------------------------------------------------------------------------------
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2018 Joel Rosdahl
+-------------------------------------------------------------------------------
+
+
+Files derived from other sources
+--------------------------------
+
+The ccache distribution contain some files from other sources and some have
+been modified for use in ccache. These files all carry attribution notices, and
+may qualify as ``separate and independent works in themselves'' for purposes of
+the GPL: that is, if separated from the ccache sources, they may be usable
+under less restrictive terms.
+
+
+src/getopt_long.[hc]
+~~~~~~~~~~~~~~~~~~~~
+
+This implementation of `getopt_long()` was copied from
+http://www.postgresql.org[PostgreSQL] and has the following license text:
+
+-------------------------------------------------------------------------------
+ Portions Copyright (c) 1987, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+
+ Portions Copyright (c) 2003
+ PostgreSQL Global Development Group
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+-------------------------------------------------------------------------------
+
+
+src/hashtable*.[hc]
+~~~~~~~~~~~~~~~~~~~
+
+This code comes from http://www.cl.cam.ac.uk/~cwc22/hashtable/ with the
+following license:
+
+-------------------------------------------------------------------------------
+ Copyright (c) 2002, 2004, Christopher Clark
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the original author; nor the names of any
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+-------------------------------------------------------------------------------
+
+
+m4/feature_macros.m4
+~~~~~~~~~~~~~~~~~~~~
+
+This Autoconf M4 snippet comes from http://www.python.org[Python] 2.6's
+`configure.in` with the following license:
+
+-------------------------------------------------------------------------------
+ A. HISTORY OF THE SOFTWARE
+ ==========================
+
+ Python was created in the early 1990s by Guido van Rossum at Stichting
+ Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+ as a successor of a language called ABC. Guido remains Python's
+ principal author, although it includes many contributions from others.
+
+ In 1995, Guido continued his work on Python at the Corporation for
+ National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+ in Reston, Virginia where he released several versions of the
+ software.
+
+ In May 2000, Guido and the Python core development team moved to
+ BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+ year, the PythonLabs team moved to Digital Creations (now Zope
+ Corporation, see http://www.zope.com). In 2001, the Python Software
+ Foundation (PSF, see http://www.python.org/psf/) was formed, a
+ non-profit organization created specifically to own Python-related
+ Intellectual Property. Zope Corporation is a sponsoring member of
+ the PSF.
+
+ All Python releases are Open Source (see http://www.opensource.org for
+ the Open Source Definition). Historically, most, but not all, Python
+ releases have also been GPL-compatible; the table below summarizes
+ the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.2 2.1.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2.1 2.2 2002 PSF yes
+ 2.2.2 2.2.1 2002 PSF yes
+ 2.2.3 2.2.2 2003 PSF yes
+ 2.3 2.2.2 2002-2003 PSF yes
+ 2.3.1 2.3 2002-2003 PSF yes
+ 2.3.2 2.3.1 2002-2003 PSF yes
+ 2.3.3 2.3.2 2002-2003 PSF yes
+ 2.3.4 2.3.3 2004 PSF yes
+ 2.3.5 2.3.4 2005 PSF yes
+ 2.4 2.3 2004 PSF yes
+ 2.4.1 2.4 2005 PSF yes
+ 2.4.2 2.4.1 2005 PSF yes
+ 2.4.3 2.4.2 2006 PSF yes
+ 2.4.4 2.4.3 2006 PSF yes
+ 2.5 2.4 2006 PSF yes
+ 2.5.1 2.5 2007 PSF yes
+ 2.5.2 2.5.1 2008 PSF yes
+ 2.5.3 2.5.2 2008 PSF yes
+ 2.6 2.5 2008 PSF yes
+ 2.6.1 2.6 2008 PSF yes
+
+ Footnotes:
+
+ (1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+ (2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+ Thanks to the many outside volunteers who have worked under Guido's
+ direction to make these releases possible.
+
+
+ B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+ ===============================================================
+
+ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+ --------------------------------------------
+
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
+ otherwise using this software ("Python") in source or binary form and
+ its associated documentation.
+
+ 2. Subject to the terms and conditions of this License Agreement, PSF hereby
+ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+ analyze, test, perform and/or display publicly, prepare derivative works,
+ distribute, and otherwise use Python alone or in any derivative version,
+ provided, however, that PSF's License Agreement and PSF's notice of copyright,
+ i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Python
+ Software Foundation; All Rights Reserved" are retained in Python alone or in any
+ derivative version prepared by Licensee.
+
+ 3. In the event Licensee prepares a derivative work that is based on
+ or incorporates Python or any part thereof, and wants to make
+ the derivative work available to others as provided herein, then
+ Licensee hereby agrees to include in any such work a brief summary of
+ the changes made to Python.
+
+ 4. PSF is making Python available to Licensee on an "AS IS"
+ basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+ INFRINGE ANY THIRD PARTY RIGHTS.
+
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+ 6. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+
+ 7. Nothing in this License Agreement shall be deemed to create any
+ relationship of agency, partnership, or joint venture between PSF and
+ Licensee. This License Agreement does not grant permission to use PSF
+ trademarks or trade name in a trademark sense to endorse or promote
+ products or services of Licensee, or any third party.
+
+ 8. By copying, installing or otherwise using Python, Licensee
+ agrees to be bound by the terms and conditions of this License
+ Agreement.
+
+
+ BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+ -------------------------------------------
+
+ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+ 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+ office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+ Individual or Organization ("Licensee") accessing and otherwise using
+ this software in source or binary form and its associated
+ documentation ("the Software").
+
+ 2. Subject to the terms and conditions of this BeOpen Python License
+ Agreement, BeOpen hereby grants Licensee a non-exclusive,
+ royalty-free, world-wide license to reproduce, analyze, test, perform
+ and/or display publicly, prepare derivative works, distribute, and
+ otherwise use the Software alone or in any derivative version,
+ provided, however, that the BeOpen Python License is retained in the
+ Software, alone or in any derivative version prepared by Licensee.
+
+ 3. BeOpen is making the Software available to Licensee on an "AS IS"
+ basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+ INFRINGE ANY THIRD PARTY RIGHTS.
+
+ 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+ SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+ AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+ DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+ 5. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+
+ 6. This License Agreement shall be governed by and interpreted in all
+ respects by the law of the State of California, excluding conflict of
+ law provisions. Nothing in this License Agreement shall be deemed to
+ create any relationship of agency, partnership, or joint venture
+ between BeOpen and Licensee. This License Agreement does not grant
+ permission to use BeOpen trademarks or trade names in a trademark
+ sense to endorse or promote products or services of Licensee, or any
+ third party. As an exception, the "BeOpen Python" logos available at
+ http://www.pythonlabs.com/logos.html may be used according to the
+ permissions granted on that web page.
+
+ 7. By copying, installing or otherwise using the software, Licensee
+ agrees to be bound by the terms and conditions of this License
+ Agreement.
+
+
+ CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+ ---------------------------------------
+
+ 1. This LICENSE AGREEMENT is between the Corporation for National
+ Research Initiatives, having an office at 1895 Preston White Drive,
+ Reston, VA 20191 ("CNRI"), and the Individual or Organization
+ ("Licensee") accessing and otherwise using Python 1.6.1 software in
+ source or binary form and its associated documentation.
+
+ 2. Subject to the terms and conditions of this License Agreement, CNRI
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide
+ license to reproduce, analyze, test, perform and/or display publicly,
+ prepare derivative works, distribute, and otherwise use Python 1.6.1
+ alone or in any derivative version, provided, however, that CNRI's
+ License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+ 1995-2001 Corporation for National Research Initiatives; All Rights
+ Reserved" are retained in Python 1.6.1 alone or in any derivative
+ version prepared by Licensee. Alternately, in lieu of CNRI's License
+ Agreement, Licensee may substitute the following text (omitting the
+ quotes): "Python 1.6.1 is made available subject to the terms and
+ conditions in CNRI's License Agreement. This Agreement together with
+ Python 1.6.1 may be located on the Internet using the following
+ unique, persistent identifier (known as a handle): 1895.22/1013. This
+ Agreement may also be obtained from a proxy server on the Internet
+ using the following URL: http://hdl.handle.net/1895.22/1013".
+
+ 3. In the event Licensee prepares a derivative work that is based on
+ or incorporates Python 1.6.1 or any part thereof, and wants to make
+ the derivative work available to others as provided herein, then
+ Licensee hereby agrees to include in any such work a brief summary of
+ the changes made to Python 1.6.1.
+
+ 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+ basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+ INFRINGE ANY THIRD PARTY RIGHTS.
+
+ 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+ 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+ 6. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+
+ 7. This License Agreement shall be governed by the federal
+ intellectual property law of the United States, including without
+ limitation the federal copyright law, and, to the extent such
+ U.S. federal law does not apply, by the law of the Commonwealth of
+ Virginia, excluding Virginia's conflict of law provisions.
+ Notwithstanding the foregoing, with regard to derivative works based
+ on Python 1.6.1 that incorporate non-separable material that was
+ previously distributed under the GNU General Public License (GPL), the
+ law of the Commonwealth of Virginia shall govern this License
+ Agreement only as to issues arising under or with respect to
+ Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+ License Agreement shall be deemed to create any relationship of
+ agency, partnership, or joint venture between CNRI and Licensee. This
+ License Agreement does not grant permission to use CNRI trademarks or
+ trade name in a trademark sense to endorse or promote products or
+ services of Licensee, or any third party.
+
+ 8. By clicking on the "ACCEPT" button where indicated, or by copying,
+ installing or otherwise using Python 1.6.1, Licensee agrees to be
+ bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+ --------------------------------------------------
+
+ Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+ The Netherlands. All rights reserved.
+
+ Permission to use, copy, modify, and distribute this software and its
+ documentation for any purpose and without fee is hereby granted,
+ provided that the above copyright notice appear in all copies and that
+ both that copyright notice and this permission notice appear in
+ supporting documentation, and that the name of Stichting Mathematisch
+ Centrum or CWI not be used in advertising or publicity pertaining to
+ distribution of the software without specific, written prior
+ permission.
+
+ STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+-------------------------------------------------------------------------------
+
+
+src/murmurhashneutral2.[hc]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This fast hash implementation is released to the public domain by Austin
+Appleby. See http://murmurhash.googlepages.com.
+
+
+src/snprintf.c and m4/snprintf.m4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This implementation of `snprintf()` and similar functions was downloaded from
+http://www.jhweiss.de/software/snprintf.html and has the following license:
+
+-------------------------------------------------------------------------------
+ Copyright (c) 1995 Patrick Powell.
+
+ This code is based on code written by Patrick Powell <papowell@astart.com>.
+ It may be used for any purpose as long as this notice remains intact on all
+ source code distributions.
+
+ Copyright (c) 2008 Holger Weiss.
+
+ This version of the code is maintained by Holger Weiss <holger@jhweiss.de>.
+ My changes to the code may freely be used, modified and/or redistributed for
+ any purpose. It would be nice if additions and fixes to this file (including
+ trivial code cleanups) would be sent back in order to let me include them in
+ the version available at <http://www.jhweiss.de/software/snprintf.html>.
+ However, this is not a requirement for using or redistributing (possibly
+ modified) versions of this file, nor is leaving this notice intact mandatory.
+-------------------------------------------------------------------------------
+
+
+src/zlib/*.[hc]
+~~~~~~~~~~~~~~~
+
+This is a bundled subset of zlib 1.2.8 from <http://zlib.net> with the
+following license:
+
+-------------------------------------------------------------------------------
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+-------------------------------------------------------------------------------
<body class="article">\r
<div id="header">\r
<h1>ccache copyright and license</h1>\r
-<span id="revnumber">version 3.4.1</span>\r
+<span id="revnumber">version 3.4.2</span>\r
<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>
<h2 id="_copyright_and_authors">Copyright and authors</h2>\r
<div class="sectionbody">\r
<div class="paragraph"><p>ccache is a collective work with contributions from many people, listed in\r
-AUTHORS.txt and at <a href="https://ccache.samba.org/authors.html">https://ccache.samba.org/authors.html</a>. Subsequent additions\r
+AUTHORS.adoc and at <a href="https://ccache.samba.org/authors.html">https://ccache.samba.org/authors.html</a>. Subsequent additions\r
by contributing authors are implicitly licensed to the public under the same\r
terms (GNU GPL version 3 or later), but the contributing authors retain\r
copyrights on their portions of the work.</p></div>\r
<div id="footnotes"><hr /></div>\r
<div id="footer">\r
<div id="footer-text">\r
-Version 3.4.1<br />\r
+Version 3.4.2<br />\r
Last updated\r
- 2018-02-06 22:28:44 CET\r
+ 2018-03-15 21:34:36 CET\r
</div>\r
</div>\r
</body>\r
+++ /dev/null
-ccache copyright and license
-============================
-
-Overall license
----------------
-
-The license for ccache as a whole is as follows:
-
--------------------------------------------------------------------------------
- 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
- Foundation; either version 3 of the License, or (at your option) any later
- version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
- Street, Fifth Floor, Boston, MA 02110-1301 USA
--------------------------------------------------------------------------------
-
-The full license text can be found in GPL-3.0.txt and at
-http://www.gnu.org/licenses/gpl-3.0.html.
-
-
-Copyright and authors
----------------------
-
-ccache is a collective work with contributions from many people, listed in
-AUTHORS.txt and at https://ccache.samba.org/authors.html. Subsequent additions
-by contributing authors are implicitly licensed to the public under the same
-terms (GNU GPL version 3 or later), but the contributing authors retain
-copyrights on their portions of the work.
-
-The copyright for ccache as a whole is as follows:
-
--------------------------------------------------------------------------------
- Copyright (C) 2002-2007 Andrew Tridgell
- Copyright (C) 2009-2018 Joel Rosdahl
--------------------------------------------------------------------------------
-
-
-Files derived from other sources
---------------------------------
-
-The ccache distribution contain some files from other sources and some have
-been modified for use in ccache. These files all carry attribution notices, and
-may qualify as ``separate and independent works in themselves'' for purposes of
-the GPL: that is, if separated from the ccache sources, they may be usable
-under less restrictive terms.
-
-
-src/getopt_long.[hc]
-~~~~~~~~~~~~~~~~~~~~
-
-This implementation of `getopt_long()` was copied from
-http://www.postgresql.org[PostgreSQL] and has the following license text:
-
--------------------------------------------------------------------------------
- Portions Copyright (c) 1987, 1993, 1994
- The Regents of the University of California. All rights reserved.
-
- Portions Copyright (c) 2003
- PostgreSQL Global Development Group
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
--------------------------------------------------------------------------------
-
-
-src/hashtable*.[hc]
-~~~~~~~~~~~~~~~~~~~
-
-This code comes from http://www.cl.cam.ac.uk/~cwc22/hashtable/ with the
-following license:
-
--------------------------------------------------------------------------------
- Copyright (c) 2002, 2004, Christopher Clark
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name of the original author; nor the names of any
- contributors may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------------
-
-
-m4/feature_macros.m4
-~~~~~~~~~~~~~~~~~~~~
-
-This Autoconf M4 snippet comes from http://www.python.org[Python] 2.6's
-`configure.in` with the following license:
-
--------------------------------------------------------------------------------
- A. HISTORY OF THE SOFTWARE
- ==========================
-
- Python was created in the early 1990s by Guido van Rossum at Stichting
- Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
- as a successor of a language called ABC. Guido remains Python's
- principal author, although it includes many contributions from others.
-
- In 1995, Guido continued his work on Python at the Corporation for
- National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
- in Reston, Virginia where he released several versions of the
- software.
-
- In May 2000, Guido and the Python core development team moved to
- BeOpen.com to form the BeOpen PythonLabs team. In October of the same
- year, the PythonLabs team moved to Digital Creations (now Zope
- Corporation, see http://www.zope.com). In 2001, the Python Software
- Foundation (PSF, see http://www.python.org/psf/) was formed, a
- non-profit organization created specifically to own Python-related
- Intellectual Property. Zope Corporation is a sponsoring member of
- the PSF.
-
- All Python releases are Open Source (see http://www.opensource.org for
- the Open Source Definition). Historically, most, but not all, Python
- releases have also been GPL-compatible; the table below summarizes
- the various releases.
-
- Release Derived Year Owner GPL-
- from compatible? (1)
-
- 0.9.0 thru 1.2 1991-1995 CWI yes
- 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
- 1.6 1.5.2 2000 CNRI no
- 2.0 1.6 2000 BeOpen.com no
- 1.6.1 1.6 2001 CNRI yes (2)
- 2.1 2.0+1.6.1 2001 PSF no
- 2.0.1 2.0+1.6.1 2001 PSF yes
- 2.1.1 2.1+2.0.1 2001 PSF yes
- 2.2 2.1.1 2001 PSF yes
- 2.1.2 2.1.1 2002 PSF yes
- 2.1.3 2.1.2 2002 PSF yes
- 2.2.1 2.2 2002 PSF yes
- 2.2.2 2.2.1 2002 PSF yes
- 2.2.3 2.2.2 2003 PSF yes
- 2.3 2.2.2 2002-2003 PSF yes
- 2.3.1 2.3 2002-2003 PSF yes
- 2.3.2 2.3.1 2002-2003 PSF yes
- 2.3.3 2.3.2 2002-2003 PSF yes
- 2.3.4 2.3.3 2004 PSF yes
- 2.3.5 2.3.4 2005 PSF yes
- 2.4 2.3 2004 PSF yes
- 2.4.1 2.4 2005 PSF yes
- 2.4.2 2.4.1 2005 PSF yes
- 2.4.3 2.4.2 2006 PSF yes
- 2.4.4 2.4.3 2006 PSF yes
- 2.5 2.4 2006 PSF yes
- 2.5.1 2.5 2007 PSF yes
- 2.5.2 2.5.1 2008 PSF yes
- 2.5.3 2.5.2 2008 PSF yes
- 2.6 2.5 2008 PSF yes
- 2.6.1 2.6 2008 PSF yes
-
- Footnotes:
-
- (1) GPL-compatible doesn't mean that we're distributing Python under
- the GPL. All Python licenses, unlike the GPL, let you distribute
- a modified version without making your changes open source. The
- GPL-compatible licenses make it possible to combine Python with
- other software that is released under the GPL; the others don't.
-
- (2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
- because its license has a choice of law clause. According to
- CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
- is "not incompatible" with the GPL.
-
- Thanks to the many outside volunteers who have worked under Guido's
- direction to make these releases possible.
-
-
- B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
- ===============================================================
-
- PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
- --------------------------------------------
-
- 1. This LICENSE AGREEMENT is between the Python Software Foundation
- ("PSF"), and the Individual or Organization ("Licensee") accessing and
- otherwise using this software ("Python") in source or binary form and
- its associated documentation.
-
- 2. Subject to the terms and conditions of this License Agreement, PSF hereby
- grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
- analyze, test, perform and/or display publicly, prepare derivative works,
- distribute, and otherwise use Python alone or in any derivative version,
- provided, however, that PSF's License Agreement and PSF's notice of copyright,
- i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Python
- Software Foundation; All Rights Reserved" are retained in Python alone or in any
- derivative version prepared by Licensee.
-
- 3. In the event Licensee prepares a derivative work that is based on
- or incorporates Python or any part thereof, and wants to make
- the derivative work available to others as provided herein, then
- Licensee hereby agrees to include in any such work a brief summary of
- the changes made to Python.
-
- 4. PSF is making Python available to Licensee on an "AS IS"
- basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
- IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
- DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
- FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
- INFRINGE ANY THIRD PARTY RIGHTS.
-
- 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
- FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
- A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
- OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
- 6. This License Agreement will automatically terminate upon a material
- breach of its terms and conditions.
-
- 7. Nothing in this License Agreement shall be deemed to create any
- relationship of agency, partnership, or joint venture between PSF and
- Licensee. This License Agreement does not grant permission to use PSF
- trademarks or trade name in a trademark sense to endorse or promote
- products or services of Licensee, or any third party.
-
- 8. By copying, installing or otherwise using Python, Licensee
- agrees to be bound by the terms and conditions of this License
- Agreement.
-
-
- BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
- -------------------------------------------
-
- BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
- 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
- office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
- Individual or Organization ("Licensee") accessing and otherwise using
- this software in source or binary form and its associated
- documentation ("the Software").
-
- 2. Subject to the terms and conditions of this BeOpen Python License
- Agreement, BeOpen hereby grants Licensee a non-exclusive,
- royalty-free, world-wide license to reproduce, analyze, test, perform
- and/or display publicly, prepare derivative works, distribute, and
- otherwise use the Software alone or in any derivative version,
- provided, however, that the BeOpen Python License is retained in the
- Software, alone or in any derivative version prepared by Licensee.
-
- 3. BeOpen is making the Software available to Licensee on an "AS IS"
- basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
- IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
- DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
- FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
- INFRINGE ANY THIRD PARTY RIGHTS.
-
- 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
- SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
- AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
- DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
- 5. This License Agreement will automatically terminate upon a material
- breach of its terms and conditions.
-
- 6. This License Agreement shall be governed by and interpreted in all
- respects by the law of the State of California, excluding conflict of
- law provisions. Nothing in this License Agreement shall be deemed to
- create any relationship of agency, partnership, or joint venture
- between BeOpen and Licensee. This License Agreement does not grant
- permission to use BeOpen trademarks or trade names in a trademark
- sense to endorse or promote products or services of Licensee, or any
- third party. As an exception, the "BeOpen Python" logos available at
- http://www.pythonlabs.com/logos.html may be used according to the
- permissions granted on that web page.
-
- 7. By copying, installing or otherwise using the software, Licensee
- agrees to be bound by the terms and conditions of this License
- Agreement.
-
-
- CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
- ---------------------------------------
-
- 1. This LICENSE AGREEMENT is between the Corporation for National
- Research Initiatives, having an office at 1895 Preston White Drive,
- Reston, VA 20191 ("CNRI"), and the Individual or Organization
- ("Licensee") accessing and otherwise using Python 1.6.1 software in
- source or binary form and its associated documentation.
-
- 2. Subject to the terms and conditions of this License Agreement, CNRI
- hereby grants Licensee a nonexclusive, royalty-free, world-wide
- license to reproduce, analyze, test, perform and/or display publicly,
- prepare derivative works, distribute, and otherwise use Python 1.6.1
- alone or in any derivative version, provided, however, that CNRI's
- License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
- 1995-2001 Corporation for National Research Initiatives; All Rights
- Reserved" are retained in Python 1.6.1 alone or in any derivative
- version prepared by Licensee. Alternately, in lieu of CNRI's License
- Agreement, Licensee may substitute the following text (omitting the
- quotes): "Python 1.6.1 is made available subject to the terms and
- conditions in CNRI's License Agreement. This Agreement together with
- Python 1.6.1 may be located on the Internet using the following
- unique, persistent identifier (known as a handle): 1895.22/1013. This
- Agreement may also be obtained from a proxy server on the Internet
- using the following URL: http://hdl.handle.net/1895.22/1013".
-
- 3. In the event Licensee prepares a derivative work that is based on
- or incorporates Python 1.6.1 or any part thereof, and wants to make
- the derivative work available to others as provided herein, then
- Licensee hereby agrees to include in any such work a brief summary of
- the changes made to Python 1.6.1.
-
- 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
- basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
- IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
- DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
- FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
- INFRINGE ANY THIRD PARTY RIGHTS.
-
- 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
- 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
- A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
- OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
- 6. This License Agreement will automatically terminate upon a material
- breach of its terms and conditions.
-
- 7. This License Agreement shall be governed by the federal
- intellectual property law of the United States, including without
- limitation the federal copyright law, and, to the extent such
- U.S. federal law does not apply, by the law of the Commonwealth of
- Virginia, excluding Virginia's conflict of law provisions.
- Notwithstanding the foregoing, with regard to derivative works based
- on Python 1.6.1 that incorporate non-separable material that was
- previously distributed under the GNU General Public License (GPL), the
- law of the Commonwealth of Virginia shall govern this License
- Agreement only as to issues arising under or with respect to
- Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
- License Agreement shall be deemed to create any relationship of
- agency, partnership, or joint venture between CNRI and Licensee. This
- License Agreement does not grant permission to use CNRI trademarks or
- trade name in a trademark sense to endorse or promote products or
- services of Licensee, or any third party.
-
- 8. By clicking on the "ACCEPT" button where indicated, or by copying,
- installing or otherwise using Python 1.6.1, Licensee agrees to be
- bound by the terms and conditions of this License Agreement.
-
- ACCEPT
-
-
- CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
- --------------------------------------------------
-
- Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
- The Netherlands. All rights reserved.
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation, and that the name of Stichting Mathematisch
- Centrum or CWI not be used in advertising or publicity pertaining to
- distribution of the software without specific, written prior
- permission.
-
- STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
- THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
- FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
- OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--------------------------------------------------------------------------------
-
-
-src/murmurhashneutral2.[hc]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This fast hash implementation is released to the public domain by Austin
-Appleby. See http://murmurhash.googlepages.com.
-
-
-src/snprintf.c and m4/snprintf.m4
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This implementation of `snprintf()` and similar functions was downloaded from
-http://www.jhweiss.de/software/snprintf.html and has the following license:
-
--------------------------------------------------------------------------------
- Copyright (c) 1995 Patrick Powell.
-
- This code is based on code written by Patrick Powell <papowell@astart.com>.
- It may be used for any purpose as long as this notice remains intact on all
- source code distributions.
-
- Copyright (c) 2008 Holger Weiss.
-
- This version of the code is maintained by Holger Weiss <holger@jhweiss.de>.
- My changes to the code may freely be used, modified and/or redistributed for
- any purpose. It would be nice if additions and fixes to this file (including
- trivial code cleanups) would be sent back in order to let me include them in
- the version available at <http://www.jhweiss.de/software/snprintf.html>.
- However, this is not a requirement for using or redistributing (possibly
- modified) versions of this file, nor is leaving this notice intact mandatory.
--------------------------------------------------------------------------------
-
-
-src/zlib/*.[hc]
-~~~~~~~~~~~~~~~
-
-This is a bundled subset of zlib 1.2.8 from <http://zlib.net> with the
-following license:
-
--------------------------------------------------------------------------------
- Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
--------------------------------------------------------------------------------
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.9" />\r
-<title>CCACHE(1)</title>\r
-<style type="text/css">\r
-/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
-\r
-/* Default font. */\r
-body {\r
- font-family: Georgia,serif;\r
-}\r
-\r
-/* Title font. */\r
-h1, h2, h3, h4, h5, h6,\r
-div.title, caption.title,\r
-thead, p.table.header,\r
-#toctitle,\r
-#author, #revnumber, #revdate, #revremark,\r
-#footer {\r
- font-family: Arial,Helvetica,sans-serif;\r
-}\r
-\r
-body {\r
- margin: 1em 5% 1em 5%;\r
-}\r
-\r
-a {\r
- color: blue;\r
- text-decoration: underline;\r
-}\r
-a:visited {\r
- color: fuchsia;\r
-}\r
-\r
-em {\r
- font-style: italic;\r
- color: navy;\r
-}\r
-\r
-strong {\r
- font-weight: bold;\r
- color: #083194;\r
-}\r
-\r
-h1, h2, h3, h4, h5, h6 {\r
- color: #527bbd;\r
- margin-top: 1.2em;\r
- margin-bottom: 0.5em;\r
- line-height: 1.3;\r
-}\r
-\r
-h1, h2, h3 {\r
- border-bottom: 2px solid silver;\r
-}\r
-h2 {\r
- padding-top: 0.5em;\r
-}\r
-h3 {\r
- float: left;\r
-}\r
-h3 + * {\r
- clear: left;\r
-}\r
-h5 {\r
- font-size: 1.0em;\r
-}\r
-\r
-div.sectionbody {\r
- margin-left: 0;\r
-}\r
-\r
-hr {\r
- border: 1px solid silver;\r
-}\r
-\r
-p {\r
- margin-top: 0.5em;\r
- margin-bottom: 0.5em;\r
-}\r
-\r
-ul, ol, li > p {\r
- margin-top: 0;\r
-}\r
-ul > li { color: #aaa; }\r
-ul > li > * { color: black; }\r
-\r
-.monospaced, code, pre {\r
- font-family: "Courier New", Courier, monospace;\r
- font-size: inherit;\r
- color: navy;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-pre {\r
- white-space: pre-wrap;\r
-}\r
-\r
-#author {\r
- color: #527bbd;\r
- font-weight: bold;\r
- font-size: 1.1em;\r
-}\r
-#email {\r
-}\r
-#revnumber, #revdate, #revremark {\r
-}\r
-\r
-#footer {\r
- font-size: small;\r
- border-top: 2px solid silver;\r
- padding-top: 0.5em;\r
- margin-top: 4.0em;\r
-}\r
-#footer-text {\r
- float: left;\r
- padding-bottom: 0.5em;\r
-}\r
-#footer-badges {\r
- float: right;\r
- padding-bottom: 0.5em;\r
-}\r
-\r
-#preamble {\r
- margin-top: 1.5em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.imageblock, div.exampleblock, div.verseblock,\r
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
-div.admonitionblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.admonitionblock {\r
- margin-top: 2.0em;\r
- margin-bottom: 2.0em;\r
- margin-right: 10%;\r
- color: #606060;\r
-}\r
-\r
-div.content { /* Block element content. */\r
- padding: 0;\r
-}\r
-\r
-/* Block element titles. */\r
-div.title, caption.title {\r
- color: #527bbd;\r
- font-weight: bold;\r
- text-align: left;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.5em;\r
-}\r
-div.title + * {\r
- margin-top: 0;\r
-}\r
-\r
-td div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content + div.title {\r
- margin-top: 0.0em;\r
-}\r
-\r
-div.sidebarblock > div.content {\r
- background: #ffffee;\r
- border: 1px solid #dddddd;\r
- border-left: 4px solid #f0f0f0;\r
- padding: 0.5em;\r
-}\r
-\r
-div.listingblock > div.content {\r
- border: 1px solid #dddddd;\r
- border-left: 5px solid #f0f0f0;\r
- background: #f8f8f8;\r
- padding: 0.5em;\r
-}\r
-\r
-div.quoteblock, div.verseblock {\r
- padding-left: 1.0em;\r
- margin-left: 1.0em;\r
- margin-right: 10%;\r
- border-left: 5px solid #f0f0f0;\r
- color: #888;\r
-}\r
-\r
-div.quoteblock > div.attribution {\r
- padding-top: 0.5em;\r
- text-align: right;\r
-}\r
-\r
-div.verseblock > pre.content {\r
- font-family: inherit;\r
- font-size: inherit;\r
-}\r
-div.verseblock > div.attribution {\r
- padding-top: 0.75em;\r
- text-align: left;\r
-}\r
-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
-div.verseblock + div.attribution {\r
- text-align: left;\r
-}\r
-\r
-div.admonitionblock .icon {\r
- vertical-align: top;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- text-decoration: underline;\r
- color: #527bbd;\r
- padding-right: 0.5em;\r
-}\r
-div.admonitionblock td.content {\r
- padding-left: 0.5em;\r
- border-left: 3px solid #dddddd;\r
-}\r
-\r
-div.exampleblock > div.content {\r
- border-left: 3px solid #dddddd;\r
- padding-left: 0.5em;\r
-}\r
-\r
-div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; vertical-align: text-bottom; }\r
-a.image:visited { color: white; }\r
-\r
-dl {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-dt {\r
- margin-top: 0.5em;\r
- margin-bottom: 0;\r
- font-style: normal;\r
- color: navy;\r
-}\r
-dd > *:first-child {\r
- margin-top: 0.1em;\r
-}\r
-\r
-ul, ol {\r
- list-style-position: outside;\r
-}\r
-ol.arabic {\r
- list-style-type: decimal;\r
-}\r
-ol.loweralpha {\r
- list-style-type: lower-alpha;\r
-}\r
-ol.upperalpha {\r
- list-style-type: upper-alpha;\r
-}\r
-ol.lowerroman {\r
- list-style-type: lower-roman;\r
-}\r
-ol.upperroman {\r
- list-style-type: upper-roman;\r
-}\r
-\r
-div.compact ul, div.compact ol,\r
-div.compact p, div.compact p,\r
-div.compact div, div.compact div {\r
- margin-top: 0.1em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-tfoot {\r
- font-weight: bold;\r
-}\r
-td > div.verse {\r
- white-space: pre;\r
-}\r
-\r
-div.hdlist {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-div.hdlist tr {\r
- padding-bottom: 15px;\r
-}\r
-dt.hdlist1.strong, td.hdlist1.strong {\r
- font-weight: bold;\r
-}\r
-td.hdlist1 {\r
- vertical-align: top;\r
- font-style: normal;\r
- padding-right: 0.8em;\r
- color: navy;\r
-}\r
-td.hdlist2 {\r
- vertical-align: top;\r
-}\r
-div.hdlist.compact tr {\r
- margin: 0;\r
- padding-bottom: 0;\r
-}\r
-\r
-.comment {\r
- background: yellow;\r
-}\r
-\r
-.footnote, .footnoteref {\r
- font-size: 0.8em;\r
-}\r
-\r
-span.footnote, span.footnoteref {\r
- vertical-align: super;\r
-}\r
-\r
-#footnotes {\r
- margin: 20px 0 20px 0;\r
- padding: 7px 0 0 0;\r
-}\r
-\r
-#footnotes div.footnote {\r
- margin: 0 0 5px 0;\r
-}\r
-\r
-#footnotes hr {\r
- border: none;\r
- border-top: 1px solid silver;\r
- height: 1px;\r
- text-align: left;\r
- margin-left: 0;\r
- width: 20%;\r
- min-width: 100px;\r
-}\r
-\r
-div.colist td {\r
- padding-right: 0.5em;\r
- padding-bottom: 0.3em;\r
- vertical-align: top;\r
-}\r
-div.colist td img {\r
- margin-top: 0.3em;\r
-}\r
-\r
-@media print {\r
- #footer-badges { display: none; }\r
-}\r
-\r
-#toc {\r
- margin-bottom: 2.5em;\r
-}\r
-\r
-#toctitle {\r
- color: #527bbd;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
- margin-top: 0;\r
- margin-bottom: 0;\r
-}\r
-div.toclevel2 {\r
- margin-left: 2em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel3 {\r
- margin-left: 4em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel4 {\r
- margin-left: 6em;\r
- font-size: 0.9em;\r
-}\r
-\r
-span.aqua { color: aqua; }\r
-span.black { color: black; }\r
-span.blue { color: blue; }\r
-span.fuchsia { color: fuchsia; }\r
-span.gray { color: gray; }\r
-span.green { color: green; }\r
-span.lime { color: lime; }\r
-span.maroon { color: maroon; }\r
-span.navy { color: navy; }\r
-span.olive { color: olive; }\r
-span.purple { color: purple; }\r
-span.red { color: red; }\r
-span.silver { color: silver; }\r
-span.teal { color: teal; }\r
-span.white { color: white; }\r
-span.yellow { color: yellow; }\r
-\r
-span.aqua-background { background: aqua; }\r
-span.black-background { background: black; }\r
-span.blue-background { background: blue; }\r
-span.fuchsia-background { background: fuchsia; }\r
-span.gray-background { background: gray; }\r
-span.green-background { background: green; }\r
-span.lime-background { background: lime; }\r
-span.maroon-background { background: maroon; }\r
-span.navy-background { background: navy; }\r
-span.olive-background { background: olive; }\r
-span.purple-background { background: purple; }\r
-span.red-background { background: red; }\r
-span.silver-background { background: silver; }\r
-span.teal-background { background: teal; }\r
-span.white-background { background: white; }\r
-span.yellow-background { background: yellow; }\r
-\r
-span.big { font-size: 2em; }\r
-span.small { font-size: 0.6em; }\r
-\r
-span.underline { text-decoration: underline; }\r
-span.overline { text-decoration: overline; }\r
-span.line-through { text-decoration: line-through; }\r
-\r
-div.unbreakable { page-break-inside: avoid; }\r
-\r
-\r
-/*\r
- * xhtml11 specific\r
- *\r
- * */\r
-\r
-div.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.tableblock > table {\r
- border: 3px solid #527bbd;\r
-}\r
-thead, p.table.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.table {\r
- margin-top: 0;\r
-}\r
-/* Because the table frame attribute is overriden by CSS in most browsers. */\r
-div.tableblock > table[frame="void"] {\r
- border-style: none;\r
-}\r
-div.tableblock > table[frame="hsides"] {\r
- border-left-style: none;\r
- border-right-style: none;\r
-}\r
-div.tableblock > table[frame="vsides"] {\r
- border-top-style: none;\r
- border-bottom-style: none;\r
-}\r
-\r
-\r
-/*\r
- * html5 specific\r
- *\r
- * */\r
-\r
-table.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-thead, p.tableblock.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.tableblock {\r
- margin-top: 0;\r
-}\r
-table.tableblock {\r
- border-width: 3px;\r
- border-spacing: 0px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
- border-collapse: collapse;\r
-}\r
-th.tableblock, td.tableblock {\r
- border-width: 1px;\r
- padding: 4px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
-}\r
-\r
-table.tableblock.frame-topbot {\r
- border-left-style: hidden;\r
- border-right-style: hidden;\r
-}\r
-table.tableblock.frame-sides {\r
- border-top-style: hidden;\r
- border-bottom-style: hidden;\r
-}\r
-table.tableblock.frame-none {\r
- border-style: hidden;\r
-}\r
-\r
-th.tableblock.halign-left, td.tableblock.halign-left {\r
- text-align: left;\r
-}\r
-th.tableblock.halign-center, td.tableblock.halign-center {\r
- text-align: center;\r
-}\r
-th.tableblock.halign-right, td.tableblock.halign-right {\r
- text-align: right;\r
-}\r
-\r
-th.tableblock.valign-top, td.tableblock.valign-top {\r
- vertical-align: top;\r
-}\r
-th.tableblock.valign-middle, td.tableblock.valign-middle {\r
- vertical-align: middle;\r
-}\r
-th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
- vertical-align: bottom;\r
-}\r
-\r
-\r
-/*\r
- * manpage specific\r
- *\r
- * */\r
-\r
-body.manpage h1 {\r
- padding-top: 0.5em;\r
- padding-bottom: 0.5em;\r
- border-top: 2px solid silver;\r
- border-bottom: 2px solid silver;\r
-}\r
-body.manpage h2 {\r
- border-style: none;\r
-}\r
-body.manpage div.sectionbody {\r
- margin-left: 3em;\r
-}\r
-\r
-@media print {\r
- body.manpage div#toc { display: none; }\r
-}\r
-\r
-\r
-</style>\r
-<script type="text/javascript">\r
-/*<+'])');\r
- // Function that scans the DOM tree for header elements (the DOM2\r
- // nodeIterator API would be a better technique but not supported by all\r
- // browsers).\r
- var iterate = function (el) {\r
- for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
- if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
- var mo = re.exec(i.tagName);\r
- if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
- }\r
- iterate(i);\r
- }\r
- }\r
- }\r
- iterate(el);\r
- return result;\r
- }\r
-\r
- var toc = document.getElementById("toc");\r
- if (!toc) {\r
- return;\r
- }\r
-\r
- // Delete existing TOC entries in case we're reloading the TOC.\r
- var tocEntriesToRemove = [];\r
- var i;\r
- for (i = 0; i < toc.childNodes.length; i++) {\r
- var entry = toc.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div'\r
- && entry.getAttribute("class")\r
- && entry.getAttribute("class").match(/^toclevel/))\r
- tocEntriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < tocEntriesToRemove.length; i++) {\r
- toc.removeChild(tocEntriesToRemove[i]);\r
- }\r
-\r
- // Rebuild TOC entries.\r
- var entries = tocEntries(document.getElementById("content"), toclevels);\r
- for (var i = 0; i < entries.length; ++i) {\r
- var entry = entries[i];\r
- if (entry.element.id == "")\r
- entry.element.id = "_toc_" + i;\r
- var a = document.createElement("a");\r
- a.href = "#" + entry.element.id;\r
- a.appendChild(document.createTextNode(entry.text));\r
- var div = document.createElement("div");\r
- div.appendChild(a);\r
- div.className = "toclevel" + entry.toclevel;\r
- toc.appendChild(div);\r
- }\r
- if (entries.length == 0)\r
- toc.parentNode.removeChild(toc);\r
-},\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Footnotes generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Based on footnote generation code from:\r
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
- */\r
-\r
-footnotes: function () {\r
- // Delete existing footnote entries in case we're reloading the footnodes.\r
- var i;\r
- var noteholder = document.getElementById("footnotes");\r
- if (!noteholder) {\r
- return;\r
- }\r
- var entriesToRemove = [];\r
- for (i = 0; i < noteholder.childNodes.length; i++) {\r
- var entry = noteholder.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
- entriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < entriesToRemove.length; i++) {\r
- noteholder.removeChild(entriesToRemove[i]);\r
- }\r
-\r
- // Rebuild footnote entries.\r
- var cont = document.getElementById("content");\r
- var spans = cont.getElementsByTagName("span");\r
- var refs = {};\r
- var n = 0;\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnote") {\r
- n++;\r
- var note = spans[i].getAttribute("data-note");\r
- if (!note) {\r
- // Use [\s\S] in place of . so multi-line matches work.\r
- // Because JavaScript has no s (dotall) regex flag.\r
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
- spans[i].innerHTML =\r
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- spans[i].setAttribute("data-note", note);\r
- }\r
- noteholder.innerHTML +=\r
- "<div class='footnote' id='_footnote_" + n + "'>" +\r
- "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
- n + "</a>. " + note + "</div>";\r
- var id =spans[i].getAttribute("id");\r
- if (id != null) refs["#"+id] = n;\r
- }\r
- }\r
- if (n == 0)\r
- noteholder.parentNode.removeChild(noteholder);\r
- else {\r
- // Process footnoterefs.\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnoteref") {\r
- var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
- href = href.match(/#.*/)[0]; // Because IE return full URL.\r
- n = refs[href];\r
- spans[i].innerHTML =\r
- "[<a href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- }\r
- }\r
- }\r
-},\r
-\r
-install: function(toclevels) {\r
- var timerId;\r
-\r
- function reinstall() {\r
- asciidoc.footnotes();\r
- if (toclevels) {\r
- asciidoc.toc(toclevels);\r
- }\r
- }\r
-\r
- function reinstallAndRemoveTimer() {\r
- clearInterval(timerId);\r
- reinstall();\r
- }\r
-\r
- timerId = setInterval(reinstall, 500);\r
- if (document.addEventListener)\r
- document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
- else\r
- window.onload = reinstallAndRemoveTimer;\r
-}\r
-\r
-}\r
-asciidoc.install(2);\r
-/*]]>*/\r
-</script>\r
-</head>\r
-<body class="article">\r
-<div id="header">\r
-<h1>CCACHE(1)</h1>\r
-<span id="revnumber">version 3.4.1</span>\r
-<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>
-</div>\r
-</div>\r
-<div id="content">\r
-<div class="sect1">\r
-<h2 id="_name">Name</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache - a fast C/C++ compiler cache</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_synopsis">Synopsis</h2>\r
-<div class="sectionbody">\r
-<div class="verseblock">\r
-<pre class="content"><strong>ccache</strong> [<em>options</em>]\r
-<strong>ccache</strong> <em>compiler</em> [<em>compiler options</em>]\r
-<em>compiler</em> [<em>compiler options</em>] (via symbolic link)</pre>\r
-<div class="attribution">\r
-</div></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_description">Description</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache is a compiler cache. It speeds up recompilation by caching the result of\r
-previous compilations and detecting when the same compilation is being done\r
-again. Supported languages are C, C++, Objective-C and Objective-C++.</p></div>\r
-<div class="paragraph"><p>ccache has been carefully written to always produce exactly the same compiler\r
-output that you would get without the cache. The only way you should be able to\r
-tell that you are using ccache is the speed. Currently known exceptions to this\r
-goal are listed under <a href="#_caveats">CAVEATS</a>. If you ever discover an\r
-undocumented case where ccache changes the output of your compiler, please let\r
-us know.</p></div>\r
-<div class="sect2">\r
-<h3 id="_features">Features</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Keeps statistics on hits/misses.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Automatic cache size management.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Can cache compilations that generate warnings.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Easy installation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Low overhead.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Optionally compresses files in the cache to reduce disk space.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_limitations">Limitations</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Only knows how to cache the compilation of a single\r
- C/C++/Objective-C/Objective-C++ file. Other types of compilations\r
- (multi-file compilation, linking, etc) will silently fall back to running the\r
- real compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Only works with GCC and compilers that behave similar enough.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Some compiler flags are not supported. If such a flag is detected, ccache\r
- will silently fall back to running the real compiler.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_run_modes">Run modes</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>There are two ways to use ccache. You can either prefix your compilation\r
-commands with <strong>ccache</strong> or you can let ccache masquerade as the compiler by\r
-creating a symbolic link (named as the compiler) to ccache. The first method is\r
-most convenient if you just want to try out ccache or wish to use it for some\r
-specific projects. The second method is most useful for when you wish to use\r
-ccache for all your compilations.</p></div>\r
-<div class="paragraph"><p>To use the first method, just make sure that <strong>ccache</strong> is in your <strong>PATH</strong>.</p></div>\r
-<div class="paragraph"><p>To use the symlinks method, do something like this:</p></div>\r
-<div class="listingblock">\r
-<div class="content">\r
-<pre><code>cp ccache /usr/local/bin/\r
-ln -s ccache /usr/local/bin/gcc\r
-ln -s ccache /usr/local/bin/g++\r
-ln -s ccache /usr/local/bin/cc\r
-ln -s ccache /usr/local/bin/c++</code></pre>\r
-</div></div>\r
-<div class="paragraph"><p>And so forth. This will work as long as the directory with symlinks comes\r
-before the path to the compiler (which is usually in <code>/usr/bin</code>). After\r
-installing you may wish to run “which gcc” to make sure that the correct link\r
-is being used.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Warning</div>\r
-</td>\r
-<td class="content">The technique of letting ccache masquerade as the compiler works well,\r
-but currently doesn’t interact well with other tools that do the same thing.\r
-See <a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.</td>\r
-</tr></table>\r
-</div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Warning</div>\r
-</td>\r
-<td class="content">Do not use a hard link, use a symbolic link. A hard link will cause\r
-“interesting” problems.</td>\r
-</tr></table>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_options">Options</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>These options only apply when you invoke ccache as “ccache”. When invoked as\r
-a compiler (via a symlink as described in the previous section), the normal\r
-compiler options apply and you should refer to the compiler’s documentation.</p></div>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-<strong>-c, --cleanup</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Clean up the cache by removing old cached files until the specified file\r
- number and cache size limits are not exceeded. This also recalculates the\r
- cache file count and size totals. Normally, there is no need to initiate\r
- cleanup manually as ccache keeps the cache below the specified limits at\r
- runtime and keeps statistics up to date on each compilation. Forcing a\r
- cleanup is mostly useful if you manually modify the cache contents or\r
- believe that the cache size statistics may be inaccurate.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-C, --clear</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Clear the entire cache, removing all cached files, but keeping the\r
- configuration file.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-F, --max-files</strong>=<em>N</em>\r
-</dt>\r
-<dd>\r
-<p>\r
- Set the maximum number of files allowed in the cache. Use 0 for no limit.\r
- The value is stored in a configuration file in the cache directory and\r
- applies to all future compilations.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-h, --help</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Print an options summary page.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-M, --max-size</strong>=<em>SIZE</em>\r
-</dt>\r
-<dd>\r
-<p>\r
- Set the maximum size of the files stored in the cache. <em>SIZE</em> should be a\r
- number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or\r
- Ti (binary). The default suffix is G. Use 0 for no limit. The value is\r
- stored in a configuration file in the cache directory and applies to all\r
- future compilations.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-o, --set-config</strong>=<em>KEY=VALUE</em>\r
-</dt>\r
-<dd>\r
-<p>\r
- Set configuration <em>KEY</em> to <em>VALUE</em>. See <a href="#_configuration">CONFIGURATION</a>\r
- for more information.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-p, --print-config</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Print current configuration options and from where they originate\r
- (environment variable, configuration file or compile-time default).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-s, --show-stats</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Print the current statistics summary for the cache.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-V, --version</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Print version and copyright information.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>-z, --zero-stats</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Zero the cache statistics (but not the configuration options).\r
-</p>\r
-</dd>\r
-</dl></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_extra_options">Extra options</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>When run as a compiler, ccache usually just takes the same command line options\r
-as the compiler you are using. The only exception to this is the option\r
-<strong>--ccache-skip</strong>. That option can be used to tell ccache to avoid interpreting\r
-the next option in any way and to pass it along to the compiler as-is.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content"><strong>--ccache-skip</strong> currently only tells ccache not to interpret the next\r
-option as a special compiler option — the option will still be included in the\r
-direct mode hash.</td>\r
-</tr></table>\r
-</div>\r
-<div class="paragraph"><p>The reason this can be important is that ccache does need to parse the command\r
-line and determine what is an input filename and what is a compiler option, as\r
-it needs the input filename to determine the name of the resulting object file\r
-(among other things). The heuristic ccache uses when parsing the command line\r
-is that any argument that exists as a file is treated as an input file name. By\r
-using <strong>--ccache-skip</strong> you can force an option to not be treated as an input\r
-file name and instead be passed along to the compiler as a command line option.</p></div>\r
-<div class="paragraph"><p>Another case where <strong>--ccache-skip</strong> can be useful is if ccache interprets an\r
-option specially but shouldn’t, since the option has another meaning for your\r
-compiler than what ccache thinks.</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_configuration">Configuration</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache’s default behavior can be overridden by configuration file settings,\r
-which in turn can be overridden by environment variables with names starting\r
-with <strong>CCACHE_</strong>. ccache normally reads configuration from two files: first a\r
-system-level configuration file and secondly a cache-specific configuration\r
-file. The priority of configuration settings is as follows (where 1 is\r
-highest):</p></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-Environment variables.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The cache-specific configuration file <strong><ccachedir>/ccache.conf</strong> (typically\r
- <strong>$HOME/.ccache/ccache.conf</strong>).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The system-wide configuration file <strong><sysconfdir>/ccache.conf</strong> (typically\r
- <strong>/etc/ccache.conf</strong> or <strong>/usr/local/etc/ccache.conf</strong>).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Compile-time defaults.\r
-</p>\r
-</li>\r
-</ol></div>\r
-<div class="paragraph"><p>As a special case, if the environment variable <strong>CCACHE_CONFIGPATH</strong> is set,\r
-ccache reads configuration from the specified path instead of the default\r
-paths.</p></div>\r
-<div class="sect2">\r
-<h3 id="_configuration_file_syntax">Configuration file syntax</h3>\r
-<div class="paragraph"><p>Configuration files are in a simple “key = value” format, one setting per\r
-line. Lines starting with a hash sign are comments. Blank lines are ignored, as\r
-is whitespace surrounding keys and values. Example:</p></div>\r
-<div class="listingblock">\r
-<div class="content">\r
-<pre><code># Set maximum cache size to 10 GB:\r
-max_size = 10G</code></pre>\r
-</div></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_boolean_values">Boolean values</h3>\r
-<div class="paragraph"><p>Some settings are boolean values (i.e. truth values). In a configuration file,\r
-such values must be set to the string <strong>true</strong> or <strong>false</strong>. For the corresponding\r
-environment variables, the semantics are a bit different: a set environment\r
-variable means “true” (even if set to the empty string), the following\r
-case-insensitive negative values are considered an error (rather than\r
-surprising the user): <strong>0</strong>, <strong>false</strong>, <strong>disable</strong> and <strong>no</strong>, and an unset\r
-environment variable means “false”. Each boolean environment variable also\r
-has a negated form starting with <strong>CCACHE_NO</strong>. For example, <strong>CCACHE_COMPRESS</strong>\r
-can be set to force compression and <strong>CCACHE_NOCOMPRESS</strong> can be set to force no\r
-compression.</p></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_configuration_settings">Configuration settings</h3>\r
-<div class="paragraph"><p>Below is a list of available configuration settings. The corresponding\r
-environment variable name is indicated in parentheses after each configuration\r
-setting key.</p></div>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-<strong>base_dir</strong> (<strong>CCACHE_BASEDIR</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting should be an absolute path to a directory. ccache then\r
- rewrites absolute paths into relative paths before computing the hash that\r
- identifies the compilation, but only for paths under the specified\r
- directory. If set to the empty string (which is the default), no rewriting\r
- is done. A typical path to use as the base directory is your home directory\r
- or another directory that is a parent of your build directories. Don’t use\r
- <code>/</code> as the base directory since that will make ccache also rewrite paths to\r
- system header files, which doesn’t gain anything.\r
-</p>\r
-<div class="paragraph"><p>See also the discussion under <a href="#_compiling_in_different_directories">COMPILING IN DIFFERENT DIRECTORIES</a>.</p></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>cache_dir</strong> (<strong>CCACHE_DIR</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting specifies where ccache will keep its cached compiler outputs.\r
- It will only take effect if set in the system-wide configuration file or as\r
- an environment variable. The default is <strong>$HOME/.ccache</strong>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>cache_dir_levels</strong> (<strong>CCACHE_NLEVELS</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting allows you to choose the number of directory levels in the\r
- cache directory. The default is 2. The minimum is 1 and the maximum is 8.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>compiler</strong> (<strong>CCACHE_CC</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting can be used to force the name of the compiler to use. If set\r
- to the empty string (which is the default), ccache works it out from the\r
- command line.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>compiler_check</strong> (<strong>CCACHE_COMPILERCHECK</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- By default, ccache includes the modification time (“mtime”) and size of\r
- the compiler in the hash to ensure that results retrieved from the cache\r
- are accurate. This setting can be used to select another strategy. Possible\r
- values are:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-<strong>content</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Hash the content of the compiler binary. This makes ccache very slightly\r
- slower compared to the <strong>mtime</strong> setting, but makes it cope better with\r
- compiler upgrades during a build bootstrapping process.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>mtime</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Hash the compiler’s mtime and size, which is fast. This is the default.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>none</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Don’t hash anything. This may be good for situations where you can safely\r
- use the cached results even though the compiler’s mtime or size has changed\r
- (e.g. if the compiler is built as part of your build system and the\r
- compiler’s source has not changed, or if the compiler only has changes that\r
- don’t affect code generation). You should only use the <strong>none</strong> setting if\r
- you know what you are doing.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>string:value</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Use <strong>value</strong> as the string to calculate hash from. This can be the compiler\r
- revision number you retrieved earlier and set here via environment variable.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<em>a command string</em>\r
-</dt>\r
-<dd>\r
-<p>\r
- Hash the standard output and standard error output of the specified\r
- command. The string will be split on whitespace to find out the command and\r
- arguments to run. No other interpretation of the command string will be\r
- done, except that the special word <strong>%compiler%</strong> will be replaced with the\r
- path to the compiler. Several commands can be specified with semicolon as\r
- separator. Examples:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="listingblock">\r
-<div class="content">\r
-<pre><code>%compiler% -v</code></pre>\r
-</div></div>\r
-<div class="listingblock">\r
-<div class="content">\r
-<pre><code>%compiler% -dumpmachine; %compiler% -dumpversion</code></pre>\r
-</div></div>\r
-<div class="paragraph"><p>You should make sure that the specified command is as fast as possible since it\r
-will be run once for each ccache invocation.</p></div>\r
-<div class="paragraph"><p>Identifying the compiler using a command is useful if you want to avoid cache\r
-misses when the compiler has been rebuilt but not changed.</p></div>\r
-<div class="paragraph"><p>Another case is when the compiler (as seen by ccache) actually isn’t the real\r
-compiler but another compiler wrapper — in that case, the default <strong>mtime</strong>\r
-method will hash the mtime and size of the other compiler wrapper, which means\r
-that ccache won’t be able to detect a compiler upgrade. Using a suitable\r
-command to identify the compiler is thus safer, but it’s also slower, so you\r
-should consider continue using the <strong>mtime</strong> method in combination with\r
-the <strong>prefix_command</strong> setting if possible. See\r
-<a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.</p></div>\r
-</div></div>\r
-</dd>\r
-</dl></div>\r
-</div></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>compression</strong> (<strong>CCACHE_COMPRESS</strong> or <strong>CCACHE_NOCOMPRESS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will compress object files and other compiler output it\r
- puts in the cache. However, this setting has no effect on how files are\r
- retrieved from the cache; compressed and uncompressed results will still be\r
- usable regardless of this setting. The default is false.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>compression_level</strong> (<strong>CCACHE_COMPRESSLEVEL</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting determines the level at which ccache will compress object\r
- files. It only has effect if <strong>compression</strong> is enabled. The value defaults\r
- to 6, and must be no lower than 1 (fastest, worst compression) and no\r
- higher than 9 (slowest, best compression).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>cpp_extension</strong> (<strong>CCACHE_EXTENSION</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting can be used to force a certain extension for the intermediate\r
- preprocessed file. The default is to automatically determine the extension\r
- to use for intermediate preprocessor files based on the type of file being\r
- compiled, but that sometimes doesn’t work. For example, when using the\r
- “aCC” compiler on HP-UX, set the cpp extension to <strong>i</strong>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>direct_mode</strong> (<strong>CCACHE_DIRECT</strong> or <strong>CCACHE_NODIRECT</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, the direct mode will be used. The default is true. See\r
- <a href="#_the_direct_mode">THE DIRECT MODE</a>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>disable</strong> (<strong>CCACHE_DISABLE</strong> or <strong>CCACHE_NODISABLE</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- When true, ccache will just call the real compiler, bypassing the cache\r
- completely. The default is false.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>extra_files_to_hash</strong> (<strong>CCACHE_EXTRAFILES</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting is a list of paths to files that ccache will include in the\r
- the hash sum that identifies the build. The list separator is semicolon on\r
- Windows systems and colon on other systems.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>hard_link</strong> (<strong>CCACHE_HARDLINK</strong> or <strong>CCACHE_NOHARDLINK</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will attempt to use hard links from the cache directory\r
- when creating the compiler output rather than using a file copy. Hard links\r
- are never made for compressed cache files. This means that you should not\r
- enable compression if you want to use hard links. The default is false.\r
-</p>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Warning</div>\r
-</td>\r
-<td class="content">Do not enable this option unless you are aware of the consequences.\r
-Using hard links may be slightly faster in some situations, but there are\r
-several pitfalls since the resulting object file will share i-node with the\r
-cached object file:</td>\r
-</tr></table>\r
-</div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-If the resulting object file is modified in any way, the cached object file\r
- will be modified as well. For instance, if you run <strong>strip object.o</strong> or <strong>echo\r
- >object.o</strong>, you will corrupt the cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Programs that rely on modification times (like “make”) can be confused\r
- since ccache updates the cached files' modification times as part of the\r
- automatic cache size management. This will affect object files in the build\r
- tree as well, which can retrigger the linking step even though nothing\r
- really has changed.\r
-</p>\r
-</li>\r
-</ol></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>hash_dir</strong> (<strong>CCACHE_HASHDIR</strong> or <strong>CCACHE_NOHASHDIR</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true (which is the default), ccache will include the current working\r
- directory (CWD) in the hash that is used to distinguish two compilations\r
- when generating debug info (compiler option <strong>-g</strong> with variations).\r
- Exception: The CWD will not be included in the hash if <strong>base_dir</strong> is set\r
- (and matches the CWD) and the compiler option <strong>-fdebug-prefix-map</strong> is used.\r
- See also the discussion under\r
- <a href="#_compiling_in_different_directories">COMPILING IN DIFFERENT DIRECTORIES</a>.\r
-</p>\r
-<div class="paragraph"><p>The reason for including the CWD in the hash by default is to prevent a problem\r
-with the storage of the current working directory in the debug info of an\r
-object file, which can lead ccache to return a cached object file that has the\r
-working directory in the debug info set incorrectly.</p></div>\r
-<div class="paragraph"><p>You can disable this setting to get cache hits when compiling the same source\r
-code in different directories if you don’t mind that CWD in the debug info\r
-might be incorrect.</p></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>ignore_headers_in_manifest</strong> (<strong>CCACHE_IGNOREHEADERS</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting is a list of paths to files (or directories with headers) that\r
- ccache will <strong>not</strong> include in the manifest list that makes up the direct\r
- mode. Note that this can cause stale cache hits if those headers do indeed\r
- change. The list separator is semicolon on Windows systems and colon on\r
- other systems.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>keep_comments_cpp</strong> (<strong>CCACHE_COMMENTS</strong> or <strong>CCACHE_NOCOMMENTS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will not discard the comments before hashing preprocessor\r
- output. This can be used to check documentation with <strong>-Wdocumentation</strong>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>limit_multiple</strong> (<strong>CCACHE_LIMIT_MULTIPLE</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- Sets the limit when cleaning up. Files are deleted (in LRU order) until the\r
- levels are below the limit. The default is 0.8 (= 80%). See\r
- <a href="#_automatic_cleanup">AUTOMATIC CLEANUP</a> for more information.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>log_file</strong> (<strong>CCACHE_LOGFILE</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- If set to a file path, ccache will write information on what it is doing to\r
- the specified file. This is useful for tracking down problems.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>max_files</strong> (<strong>CCACHE_MAXFILES</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This option specifies the maximum number of files to keep in the cache. Use\r
- 0 for no limit (which is the default). See also\r
- <a href="#_cache_size_management">CACHE SIZE MANAGEMENT</a>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>max_size</strong> (<strong>CCACHE_MAXSIZE</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This option specifies the maximum size of the cache. Use 0 for no limit.\r
- The default value is 5G. Available suffixes: k, M, G, T (decimal) and Ki,\r
- Mi, Gi, Ti (binary). The default suffix is "G". See also\r
- <a href="#_cache_size_management">CACHE SIZE MANAGEMENT</a>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>path</strong> (<strong>CCACHE_PATH</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- If set, ccache will search directories in this list when looking for the\r
- real compiler. The list separator is semicolon on Windows systems and colon\r
- on other systems. If not set, ccache will look for the first executable\r
- matching the compiler name in the normal <strong>PATH</strong> that isn’t a symbolic link\r
- to ccache itself.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>prefix_command</strong> (<strong>CCACHE_PREFIX</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This option adds a list of prefixes (separated by space) to the command\r
- line that ccache uses when invoking the compiler. See also\r
- <a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>prefix_command_cpp</strong> (<strong>CCACHE_PREFIX_CPP</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This option adds a list of prefixes (separated by space) to the command\r
- line that ccache uses when invoking the preprocessor.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>read_only</strong> (<strong>CCACHE_READONLY</strong> or <strong>CCACHE_NOREADONLY</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will attempt to use existing cached object files, but it\r
- will not to try to add anything new to the cache. If you are using this\r
- because your ccache directory is read-only, then you need to set\r
- <strong>temporary_dir</strong> as otherwise ccache will fail to create temporary files.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>read_only_direct</strong> (<strong>CCACHE_READONLY_DIRECT</strong> or <strong>CCACHE_NOREADONLY_DIRECT</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- Just like <strong>read_only</strong> except that ccache will only try to retrieve results\r
- from the cache using the direct mode, not the preprocessor mode. See\r
- documentation for <strong>read_only</strong> regarding using a read-only ccache directory.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>recache</strong> (<strong>CCACHE_RECACHE</strong> or <strong>CCACHE_NORECACHE</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will not use any previously stored result. New results will\r
- still be cached, possibly overwriting any pre-existing results.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>run_second_cpp</strong> (<strong>CCACHE_CPP2</strong> or <strong>CCACHE_NOCPP2</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will first run the preprocessor to preprocess the source\r
- code (see <a href="#_the_preprocessor_mode">THE PREPROCESSOR MODE</a>) and then on a\r
- cache miss run the compiler on the source code to get hold of the object\r
- file. This is the default.\r
-</p>\r
-<div class="paragraph"><p>If false, ccache will first run preprocessor to preprocess the source code and\r
-then on a cache miss run the compiler on the <em>preprocessed source code</em> instead\r
-of the original source code. This makes cache misses slightly faster since the\r
-source code only has to be preprocessed once. The downside is that some\r
-compilers won’t produce the same result (for instance diagnostics warnings)\r
-when compiling preprocessed source code.</p></div>\r
-<div class="paragraph"><p>A solution to the above mentioned downside is to set <strong>run_second_cpp</strong> to false\r
-and pass <strong>-fdirectives-only</strong> (for GCC) or <strong>-frewrite-includes</strong> (for Clang) to\r
-the compiler. This will cause the compiler to leave the macros and other\r
-preprocessor information, and only process the <strong>#include</strong> directives. When run\r
-in this way, the preprocessor arguments will be passed to the compiler since it\r
-still has to do <em>some</em> preprocessing (like macros).</p></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>sloppiness</strong> (<strong>CCACHE_SLOPPINESS</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- By default, ccache tries to give as few false cache hits as possible.\r
- However, in certain situations it’s possible that you know things that\r
- ccache can’t take for granted. This setting makes it possible to tell\r
- ccache to relax some checks in order to increase the hit rate. The value\r
- should be a comma-separated string with options. Available options are:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-<strong>file_macro</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Ignore <strong>__FILE__</strong> being present in the source.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>file_stat_matches</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- ccache normally examines a file’s contents to determine whether it matches\r
- the cached version. With this option set, ccache will consider a file as\r
- matching its cached version if the mtimes and ctimes match.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>include_file_ctime</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- By default, ccache also will not cache a file if it includes a header whose\r
- ctime is too new. This option disables that check.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>include_file_mtime</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- By default, ccache will not cache a file if it includes a header whose\r
- mtime is too new. This option disables that check.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>no_system_headers</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- By default, ccache will also include all system headers in the manifest.\r
- With this option set, ccache will only include system headers in the hash\r
- but not add the system header files to the list of include files.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>pch_defines</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Be sloppy about <strong>#define</strong>s when precompiling a header file. See\r
- <a href="#_precompiled_headers">PRECOMPILED HEADERS</a> for more information.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>time_macros</strong>\r
-</dt>\r
-<dd>\r
-<p>\r
- Ignore <strong>__DATE__</strong> and <strong>__TIME__</strong> being present in the source code.\r
-</p>\r
-</dd>\r
-</dl></div>\r
-</div></div>\r
-<div class="paragraph"><p>See the discussion under <a href="#_troubleshooting">TROUBLESHOOTING</a> for more\r
-information.</p></div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>stats</strong> (<strong>CCACHE_STATS</strong> or <strong>CCACHE_NOSTATS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will update the statistics counters on each compilation.\r
- The default is true.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>temporary_dir</strong> (<strong>CCACHE_TEMPDIR</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting specifies where ccache will put temporary files. The default\r
- is <strong><cache_dir>/tmp</strong>.\r
-</p>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">In previous versions of ccache, <strong>CCACHE_TEMPDIR</strong> had to be on the same\r
- filesystem as the <strong>CCACHE_DIR</strong> path, but this requirement has been\r
- relaxed.)</td>\r
-</tr></table>\r
-</div>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>umask</strong> (<strong>CCACHE_UMASK</strong>)\r
-</dt>\r
-<dd>\r
-<p>\r
- This setting specifies the umask for ccache and all child processes (such\r
- as the compiler). This is mostly useful when you wish to share your cache\r
- with other users. Note that this also affects the file permissions set on\r
- the object files created from your compilations.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-<strong>unify</strong> (<strong>CCACHE_UNIFY</strong> or <strong>CCACHE_NOUNIFY</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
-</dt>\r
-<dd>\r
-<p>\r
- If true, ccache will use a C/C++ unifier when hashing the preprocessor\r
- output if the <strong>-g</strong> option is not used. The unifier is slower than a normal\r
- hash, so setting this environment variable loses a little bit of speed, but\r
- it means that ccache can take advantage of not recompiling when the changes\r
- to the source code consist of reformatting only. Note that enabling the\r
- unifier changes the hash, so cached compilations produced when the unifier\r
- is enabled cannot be reused when the unifier is disabled, and vice versa.\r
- Enabling the unifier may result in incorrect line number information in\r
- compiler warning messages and expansions of the <strong>__LINE__</strong> macro.\r
-</p>\r
-</dd>\r
-</dl></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_cache_size_management">Cache size management</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>By default, ccache has a 5 GB limit on the total size of files in the cache and\r
-no limit on the number of files. You can set different limits using the\r
-<strong>-M</strong>/<strong>--max-size</strong> and <strong>-F</strong>/<strong>--max-files</strong> options. Use <strong>ccache -s/--show-stats</strong>\r
-to see the cache size and the currently configured limits (in addition to other\r
-various statistics).</p></div>\r
-<div class="paragraph"><p>Cleanup can be triggered in two different ways: automatic and manual.</p></div>\r
-<div class="sect2">\r
-<h3 id="_automatic_cleanup">Automatic cleanup</h3>\r
-<div class="paragraph"><p>ccache maintains counters for various statistics about the cache, including the\r
-size and number of all cached files. In order to improve performance and reduce\r
-issues with concurrent ccache invocations, there is one statistics file for\r
-each of the sixteen subdirectories in the cache.</p></div>\r
-<div class="paragraph"><p>After a new compilation result has been written to the cache, ccache will\r
-update the size and file number statistics for the subdirectory (one of\r
-sixteen) to which the result was written. Then, if the size counter for said\r
-subdirectory is greater than <strong>max_size / 16</strong> or the file number counter is\r
-greater than <strong>max_files / 16</strong>, automatic cleanup is triggered.</p></div>\r
-<div class="paragraph"><p>When automatic cleanup is triggered for a subdirectory in the cache, ccache\r
-will:</p></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-Count all files in the subdirectory and compute their aggregated size.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Remove files in LRU (least recently used) order until the size is at most\r
- <strong>limit_multiple * max_size / 16</strong> and the number of files is at most\r
- <strong>limit_multiple * max_files / 16</strong>, where <strong>limit_multiple</strong>, <strong>max_size</strong> and\r
- <strong>max_files</strong> are configuration settings.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Set the size and file number counters to match the files that were kept.\r
-</p>\r
-</li>\r
-</ol></div>\r
-<div class="paragraph"><p>The reason for removing more files than just those needed to not exceed the max\r
-limits is that a cleanup is a fairly slow operation, so it would not be a good\r
-idea to trigger it often, like after each cache miss.</p></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_manual_cleanup">Manual cleanup</h3>\r
-<div class="paragraph"><p>You can run <strong>ccache -c/--cleanup</strong> to force cleanup of the whole cache, i.e. all\r
-of the sixteen subdirectories. This will recalculate the statistics counters\r
-and make sure that the <strong>max_size</strong> and <strong>max_files</strong> settings are not exceeded.\r
-Note that <strong>limit_multiple</strong> is not taken into account for manual cleanup.</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_cache_compression">Cache compression</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache can optionally compress all files it puts into the cache using the\r
-compression library zlib. While this may involve a tiny performance slowdown,\r
-it increases the number of files that fit in the cache. You can turn on\r
-compression with the <strong>compression</strong> configuration setting and you can also tweak\r
-the compression level with <strong>compression_level</strong>.</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_cache_statistics">Cache statistics</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p><strong>ccache -s/--show-stats</strong> can show the following statistics:</p></div>\r
-<div class="tableblock">\r
-<table rules="all"\r
-width="100%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<col width="30%" />\r
-<col width="70%" />\r
-<thead>\r
-<tr>\r
-<th align="left" valign="top">Name </th>\r
-<th align="left" valign="top"> Description</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">autoconf compile/link</p></td>\r
-<td align="left" valign="top"><p class="table">Uncachable compilation or linking by an autoconf test.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">bad compiler arguments</p></td>\r
-<td align="left" valign="top"><p class="table">Malformed compiler argument, e.g. missing a value for an option that requires\r
-an argument or failure to read a file specified by an option argument.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cache file missing</p></td>\r
-<td align="left" valign="top"><p class="table">A file was unexpectedly missing from the cache. This only happens in rare\r
-situations, e.g. if one ccache instance is about to get a file from the cache\r
-while another instance removed the file as part of cache cleanup.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cache hit (direct)</p></td>\r
-<td align="left" valign="top"><p class="table">A result was successfully found using <a href="#_the_direct_mode">the direct mode</a>.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cache hit (preprocessed)</p></td>\r
-<td align="left" valign="top"><p class="table">A result was successfully found using <a href="#_the_preprocessor_mode">the preprocessor mode</a>.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cache miss</p></td>\r
-<td align="left" valign="top"><p class="table">No result was found.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cache size</p></td>\r
-<td align="left" valign="top"><p class="table">Current size of the cache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">called for link</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler was called for linking, not compiling.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">called for preprocessing</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler was called for preprocessing, not compiling.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">can’t use precompiled header</p></td>\r
-<td align="left" valign="top"><p class="table">Preconditions for using <a href="#_precompiled_headers">precompiled headers</a> were not\r
-fulfilled.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">ccache internal error</p></td>\r
-<td align="left" valign="top"><p class="table">Unexpected failure, e.g. due to problems reading/writing the cache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">cleanups performed</p></td>\r
-<td align="left" valign="top"><p class="table">Number of cleanups performed, either implicitly due to the cache size limit\r
-being reached or due to explicit <strong>ccache -c/--cleanup</strong> calls.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">compile failed</p></td>\r
-<td align="left" valign="top"><p class="table">The compilation failed. No result stored in the cache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">compiler check failed</p></td>\r
-<td align="left" valign="top"><p class="table">A compiler check program specified by <strong>compiler_check</strong> (<strong>CCACHE_COMPILERCHECK</strong>)\r
-failed.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">compiler produced empty output</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler’s output file (typically an object file) was empty after\r
-compilation.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">compiler produced no output</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler’s output file (typically an object file) was missing after\r
-compilation.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">compiler produced stdout</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler wrote data to standard output. This is something that compilers\r
-normally never do, so ccache is not designed to store such output in the cache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">couldn’t find the compiler</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler to execute could not be found.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">error hashing extra file</p></td>\r
-<td align="left" valign="top"><p class="table">Failure reading a file specified by <strong>extra_files_to_hash</strong>\r
-(<strong>CCACHE_EXTRAFILES</strong>).</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">files in cache</p></td>\r
-<td align="left" valign="top"><p class="table">Current number of files in the cache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">multiple source files</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler was called to compile multiple source files in one go. This is not\r
-supported by ccache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">no input file</p></td>\r
-<td align="left" valign="top"><p class="table">No input file was specified to the compiler.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">output to a non-regular file</p></td>\r
-<td align="left" valign="top"><p class="table">The output path specified with <strong>-o</strong> is not a file (e.g. a directory or a device\r
-node).</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">output to stdout</p></td>\r
-<td align="left" valign="top"><p class="table">The compiler was instructed to write its output to standard output using <strong>-o\r
--</strong>. This is not supported by ccache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">preprocessor error</p></td>\r
-<td align="left" valign="top"><p class="table">Preprocessing the source code using the compiler’s <strong>-E</strong> option failed.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">unsupported code directive</p></td>\r
-<td align="left" valign="top"><p class="table">Code like the assembler “.incbin” directive was found. This is not supported\r
-by ccache.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">unsupported compiler option</p></td>\r
-<td align="left" valign="top"><p class="table">A compiler option not supported by ccache was found.</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table">unsupported source language</p></td>\r
-<td align="left" valign="top"><p class="table">A source language e.g. specified with <strong>-x</strong> was unsupported by ccache.</p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_how_ccache_works">How ccache works</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>The basic idea is to detect when you are compiling exactly the same code a\r
-second time and reuse the previously produced output. The detection is done by\r
-hashing different kinds of information that should be unique for the\r
-compilation and then using the hash sum to identify the cached output. ccache\r
-uses MD4, a very fast cryptographic hash algorithm, for the hashing. (MD4 is\r
-nowadays too weak to be useful in cryptographic contexts, but it should be safe\r
-enough to be used to identify recompilations.) On a cache hit, ccache is able\r
-to supply all of the correct compiler outputs (including all warnings,\r
-dependency file, etc) from the cache.</p></div>\r
-<div class="paragraph"><p>ccache has two ways of doing the detection:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the <strong>direct mode</strong>, where ccache hashes the source code and include files\r
- directly\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the <strong>preprocessor mode</strong>, where ccache runs the preprocessor on the source\r
- code and hashes the result\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>The direct mode is generally faster since running the preprocessor has some\r
-overhead.</p></div>\r
-<div class="sect2">\r
-<h3 id="_common_hashed_information">Common hashed information</h3>\r
-<div class="paragraph"><p>For both modes, the following information is included in the hash:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the extension used by the compiler for a file with preprocessor output\r
- (normally <strong>.i</strong> for C code and <strong>.ii</strong> for C++ code)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the compiler’s size and modification time (or other compiler-specific\r
- information specified by the <strong>compiler_check</strong> setting)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the name of the compiler\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the current directory (if the <strong>hash_dir</strong> setting is enabled)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-contents of files specified by the <strong>extra_files_to_hash</strong> setting (if any)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_the_direct_mode">The direct mode</h3>\r
-<div class="paragraph"><p>In the direct mode, the hash is formed of the common information and:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the input source file\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the command line options\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>Based on the hash, a data structure called “manifest” is looked up in the\r
-cache. The manifest contains:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-references to cached compilation results (object file, dependency file, etc)\r
- that were produced by previous compilations that matched the hash\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-paths to the include files that were read at the time the compilation results\r
- were stored in the cache\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-hash sums of the include files at the time the compilation results were\r
- stored in the cache\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>The current contents of the include files are then hashed and compared to the\r
-information in the manifest. If there is a match, ccache knows the result of\r
-the compilation. If there is no match, ccache falls back to running the\r
-preprocessor. The output from the preprocessor is parsed to find the include\r
-files that were read. The paths and hash sums of those include files are then\r
-stored in the manifest along with information about the produced compilation\r
-result.</p></div>\r
-<div class="paragraph"><p>There is a catch with the direct mode: header files that were used by the\r
-compiler are recorded, but header files that were <strong>not</strong> used, but would have\r
-been used if they existed, are not. So, when ccache checks if a result can be\r
-taken from the cache, it currently can’t check if the existence of a new header\r
-file should invalidate the result. In practice, the direct mode is safe to use\r
-in the absolute majority of cases.</p></div>\r
-<div class="paragraph"><p>The direct mode will be disabled if any of the following holds:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the configuration setting <strong>direct_mode</strong> is false\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-a modification time of one of the include files is too new (needed to avoid a\r
- race condition)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-a compiler option not supported by the direct mode is used:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-a <strong>-Wp,<em>X</em></strong> compiler option other than <strong>-Wp,-MD,<em>path</em></strong>,\r
- <strong>-Wp,-MMD,<em>path</em></strong> and <strong>-Wp,-D_define_</strong>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<strong>-Xpreprocessor</strong>\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-the string “__TIME__” is present in the source code\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_the_preprocessor_mode">The preprocessor mode</h3>\r
-<div class="paragraph"><p>In the preprocessor mode, the hash is formed of the common information and:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the preprocessor output from running the compiler with <strong>-E</strong>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the command line options except options that affect include files (<strong>-I</strong>,\r
- <strong>-include</strong>, <strong>-D</strong>, etc; the theory is that these options will change the\r
- preprocessor output if they have any effect at all)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-any standard error output generated by the preprocessor\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>Based on the hash, the cached compilation result can be looked up directly in\r
-the cache.</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_compiling_in_different_directories">Compiling in different directories</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Some information included in the hash that identifies a unique compilation can\r
-contain absolute paths:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The preprocessed source code may contain absolute paths to include files if\r
- the compiler option <strong>-g</strong> is used or if absolute paths are given to <strong>-I</strong> and\r
- similar compiler options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Paths specified by compiler options (such as <strong>-I</strong>, <strong>-MF</strong>, etc) on the command\r
- line may be absolute.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The source code file path may be absolute, and that path may substituted for\r
- <strong>__FILE__</strong> macros in the source code or included in warnings emitted to\r
- standard error by the preprocessor.\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>This means that if you compile the same code in different locations, you can’t\r
-share compilation results between the different build directories since you get\r
-cache misses because of the absolute build directory paths that are part of the\r
-hash.</p></div>\r
-<div class="paragraph"><p>Here’s what can be done to enable cache hits between different build\r
-directories:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-If you build with <strong>-g</strong> (or similar) to add debug information to the object\r
- file, you must either:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-use the <strong>-fdebug-prefix-map=<em>old</em>=<em>new</em></strong> option for relocating debug info to\r
- a common prefix (e.g. <strong>-fdebug-prefix-map=$PWD=.</strong>); or\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-set <strong>hash_dir = false</strong>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div></div>\r
-</li>\r
-<li>\r
-<p>\r
-If you use absolute paths anywhere on the command line (e.g. the source code\r
- file path or an argument to compiler options like <strong>-I</strong> and <strong>-MF</strong>), you must\r
- to set <strong>base_dir</strong> to an absolute path to a “base directory”. ccache will\r
- then rewrite absolute paths under that directory to relative before computing\r
- the hash.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_precompiled_headers">Precompiled headers</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache has support for GCC’s precompiled headers. However, you have to do some\r
-things to make it work properly:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-You must set <strong>sloppiness</strong> to <strong>pch_defines,time_macros</strong>. The reason is that\r
- ccache can’t tell whether <strong>__TIME__</strong> or <strong>__DATE__</strong> is used when using a\r
- precompiled header. Further, it can’t detect changes in <strong>#define</strong>s in the\r
- source code because of how preprocessing works in combination with\r
- precompiled headers.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-You must either:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-use the <strong>-include</strong> compiler option to include the precompiled header\r
- (i.e., don’t use <strong>#include</strong> in the source code to include the header); or\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-(for the Clang compiler) use the <strong>-include-pch</strong> compiler option to include\r
- the PCH file generated from the precompiled header; or\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-add the <strong>-fpch-preprocess</strong> compiler option when compiling.\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>If you don’t do this, either the non-precompiled version of the header file\r
-will be used (if available) or ccache will fall back to running the real\r
-compiler and increase the statistics counter “preprocessor error” (if the\r
-non-precompiled header file is not available).</p></div>\r
-</div></div>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_sharing_a_cache">Sharing a cache</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>A group of developers can increase the cache hit rate by sharing a cache\r
-directory. To share a cache without unpleasant side effects, the following\r
-conditions should to be met:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Use the same cache directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Make sure that the configuration setting <strong>hard_link</strong> is false (which is the\r
- default).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Make sure that all users are in the same group.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Set the configuration setting <strong>umask</strong> to 002. This ensures that cached files\r
- are accessible to everyone in the group.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Make sure that all users have write permission in the entire cache directory\r
- (and that you trust all users of the shared cache).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Make sure that the setgid bit is set on all directories in the cache. This\r
- tells the filesystem to inherit group ownership for new directories. The\r
- following command might be useful for this:\r
-</p>\r
-<div class="openblock">\r
-<div class="content">\r
-<div class="listingblock">\r
-<div class="content">\r
-<pre><code>find $CCACHE_DIR -type d | xargs chmod g+s</code></pre>\r
-</div></div>\r
-</div></div>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>The reason to avoid the hard link mode is that the hard links cause unwanted\r
-side effects, as all links to a cached file share the file’s modification\r
-timestamp. This results in false dependencies to be triggered by\r
-timestamp-based build systems whenever another user links to an existing file.\r
-Typically, users will see that their libraries and binaries are relinked\r
-without reason.</p></div>\r
-<div class="paragraph"><p>You may also want to make sure that a base directory is set appropriately, as\r
-discussed in a previous section.</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_sharing_a_cache_on_nfs">Sharing a cache on NFS</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>It is possible to put the cache directory on an NFS filesystem (or similar\r
-filesystems), but keep in mind that:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Having the cache on NFS may slow down compilation. Make sure to do some\r
- benchmarking to see if it’s worth it.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache hasn’t been tested very thoroughly on NFS.\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>A tip is to set <strong>temporary_dir</strong> to a directory on the local host to avoid NFS\r
-traffic for temporary files.</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_using_ccache_with_other_compiler_wrappers">Using ccache with other compiler wrappers</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>The recommended way of combining ccache with another compiler wrapper (such as\r
-“distcc”) is by letting ccache execute the compiler wrapper. This is\r
-accomplished by defining the configuration setting <strong>prefix_command</strong>, for\r
-example by setting the environment variable <strong>CCACHE_PREFIX</strong> to the name of the\r
-wrapper (e.g. <strong>distcc</strong>). ccache will then prefix the command line with the\r
-specified command when running the compiler. To specify several prefix\r
-commands, set <strong>prefix_command</strong> to a colon-separated list of commands.</p></div>\r
-<div class="paragraph"><p>Unless you set <strong>compiler_check</strong> to a suitable command (see the description of\r
-that configuration option), it is not recommended to use the form <strong>ccache\r
-anotherwrapper compiler args</strong> as the compilation command. It’s also not\r
-recommended to use the masquerading technique for the other compiler wrapper.\r
-The reason is that by default, ccache will in both cases hash the mtime and\r
-size of the other wrapper instead of the real compiler, which means that:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Compiler upgrades will not be detected properly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The cached results will not be shared between compilations with and without\r
- the other wrapper.\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>Another minor thing is that if <strong>prefix_command</strong> is used, ccache will not invoke\r
-the other wrapper when running the preprocessor, which increases performance.\r
-You can use the <strong>prefix_command_cpp</strong> configuration setting if you also want to\r
-invoke the other wrapper when doing preprocessing (normally by adding <strong>-E</strong>).</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_caveats">Caveats</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The direct mode fails to pick up new header files in some rare scenarios. See\r
- <a href="#_the_direct_mode">THE DIRECT MODE</a> above.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-When run via ccache, warning messages produced by GCC 4.9 and newer will only\r
- be colored when the environment variable <strong>GCC_COLORS</strong> is set. An alternative\r
- to setting <strong>GCC_COLORS</strong> is to pass <code>-fdiagnostics-color</code> explicitly when\r
- compiling (but then color codes will also be present when redirecting stderr\r
- to a file).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If ccache guesses that the compiler may emit colored warnings, then a\r
- compilation with stderr referring to a TTY will be considered different from\r
- a compilation with a redirected stderr, thus not sharing cache entries. This\r
- happens for clang by default and for GCC when <strong>GCC_COLORS</strong> is set as\r
- mentioned above. If you want to share cache hits, you can pass\r
- <code>-f[no-]diagnostics-color</code> (GCC) or <code>-f[no-]color-diagnostics</code> (clang)\r
- explicitly when compiling (but then color codes will be either on or off for\r
- both the TTY and the redirected case).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_troubleshooting">Troubleshooting</h2>\r
-<div class="sectionbody">\r
-<div class="sect2">\r
-<h3 id="_general">General</h3>\r
-<div class="paragraph"><p>A general tip for getting information about what ccache is doing is to enable\r
-debug logging by setting <strong>log_file</strong>. The log contains executed commands,\r
-important decisions that ccache makes, read and written files, etc. Another way\r
-of keeping track of what is happening is to check the output of <strong>ccache -s</strong>.</p></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_performance">Performance</h3>\r
-<div class="paragraph"><p>ccache has been written to perform well out of the box, but sometimes you may\r
-have to do some adjustments of how you use the compiler and ccache in order to\r
-improve performance.</p></div>\r
-<div class="paragraph"><p>Since ccache works best when I/O is fast, put the cache directory on a fast\r
-storage device if possible. Having lots of free memory so that files in the\r
-cache directory stay in the disk cache is also preferable.</p></div>\r
-<div class="paragraph"><p>A good way of monitoring how well ccache works is to run <strong>ccache -s</strong> before and\r
-after your build and then compare the statistics counters. Here are some common\r
-problems and what may be done to increase the hit rate:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-If “cache hit (preprocessed)” has been incremented instead of “cache hit\r
- (direct)”, ccache has fallen back to preprocessor mode, which is generally\r
- slower. Some possible reasons are:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The source code has been modified in such a way that the preprocessor output\r
- is not affected.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Compiler arguments that are hashed in the direct mode but not in the\r
- preprocessor mode have changed (<strong>-I</strong>, <strong>-include</strong>, <strong>-D</strong>, etc) and they didn’t\r
- affect the preprocessor output.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The compiler option <strong>-Xpreprocessor</strong> or <strong>-Wp,<em>X</em></strong> (except <strong>-Wp,-MD,<em>path</em></strong>,\r
- <strong>-Wp,-MMD,<em>path</em></strong>, and <strong>-Wp,-D_define_</strong>) is used.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-This was the first compilation with a new value of the base directory\r
- setting.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-A modification time of one of the include files is too new (created the same\r
- second as the compilation is being done). This check is made to avoid a race\r
- condition. To fix this, create the include file earlier in the build\r
- process, if possible, or set <strong>sloppiness</strong> to <strong>include_file_mtime</strong> if you are\r
- willing to take the risk. (The race condition consists of these events: the\r
- preprocessor is run; an include file is modified by someone; the new include\r
- file is hashed by ccache; the real compiler is run on the preprocessor’s\r
- output, which contains data from the old header file; the wrong object file\r
- is stored in the cache.)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The <strong>__TIME__</strong> preprocessor macro is (potentially) being used. ccache\r
- turns off direct mode if “__TIME__” is present in the source code. This\r
- is done as a safety measure since the string indicates that a <strong>__TIME__</strong>\r
- macro <em>may</em> affect the output. (To be sure, ccache would have to run the\r
- preprocessor, but the sole point of the direct mode is to avoid that.) If\r
- you know that <strong>__TIME__</strong> isn’t used in practise, or don’t care if ccache\r
- produces objects where <strong>__TIME__</strong> is expanded to something in the past,\r
- you can set <strong>sloppiness</strong> to <strong>time_macros</strong>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The <strong>__DATE__</strong> preprocessor macro is (potentially) being used and the\r
- date has changed. This is similar to how <strong>__TIME__</strong> is handled. If\r
- “__DATE__” is present in the source code, ccache hashes the current\r
- date in order to be able to produce the correct object file if the\r
- <strong>__DATE__</strong> macro affects the output. If you know that <strong>__DATE__</strong> isn’t\r
- used in practise, or don’t care if ccache produces objects where\r
- <strong>__DATE__</strong> is expanded to something in the past, you can set <strong>sloppiness</strong>\r
- to <strong>time_macros</strong>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The <strong>__FILE__</strong> preprocessor macro is (potentially) being used and the\r
- file path has changed. If “__FILE__” is present in the source code,\r
- ccache hashes the current input file path in order to be able to produce the\r
- correct object file if the <strong>__FILE__</strong> macro affects the output. If you\r
- know that <strong>__FILE__</strong> isn’t used in practise, or don’t care if ccache\r
- produces objects where <strong>__FILE__</strong> is expanded to the wrong path, you can\r
- set <strong>sloppiness</strong> to <strong>file_macro</strong>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-If “cache miss” has been incremented even though the same code has been\r
- compiled and cached before, ccache has either detected that something has\r
- changed anyway or a cleanup has been performed (either explicitly or\r
- implicitly when a cache limit has been reached). Some perhaps unobvious\r
- things that may result in a cache miss are usage of <strong>__TIME__</strong> or\r
- <strong>__DATE__</strong> macros, or use of automatically generated code that contains a\r
- timestamp, build counter or other volatile information.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If “multiple source files” has been incremented, it’s an indication that\r
- the compiler has been invoked on several source code files at once. ccache\r
- doesn’t support that. Compile the source code files separately if possible.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If “unsupported compiler option” has been incremented, enable debug logging\r
- and check which option was rejected.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If “preprocessor error” has been incremented, one possible reason is that\r
- precompiled headers are being used. See <a href="#_precompiled_headers">PRECOMPILED HEADERS</a> for how to remedy this.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If “can’t use precompiled header” has been incremented, see\r
- <a href="#_precompiled_headers">PRECOMPILED HEADERS</a>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_corrupt_object_files">Corrupt object files</h3>\r
-<div class="paragraph"><p>It should be noted that ccache is susceptible to general storage problems. If a\r
-bad object file sneaks into the cache for some reason, it will of course stay\r
-bad. Some possible reasons for erroneous object files are bad hardware (disk\r
-drive, disk controller, memory, etc), buggy drivers or file systems, a bad\r
-<strong>prefix_command</strong> or compiler wrapper. If this happens, the easiest way of\r
-fixing it is this:</p></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-Build so that the bad object file ends up in the build tree.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Remove the bad object file from the build tree.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Rebuild with <strong>CCACHE_RECACHE</strong> set.\r
-</p>\r
-</li>\r
-</ol></div>\r
-<div class="paragraph"><p>An alternative is to clear the whole cache with <strong>ccache -C</strong> if you don’t mind\r
-losing other cached results.</p></div>\r
-<div class="paragraph"><p>There are no reported issues about ccache producing broken object files\r
-reproducibly. That doesn’t mean it can’t happen, so if you find a repeatable\r
-case, please report it.</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_more_information">More information</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Credits, mailing list information, bug reporting instructions, source code,\r
-etc, can be found on ccache’s web site: <a href="https://ccache.samba.org">https://ccache.samba.org</a>.</p></div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_author">Author</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>ccache was originally written by Andrew Tridgell and is currently developed and\r
-maintained by Joel Rosdahl. See AUTHORS.txt or AUTHORS.html and\r
-<a href="https://ccache.samba.org/credits.html">https://ccache.samba.org/credits.html</a> for a list of contributors.</p></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 3.4.1<br />\r
-Last updated\r
- 2018-02-06 21:44:11 CET\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
srcdir = @srcdir@
+builddir = @builddir@
VPATH = @srcdir@
prefix = @prefix@
RANLIB = @RANLIB@
all_cflags = $(CFLAGS)
-all_cppflags = @DEFS@ -DSYSCONFDIR=$(sysconfdir) -I. -I$(srcdir)/src $(CPPFLAGS)
+all_cppflags = @DEFS@ -DSYSCONFDIR=$(sysconfdir) -I. -I$(srcdir)/src -I$(builddir)/unittest $(CPPFLAGS)
extra_libs = @extra_libs@
non_3pp_sources = \
src/mdfour.c \
src/stats.c \
src/unify.c \
- src/util.c \
+ src/util.c
+generated_sources = \
src/version.c
3pp_sources = \
src/getopt_long.c \
src/hashtable_itr.c \
src/murmurhashneutral2.c \
src/snprintf.c
-base_sources = $(non_3pp_sources) $(3pp_sources)
+base_sources = $(non_3pp_sources) $(generated_sources) $(3pp_sources)
base_objs = $(base_sources:.c=.o)
ccache_sources = src/main.c $(base_sources)
ccache_objs = $(ccache_sources:.c=.o)
zlib_sources = \
- zlib/adler32.c zlib/crc32.c zlib/deflate.c zlib/gzclose.c zlib/gzlib.c \
- zlib/gzread.c zlib/gzwrite.c zlib/inffast.c zlib/inflate.c \
- zlib/inftrees.c zlib/trees.c zlib/zutil.c
+ src/zlib/adler32.c \
+ src/zlib/crc32.c \
+ src/zlib/deflate.c \
+ src/zlib/gzclose.c \
+ src/zlib/gzlib.c \
+ src/zlib/gzread.c \
+ src/zlib/gzwrite.c \
+ src/zlib/inffast.c \
+ src/zlib/inflate.c \
+ src/zlib/inftrees.c \
+ src/zlib/trees.c \
+ src/zlib/zutil.c
+
zlib_objs = $(zlib_sources:.c=.o)
test_suites = @test_suites@
all_sources = $(ccache_sources) $(test_sources)
all_objs = $(ccache_objs) $(test_objs) $(zlib_objs)
-files_to_clean = $(all_objs) ccache$(EXEEXT) unittest/run$(EXEEXT) *~ testdir.*
+files_to_clean = \
+ $(all_objs) \
+ ccache$(EXEEXT) \
+ src/*~ \
+ src/zlib/libz.a \
+ testdir.* \
+ unittest/run$(EXEEXT) \
+ *~
+
files_to_distclean = Makefile config.h config.log config.status
.PHONY: all
ccache$(EXEEXT): $(ccache_objs) $(extra_libs)
$(CC) $(all_cflags) -o $@ $(ccache_objs) $(LDFLAGS) $(extra_libs) $(LIBS)
+ccache.1: doc/ccache.1
+ cp $< $@
+
.PHONY: install
-install: all $(srcdir)/ccache.1
+install: ccache$(EXEEXT) ccache.1
$(installcmd) -d $(DESTDIR)$(bindir)
$(installcmd) -m 755 ccache$(EXEEXT) $(DESTDIR)$(bindir)
$(installcmd) -d $(DESTDIR)$(mandir)/man1
- -$(installcmd) -m 644 $(srcdir)/ccache.1 $(DESTDIR)$(mandir)/man1/
+ -$(installcmd) -m 644 ccache.1 $(DESTDIR)$(mandir)/man1/
.PHONY: clean
clean:
$(zlib_objs): CPPFLAGS += -include config.h
-zlib/libz.a: $(zlib_objs)
+src/zlib/libz.a: $(zlib_objs)
$(AR) cr $@ $(zlib_objs)
$(RANLIB) $@
unittest/main.o: unittest/suites.h
unittest/suites.h: $(test_suites) Makefile
- sed -n 's/TEST_SUITE(\(.*\))/SUITE(\1)/p' $(test_suites) >$@
+ ls $^ | grep -v Makefile | xargs sed -n 's/TEST_SUITE(\(.*\))/SUITE(\1)/p' >$@
.PHONY: check
check: test
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.9" />\r
-<title>ccache news</title>\r
-<style type="text/css">\r
-/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
-\r
-/* Default font. */\r
-body {\r
- font-family: Georgia,serif;\r
-}\r
-\r
-/* Title font. */\r
-h1, h2, h3, h4, h5, h6,\r
-div.title, caption.title,\r
-thead, p.table.header,\r
-#toctitle,\r
-#author, #revnumber, #revdate, #revremark,\r
-#footer {\r
- font-family: Arial,Helvetica,sans-serif;\r
-}\r
-\r
-body {\r
- margin: 1em 5% 1em 5%;\r
-}\r
-\r
-a {\r
- color: blue;\r
- text-decoration: underline;\r
-}\r
-a:visited {\r
- color: fuchsia;\r
-}\r
-\r
-em {\r
- font-style: italic;\r
- color: navy;\r
-}\r
-\r
-strong {\r
- font-weight: bold;\r
- color: #083194;\r
-}\r
-\r
-h1, h2, h3, h4, h5, h6 {\r
- color: #527bbd;\r
- margin-top: 1.2em;\r
- margin-bottom: 0.5em;\r
- line-height: 1.3;\r
-}\r
-\r
-h1, h2, h3 {\r
- border-bottom: 2px solid silver;\r
-}\r
-h2 {\r
- padding-top: 0.5em;\r
-}\r
-h3 {\r
- float: left;\r
-}\r
-h3 + * {\r
- clear: left;\r
-}\r
-h5 {\r
- font-size: 1.0em;\r
-}\r
-\r
-div.sectionbody {\r
- margin-left: 0;\r
-}\r
-\r
-hr {\r
- border: 1px solid silver;\r
-}\r
-\r
-p {\r
- margin-top: 0.5em;\r
- margin-bottom: 0.5em;\r
-}\r
-\r
-ul, ol, li > p {\r
- margin-top: 0;\r
-}\r
-ul > li { color: #aaa; }\r
-ul > li > * { color: black; }\r
-\r
-.monospaced, code, pre {\r
- font-family: "Courier New", Courier, monospace;\r
- font-size: inherit;\r
- color: navy;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-pre {\r
- white-space: pre-wrap;\r
-}\r
-\r
-#author {\r
- color: #527bbd;\r
- font-weight: bold;\r
- font-size: 1.1em;\r
-}\r
-#email {\r
-}\r
-#revnumber, #revdate, #revremark {\r
-}\r
-\r
-#footer {\r
- font-size: small;\r
- border-top: 2px solid silver;\r
- padding-top: 0.5em;\r
- margin-top: 4.0em;\r
-}\r
-#footer-text {\r
- float: left;\r
- padding-bottom: 0.5em;\r
-}\r
-#footer-badges {\r
- float: right;\r
- padding-bottom: 0.5em;\r
-}\r
-\r
-#preamble {\r
- margin-top: 1.5em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.imageblock, div.exampleblock, div.verseblock,\r
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
-div.admonitionblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.admonitionblock {\r
- margin-top: 2.0em;\r
- margin-bottom: 2.0em;\r
- margin-right: 10%;\r
- color: #606060;\r
-}\r
-\r
-div.content { /* Block element content. */\r
- padding: 0;\r
-}\r
-\r
-/* Block element titles. */\r
-div.title, caption.title {\r
- color: #527bbd;\r
- font-weight: bold;\r
- text-align: left;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.5em;\r
-}\r
-div.title + * {\r
- margin-top: 0;\r
-}\r
-\r
-td div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content div.title:first-child {\r
- margin-top: 0.0em;\r
-}\r
-div.content + div.title {\r
- margin-top: 0.0em;\r
-}\r
-\r
-div.sidebarblock > div.content {\r
- background: #ffffee;\r
- border: 1px solid #dddddd;\r
- border-left: 4px solid #f0f0f0;\r
- padding: 0.5em;\r
-}\r
-\r
-div.listingblock > div.content {\r
- border: 1px solid #dddddd;\r
- border-left: 5px solid #f0f0f0;\r
- background: #f8f8f8;\r
- padding: 0.5em;\r
-}\r
-\r
-div.quoteblock, div.verseblock {\r
- padding-left: 1.0em;\r
- margin-left: 1.0em;\r
- margin-right: 10%;\r
- border-left: 5px solid #f0f0f0;\r
- color: #888;\r
-}\r
-\r
-div.quoteblock > div.attribution {\r
- padding-top: 0.5em;\r
- text-align: right;\r
-}\r
-\r
-div.verseblock > pre.content {\r
- font-family: inherit;\r
- font-size: inherit;\r
-}\r
-div.verseblock > div.attribution {\r
- padding-top: 0.75em;\r
- text-align: left;\r
-}\r
-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
-div.verseblock + div.attribution {\r
- text-align: left;\r
-}\r
-\r
-div.admonitionblock .icon {\r
- vertical-align: top;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- text-decoration: underline;\r
- color: #527bbd;\r
- padding-right: 0.5em;\r
-}\r
-div.admonitionblock td.content {\r
- padding-left: 0.5em;\r
- border-left: 3px solid #dddddd;\r
-}\r
-\r
-div.exampleblock > div.content {\r
- border-left: 3px solid #dddddd;\r
- padding-left: 0.5em;\r
-}\r
-\r
-div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; vertical-align: text-bottom; }\r
-a.image:visited { color: white; }\r
-\r
-dl {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-dt {\r
- margin-top: 0.5em;\r
- margin-bottom: 0;\r
- font-style: normal;\r
- color: navy;\r
-}\r
-dd > *:first-child {\r
- margin-top: 0.1em;\r
-}\r
-\r
-ul, ol {\r
- list-style-position: outside;\r
-}\r
-ol.arabic {\r
- list-style-type: decimal;\r
-}\r
-ol.loweralpha {\r
- list-style-type: lower-alpha;\r
-}\r
-ol.upperalpha {\r
- list-style-type: upper-alpha;\r
-}\r
-ol.lowerroman {\r
- list-style-type: lower-roman;\r
-}\r
-ol.upperroman {\r
- list-style-type: upper-roman;\r
-}\r
-\r
-div.compact ul, div.compact ol,\r
-div.compact p, div.compact p,\r
-div.compact div, div.compact div {\r
- margin-top: 0.1em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-tfoot {\r
- font-weight: bold;\r
-}\r
-td > div.verse {\r
- white-space: pre;\r
-}\r
-\r
-div.hdlist {\r
- margin-top: 0.8em;\r
- margin-bottom: 0.8em;\r
-}\r
-div.hdlist tr {\r
- padding-bottom: 15px;\r
-}\r
-dt.hdlist1.strong, td.hdlist1.strong {\r
- font-weight: bold;\r
-}\r
-td.hdlist1 {\r
- vertical-align: top;\r
- font-style: normal;\r
- padding-right: 0.8em;\r
- color: navy;\r
-}\r
-td.hdlist2 {\r
- vertical-align: top;\r
-}\r
-div.hdlist.compact tr {\r
- margin: 0;\r
- padding-bottom: 0;\r
-}\r
-\r
-.comment {\r
- background: yellow;\r
-}\r
-\r
-.footnote, .footnoteref {\r
- font-size: 0.8em;\r
-}\r
-\r
-span.footnote, span.footnoteref {\r
- vertical-align: super;\r
-}\r
-\r
-#footnotes {\r
- margin: 20px 0 20px 0;\r
- padding: 7px 0 0 0;\r
-}\r
-\r
-#footnotes div.footnote {\r
- margin: 0 0 5px 0;\r
-}\r
-\r
-#footnotes hr {\r
- border: none;\r
- border-top: 1px solid silver;\r
- height: 1px;\r
- text-align: left;\r
- margin-left: 0;\r
- width: 20%;\r
- min-width: 100px;\r
-}\r
-\r
-div.colist td {\r
- padding-right: 0.5em;\r
- padding-bottom: 0.3em;\r
- vertical-align: top;\r
-}\r
-div.colist td img {\r
- margin-top: 0.3em;\r
-}\r
-\r
-@media print {\r
- #footer-badges { display: none; }\r
-}\r
-\r
-#toc {\r
- margin-bottom: 2.5em;\r
-}\r
-\r
-#toctitle {\r
- color: #527bbd;\r
- font-size: 1.1em;\r
- font-weight: bold;\r
- margin-top: 1.0em;\r
- margin-bottom: 0.1em;\r
-}\r
-\r
-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
- margin-top: 0;\r
- margin-bottom: 0;\r
-}\r
-div.toclevel2 {\r
- margin-left: 2em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel3 {\r
- margin-left: 4em;\r
- font-size: 0.9em;\r
-}\r
-div.toclevel4 {\r
- margin-left: 6em;\r
- font-size: 0.9em;\r
-}\r
-\r
-span.aqua { color: aqua; }\r
-span.black { color: black; }\r
-span.blue { color: blue; }\r
-span.fuchsia { color: fuchsia; }\r
-span.gray { color: gray; }\r
-span.green { color: green; }\r
-span.lime { color: lime; }\r
-span.maroon { color: maroon; }\r
-span.navy { color: navy; }\r
-span.olive { color: olive; }\r
-span.purple { color: purple; }\r
-span.red { color: red; }\r
-span.silver { color: silver; }\r
-span.teal { color: teal; }\r
-span.white { color: white; }\r
-span.yellow { color: yellow; }\r
-\r
-span.aqua-background { background: aqua; }\r
-span.black-background { background: black; }\r
-span.blue-background { background: blue; }\r
-span.fuchsia-background { background: fuchsia; }\r
-span.gray-background { background: gray; }\r
-span.green-background { background: green; }\r
-span.lime-background { background: lime; }\r
-span.maroon-background { background: maroon; }\r
-span.navy-background { background: navy; }\r
-span.olive-background { background: olive; }\r
-span.purple-background { background: purple; }\r
-span.red-background { background: red; }\r
-span.silver-background { background: silver; }\r
-span.teal-background { background: teal; }\r
-span.white-background { background: white; }\r
-span.yellow-background { background: yellow; }\r
-\r
-span.big { font-size: 2em; }\r
-span.small { font-size: 0.6em; }\r
-\r
-span.underline { text-decoration: underline; }\r
-span.overline { text-decoration: overline; }\r
-span.line-through { text-decoration: line-through; }\r
-\r
-div.unbreakable { page-break-inside: avoid; }\r
-\r
-\r
-/*\r
- * xhtml11 specific\r
- *\r
- * */\r
-\r
-div.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-div.tableblock > table {\r
- border: 3px solid #527bbd;\r
-}\r
-thead, p.table.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.table {\r
- margin-top: 0;\r
-}\r
-/* Because the table frame attribute is overriden by CSS in most browsers. */\r
-div.tableblock > table[frame="void"] {\r
- border-style: none;\r
-}\r
-div.tableblock > table[frame="hsides"] {\r
- border-left-style: none;\r
- border-right-style: none;\r
-}\r
-div.tableblock > table[frame="vsides"] {\r
- border-top-style: none;\r
- border-bottom-style: none;\r
-}\r
-\r
-\r
-/*\r
- * html5 specific\r
- *\r
- * */\r
-\r
-table.tableblock {\r
- margin-top: 1.0em;\r
- margin-bottom: 1.5em;\r
-}\r
-thead, p.tableblock.header {\r
- font-weight: bold;\r
- color: #527bbd;\r
-}\r
-p.tableblock {\r
- margin-top: 0;\r
-}\r
-table.tableblock {\r
- border-width: 3px;\r
- border-spacing: 0px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
- border-collapse: collapse;\r
-}\r
-th.tableblock, td.tableblock {\r
- border-width: 1px;\r
- padding: 4px;\r
- border-style: solid;\r
- border-color: #527bbd;\r
-}\r
-\r
-table.tableblock.frame-topbot {\r
- border-left-style: hidden;\r
- border-right-style: hidden;\r
-}\r
-table.tableblock.frame-sides {\r
- border-top-style: hidden;\r
- border-bottom-style: hidden;\r
-}\r
-table.tableblock.frame-none {\r
- border-style: hidden;\r
-}\r
-\r
-th.tableblock.halign-left, td.tableblock.halign-left {\r
- text-align: left;\r
-}\r
-th.tableblock.halign-center, td.tableblock.halign-center {\r
- text-align: center;\r
-}\r
-th.tableblock.halign-right, td.tableblock.halign-right {\r
- text-align: right;\r
-}\r
-\r
-th.tableblock.valign-top, td.tableblock.valign-top {\r
- vertical-align: top;\r
-}\r
-th.tableblock.valign-middle, td.tableblock.valign-middle {\r
- vertical-align: middle;\r
-}\r
-th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
- vertical-align: bottom;\r
-}\r
-\r
-\r
-/*\r
- * manpage specific\r
- *\r
- * */\r
-\r
-body.manpage h1 {\r
- padding-top: 0.5em;\r
- padding-bottom: 0.5em;\r
- border-top: 2px solid silver;\r
- border-bottom: 2px solid silver;\r
-}\r
-body.manpage h2 {\r
- border-style: none;\r
-}\r
-body.manpage div.sectionbody {\r
- margin-left: 3em;\r
-}\r
-\r
-@media print {\r
- body.manpage div#toc { display: none; }\r
-}\r
-\r
-\r
-</style>\r
-<script type="text/javascript">\r
-/*<+'])');\r
- // Function that scans the DOM tree for header elements (the DOM2\r
- // nodeIterator API would be a better technique but not supported by all\r
- // browsers).\r
- var iterate = function (el) {\r
- for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
- if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
- var mo = re.exec(i.tagName);\r
- if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
- }\r
- iterate(i);\r
- }\r
- }\r
- }\r
- iterate(el);\r
- return result;\r
- }\r
-\r
- var toc = document.getElementById("toc");\r
- if (!toc) {\r
- return;\r
- }\r
-\r
- // Delete existing TOC entries in case we're reloading the TOC.\r
- var tocEntriesToRemove = [];\r
- var i;\r
- for (i = 0; i < toc.childNodes.length; i++) {\r
- var entry = toc.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div'\r
- && entry.getAttribute("class")\r
- && entry.getAttribute("class").match(/^toclevel/))\r
- tocEntriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < tocEntriesToRemove.length; i++) {\r
- toc.removeChild(tocEntriesToRemove[i]);\r
- }\r
-\r
- // Rebuild TOC entries.\r
- var entries = tocEntries(document.getElementById("content"), toclevels);\r
- for (var i = 0; i < entries.length; ++i) {\r
- var entry = entries[i];\r
- if (entry.element.id == "")\r
- entry.element.id = "_toc_" + i;\r
- var a = document.createElement("a");\r
- a.href = "#" + entry.element.id;\r
- a.appendChild(document.createTextNode(entry.text));\r
- var div = document.createElement("div");\r
- div.appendChild(a);\r
- div.className = "toclevel" + entry.toclevel;\r
- toc.appendChild(div);\r
- }\r
- if (entries.length == 0)\r
- toc.parentNode.removeChild(toc);\r
-},\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Footnotes generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Based on footnote generation code from:\r
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
- */\r
-\r
-footnotes: function () {\r
- // Delete existing footnote entries in case we're reloading the footnodes.\r
- var i;\r
- var noteholder = document.getElementById("footnotes");\r
- if (!noteholder) {\r
- return;\r
- }\r
- var entriesToRemove = [];\r
- for (i = 0; i < noteholder.childNodes.length; i++) {\r
- var entry = noteholder.childNodes[i];\r
- if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
- entriesToRemove.push(entry);\r
- }\r
- for (i = 0; i < entriesToRemove.length; i++) {\r
- noteholder.removeChild(entriesToRemove[i]);\r
- }\r
-\r
- // Rebuild footnote entries.\r
- var cont = document.getElementById("content");\r
- var spans = cont.getElementsByTagName("span");\r
- var refs = {};\r
- var n = 0;\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnote") {\r
- n++;\r
- var note = spans[i].getAttribute("data-note");\r
- if (!note) {\r
- // Use [\s\S] in place of . so multi-line matches work.\r
- // Because JavaScript has no s (dotall) regex flag.\r
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
- spans[i].innerHTML =\r
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- spans[i].setAttribute("data-note", note);\r
- }\r
- noteholder.innerHTML +=\r
- "<div class='footnote' id='_footnote_" + n + "'>" +\r
- "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
- n + "</a>. " + note + "</div>";\r
- var id =spans[i].getAttribute("id");\r
- if (id != null) refs["#"+id] = n;\r
- }\r
- }\r
- if (n == 0)\r
- noteholder.parentNode.removeChild(noteholder);\r
- else {\r
- // Process footnoterefs.\r
- for (i=0; i<spans.length; i++) {\r
- if (spans[i].className == "footnoteref") {\r
- var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
- href = href.match(/#.*/)[0]; // Because IE return full URL.\r
- n = refs[href];\r
- spans[i].innerHTML =\r
- "[<a href='#_footnote_" + n +\r
- "' title='View footnote' class='footnote'>" + n + "</a>]";\r
- }\r
- }\r
- }\r
-},\r
-\r
-install: function(toclevels) {\r
- var timerId;\r
-\r
- function reinstall() {\r
- asciidoc.footnotes();\r
- if (toclevels) {\r
- asciidoc.toc(toclevels);\r
- }\r
- }\r
-\r
- function reinstallAndRemoveTimer() {\r
- clearInterval(timerId);\r
- reinstall();\r
- }\r
-\r
- timerId = setInterval(reinstall, 500);\r
- if (document.addEventListener)\r
- document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
- else\r
- window.onload = reinstallAndRemoveTimer;\r
-}\r
-\r
-}\r
-asciidoc.install(2);\r
-/*]]>*/\r
-</script>\r
-</head>\r
-<body class="article">\r
-<div id="header">\r
-<h1>ccache news</h1>\r
-<span id="revnumber">version 3.4.1</span>\r
-<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>
-</div>\r
-</div>\r
-<div id="content">\r
-<div class="sect1">\r
-<h2 id="_ccache_3_4_1">ccache 3.4.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2018-02-11</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed printing of version number in <code>ccache --version</code>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_4">ccache 3.4</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2018-02-11</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The compiler option form <code>--sysroot arg</code> is now handled like the documented\r
- <code>--sysroot=arg</code> form.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for caching <code>.su</code> files generated by GCC flag <code>-fstack-usage</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache should now work with distcc’s “pump” wrapper.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The optional unifier is no longer disabled when the direct mode is enabled.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for nvcc compiler options <code>--compiler-bindir/-ccbin</code>,\r
- <code>--output-directory/-odir</code> and <code>--libdevice-directory/-ldir</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Boolean environment variable settings no longer accept the following\r
- (case-insensitive) values: <code>0</code>, <code>false</code>, <code>disable</code> and <code>no</code>. All other values\r
- are accepted and taken to mean “true”. This is to stop users from setting\r
- e.g. <code>CCACHE_DISABLE=0</code> and then expect the cache to be used.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved support for <code>run_second_cpp = false</code>: If combined with passing\r
- <code>-fdirectives-only</code> (GCC) or <code>frewrite-includes</code> (Clang) to the compiler,\r
- diagnostics warnings and similar will be correct.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-An implicit <code>-MQ</code> is now passed to the preprocessor only if the object file\r
- extension is non-standard. This should make it easier to use EDG-based\r
- compilers (e.g. GHS) which don’t understand <code>-MQ</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now treats an unreadable configuration file just like a missing\r
- configuration file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Documented more pitfalls with enabling <code>hard_links</code> (<code>CCACHE_HARDLINK</code>).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Documented caveats related to colored warnings from compilers.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_2">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-File size and number counters are now updated correctly when files are\r
- overwritten in the cache, e.g. when using <code>CCACHE_RECACHE</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>run_second_cpp</code> is now forced for nvcc.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed how the nvcc options <code>-optf</code> and <code>-odir</code> are handled.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_6">ccache 3.3.6</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2018-01-28</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_2">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Improved instructions on how to get cache hits between different working\r
- directories.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_3">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed regression in ccache 3.3.5 related to the <code>UNCACHED_ERR_FD</code> feature.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_5">ccache 3.3.5</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2018-01-13</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_3">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Documented how automatic cache cleanup works.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_4">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a regression where the original order of debug options could be lost.\r
- This reverts the “Improved parsing of <code>-g*</code> options” feature in ccache 3.3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Multiple <code>-fdebug-prefix-map</code> options should now be handled correctly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed matching of directories in the <code>ignore_headers_in_manifest</code>\r
- configuration option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed detection of missing argument to <code>-opt</code>/<code>--options-file</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now bails out when building a precompiled header if any of the\r
- corresponding header files have an updated timestamp. This fixes complaints\r
- from clang.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug related to erroneously storing a dependency file with absolute\r
- paths in the cache on a preprocessed hit.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>ccache -c/--cleanup</code> now works like documented: it just recalculates size\r
- counters and trims the cache to not exceed the max size and file number\r
- limits. Previously, the forced cleanup took “limit_multiple” into account,\r
- so that <code>ccache -c/--cleanup</code> by default would trim the cache to 80% of the\r
- max limit.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache no longer ignores linker arguments for clang since clang warns about\r
- them.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Plugged a couple of file descriptor leaks.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug where ccache would skip hashing the compiler argument following a\r
- <code>-fno-working-directory</code>, <code>-fworking-directory</code>, <code>-nostdinc</code>, <code>-nostdinc++</code>,\r
- <code>-remap</code> or <code>-trigraphs</code> option in preprocessor mode.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_4">ccache 3.3.4</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2017-02-17</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_4">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Documented the different cache statistics counters.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_5">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a regression in ccache 3.3 related to potentially bad content of\r
- dependency files when compiling identical source code but with different\r
- source paths. This was only partially fixed in 3.3.2 and reverts the new\r
- “Names of included files are no longer included in the hash of the\r
- compiler’s preprocessed output” feature in 3.3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected statistics counter for <code>-optf</code>/<code>--options-file</code> failure.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed undefined behavior warnings in ccache found by <code>-fsanitize=undefined</code>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_3">ccache 3.3.3</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-10-26</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_6">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-ccache now detects usage of <code>.incbin</code> assembler directives in the source code\r
- and avoids caching such compilations.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_2">ccache 3.3.2</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-09-28</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_7">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a regression in ccache 3.3 related to potentially bad content of\r
- dependency files when compiling identical source code but with different\r
- source paths.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a regression in ccache 3.3.1: ccache could get confused when using the\r
- compiler option <code>-Wp,</code> to pass multiple options to the preprocessor,\r
- resulting in missing dependency files from direct mode cache hits.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3_1">ccache 3.3.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-09-07</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_8">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a problem in the “multiple <code>-arch</code> options” support introduced in\r
- 3.3. When using the direct mode (the default), different combinations of\r
- <code>-arch</code> options were not detected properly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed an issue when compiler option <code>-Wp,-MT,path</code> is used instead of <code>-MT\r
- path</code> (and similar for <code>-MF</code>, <code>-MP</code> and <code>-MQ</code>) and <code>run_second_cpp</code>\r
- (<code>CCACHE_CPP2</code>) is enabled.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_3">ccache 3.3</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-08-27</p></div>\r
-<div class="sect2">\r
-<h3 id="_notes">Notes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-A C99-compatible compiler is now required to build ccache.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_5">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The configuration option <code>run_second_cpp</code> (<code>CCACHE_CPP2</code>) now defaults to\r
- true. This improves ccache’s out-of-the-box experience for compilers that\r
- can’t compile their own preprocessed output with the same outcome as if they\r
- compiled the real source code directly, e.g. newer versions of GCC and Clang.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The configuration option <code>hash_dir</code> (<code>CCACHE_HASHDIR</code>) now defaults to true.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new <code>ignore_headers_in_manifest</code> configuration option, which\r
- specifies headers that should be ignored in the direct mode.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new <code>prefix_command_cpp</code> (<code>CCACHE_PREFIX_CPP</code>) configuration option,\r
- which specifies one or several prefixes to add to the command line ccache\r
- uses when invoking the preprocessor.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new <code>limit_multiple</code> (<code>CCACHE_LIMIT_MULTIPLE</code>) configuration option,\r
- which specifies how much of the cache to remove when cleaning.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new <code>keep_comments_cpp</code> (<code>CCACHE_COMMENTS</code>) configuration option,\r
- which tells ccache not to discard the comments before hashing preprocessor\r
- output. This can be used to check documentation with <strong>-Wdocumentation</strong>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new sloppiness option <code>no_system_headers</code>, which tells ccache not to\r
- include system headers in manifest files.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new statistics counter that tracks the number of performed cleanups\r
- due to the cache size being over the limit. The value is shown in the output\r
- of “ccache -s”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for relocating debug info directory using <code>-fdebug-prefix-map</code>.\r
- This allows for cache hits even when <code>hash_dir</code> is used in combination with\r
- <code>base_dir</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new “cache hit rate” field to the output of “ccache -s”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for caching compilation of assembler code produced by e.g.\r
- “gcc -S file.c”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for cuda including the -optf/--options-file option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for Fortran 77.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for multiple <code>-arch</code> options to produce "fat binaries".\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Multiple identical <code>-arch</code> arguments are now handled without bailing.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The concatenated form of some long compiler options is now recognized, for\r
- example when using <code>-isystemPATH</code> instead of <code>-isystem PATH</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If hard-linking is enabled and but fails (e.g. due to cross-device linking),\r
- ccache now falls back to copying instead of running the compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made the <code>hash_dir</code> option only have effect when generating debug info.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now knows how to convert absolute paths to relative paths inside\r
- dependency files when using <code>base_dir</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved parsing of <code>-g*</code> options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made ccache understand <code>-Wp,-D*</code> options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now understands the undocumented <code>-coverage</code> (only one dash) GCC\r
- option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Names of included files are no longer included in the hash of the compiler’s\r
- preprocessed output. This leads to more potential cache hits when not using\r
- the direct mode.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Increased buffer size used when reading file data. This improves performance\r
- slightly.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_9">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler option <code>-P</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed clang test suite when running on Linux.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed build and test for MinGW32 and Windows.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_9">ccache 3.2.9</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-09-28</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_10">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a regression in ccache 3.2.8: ccache could get confused when using the\r
- compiler option <code>-Wp,</code> to pass multiple options to the preprocessor,\r
- resulting in missing dependency files from direct mode cache hits.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_8">ccache 3.2.8</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-09-07</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_11">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed an issue when compiler option <code>-Wp,-MT,path</code> is used instead of <code>-MT\r
- path</code> (and similar for <code>-MF</code>, <code>-MP</code> and <code>-MQ</code>) and <code>run_second_cpp</code>\r
- (<code>CCACHE_CPP2</code>) is enabled.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now understands the undocumented <code>-coverage</code> (only one dash) GCC\r
- option.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_7">ccache 3.2.7</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-07-20</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_12">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a bug which could lead to false cache hits for compiler command lines\r
- with a missing argument to an option that takes an argument.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now knows how to work around a glitch in the output of GCC 6’s\r
- preprocessor.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_6">ccache 3.2.6</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-07-12</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_13">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed build problem on QNX, which lacks “SA_RESTART”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on compiler option <code>-fstack-usage</code> since it creates a <code>.su</code> file\r
- which ccache currently doesn’t handle.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug where (due to ccache rewriting paths) the compiler could choose\r
- incorrect include files if <code>CCACHE_BASEDIR</code> is used and the source file path\r
- is absolute and is a symlink.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_5">ccache 3.2.5</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-04-17</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_6">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Only pass clang-specific <code>-stdlib=</code> to the preprocessor.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved handling of stale NFS handles.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made it harder to misinterpret documentation of boolean environment settings'\r
- semantics.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_14">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Include m4 files used by configure.ac in the source dist archives.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected "Performance" section in the manual regarding <code>__DATE_</code>, <code>__TIME__</code>\r
- and <code>__FILE__</code> macros.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed build on Solaris 10+ and AIX 7.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed failure to create directories on QNX.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Don’t (try to) update manifest file in “read-only” and “read-only direct”\r
- modes.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug in caching of <code>stat</code> system calls in “file_stat_matches\r
- sloppiness mode”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed bug in hashing of clang plugins, leading to unnecessary cache misses.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed --print-config to show “pch_defines sloppiness”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The man page is now built when running “make install” from Git repository\r
- sources.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_4">ccache 3.2.4</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2015-10-08</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_15">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed build error related to zlib on systems with older make versions\r
- (regression in ccache 3.2.3).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made conversion-to-bool explicit to avoid build warnings (and potential\r
- runtime errors) on legacy systems.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved signal handling: Kill compiler on SIGTERM; wait for compiler to exit\r
- before exiting; die appropriately.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Minor fixes related to Windows support.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The correct compression level is now used if compression is requested.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug where cache cleanup could be run too early for caches larger than\r
- 64 GiB on 32-bit systems.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_3">ccache 3.2.3</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2015-08-16</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_7">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added support for compiler option <code>-gsplit-dwarf</code>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_16">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Support external zlib in nonstandard directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Avoid calling <code>exit()</code> inside an exit handler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Let exit handler terminate properly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on compiler option <code>--save-temps</code> in addition to <code>-save-temps</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Only log "Disabling direct mode" once when failing to read potential include\r
- files.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_2">ccache 3.2.2</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2015-05-10</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_8">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added support for <code>CCACHE_COMPILERCHECK=string:<value></code>. This is a faster\r
- alternative to <code>CCACHE_COMPILERCHECK=<command></code> if the command’s output can\r
- be precalculated by the build system.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Add support for caching code coverage results (compiling for gcov).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_17">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Made hash of cached result created with and without <code>CCACHE_CPP2</code> different.\r
- This makes it possible to rebuild with <code>CCACHE_CPP2</code> set without having to\r
- clear the cache to get new results.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Don’t try to reset a non-existing stats file. This avoids “No such file or\r
- directory” messages in the ccache log when the cache directory doesn’t\r
- exist.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug where ccache deleted clang diagnostics after compiler failures.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Avoid performing an unnecessary copy of the object file on a cache miss.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler option <code>-fmodules</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler option <code>-fplugin=libcc1plugin</code> (interaction\r
- with GDB).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed build error when compiling ccache with recent clang versions.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Removed signal-unsafe code from signal handler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected logic for when to output cached stderr.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Wipe the whole cached result on failure retrieving a cached file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed build error when compiling ccache with recent clang versions.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2_1">ccache 3.2.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2014-12-10</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_18">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed regression in temporary file handling, which lead to incorrect\r
- permissions for stats, manifest and ccache.conf files in the cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>CACHEDIR.TAG</code> files are now created in the [0-9a-f] subdirectories so that\r
- ccache.conf is not lost in backups.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made the default cache size suffix <code>G</code>, as previously documented.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>-fdiagnostics-color=auto</code> is now passed to the compiler even if stderr is\r
- redirected. This fixes a problem when, for instance, a configure test probes\r
- if the compiler (wrapped via ccache) supports <code>-fdiagnostics-color=auto</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added missing documentation for <code>max_files</code> and <code>max_size</code> configuration\r
- options.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_2">ccache 3.2</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2014-11-17</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_9">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added support for configuring ccache via one or several configuration files\r
- instead of via environment variables. Environment variables still have\r
- priority but are no longer the recommended way of customizing ccache\r
- behavior. See the manual for more information.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for compiler error/warning messages with color.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made creation of temporary directories and cache directories smarter to avoid\r
- unnecessary <code>stat</code> calls.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved efficiency of the algorithm that scans for <code>__DATE_</code> and <code>__TIME__</code>\r
- tokens in the hashed source code.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for several binaries (separated by space) in <code>CCACHE_PREFIX</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The <code>-c</code> option is no longer passed to the preprocessor. This fixes problems\r
- with clang and Solaris’s C++ compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache no longer passes preprocessor options like <code>-D</code> and <code>-I</code> to the\r
- compiler when compiling preprocessed output. This fixes warnings emitted by\r
- clang.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Compiler options <code>-fprofile-generate</code>, <code>-fprofile-arcs</code>, <code>-fprofile-use</code> and\r
- <code>-fbranch-probabilities</code> are now handled without bailing.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for clang’s <code>--serialize-diagnostic</code> option, storing the\r
- diagnostic file (<code>.dia</code>) in the cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for precompiled headers when using clang.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for clang <code>.pth</code> (pretokenized header) files.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Changed the <code>-x</code> language option to use the new objective C standard for GCC\r
- and clang.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-On a cache miss, ccache now instructs the compiler to create the object file\r
- at the real destination and then copies the file into the cache instead of\r
- the other way around. This is needed to support compiler options like\r
- <code>-fprofile-arcs</code> and <code>--serialize-diagnostics</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now checks that included files' ctimes aren’t too new. This check can\r
- be turned off by adding <code>include_file_ctime</code> to the “ccache sloppiness”\r
- setting.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added possibility to get cache hits based on filename, size, mtime and ctime\r
- only. On other words, source code files are not even read, only stat-ed. This\r
- operation mode is opt-in by adding <code>file_stat_matches</code> to the “ccache\r
- sloppiness” setting.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The filename part of options like <code>-Wp,-MDfilename</code> is no longer included in\r
- the hash since the filename doesn’t have any bearing on the result.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a “read-only direct” configuration setting, which is like the\r
- ordinary read-only setting except that ccache will only try to retrieve\r
- results from the cache using the direct mode, not the preprocessor mode.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The display and interpretation of cache size has been changed to use SI\r
- units.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Default cache size is now 5 GB (was previously 1 GiB).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added configuration option to set the compression level of compressed object\r
- files in the cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for <code>@file</code> and <code>-@file</code> arguments (reading options from a\r
- file).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>-Wl,</code> options are no longer included in the hash since they don’t affect\r
- compilation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler option <code>-Wp,-P</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Optimized MD4 calculation code on little-endian systems.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Various improvements and fixes on win32.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved logging to the ccache log file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>--dump-manifest</code> command-line option for debugging purposes.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>--with-bundled-zlib</code> configure option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Upgraded bundled zlib to version 1.2.8.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved <code>dev.mk</code> to be more platform independent.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made the test suite work with clang and gcc-llvm on OS X.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Various other improvements of the test suite.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_19">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Any previous <code>.stderr</code> is now removed from the cache when recaching.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed an issue when handling the <code>-arch</code> compiler option with an argument.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed race condition when creating the initial cache directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed test suite failures when <code>CC</code> is a ccache-wrapped compiler.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_12">ccache 3.1.12</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2016-07-12</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_20">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed a bug where (due to ccache rewriting paths) the compiler could choose\r
- incorrect include files if <code>CCACHE_BASEDIR</code> is used and the source file path\r
- is absolute and is a symlink.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_11">ccache 3.1.11</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2015-03-07</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_21">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed bug which could result in false cache hits when source code contains\r
- <code>'"'</code> followed by <code>" /*"</code> or <code>" //"</code> (with variations).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made hash of cached result created with and without <code>CCACHE_CPP2</code> different.\r
- This makes it possible to rebuild with <code>CCACHE_CPP2</code> set without having to\r
- clear the cache to get new results.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Don’t try to reset a non-existing stats file. This avoids “No such file or\r
- directory” messages in the ccache log when the cache directory doesn’t\r
- exist.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_10">ccache 3.1.10</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2014-10-19</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_10">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added support for the <code>-Xclang</code> compiler option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved handling of exit code of internally executed processes.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Zero length object files in the cache are now rejected as invalid.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on option <code>-gsplit-dwarf</code> (since it produces multiple output files).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Compiler option <code>-fdebug-prefix-map</code> is now ignored (not part of the hash).\r
- (The <code>-fdebug-prefix-map</code> option may be used in combination with\r
- <code>CCACHE_BASEDIR</code> to reuse results across different directories.)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added note in documentation that <code>--ccache-skip</code> currently does not mean\r
- “don’t hash the following option”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-To enable support for precompiled headers (PCH), <code>CCACHE_SLOPPINESS</code> now also\r
- needs to include the new <code>pch_defines</code> sloppiness. This is because ccache\r
- can’t detect changes in the source code when only defined macros have been\r
- changed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Stale files in the internal temporary directory (<code><ccache_dir>/tmp</code>) are now\r
- cleaned up if they are older than one hour.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_22">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed path canonicalization in <code>make_relative_path()</code> when path doesn’t\r
- exist.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed bug in <code>common_dir_prefix_length()</code>. This corrects the <code>CCACHE_BASEDIR</code>\r
- behavior.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache no longer tries to create the cache directory when <code>CCACHE_DISABLE</code> is\r
- set.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed bug when reading manifests with a very large number of file info\r
- entries.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed problem with logging of current working directory.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_9">ccache 3.1.9</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2013-01-06</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_23">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The EAGAIN signal is now handled correctly when emitting cached stderr\r
- output. This fixes a problem triggered by large error outputs from the\r
- compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Subdirectories in the cache are no longer created in read-only mode.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed so that ccache’s log file descriptor is not made available to the\r
- compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved error reporting when failing to create temporary stdout/stderr files\r
- when executing the compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Disappearing temporary stdout/stderr files are now handled gracefully.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed test suite to work on ecryptfs.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_8">ccache 3.1.8</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2012-08-11</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_11">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Made paths to dependency files relative in order to increase cache hits.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added work-around to make ccache work with buggy GCC 4.1 when creating a\r
- pre-compiled header.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Clang plugins are now hashed to catch plugin upgrades.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_24">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fixed crash when the current working directory has been removed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed crash when stderr is closed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected a corner case when parsing backslash escapes in string\r
- literals.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Paths are now correctly canonicalized when computing paths relative to the\r
- base directory.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_2">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Made git version macro work when compiling outside of the source directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed <code>static_assert</code> macro definition clash with GCC 4.7.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_7">ccache 3.1.7</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2012-01-08</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_25">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Non-writable <code>CCACHE_DIR</code> is now handled gracefully when <code>CCACHE_READONLY</code> is\r
- set.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made failure to create files (typically due to bad directory permissions) in\r
- the cache directory fatal. Previously, such failures were silently and\r
- erroneously flagged as "compiler produced stdout".\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Both the <code>-specs=file</code> and <code>--specs=file</code> forms are now recognized.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added recognition and hashing of GCC plugins specified with <code>-fplugin=file</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>CCACHE_COMPILERCHECK</code> now also determines how to hash explicit specs files\r
- (<code>-specs=file</code>).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>CPATH</code>, <code>C_INCLUDE_PATH</code> and similar environment variables to the hash\r
- to avoid false cache hits when such variables have changed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected log message when unify mode is enabled.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Reverted the GCC bug compatibility introduced in ccache 3.1.5 for <code>-MT</code>/<code>-MQ</code>\r
- options with concatenated arguments. (The bug is fixed in recent GCC\r
- versions.)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_3">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Corrected license header for <code>mdfour.c</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved documentation on how to fix bad object files in the cache.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_6">ccache 3.1.6</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2011-08-21</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_12">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Rewrite argument to <code>--sysroot</code> if <code>CCACHE_BASEDIR</code> is used.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_26">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Don’t crash if <code>getcwd()</code> fails.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed alignment of “called for preprocessing” counter.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_5">ccache 3.1.5</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2011-05-29</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_13">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added a new statistics counter named “called for preprocessing”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The original command line is now logged to the file specified with\r
- <code>CCACHE_LOGFILE</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved error logging when system calls fail.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for rewriting absolute paths in <code>-F</code>/<code>-iframework</code> GCC\r
- options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved order of statistics counters in <code>ccache -s</code> output.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_27">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The <code>-MF</code>/<code>-MT</code>/<code>-MQ</code> options with concatenated argument are now handled\r
- correctly when they are last on the command line.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache is now bug compatible with GCC for the <code>-MT</code>/<code>-MQ</code> options with\r
- concatenated arguments.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a minor memory leak.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Systems that lack (and don’t need to be linked with) libm are now supported.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_4">ccache 3.1.4</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2011-01-09</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_28">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Made a work-around for a bug in <code>gzputc()</code> in zlib 1.2.5.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrupt manifest files are now removed so that they won’t block direct mode\r
- hits.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache now copes with file systems that don’t know about symbolic links.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The file handle in now correctly closed on write error when trying to create\r
- a cache dir tag.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_3">ccache 3.1.3</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-11-28</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_29">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The -MFarg, -MTarg and -MQarg compiler options (i.e, without space between\r
- option and argument) are now handled correctly.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_4">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Portability fixes for HP-UX 11.00 and other esoteric systems.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_2">ccache 3.1.2</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-11-21</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_30">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler options <code>-fdump-*</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-NULL return values from malloc/calloc of zero bytes are now handled\r
- correctly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed issue when parsing precompiler output on AIX.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_5">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Improved documentation on which information is included in the hash sum.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made the “too new header file” test case work on file systems with\r
- unsynchronized clocks.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The test suite now also works on systems that lack a /dev/zero.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1_1">ccache 3.1.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-11-07</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_31">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-ccache now falls back to preprocessor mode when a non-regular include file\r
- (device, socket, etc) has been detected so that potential hanging due to\r
- blocking reads is avoided.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-CRC errors are now detected when decompressing compressed files in the cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed potential object file corruption race on NFS.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Minor documentation corrections.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed configure detection of ar.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-ccache development version (set by dev.mk) now works with gits whose\r
- <code>describe</code> command doesn’t understand <code>--dirty</code>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_6">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Minor debug log message improvements.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_1">ccache 3.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-09-16</p></div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_14">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added support for hashing the output of a custom command (e.g. <code>%compiler%\r
- --version</code>) to identify the compiler instead of stat-ing or hashing the\r
- compiler binary. This can improve robustness when the compiler (as seen by\r
- ccache) actually isn’t the real compiler but another compiler wrapper.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for caching compilations that use precompiled headers. (See the\r
- manual for important instructions regarding this.)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Locking of the files containing statistics counters is now done using\r
- symlinks instead of POSIX locks. This should make ccache behave a lot better\r
- on file systems where POSIX locks are slow or broken (e.g. NFS on some\r
- systems).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Manifest files are now updated without the need of taking locks.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Updates of statistics counters are now always done in one of the sub-level\r
- statistics files. This reduces lock contention, which especially improves\r
- performance on slow NFS mounts.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Reading and writing of statistics counters has been made forward-compatible\r
- (unknown counters are retained).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Files are now read without using <code>mmap()</code>. This has two benefits: it’s more\r
- robust against file changes during reading and it improves performance on\r
- poor systems where <code>mmap()</code> doesn’t use the disk cache.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>.cp</code> and <code>.CP</code> as known C++ suffixes.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved logging.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>-install_name</code> as an option known to take an argument. (This improves\r
- statistics when using the Darwin linker.)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_32">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Non-fatal error messages are now never printed to stderr but logged instead.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug affecting failing commands when <code>--ccache-skip</code> is used.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made <code>--ccache-skip</code> work for all options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-EINTR is now handled correctly.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_other_7">Other</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Work on porting ccache to win32 (native), mostly done by Ramiro Polla. The\r
- port is not yet finished, but will hopefully be complete in some subsequent\r
- release.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a <code>--nostats</code> flag to the performance benchmark program.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Made the performance benchmark program more accurate when measuring cache\r
- hits.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added a new test framework for unit tests written in C.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Got rid of <code>configure-dev</code>; dev mode is now given by <code>dev.mk.in</code> presence.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved documentation on how to combine ccache with other compiler wrappers\r
- (like <code>distcc</code>).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-New <code>LICENSE.txt</code> file with licensing and copyright details about bundled\r
- source code.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-New <code>AUTHORS.txt</code> file with a list of ccache contributors.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-New <code>HACKING.txt</code> file with some notes about ccache code conventions.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_0_1">ccache 3.0.1</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-07-15</p></div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_33">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The statistics counter “called for link” is now correctly updated when\r
- linking with a single object file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a problem with out-of-source builds.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-<div class="sect1">\r
-<h2 id="_ccache_3_0">ccache 3.0</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Release date: 2010-06-20</p></div>\r
-<div class="sect2">\r
-<h3 id="_general">General</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-ccache is now licensed under the GNU General Public License (GPL) version 3\r
- or later.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_upgrade_notes">Upgrade notes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The way the hashes are calculated has changed, so you won’t get cache hits\r
- for compilation results stored by older ccache versions. Because of this, you\r
- might as well clear the old cache directory with <code>ccache --clear</code> if you\r
- want, unless you plan to keep using an older ccache version.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_new_features_and_enhancements_15">New features and enhancements</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-ccache now has a “direct mode” where it computes a hash of the source code\r
- (including all included files) and compiler options without running the\r
- preprocessor. By not running the preprocessor, CPU usage is reduced; the\r
- speed is somewhere between 1 and 5 times that of ccache running in\r
- traditional mode, depending on the circumstances. The speedup will be higher\r
- when I/O is fast (e.g., when files are in the disk cache). The direct mode\r
- can be disabled by setting <code>CCACHE_NODIRECT</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Support has been added for rewriting absolute paths to relative paths when\r
- hashing, in order to increase cache hit rate when building the same source\r
- code in different directories even when compiling with <code>-g</code> and when using\r
- absolute include directory paths. This is done by setting the\r
- <code>CCACHE_BASEDIR</code> environment variable to an absolute path that specifies\r
- which paths to rewrite.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Object files are now optionally stored compressed in the cache. The runtime\r
- cost is negligible, and more files will fit in the ccache directory and in\r
- the disk cache. Set <code>CCACHE_COMPRESS</code> to enable object file compression. Note\r
- that you can’t use compression in combination with the hard link feature.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-A <code>CCACHE_COMPILERCHECK</code> option has been added. This option tells ccache what\r
- compiler-identifying information to hash to ensure that results retrieved\r
- from the cache are accurate. Possible values are: none (don’t hash anything),\r
- mtime (hash the compiler’s mtime and size) and content (hash the content of\r
- the compiler binary). The default is mtime.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-It is now possible to specify extra files whose contents should be included\r
- in the hash sum by setting the <code>CCACHE_EXTRAFILES</code> option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for Objective-C and Objective-C++. The statistics counter\r
- “not a C/C++ file” has been renamed to “unsupported source language”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for the <code>-x</code> compiler option.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for long command-line options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-A <code>CACHEDIR.TAG</code> file is now created in the cache directory. See\r
- <a href="http://www.brynosaurus.com/cachedir/">http://www.brynosaurus.com/cachedir/</a>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Messages printed to the debug log (specified by <code>CCACHE_LOGFILE</code>) have been\r
- improved.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-You can relax some checks that ccache does in direct mode by setting\r
- <code>CCACHE_SLOPPINESS</code>. See the manual for more information.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>CCACHE_TEMPDIR</code> no longer needs to be on the same filesystem as\r
- <code>CCACHE_DIR</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The default value of <code>CCACHE_TEMPDIR</code> has been changed to <code>$CCACHE_DIR/tmp</code>\r
- to avoid cluttering the top directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Temporary files that later will be moved into the cache are now created in\r
- the cache directory they will end up in. This makes ccache more friendly to\r
- Linux’s directory layout.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved the test suite and added tests for most of the new functionality.\r
- It’s now also possible to specify a subset of tests to run.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Standard error output from the compiler is now only stored in the cache if\r
- it’s non-empty.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-If the compiler produces no object file or an empty object file, but gives a\r
- zero exit status (could be due to a file system problem, a buggy program\r
- specified by <code>CCACHE_PREFIX</code>, etc.), ccache copes with it properly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <code>installcheck</code> and <code>distcheck</code> make targets.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Clarified cache size limit options' and cleanup semantics.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved display of cache max size values.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The following options are no longer hashed in the preprocessor mode:\r
- <code>-imacros</code>, <code>-imultilib</code>, <code>-iprefix</code>, <code>-iquote</code>, <code>-isysroot</code>, <code>-iwithprefix</code>,\r
- <code>-iwithprefixbefore</code>, <code>-nostdinc</code>, <code>-nostdinc++</code> and <code>-U</code>.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<div class="sect2">\r
-<h3 id="_bug_fixes_34">Bug fixes</h3>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Various portability improvements.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved detection of home directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-User-defined <code>CPPFLAGS</code> and <code>LDFLAGS</code> are now respected in the Makefile.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed NFS issues.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Computation of the hash sum has been improved to decrease the risk of hash\r
- collisions. For instance, the compiler options <code>-X -Y</code> and <code>-X-Y</code> previously\r
- contributed equally to the hash sum.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Bail out on too hard compiler options <code>--coverage</code>, <code>-fprofile-arcs</code>,\r
- <code>-fprofile-generate</code>, <code>-fprofile-use</code>, <code>-frepo</code>, <code>-ftest-coverage</code> and\r
- <code>-save-temps</code>. Also bail out on <code>@file</code> style options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Errors when using multiple <code>-arch</code> compiler options are now noted as\r
- “unsupported compiler option”.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>-MD</code>/<code>-MMD</code> options without <code>-MT</code>/<code>-MF</code> are now handled correctly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The <code>-finput-charset</code> option is now handled correctly.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added support for <code>-Wp,-MD</code> and <code>-Wp,-MMD</code> options.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The compiler options <code>-Xassembler</code>, <code>-b</code>, <code>-G</code> and <code>-V</code> are now correctly\r
- recognized as taking an argument.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Debug information containing line numbers of predefined and command-line\r
- macros (enabled with the compiler option <code>-g3</code>) will now be correct.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected LRU cleanup handling of object files.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<code>utimes()</code> is now used instead of <code>utime()</code> when available.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Non-writable cache directories are now handled gracefully.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected documentation about sharing the cache directory.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed compilation warnings from GCC 4.3.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The command specified by <code>CCACHE_PREFIX</code> is no longer part of the hash.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed bad memory access spotted by Valgrind.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug in <code>x_realloc</code>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Freed memory is no longer referenced when compiling a <code>.i</code>/<code>.ii</code> file and\r
- falling back to running the real compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The test suite is now immune to external values of the <code>CCACHE_*</code> environment\r
- variables.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Improved detection of recursive invocation.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The ccache binary is now not unconditionally stripped when installing.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Statistics counters are now correctly updated for -E option failures and\r
- internal errors.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 3.4.1<br />\r
-Last updated\r
- 2018-02-11 19:14:26 CET\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
+++ /dev/null
-'\" t
-.\" Title: ccache
-.\" Author: [see the "Author" section]
-.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
-.\" Date: 02/11/2018
-.\" Manual: ccache Manual
-.\" Source: ccache 3.3.6+95_g181effa
-.\" Language: English
-.\"
-.TH "CCACHE" "1" "02/11/2018" "ccache 3\&.3\&.6+95_g181effa" "ccache Manual"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-ccache \- a fast C/C++ compiler cache
-.SH "SYNOPSIS"
-.sp
-.nf
-\fBccache\fR [\fIoptions\fR]
-\fBccache\fR \fIcompiler\fR [\fIcompiler options\fR]
-\fIcompiler\fR [\fIcompiler options\fR] (via symbolic link)
-.fi
-.SH "DESCRIPTION"
-.sp
-ccache is a compiler cache\&. It speeds up recompilation by caching the result of previous compilations and detecting when the same compilation is being done again\&. Supported languages are C, C++, Objective\-C and Objective\-C++\&.
-.sp
-ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache\&. The only way you should be able to tell that you are using ccache is the speed\&. Currently known exceptions to this goal are listed under CAVEATS\&. If you ever discover an undocumented case where ccache changes the output of your compiler, please let us know\&.
-.SS "Features"
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Keeps statistics on hits/misses\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Automatic cache size management\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Can cache compilations that generate warnings\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Easy installation\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Low overhead\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Optionally compresses files in the cache to reduce disk space\&.
-.RE
-.SS "Limitations"
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Only knows how to cache the compilation of a single C/C++/Objective\-C/Objective\-C++ file\&. Other types of compilations (multi\-file compilation, linking, etc) will silently fall back to running the real compiler\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Only works with GCC and compilers that behave similar enough\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Some compiler flags are not supported\&. If such a flag is detected, ccache will silently fall back to running the real compiler\&.
-.RE
-.SH "RUN MODES"
-.sp
-There are two ways to use ccache\&. You can either prefix your compilation commands with \fBccache\fR or you can let ccache masquerade as the compiler by creating a symbolic link (named as the compiler) to ccache\&. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects\&. The second method is most useful for when you wish to use ccache for all your compilations\&.
-.sp
-To use the first method, just make sure that \fBccache\fR is in your \fBPATH\fR\&.
-.sp
-To use the symlinks method, do something like this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-cp ccache /usr/local/bin/
-ln \-s ccache /usr/local/bin/gcc
-ln \-s ccache /usr/local/bin/g++
-ln \-s ccache /usr/local/bin/cc
-ln \-s ccache /usr/local/bin/c++
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-And so forth\&. This will work as long as the directory with symlinks comes before the path to the compiler (which is usually in /usr/bin)\&. After installing you may wish to run \(lqwhich gcc\(rq to make sure that the correct link is being used\&.
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBWarning\fR
-.ps -1
-.br
-.sp
-The technique of letting ccache masquerade as the compiler works well, but currently doesn\(cqt interact well with other tools that do the same thing\&. See USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
-.sp .5v
-.RE
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBWarning\fR
-.ps -1
-.br
-.sp
-Do not use a hard link, use a symbolic link\&. A hard link will cause \(lqinteresting\(rq problems\&.
-.sp .5v
-.RE
-.SH "OPTIONS"
-.sp
-These options only apply when you invoke ccache as \(lqccache\(rq\&. When invoked as a compiler (via a symlink as described in the previous section), the normal compiler options apply and you should refer to the compiler\(cqs documentation\&.
-.PP
-\fB\-c, \-\-cleanup\fR
-.RS 4
-Clean up the cache by removing old cached files until the specified file number and cache size limits are not exceeded\&. This also recalculates the cache file count and size totals\&. Normally, there is no need to initiate cleanup manually as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compilation\&. Forcing a cleanup is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate\&.
-.RE
-.PP
-\fB\-C, \-\-clear\fR
-.RS 4
-Clear the entire cache, removing all cached files, but keeping the configuration file\&.
-.RE
-.PP
-\fB\-F, \-\-max\-files\fR=\fIN\fR
-.RS 4
-Set the maximum number of files allowed in the cache\&. Use 0 for no limit\&. The value is stored in a configuration file in the cache directory and applies to all future compilations\&.
-.RE
-.PP
-\fB\-h, \-\-help\fR
-.RS 4
-Print an options summary page\&.
-.RE
-.PP
-\fB\-M, \-\-max\-size\fR=\fISIZE\fR
-.RS 4
-Set the maximum size of the files stored in the cache\&.
-\fISIZE\fR
-should be a number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or Ti (binary)\&. The default suffix is G\&. Use 0 for no limit\&. The value is stored in a configuration file in the cache directory and applies to all future compilations\&.
-.RE
-.PP
-\fB\-o, \-\-set\-config\fR=\fIKEY=VALUE\fR
-.RS 4
-Set configuration
-\fIKEY\fR
-to
-\fIVALUE\fR\&. See
-CONFIGURATION
-for more information\&.
-.RE
-.PP
-\fB\-p, \-\-print\-config\fR
-.RS 4
-Print current configuration options and from where they originate (environment variable, configuration file or compile\-time default)\&.
-.RE
-.PP
-\fB\-s, \-\-show\-stats\fR
-.RS 4
-Print the current statistics summary for the cache\&.
-.RE
-.PP
-\fB\-V, \-\-version\fR
-.RS 4
-Print version and copyright information\&.
-.RE
-.PP
-\fB\-z, \-\-zero\-stats\fR
-.RS 4
-Zero the cache statistics (but not the configuration options)\&.
-.RE
-.SH "EXTRA OPTIONS"
-.sp
-When run as a compiler, ccache usually just takes the same command line options as the compiler you are using\&. The only exception to this is the option \fB\-\-ccache\-skip\fR\&. That option can be used to tell ccache to avoid interpreting the next option in any way and to pass it along to the compiler as\-is\&.
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBNote\fR
-.ps -1
-.br
-.sp
-\fB\-\-ccache\-skip\fR currently only tells ccache not to interpret the next option as a special compiler option \(em the option will still be included in the direct mode hash\&.
-.sp .5v
-.RE
-.sp
-The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things)\&. The heuristic ccache uses when parsing the command line is that any argument that exists as a file is treated as an input file name\&. By using \fB\-\-ccache\-skip\fR you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option\&.
-.sp
-Another case where \fB\-\-ccache\-skip\fR can be useful is if ccache interprets an option specially but shouldn\(cqt, since the option has another meaning for your compiler than what ccache thinks\&.
-.SH "CONFIGURATION"
-.sp
-ccache\(cqs default behavior can be overridden by configuration file settings, which in turn can be overridden by environment variables with names starting with \fBCCACHE_\fR\&. ccache normally reads configuration from two files: first a system\-level configuration file and secondly a cache\-specific configuration file\&. The priority of configuration settings is as follows (where 1 is highest):
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 1.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 1." 4.2
-.\}
-Environment variables\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 2.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 2." 4.2
-.\}
-The cache\-specific configuration file
-\fB<ccachedir>/ccache\&.conf\fR
-(typically
-\fB$HOME/\&.ccache/ccache\&.conf\fR)\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 3.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 3." 4.2
-.\}
-The system\-wide configuration file
-\fB<sysconfdir>/ccache\&.conf\fR
-(typically
-\fB/etc/ccache\&.conf\fR
-or
-\fB/usr/local/etc/ccache\&.conf\fR)\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 4.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 4." 4.2
-.\}
-Compile\-time defaults\&.
-.RE
-.sp
-As a special case, if the environment variable \fBCCACHE_CONFIGPATH\fR is set, ccache reads configuration from the specified path instead of the default paths\&.
-.SS "Configuration file syntax"
-.sp
-Configuration files are in a simple \(lqkey = value\(rq format, one setting per line\&. Lines starting with a hash sign are comments\&. Blank lines are ignored, as is whitespace surrounding keys and values\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Set maximum cache size to 10 GB:
-max_size = 10G
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Boolean values"
-.sp
-Some settings are boolean values (i\&.e\&. truth values)\&. In a configuration file, such values must be set to the string \fBtrue\fR or \fBfalse\fR\&. For the corresponding environment variables, the semantics are a bit different: a set environment variable means \(lqtrue\(rq (even if set to the empty string), the following case\-insensitive negative values are considered an error (rather than surprising the user): \fB0\fR, \fBfalse\fR, \fBdisable\fR and \fBno\fR, and an unset environment variable means \(lqfalse\(rq\&. Each boolean environment variable also has a negated form starting with \fBCCACHE_NO\fR\&. For example, \fBCCACHE_COMPRESS\fR can be set to force compression and \fBCCACHE_NOCOMPRESS\fR can be set to force no compression\&.
-.SS "Configuration settings"
-.sp
-Below is a list of available configuration settings\&. The corresponding environment variable name is indicated in parentheses after each configuration setting key\&.
-.PP
-\fBbase_dir\fR (\fBCCACHE_BASEDIR\fR)
-.RS 4
-This setting should be an absolute path to a directory\&. ccache then rewrites absolute paths into relative paths before computing the hash that identifies the compilation, but only for paths under the specified directory\&. If set to the empty string (which is the default), no rewriting is done\&. A typical path to use as the base directory is your home directory or another directory that is a parent of your build directories\&. Don\(cqt use
-/
-as the base directory since that will make ccache also rewrite paths to system header files, which doesn\(cqt gain anything\&.
-.sp
-See also the discussion under
-COMPILING IN DIFFERENT DIRECTORIES\&.
-.RE
-.PP
-\fBcache_dir\fR (\fBCCACHE_DIR\fR)
-.RS 4
-This setting specifies where ccache will keep its cached compiler outputs\&. It will only take effect if set in the system\-wide configuration file or as an environment variable\&. The default is
-\fB$HOME/\&.ccache\fR\&.
-.RE
-.PP
-\fBcache_dir_levels\fR (\fBCCACHE_NLEVELS\fR)
-.RS 4
-This setting allows you to choose the number of directory levels in the cache directory\&. The default is 2\&. The minimum is 1 and the maximum is 8\&.
-.RE
-.PP
-\fBcompiler\fR (\fBCCACHE_CC\fR)
-.RS 4
-This setting can be used to force the name of the compiler to use\&. If set to the empty string (which is the default), ccache works it out from the command line\&.
-.RE
-.PP
-\fBcompiler_check\fR (\fBCCACHE_COMPILERCHECK\fR)
-.RS 4
-By default, ccache includes the modification time (\(lqmtime\(rq) and size of the compiler in the hash to ensure that results retrieved from the cache are accurate\&. This setting can be used to select another strategy\&. Possible values are:
-.PP
-\fBcontent\fR
-.RS 4
-Hash the content of the compiler binary\&. This makes ccache very slightly slower compared to the
-\fBmtime\fR
-setting, but makes it cope better with compiler upgrades during a build bootstrapping process\&.
-.RE
-.PP
-\fBmtime\fR
-.RS 4
-Hash the compiler\(cqs mtime and size, which is fast\&. This is the default\&.
-.RE
-.PP
-\fBnone\fR
-.RS 4
-Don\(cqt hash anything\&. This may be good for situations where you can safely use the cached results even though the compiler\(cqs mtime or size has changed (e\&.g\&. if the compiler is built as part of your build system and the compiler\(cqs source has not changed, or if the compiler only has changes that don\(cqt affect code generation)\&. You should only use the
-\fBnone\fR
-setting if you know what you are doing\&.
-.RE
-.PP
-\fBstring:value\fR
-.RS 4
-Use
-\fBvalue\fR
-as the string to calculate hash from\&. This can be the compiler revision number you retrieved earlier and set here via environment variable\&.
-.RE
-.PP
-\fIa command string\fR
-.RS 4
-Hash the standard output and standard error output of the specified command\&. The string will be split on whitespace to find out the command and arguments to run\&. No other interpretation of the command string will be done, except that the special word
-\fB%compiler%\fR
-will be replaced with the path to the compiler\&. Several commands can be specified with semicolon as separator\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-%compiler% \-v
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-%compiler% \-dumpmachine; %compiler% \-dumpversion
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-You should make sure that the specified command is as fast as possible since it will be run once for each ccache invocation\&.
-.sp
-Identifying the compiler using a command is useful if you want to avoid cache misses when the compiler has been rebuilt but not changed\&.
-.sp
-Another case is when the compiler (as seen by ccache) actually isn\(cqt the real compiler but another compiler wrapper \(em in that case, the default
-\fBmtime\fR
-method will hash the mtime and size of the other compiler wrapper, which means that ccache won\(cqt be able to detect a compiler upgrade\&. Using a suitable command to identify the compiler is thus safer, but it\(cqs also slower, so you should consider continue using the
-\fBmtime\fR
-method in combination with the
-\fBprefix_command\fR
-setting if possible\&. See
-USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
-.RE
-.RE
-.PP
-\fBcompression\fR (\fBCCACHE_COMPRESS\fR or \fBCCACHE_NOCOMPRESS\fR, see Boolean values above)
-.RS 4
-If true, ccache will compress object files and other compiler output it puts in the cache\&. However, this setting has no effect on how files are retrieved from the cache; compressed and uncompressed results will still be usable regardless of this setting\&. The default is false\&.
-.RE
-.PP
-\fBcompression_level\fR (\fBCCACHE_COMPRESSLEVEL\fR)
-.RS 4
-This setting determines the level at which ccache will compress object files\&. It only has effect if
-\fBcompression\fR
-is enabled\&. The value defaults to 6, and must be no lower than 1 (fastest, worst compression) and no higher than 9 (slowest, best compression)\&.
-.RE
-.PP
-\fBcpp_extension\fR (\fBCCACHE_EXTENSION\fR)
-.RS 4
-This setting can be used to force a certain extension for the intermediate preprocessed file\&. The default is to automatically determine the extension to use for intermediate preprocessor files based on the type of file being compiled, but that sometimes doesn\(cqt work\&. For example, when using the \(lqaCC\(rq compiler on HP\-UX, set the cpp extension to
-\fBi\fR\&.
-.RE
-.PP
-\fBdirect_mode\fR (\fBCCACHE_DIRECT\fR or \fBCCACHE_NODIRECT\fR, see Boolean values above)
-.RS 4
-If true, the direct mode will be used\&. The default is true\&. See
-THE DIRECT MODE\&.
-.RE
-.PP
-\fBdisable\fR (\fBCCACHE_DISABLE\fR or \fBCCACHE_NODISABLE\fR, see Boolean values above)
-.RS 4
-When true, ccache will just call the real compiler, bypassing the cache completely\&. The default is false\&.
-.RE
-.PP
-\fBextra_files_to_hash\fR (\fBCCACHE_EXTRAFILES\fR)
-.RS 4
-This setting is a list of paths to files that ccache will include in the the hash sum that identifies the build\&. The list separator is semicolon on Windows systems and colon on other systems\&.
-.RE
-.PP
-\fBhard_link\fR (\fBCCACHE_HARDLINK\fR or \fBCCACHE_NOHARDLINK\fR, see Boolean values above)
-.RS 4
-If true, ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy\&. Hard links are never made for compressed cache files\&. This means that you should not enable compression if you want to use hard links\&. The default is false\&.
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBWarning\fR
-.ps -1
-.br
-Do not enable this option unless you are aware of the consequences\&. Using hard links may be slightly faster in some situations, but there are several pitfalls since the resulting object file will share i\-node with the cached object file:
-.sp .5v
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 1.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 1." 4.2
-.\}
-If the resulting object file is modified in any way, the cached object file will be modified as well\&. For instance, if you run
-\fBstrip object\&.o\fR
-or
-\fBecho >object\&.o\fR, you will corrupt the cache\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 2.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 2." 4.2
-.\}
-Programs that rely on modification times (like \(lqmake\(rq) can be confused since ccache updates the cached files\*(Aq modification times as part of the automatic cache size management\&. This will affect object files in the build tree as well, which can retrigger the linking step even though nothing really has changed\&.
-.RE
-.RE
-.PP
-\fBhash_dir\fR (\fBCCACHE_HASHDIR\fR or \fBCCACHE_NOHASHDIR\fR, see Boolean values above)
-.RS 4
-If true (which is the default), ccache will include the current working directory (CWD) in the hash that is used to distinguish two compilations when generating debug info (compiler option
-\fB\-g\fR
-with variations)\&. Exception: The CWD will not be included in the hash if
-\fBbase_dir\fR
-is set (and matches the CWD) and the compiler option
-\fB\-fdebug\-prefix\-map\fR
-is used\&. See also the discussion under
-COMPILING IN DIFFERENT DIRECTORIES\&.
-.sp
-The reason for including the CWD in the hash by default is to prevent a problem with the storage of the current working directory in the debug info of an object file, which can lead ccache to return a cached object file that has the working directory in the debug info set incorrectly\&.
-.sp
-You can disable this setting to get cache hits when compiling the same source code in different directories if you don\(cqt mind that CWD in the debug info might be incorrect\&.
-.RE
-.PP
-\fBignore_headers_in_manifest\fR (\fBCCACHE_IGNOREHEADERS\fR)
-.RS 4
-This setting is a list of paths to files (or directories with headers) that ccache will
-\fBnot\fR
-include in the manifest list that makes up the direct mode\&. Note that this can cause stale cache hits if those headers do indeed change\&. The list separator is semicolon on Windows systems and colon on other systems\&.
-.RE
-.PP
-\fBkeep_comments_cpp\fR (\fBCCACHE_COMMENTS\fR or \fBCCACHE_NOCOMMENTS\fR, see Boolean values above)
-.RS 4
-If true, ccache will not discard the comments before hashing preprocessor output\&. This can be used to check documentation with
-\fB\-Wdocumentation\fR\&.
-.RE
-.PP
-\fBlimit_multiple\fR (\fBCCACHE_LIMIT_MULTIPLE\fR)
-.RS 4
-Sets the limit when cleaning up\&. Files are deleted (in LRU order) until the levels are below the limit\&. The default is 0\&.8 (= 80%)\&. See
-AUTOMATIC CLEANUP
-for more information\&.
-.RE
-.PP
-\fBlog_file\fR (\fBCCACHE_LOGFILE\fR)
-.RS 4
-If set to a file path, ccache will write information on what it is doing to the specified file\&. This is useful for tracking down problems\&.
-.RE
-.PP
-\fBmax_files\fR (\fBCCACHE_MAXFILES\fR)
-.RS 4
-This option specifies the maximum number of files to keep in the cache\&. Use 0 for no limit (which is the default)\&. See also
-CACHE SIZE MANAGEMENT\&.
-.RE
-.PP
-\fBmax_size\fR (\fBCCACHE_MAXSIZE\fR)
-.RS 4
-This option specifies the maximum size of the cache\&. Use 0 for no limit\&. The default value is 5G\&. Available suffixes: k, M, G, T (decimal) and Ki, Mi, Gi, Ti (binary)\&. The default suffix is "G"\&. See also
-CACHE SIZE MANAGEMENT\&.
-.RE
-.PP
-\fBpath\fR (\fBCCACHE_PATH\fR)
-.RS 4
-If set, ccache will search directories in this list when looking for the real compiler\&. The list separator is semicolon on Windows systems and colon on other systems\&. If not set, ccache will look for the first executable matching the compiler name in the normal
-\fBPATH\fR
-that isn\(cqt a symbolic link to ccache itself\&.
-.RE
-.PP
-\fBprefix_command\fR (\fBCCACHE_PREFIX\fR)
-.RS 4
-This option adds a list of prefixes (separated by space) to the command line that ccache uses when invoking the compiler\&. See also
-USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
-.RE
-.PP
-\fBprefix_command_cpp\fR (\fBCCACHE_PREFIX_CPP\fR)
-.RS 4
-This option adds a list of prefixes (separated by space) to the command line that ccache uses when invoking the preprocessor\&.
-.RE
-.PP
-\fBread_only\fR (\fBCCACHE_READONLY\fR or \fBCCACHE_NOREADONLY\fR, see Boolean values above)
-.RS 4
-If true, ccache will attempt to use existing cached object files, but it will not to try to add anything new to the cache\&. If you are using this because your ccache directory is read\-only, then you need to set
-\fBtemporary_dir\fR
-as otherwise ccache will fail to create temporary files\&.
-.RE
-.PP
-\fBread_only_direct\fR (\fBCCACHE_READONLY_DIRECT\fR or \fBCCACHE_NOREADONLY_DIRECT\fR, see Boolean values above)
-.RS 4
-Just like
-\fBread_only\fR
-except that ccache will only try to retrieve results from the cache using the direct mode, not the preprocessor mode\&. See documentation for
-\fBread_only\fR
-regarding using a read\-only ccache directory\&.
-.RE
-.PP
-\fBrecache\fR (\fBCCACHE_RECACHE\fR or \fBCCACHE_NORECACHE\fR, see Boolean values above)
-.RS 4
-If true, ccache will not use any previously stored result\&. New results will still be cached, possibly overwriting any pre\-existing results\&.
-.RE
-.PP
-\fBrun_second_cpp\fR (\fBCCACHE_CPP2\fR or \fBCCACHE_NOCPP2\fR, see Boolean values above)
-.RS 4
-If true, ccache will first run the preprocessor to preprocess the source code (see
-THE PREPROCESSOR MODE) and then on a cache miss run the compiler on the source code to get hold of the object file\&. This is the default\&.
-.sp
-If false, ccache will first run preprocessor to preprocess the source code and then on a cache miss run the compiler on the
-\fIpreprocessed source code\fR
-instead of the original source code\&. This makes cache misses slightly faster since the source code only has to be preprocessed once\&. The downside is that some compilers won\(cqt produce the same result (for instance diagnostics warnings) when compiling preprocessed source code\&.
-.sp
-A solution to the above mentioned downside is to set
-\fBrun_second_cpp\fR
-to false and pass
-\fB\-fdirectives\-only\fR
-(for GCC) or
-\fB\-frewrite\-includes\fR
-(for Clang) to the compiler\&. This will cause the compiler to leave the macros and other preprocessor information, and only process the
-\fB#include\fR
-directives\&. When run in this way, the preprocessor arguments will be passed to the compiler since it still has to do
-\fIsome\fR
-preprocessing (like macros)\&.
-.RE
-.PP
-\fBsloppiness\fR (\fBCCACHE_SLOPPINESS\fR)
-.RS 4
-By default, ccache tries to give as few false cache hits as possible\&. However, in certain situations it\(cqs possible that you know things that ccache can\(cqt take for granted\&. This setting makes it possible to tell ccache to relax some checks in order to increase the hit rate\&. The value should be a comma\-separated string with options\&. Available options are:
-.PP
-\fBfile_macro\fR
-.RS 4
-Ignore
-\fB__FILE__\fR
-being present in the source\&.
-.RE
-.PP
-\fBfile_stat_matches\fR
-.RS 4
-ccache normally examines a file\(cqs contents to determine whether it matches the cached version\&. With this option set, ccache will consider a file as matching its cached version if the mtimes and ctimes match\&.
-.RE
-.PP
-\fBinclude_file_ctime\fR
-.RS 4
-By default, ccache also will not cache a file if it includes a header whose ctime is too new\&. This option disables that check\&.
-.RE
-.PP
-\fBinclude_file_mtime\fR
-.RS 4
-By default, ccache will not cache a file if it includes a header whose mtime is too new\&. This option disables that check\&.
-.RE
-.PP
-\fBno_system_headers\fR
-.RS 4
-By default, ccache will also include all system headers in the manifest\&. With this option set, ccache will only include system headers in the hash but not add the system header files to the list of include files\&.
-.RE
-.PP
-\fBpch_defines\fR
-.RS 4
-Be sloppy about
-\fB#define\fRs when precompiling a header file\&. See
-PRECOMPILED HEADERS
-for more information\&.
-.RE
-.PP
-\fBtime_macros\fR
-.RS 4
-Ignore
-\fB__DATE__\fR
-and
-\fB__TIME__\fR
-being present in the source code\&.
-.RE
-.sp
-See the discussion under
-TROUBLESHOOTING
-for more information\&.
-.RE
-.PP
-\fBstats\fR (\fBCCACHE_STATS\fR or \fBCCACHE_NOSTATS\fR, see Boolean values above)
-.RS 4
-If true, ccache will update the statistics counters on each compilation\&. The default is true\&.
-.RE
-.PP
-\fBtemporary_dir\fR (\fBCCACHE_TEMPDIR\fR)
-.RS 4
-This setting specifies where ccache will put temporary files\&. The default is
-\fB<cache_dir>/tmp\fR\&.
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBNote\fR
-.ps -1
-.br
-In previous versions of ccache,
-\fBCCACHE_TEMPDIR\fR
-had to be on the same filesystem as the
-\fBCCACHE_DIR\fR
-path, but this requirement has been relaxed\&.)
-.sp .5v
-.RE
-.RE
-.PP
-\fBumask\fR (\fBCCACHE_UMASK\fR)
-.RS 4
-This setting specifies the umask for ccache and all child processes (such as the compiler)\&. This is mostly useful when you wish to share your cache with other users\&. Note that this also affects the file permissions set on the object files created from your compilations\&.
-.RE
-.PP
-\fBunify\fR (\fBCCACHE_UNIFY\fR or \fBCCACHE_NOUNIFY\fR, see Boolean values above)
-.RS 4
-If true, ccache will use a C/C++ unifier when hashing the preprocessor output if the
-\fB\-g\fR
-option is not used\&. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only\&. Note that enabling the unifier changes the hash, so cached compilations produced when the unifier is enabled cannot be reused when the unifier is disabled, and vice versa\&. Enabling the unifier may result in incorrect line number information in compiler warning messages and expansions of the
-\fB__LINE__\fR
-macro\&.
-.RE
-.SH "CACHE SIZE MANAGEMENT"
-.sp
-By default, ccache has a 5 GB limit on the total size of files in the cache and no limit on the number of files\&. You can set different limits using the \fB\-M\fR/\fB\-\-max\-size\fR and \fB\-F\fR/\fB\-\-max\-files\fR options\&. Use \fBccache \-s/\-\-show\-stats\fR to see the cache size and the currently configured limits (in addition to other various statistics)\&.
-.sp
-Cleanup can be triggered in two different ways: automatic and manual\&.
-.SS "Automatic cleanup"
-.sp
-ccache maintains counters for various statistics about the cache, including the size and number of all cached files\&. In order to improve performance and reduce issues with concurrent ccache invocations, there is one statistics file for each of the sixteen subdirectories in the cache\&.
-.sp
-After a new compilation result has been written to the cache, ccache will update the size and file number statistics for the subdirectory (one of sixteen) to which the result was written\&. Then, if the size counter for said subdirectory is greater than \fBmax_size / 16\fR or the file number counter is greater than \fBmax_files / 16\fR, automatic cleanup is triggered\&.
-.sp
-When automatic cleanup is triggered for a subdirectory in the cache, ccache will:
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 1.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 1." 4.2
-.\}
-Count all files in the subdirectory and compute their aggregated size\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 2.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 2." 4.2
-.\}
-Remove files in LRU (least recently used) order until the size is at most
-\fBlimit_multiple * max_size / 16\fR
-and the number of files is at most
-\fBlimit_multiple * max_files / 16\fR, where
-\fBlimit_multiple\fR,
-\fBmax_size\fR
-and
-\fBmax_files\fR
-are configuration settings\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 3.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 3." 4.2
-.\}
-Set the size and file number counters to match the files that were kept\&.
-.RE
-.sp
-The reason for removing more files than just those needed to not exceed the max limits is that a cleanup is a fairly slow operation, so it would not be a good idea to trigger it often, like after each cache miss\&.
-.SS "Manual cleanup"
-.sp
-You can run \fBccache \-c/\-\-cleanup\fR to force cleanup of the whole cache, i\&.e\&. all of the sixteen subdirectories\&. This will recalculate the statistics counters and make sure that the \fBmax_size\fR and \fBmax_files\fR settings are not exceeded\&. Note that \fBlimit_multiple\fR is not taken into account for manual cleanup\&.
-.SH "CACHE COMPRESSION"
-.sp
-ccache can optionally compress all files it puts into the cache using the compression library zlib\&. While this may involve a tiny performance slowdown, it increases the number of files that fit in the cache\&. You can turn on compression with the \fBcompression\fR configuration setting and you can also tweak the compression level with \fBcompression_level\fR\&.
-.SH "CACHE STATISTICS"
-.sp
-\fBccache \-s/\-\-show\-stats\fR can show the following statistics:
-.TS
-allbox tab(:);
-ltB ltB.
-T{
-Name
-T}:T{
-Description
-T}
-.T&
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt
-lt lt.
-T{
-.sp
-autoconf compile/link
-T}:T{
-.sp
-Uncachable compilation or linking by an autoconf test\&.
-T}
-T{
-.sp
-bad compiler arguments
-T}:T{
-.sp
-Malformed compiler argument, e\&.g\&. missing a value for an option that requires an argument or failure to read a file specified by an option argument\&.
-T}
-T{
-.sp
-cache file missing
-T}:T{
-.sp
-A file was unexpectedly missing from the cache\&. This only happens in rare situations, e\&.g\&. if one ccache instance is about to get a file from the cache while another instance removed the file as part of cache cleanup\&.
-T}
-T{
-.sp
-cache hit (direct)
-T}:T{
-.sp
-A result was successfully found using the direct mode\&.
-T}
-T{
-.sp
-cache hit (preprocessed)
-T}:T{
-.sp
-A result was successfully found using the preprocessor mode\&.
-T}
-T{
-.sp
-cache miss
-T}:T{
-.sp
-No result was found\&.
-T}
-T{
-.sp
-cache size
-T}:T{
-.sp
-Current size of the cache\&.
-T}
-T{
-.sp
-called for link
-T}:T{
-.sp
-The compiler was called for linking, not compiling\&.
-T}
-T{
-.sp
-called for preprocessing
-T}:T{
-.sp
-The compiler was called for preprocessing, not compiling\&.
-T}
-T{
-.sp
-can\(cqt use precompiled header
-T}:T{
-.sp
-Preconditions for using precompiled headers were not fulfilled\&.
-T}
-T{
-.sp
-ccache internal error
-T}:T{
-.sp
-Unexpected failure, e\&.g\&. due to problems reading/writing the cache\&.
-T}
-T{
-.sp
-cleanups performed
-T}:T{
-.sp
-Number of cleanups performed, either implicitly due to the cache size limit being reached or due to explicit \fBccache \-c/\-\-cleanup\fR calls\&.
-T}
-T{
-.sp
-compile failed
-T}:T{
-.sp
-The compilation failed\&. No result stored in the cache\&.
-T}
-T{
-.sp
-compiler check failed
-T}:T{
-.sp
-A compiler check program specified by \fBcompiler_check\fR (\fBCCACHE_COMPILERCHECK\fR) failed\&.
-T}
-T{
-.sp
-compiler produced empty output
-T}:T{
-.sp
-The compiler\(cqs output file (typically an object file) was empty after compilation\&.
-T}
-T{
-.sp
-compiler produced no output
-T}:T{
-.sp
-The compiler\(cqs output file (typically an object file) was missing after compilation\&.
-T}
-T{
-.sp
-compiler produced stdout
-T}:T{
-.sp
-The compiler wrote data to standard output\&. This is something that compilers normally never do, so ccache is not designed to store such output in the cache\&.
-T}
-T{
-.sp
-couldn\(cqt find the compiler
-T}:T{
-.sp
-The compiler to execute could not be found\&.
-T}
-T{
-.sp
-error hashing extra file
-T}:T{
-.sp
-Failure reading a file specified by \fBextra_files_to_hash\fR (\fBCCACHE_EXTRAFILES\fR)\&.
-T}
-T{
-.sp
-files in cache
-T}:T{
-.sp
-Current number of files in the cache\&.
-T}
-T{
-.sp
-multiple source files
-T}:T{
-.sp
-The compiler was called to compile multiple source files in one go\&. This is not supported by ccache\&.
-T}
-T{
-.sp
-no input file
-T}:T{
-.sp
-No input file was specified to the compiler\&.
-T}
-T{
-.sp
-output to a non\-regular file
-T}:T{
-.sp
-The output path specified with \fB\-o\fR is not a file (e\&.g\&. a directory or a device node)\&.
-T}
-T{
-.sp
-output to stdout
-T}:T{
-.sp
-The compiler was instructed to write its output to standard output using \fB\-o \-\fR\&. This is not supported by ccache\&.
-T}
-T{
-.sp
-preprocessor error
-T}:T{
-.sp
-Preprocessing the source code using the compiler\(cqs \fB\-E\fR option failed\&.
-T}
-T{
-.sp
-unsupported code directive
-T}:T{
-.sp
-Code like the assembler \(lq\&.incbin\(rq directive was found\&. This is not supported by ccache\&.
-T}
-T{
-.sp
-unsupported compiler option
-T}:T{
-.sp
-A compiler option not supported by ccache was found\&.
-T}
-T{
-.sp
-unsupported source language
-T}:T{
-.sp
-A source language e\&.g\&. specified with \fB\-x\fR was unsupported by ccache\&.
-T}
-.TE
-.sp 1
-.SH "HOW CCACHE WORKS"
-.sp
-The basic idea is to detect when you are compiling exactly the same code a second time and reuse the previously produced output\&. The detection is done by hashing different kinds of information that should be unique for the compilation and then using the hash sum to identify the cached output\&. ccache uses MD4, a very fast cryptographic hash algorithm, for the hashing\&. (MD4 is nowadays too weak to be useful in cryptographic contexts, but it should be safe enough to be used to identify recompilations\&.) On a cache hit, ccache is able to supply all of the correct compiler outputs (including all warnings, dependency file, etc) from the cache\&.
-.sp
-ccache has two ways of doing the detection:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the
-\fBdirect mode\fR, where ccache hashes the source code and include files directly
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the
-\fBpreprocessor mode\fR, where ccache runs the preprocessor on the source code and hashes the result
-.RE
-.sp
-The direct mode is generally faster since running the preprocessor has some overhead\&.
-.SS "Common hashed information"
-.sp
-For both modes, the following information is included in the hash:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the extension used by the compiler for a file with preprocessor output (normally
-\fB\&.i\fR
-for C code and
-\fB\&.ii\fR
-for C++ code)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the compiler\(cqs size and modification time (or other compiler\-specific information specified by the
-\fBcompiler_check\fR
-setting)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the name of the compiler
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the current directory (if the
-\fBhash_dir\fR
-setting is enabled)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-contents of files specified by the
-\fBextra_files_to_hash\fR
-setting (if any)
-.RE
-.SS "The direct mode"
-.sp
-In the direct mode, the hash is formed of the common information and:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the input source file
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the command line options
-.RE
-.sp
-Based on the hash, a data structure called \(lqmanifest\(rq is looked up in the cache\&. The manifest contains:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-references to cached compilation results (object file, dependency file, etc) that were produced by previous compilations that matched the hash
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-paths to the include files that were read at the time the compilation results were stored in the cache
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-hash sums of the include files at the time the compilation results were stored in the cache
-.RE
-.sp
-The current contents of the include files are then hashed and compared to the information in the manifest\&. If there is a match, ccache knows the result of the compilation\&. If there is no match, ccache falls back to running the preprocessor\&. The output from the preprocessor is parsed to find the include files that were read\&. The paths and hash sums of those include files are then stored in the manifest along with information about the produced compilation result\&.
-.sp
-There is a catch with the direct mode: header files that were used by the compiler are recorded, but header files that were \fBnot\fR used, but would have been used if they existed, are not\&. So, when ccache checks if a result can be taken from the cache, it currently can\(cqt check if the existence of a new header file should invalidate the result\&. In practice, the direct mode is safe to use in the absolute majority of cases\&.
-.sp
-The direct mode will be disabled if any of the following holds:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the configuration setting
-\fBdirect_mode\fR
-is false
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-a modification time of one of the include files is too new (needed to avoid a race condition)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-a compiler option not supported by the direct mode is used:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-a
-\fB\-Wp,\fR\fB\fIX\fR\fR
-compiler option other than
-\fB\-Wp,\-MD,\fR\fB\fIpath\fR\fR,
-\fB\-Wp,\-MMD,\fR\fB\fIpath\fR\fR
-and
-\fB\-Wp,\-D_define_\fR
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-\fB\-Xpreprocessor\fR
-.RE
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the string \(lq__TIME__\(rq is present in the source code
-.RE
-.SS "The preprocessor mode"
-.sp
-In the preprocessor mode, the hash is formed of the common information and:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the preprocessor output from running the compiler with
-\fB\-E\fR
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the command line options except options that affect include files (\fB\-I\fR,
-\fB\-include\fR,
-\fB\-D\fR, etc; the theory is that these options will change the preprocessor output if they have any effect at all)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-any standard error output generated by the preprocessor
-.RE
-.sp
-Based on the hash, the cached compilation result can be looked up directly in the cache\&.
-.SH "COMPILING IN DIFFERENT DIRECTORIES"
-.sp
-Some information included in the hash that identifies a unique compilation can contain absolute paths:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The preprocessed source code may contain absolute paths to include files if the compiler option
-\fB\-g\fR
-is used or if absolute paths are given to
-\fB\-I\fR
-and similar compiler options\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Paths specified by compiler options (such as
-\fB\-I\fR,
-\fB\-MF\fR, etc) on the command line may be absolute\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The source code file path may be absolute, and that path may substituted for
-\fB__FILE__\fR
-macros in the source code or included in warnings emitted to standard error by the preprocessor\&.
-.RE
-.sp
-This means that if you compile the same code in different locations, you can\(cqt share compilation results between the different build directories since you get cache misses because of the absolute build directory paths that are part of the hash\&.
-.sp
-Here\(cqs what can be done to enable cache hits between different build directories:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If you build with
-\fB\-g\fR
-(or similar) to add debug information to the object file, you must either:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-use the
-\fB\-fdebug\-prefix\-map=\fR\fB\fIold\fR\fR\fB=\fR\fB\fInew\fR\fR
-option for relocating debug info to a common prefix (e\&.g\&.
-\fB\-fdebug\-prefix\-map=$PWD=\&.\fR); or
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-set
-\fBhash_dir = false\fR\&.
-.RE
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If you use absolute paths anywhere on the command line (e\&.g\&. the source code file path or an argument to compiler options like
-\fB\-I\fR
-and
-\fB\-MF\fR), you must to set
-\fBbase_dir\fR
-to an absolute path to a \(lqbase directory\(rq\&. ccache will then rewrite absolute paths under that directory to relative before computing the hash\&.
-.RE
-.SH "PRECOMPILED HEADERS"
-.sp
-ccache has support for GCC\(cqs precompiled headers\&. However, you have to do some things to make it work properly:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-You must set
-\fBsloppiness\fR
-to
-\fBpch_defines,time_macros\fR\&. The reason is that ccache can\(cqt tell whether
-\fB__TIME__\fR
-or
-\fB__DATE__\fR
-is used when using a precompiled header\&. Further, it can\(cqt detect changes in
-\fB#define\fRs in the source code because of how preprocessing works in combination with precompiled headers\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-You must either:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-use the
-\fB\-include\fR
-compiler option to include the precompiled header (i\&.e\&., don\(cqt use
-\fB#include\fR
-in the source code to include the header); or
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-(for the Clang compiler) use the
-\fB\-include\-pch\fR
-compiler option to include the PCH file generated from the precompiled header; or
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-add the
-\fB\-fpch\-preprocess\fR
-compiler option when compiling\&.
-.RE
-.sp
-If you don\(cqt do this, either the non\-precompiled version of the header file will be used (if available) or ccache will fall back to running the real compiler and increase the statistics counter \(lqpreprocessor error\(rq (if the non\-precompiled header file is not available)\&.
-.RE
-.SH "SHARING A CACHE"
-.sp
-A group of developers can increase the cache hit rate by sharing a cache directory\&. To share a cache without unpleasant side effects, the following conditions should to be met:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Use the same cache directory\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Make sure that the configuration setting
-\fBhard_link\fR
-is false (which is the default)\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Make sure that all users are in the same group\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Set the configuration setting
-\fBumask\fR
-to 002\&. This ensures that cached files are accessible to everyone in the group\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache)\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Make sure that the setgid bit is set on all directories in the cache\&. This tells the filesystem to inherit group ownership for new directories\&. The following command might be useful for this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-find $CCACHE_DIR \-type d | xargs chmod g+s
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.sp
-The reason to avoid the hard link mode is that the hard links cause unwanted side effects, as all links to a cached file share the file\(cqs modification timestamp\&. This results in false dependencies to be triggered by timestamp\-based build systems whenever another user links to an existing file\&. Typically, users will see that their libraries and binaries are relinked without reason\&.
-.sp
-You may also want to make sure that a base directory is set appropriately, as discussed in a previous section\&.
-.SH "SHARING A CACHE ON NFS"
-.sp
-It is possible to put the cache directory on an NFS filesystem (or similar filesystems), but keep in mind that:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Having the cache on NFS may slow down compilation\&. Make sure to do some benchmarking to see if it\(cqs worth it\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-ccache hasn\(cqt been tested very thoroughly on NFS\&.
-.RE
-.sp
-A tip is to set \fBtemporary_dir\fR to a directory on the local host to avoid NFS traffic for temporary files\&.
-.SH "USING CCACHE WITH OTHER COMPILER WRAPPERS"
-.sp
-The recommended way of combining ccache with another compiler wrapper (such as \(lqdistcc\(rq) is by letting ccache execute the compiler wrapper\&. This is accomplished by defining the configuration setting \fBprefix_command\fR, for example by setting the environment variable \fBCCACHE_PREFIX\fR to the name of the wrapper (e\&.g\&. \fBdistcc\fR)\&. ccache will then prefix the command line with the specified command when running the compiler\&. To specify several prefix commands, set \fBprefix_command\fR to a colon\-separated list of commands\&.
-.sp
-Unless you set \fBcompiler_check\fR to a suitable command (see the description of that configuration option), it is not recommended to use the form \fBccache anotherwrapper compiler args\fR as the compilation command\&. It\(cqs also not recommended to use the masquerading technique for the other compiler wrapper\&. The reason is that by default, ccache will in both cases hash the mtime and size of the other wrapper instead of the real compiler, which means that:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Compiler upgrades will not be detected properly\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The cached results will not be shared between compilations with and without the other wrapper\&.
-.RE
-.sp
-Another minor thing is that if \fBprefix_command\fR is used, ccache will not invoke the other wrapper when running the preprocessor, which increases performance\&. You can use the \fBprefix_command_cpp\fR configuration setting if you also want to invoke the other wrapper when doing preprocessing (normally by adding \fB\-E\fR)\&.
-.SH "CAVEATS"
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The direct mode fails to pick up new header files in some rare scenarios\&. See
-THE DIRECT MODE
-above\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-When run via ccache, warning messages produced by GCC 4\&.9 and newer will only be colored when the environment variable
-\fBGCC_COLORS\fR
-is set\&. An alternative to setting
-\fBGCC_COLORS\fR
-is to pass
-\-fdiagnostics\-color
-explicitly when compiling (but then color codes will also be present when redirecting stderr to a file)\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If ccache guesses that the compiler may emit colored warnings, then a compilation with stderr referring to a TTY will be considered different from a compilation with a redirected stderr, thus not sharing cache entries\&. This happens for clang by default and for GCC when
-\fBGCC_COLORS\fR
-is set as mentioned above\&. If you want to share cache hits, you can pass
-\-f[no\-]diagnostics\-color
-(GCC) or
-\-f[no\-]color\-diagnostics
-(clang) explicitly when compiling (but then color codes will be either on or off for both the TTY and the redirected case)\&.
-.RE
-.SH "TROUBLESHOOTING"
-.SS "General"
-.sp
-A general tip for getting information about what ccache is doing is to enable debug logging by setting \fBlog_file\fR\&. The log contains executed commands, important decisions that ccache makes, read and written files, etc\&. Another way of keeping track of what is happening is to check the output of \fBccache \-s\fR\&.
-.SS "Performance"
-.sp
-ccache has been written to perform well out of the box, but sometimes you may have to do some adjustments of how you use the compiler and ccache in order to improve performance\&.
-.sp
-Since ccache works best when I/O is fast, put the cache directory on a fast storage device if possible\&. Having lots of free memory so that files in the cache directory stay in the disk cache is also preferable\&.
-.sp
-A good way of monitoring how well ccache works is to run \fBccache \-s\fR before and after your build and then compare the statistics counters\&. Here are some common problems and what may be done to increase the hit rate:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqcache hit (preprocessed)\(rq has been incremented instead of \(lqcache hit (direct)\(rq, ccache has fallen back to preprocessor mode, which is generally slower\&. Some possible reasons are:
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The source code has been modified in such a way that the preprocessor output is not affected\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-Compiler arguments that are hashed in the direct mode but not in the preprocessor mode have changed (\fB\-I\fR,
-\fB\-include\fR,
-\fB\-D\fR, etc) and they didn\(cqt affect the preprocessor output\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The compiler option
-\fB\-Xpreprocessor\fR
-or
-\fB\-Wp,\fR\fB\fIX\fR\fR
-(except
-\fB\-Wp,\-MD,\fR\fB\fIpath\fR\fR,
-\fB\-Wp,\-MMD,\fR\fB\fIpath\fR\fR, and
-\fB\-Wp,\-D_define_\fR) is used\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-This was the first compilation with a new value of the base directory setting\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-A modification time of one of the include files is too new (created the same second as the compilation is being done)\&. This check is made to avoid a race condition\&. To fix this, create the include file earlier in the build process, if possible, or set
-\fBsloppiness\fR
-to
-\fBinclude_file_mtime\fR
-if you are willing to take the risk\&. (The race condition consists of these events: the preprocessor is run; an include file is modified by someone; the new include file is hashed by ccache; the real compiler is run on the preprocessor\(cqs output, which contains data from the old header file; the wrong object file is stored in the cache\&.)
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The
-\fB__TIME__\fR
-preprocessor macro is (potentially) being used\&. ccache turns off direct mode if \(lq__TIME__\(rq is present in the source code\&. This is done as a safety measure since the string indicates that a
-\fB__TIME__\fR
-macro
-\fImay\fR
-affect the output\&. (To be sure, ccache would have to run the preprocessor, but the sole point of the direct mode is to avoid that\&.) If you know that
-\fB__TIME__\fR
-isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
-\fB__TIME__\fR
-is expanded to something in the past, you can set
-\fBsloppiness\fR
-to
-\fBtime_macros\fR\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The
-\fB__DATE__\fR
-preprocessor macro is (potentially) being used and the date has changed\&. This is similar to how
-\fB__TIME__\fR
-is handled\&. If \(lq__DATE__\(rq is present in the source code, ccache hashes the current date in order to be able to produce the correct object file if the
-\fB__DATE__\fR
-macro affects the output\&. If you know that
-\fB__DATE__\fR
-isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
-\fB__DATE__\fR
-is expanded to something in the past, you can set
-\fBsloppiness\fR
-to
-\fBtime_macros\fR\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-The
-\fB__FILE__\fR
-preprocessor macro is (potentially) being used and the file path has changed\&. If \(lq__FILE__\(rq is present in the source code, ccache hashes the current input file path in order to be able to produce the correct object file if the
-\fB__FILE__\fR
-macro affects the output\&. If you know that
-\fB__FILE__\fR
-isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
-\fB__FILE__\fR
-is expanded to the wrong path, you can set
-\fBsloppiness\fR
-to
-\fBfile_macro\fR\&.
-.RE
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqcache miss\(rq has been incremented even though the same code has been compiled and cached before, ccache has either detected that something has changed anyway or a cleanup has been performed (either explicitly or implicitly when a cache limit has been reached)\&. Some perhaps unobvious things that may result in a cache miss are usage of
-\fB__TIME__\fR
-or
-\fB__DATE__\fR
-macros, or use of automatically generated code that contains a timestamp, build counter or other volatile information\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqmultiple source files\(rq has been incremented, it\(cqs an indication that the compiler has been invoked on several source code files at once\&. ccache doesn\(cqt support that\&. Compile the source code files separately if possible\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqunsupported compiler option\(rq has been incremented, enable debug logging and check which option was rejected\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqpreprocessor error\(rq has been incremented, one possible reason is that precompiled headers are being used\&. See
-PRECOMPILED HEADERS
-for how to remedy this\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-If \(lqcan\(cqt use precompiled header\(rq has been incremented, see
-PRECOMPILED HEADERS\&.
-.RE
-.SS "Corrupt object files"
-.sp
-It should be noted that ccache is susceptible to general storage problems\&. If a bad object file sneaks into the cache for some reason, it will of course stay bad\&. Some possible reasons for erroneous object files are bad hardware (disk drive, disk controller, memory, etc), buggy drivers or file systems, a bad \fBprefix_command\fR or compiler wrapper\&. If this happens, the easiest way of fixing it is this:
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 1.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 1." 4.2
-.\}
-Build so that the bad object file ends up in the build tree\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 2.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 2." 4.2
-.\}
-Remove the bad object file from the build tree\&.
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 3.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 3." 4.2
-.\}
-Rebuild with
-\fBCCACHE_RECACHE\fR
-set\&.
-.RE
-.sp
-An alternative is to clear the whole cache with \fBccache \-C\fR if you don\(cqt mind losing other cached results\&.
-.sp
-There are no reported issues about ccache producing broken object files reproducibly\&. That doesn\(cqt mean it can\(cqt happen, so if you find a repeatable case, please report it\&.
-.SH "MORE INFORMATION"
-.sp
-Credits, mailing list information, bug reporting instructions, source code, etc, can be found on ccache\(cqs web site: https://ccache\&.samba\&.org\&.
-.SH "AUTHOR"
-.sp
-ccache was originally written by Andrew Tridgell and is currently developed and maintained by Joel Rosdahl\&. See AUTHORS\&.txt or AUTHORS\&.html and https://ccache\&.samba\&.org/credits\&.html for a list of contributors\&.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring ccache" >&5
-$as_echo "$as_me: Configuring ccache" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: configuring ccache" >&5
+$as_echo "$as_me: configuring ccache" >&6;}
ac_config_headers="$ac_config_headers config.h"
if test x${use_bundled_zlib} = xyes; then
CPPFLAGS="$CPPFLAGS -I\$(srcdir)/src/zlib"
- extra_libs="zlib/libz.a"
- mkdir -p zlib
+ extra_libs="src/zlib/libz.a"
+ mkdir -p src/zlib
else
LIBS="$LIBS -lz"
fi
fi
+mkdir -p .deps src unittest
+
if test ! -f $srcdir/dev_mode_disabled && test "$RUN_FROM_BUILD_FARM" != yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: Developer mode enabled" >&5
-$as_echo "$as_me: Developer mode enabled" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: developer mode enabled" >&5
+$as_echo "$as_me: developer mode enabled" >&6;}
ac_config_files="$ac_config_files dev.mk"
include_dev_mk='include dev.mk'
version=`(git --git-dir=$srcdir/.git describe --dirty 2>/dev/null || echo vunknown) | sed -e 's/v//' -e 's/-/+/' -e 's/-/_/g'`
echo "const char CCACHE_VERSION[] = \"$version\";" >src/version.c
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: Developer mode disabled" >&5
-$as_echo "$as_me: Developer mode disabled" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: developer mode disabled" >&5
+$as_echo "$as_me: developer mode disabled" >&6;}
fi
-if test ! -f $srcdir/src/version.c; then
+if test ! -f $srcdir/src/version.c -a ! -f src/version.c ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to determine ccache version" >&5
$as_echo "$as_me: WARNING: unable to determine ccache version" >&2;}
echo "const char CCACHE_VERSION[] = \"unknown\";" >src/version.c
fi
-test_suites=`ls $srcdir/unittest/test_*.c | egrep -v 'BASE|BACKUP|LOCAL|REMOTE' | xargs echo`
+test_suites=`cd $srcdir && ls unittest/test_*.c | egrep -v 'BASE|BACKUP|LOCAL|REMOTE' | xargs echo`
ac_config_files="$ac_config_files Makefile"
echo '#endif' >>config.h.tmp
mv config.h.tmp config.h
-mkdir -p .deps src unittest
-
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: now build ccache by running make" >&5
$as_echo "$as_me: now build ccache by running make" >&6;}
AC_INIT()
AC_PREREQ(2.52)
-AC_MSG_NOTICE([Configuring ccache])
+AC_MSG_NOTICE([configuring ccache])
AC_CONFIG_HEADER(config.h)
if test x${use_bundled_zlib} = xyes; then
CPPFLAGS="$CPPFLAGS -I\$(srcdir)/src/zlib"
- extra_libs="zlib/libz.a"
- mkdir -p zlib
+ extra_libs="src/zlib/libz.a"
+ mkdir -p src/zlib
else
LIBS="$LIBS -lz"
fi
Define to 1 if your compiler supports extern inline)
fi
+mkdir -p .deps src unittest
+
dnl Enable developer mode if dev.mk.in exists.
if test ! -f $srcdir/dev_mode_disabled && test "$RUN_FROM_BUILD_FARM" != yes; then
- AC_MSG_NOTICE(Developer mode enabled)
+ AC_MSG_NOTICE(developer mode enabled)
AC_CONFIG_FILES([dev.mk])
include_dev_mk='include dev.mk'
version=`(git --git-dir=$srcdir/.git describe --dirty 2>/dev/null || echo vunknown) | sed -e 's/v//' -e 's/-/+/' -e 's/-/_/g'`
echo "const char CCACHE_VERSION@<:@@:>@ = \"$version\";" >src/version.c
else
- AC_MSG_NOTICE(Developer mode disabled)
+ AC_MSG_NOTICE(developer mode disabled)
fi
-if test ! -f $srcdir/src/version.c; then
+if test ! -f $srcdir/src/version.c -a ! -f src/version.c ; then
AC_MSG_WARN(unable to determine ccache version)
echo "const char CCACHE_VERSION@<:@@:>@ = \"unknown\";" >src/version.c
fi
dnl Find test suite files.
-test_suites=`ls $srcdir/unittest/test_*.c | egrep -v 'BASE|BACKUP|LOCAL|REMOTE' | xargs echo`
+test_suites=`cd $srcdir && ls unittest/test_*.c | egrep -v 'BASE|BACKUP|LOCAL|REMOTE' | xargs echo`
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
echo '#endif' >>config.h.tmp
mv config.h.tmp config.h
-mkdir -p .deps src unittest
-
-
AC_MSG_NOTICE(now build ccache by running make)
all_cflags += -Werror
all_cppflags += -MD -MP -MF .deps/$(subst .._,,$(subst /,_,$<)).d
+A2X = a2x
ASCIIDOC = asciidoc
CPPCHECK = cppcheck
CPPCHECK_SUPPRESSIONS = misc/cppcheck-suppressions.txt
SCAN_BUILD = scan-build
DOCKER = docker
GPERF = gperf
-XSLTPROC = xsltproc
-MANPAGE_XSL = $(shell if [ -e /usr/local/etc/asciidoc/docbook-xsl/manpage.xsl ]; \
- then echo /usr/local/etc/asciidoc/docbook-xsl/manpage.xsl; \
- else echo /etc/asciidoc/docbook-xsl/manpage.xsl; fi)
-
version := \
$(shell (git --git-dir=$(srcdir)/.git describe --dirty || git --git-dir=$(srcdir)/.git describe || echo vunknown) \
dist_archives += ccache-$(version).tar.xz
endif
-generated_docs = ccache.1 doc/AUTHORS.html LICENSE.html doc/MANUAL.html doc/NEWS.html
-built_dist_files = $(generated_docs)
+generated_docs = \
+ LICENSE.html \
+ doc/AUTHORS.html \
+ doc/MANUAL.html \
+ doc/NEWS.html \
+ doc/ccache.1
+built_dist_files = $(generated_sources) $(generated_docs)
headers = \
src/ccache.h \
src/murmurhashneutral2.h \
src/system.h \
unittest/framework.h \
- unittest/suites.h \
unittest/util.h
+generated_headers = \
+ unittest/suites.h
files_to_clean += *.tar.bz2 *.tar.gz *.tar.xz *.xml .deps/* perfdir.*
files_to_distclean += $(built_dist_files) src/version.c unittest/suites.h
files_to_distclean += .deps dev.mk
source_dist_files = \
- $(base_sources) \
+ $(non_3pp_sources) \
+ $(3pp_sources) \
$(headers) \
$(test_sources) \
CONTRIBUTING.md \
GPL-3.0.txt \
- LICENSE.txt \
+ LICENSE.adoc \
Makefile.in \
README.md \
autogen.sh \
configure \
configure.ac \
dev.mk.in \
- doc/AUTHORS.txt \
- doc/MANUAL.txt \
- doc/NEWS.txt \
+ doc/AUTHORS.adoc \
+ doc/MANUAL.adoc \
+ doc/NEWS.adoc \
install-sh \
m4 \
src/confitems.gperf \
(cd $(srcdir) && \
rsync -r --relative $(source_dist_files) $$dir) && \
cp $(srcdir)/doc/INSTALL-from-release-archive.md $$dir/INSTALL.md && \
- cp $(built_dist_files) $$dir && \
+ (cd $(builddir) && \
+ rsync -r --relative $(built_dist_files) $$dir) && \
echo "Remove this file to enable developer mode." >$$dir/dev_mode_disabled && \
(cd $$tmpdir && \
tarcompression= && \
distcheck: $(firstword $(dist_archives))
tmpdir=$$(mktemp -d /tmp/tmp-ccache-distcheck.XXXXXX) && \
(cd $$tmpdir && \
- tar xjf $(CURDIR)/$< && \
+ tar xf $(CURDIR)/$< && \
mkdir -p $(dist_dir)/build && \
+ chmod -R a-w $(dist_dir) && \
+ chmod u+w $(dist_dir)/build && \
cd $(dist_dir)/build && \
../configure --prefix=$$tmpdir/root && \
$(MAKE) install && \
$(MAKE) installcheck) && \
+ chmod -R u+w $$tmpdir/$(dist_dir) && \
+ rm -rf $$tmpdir
+
+ tmpdir=$$(mktemp -d /tmp/tmp-ccache-distcheck.XXXXXX) && \
+ (cd $$tmpdir && \
+ tar xf $(CURDIR)/$< && \
+ mkdir -p $(dist_dir)/build && \
+ chmod -R a-w $(dist_dir) && \
+ chmod u+w $(dist_dir)/build && \
+ cd $(dist_dir)/build && \
+ ../configure --prefix=$$tmpdir/root --with-bundled-zlib && \
+ $(MAKE) install && \
+ $(MAKE) installcheck) && \
+ chmod -R u+w $$tmpdir/$(dist_dir) && \
rm -rf $$tmpdir
.PHONY: docs
docs: $(generated_docs)
-%.html: %.txt
- $(ASCIIDOC) -a revnumber=$(version) -a toc -b xhtml11 $<
+%.html: %.adoc
+ @mkdir -p $(@D)
+ $(ASCIIDOC) -o $@ -a revnumber=$(version) -a toc -b xhtml11 $<
-%.xml: %.txt
- $(ASCIIDOC) -a revnumber=$(version) -d manpage -b docbook $<
+%.xml: %.adoc
+ @mkdir -p $(@D)
+# Make literals stand out as bold in the man page:
+ $(ASCIIDOC) -a revnumber=$(version) -d manpage -b docbook -o - $< | \
+ perl -pe 's!<literal>(.*?)</literal>!<emphasis role="strong">\1</emphasis>!g' >$@
-ccache.1: doc/MANUAL.xml
- $(XSLTPROC) --nonet $(MANPAGE_XSL) $<
+doc/ccache.1: doc/MANUAL.xml
+ $(A2X) --doctype manpage --format manpage $<
.PHONY: update-authors
update-authors:
git log --pretty=format:"* %aN <%aE>" \
| sort -u \
- | perl -00 -p -i -e 's/^\*.*/<STDIN> . "\n"/es' doc/AUTHORS.txt
+ | perl -00 -p -i -e 's/^\*.*/<STDIN> . "\n"/es' doc/AUTHORS.adoc
.PHONY: check-syntax
check-syntax:
.PHONY: docker
docker: misc/Dockerfile
- $(DOCKER) build $(srcdir)
+ $(DOCKER) build -f $< $(srcdir)
-include .deps/*.d
--- /dev/null
+ccache authors
+==============
+
+ccache was originally written by Andrew Tridgell and is currently developed and
+maintained by Joel Rosdahl.
+
+ccache is a collective work with contributions from many people, including:
+
+* Alexey Tourbin <alexey.tourbin@gmail.com>
+* Alfred Landrum <alfred.landrum@riverbed.com>
+* Anders F Björklund <anders.f.bjorklund@gmail.com>
+* Andrea Bittau <a.bittau@cs.ucl.ac.uk>
+* Andreas Huber <andreas.huber@deltaww.com>
+* André Klitzing <aklitzing@gmail.com>
+* Andrew P Boie <andrew.p.boie@intel.com>
+* Andrew Stubbs <ams@codesourcery.com>
+* Andrew Tridgell <tridge@samba.org>
+* Bernhard Bauer <bauerb@chromium.org>
+* Björn Jacke <bj@sernet.de>
+* Chiaki Ishikawa <ishikawa@yk.rim.or.jp>
+* Chris AtLee <catlee@mozilla.com>
+* Clemens Rabe <clemens.rabe@gmail.com>
+* David Givone <david@givone.net>
+* Edward Z. Yang <ezyang@fb.com>
+* Francois Marier <francois@debian.org>
+* Geert Bosch <geert@mongodb.com>
+* Grigory Entin <grigorye@dins.ru>
+* Hongli Lai <hongli@phusion.nl>
+* Ivan Vaigult <i.vaigult@gmail.com>
+* Jiang Jiang <jiangj@opera.com>
+* Joel Rosdahl <joel@rosdahl.net>
+* John Basila <jbasila@checkpoint.com>
+* John Coiner <john.coiner@amd.com>
+* Jon Bernard <jbernard@tuxion.com>
+* Jørgen P. Tjernø <jorgen@valvesoftware.com>
+* Justin Lebar <justin.lebar@gmail.com>
+* Karl Chen <quarl@cs.berkeley.edu>
+* Kona Blend <kona8lend@gmail.com>
+* Kovarththanan Rajaratnam <kovarththanan.rajaratnam@gmail.com>
+* Lalit Chhabra <lchhabra@linuxmail.org>
+* Lars Gustäbel <lars@gustaebel.de>
+* Leanid Chaika <leanid.chaika@gmail.com>
+* Luboš Luňák <l.lunak@centrum.cz>
+* Mark Starovoytov <starovoytov.mark@googlemail.com>
+* Martin Ettl <ettl.martin78@gmail.com>
+* Martin Pool <mbp@sourcefrog.net>
+* Mathias De Maré <mathias.de_mare@nokia.com>
+* Matthias Kretz <kretz@kde.org>
+* Melven Roehrig-Zoellner <Melven.Roehrig-Zoellner@DLR.de>
+* Michael Marineau <michael.marineau@coreos.com>
+* Michael Meeks <michael.meeks@suse.com>
+* Mihai Serban <mihai.serban@intel.com>
+* Mike Frysinger <vapier@gentoo.org>
+* Mikhail Kolomeytsev <mkolom@yandex-team.ru>
+* Mostyn Bramley-Moore <mostyn@antipode.se>
+* Neil Mushell <nmushell@bloomberg.net>
+* Nick Schultz <nick.schultz@intel.com>
+* Norbert Lange <nolange79@gmail.com>
+* Oded Shimon <oded@istraresearch.com>
+* Orgad Shaneh <orgad.shaneh@audiocodes.com>
+* Orion Poplawski <orion@cora.nwra.com>
+* Owen Mann <owen@mann.org>
+* Patrick von Reth <vonreth@kde.org>
+* Paul Griffith <paulg@cse.yorku.ca>
+* Pavel Boldin <pboldin@cloudlinux.com>
+* Per Nordlöw <per.nordlow@autoliv.com>
+* Peter Budai <peterbudai@hotmail.com>
+* Philippe Proulx <eeppeliteloop@gmail.com>
+* Ramiro Polla <ramiro.polla@gmail.com>
+* Robin H. Johnson <robbat2@gentoo.org>
+* Rolf Bjarne Kvinge <rolf@xamarin.com>
+* RW <fbsd06@mlists.homeunix.com>
+* Ryan Brown <ryb@ableton.com>
+* Sam Gross <sgross@fb.com>
+* Thomas Röfer <Thomas.Roefer@dfki.de>
+* Timofei Kushnir <timophey@rdp.ru>
+* Tim Potter <tpot@samba.org>
+* Tom Hughes <tomtheengineer@gmail.com>
+* Tor Arne Vestbø <tor.arne.vestbo@qt.io>
+* Vadim Petrochenkov <vadim.petrochenkov@gmail.com>
+* Ville Skyttä <ville.skytta@iki.fi>
+* William S Fulton <wsf@fultondesigns.co.uk>
+* Wilson Snyder <wsnyder@wsnyder.org>
+* Yiding Jia <yiding@fb.com>
+
+Thanks!
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
+<head>\r
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
+<meta name="generator" content="AsciiDoc 8.6.9" />\r
+<title>ccache authors</title>\r
+<style type="text/css">\r
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
+\r
+/* Default font. */\r
+body {\r
+ font-family: Georgia,serif;\r
+}\r
+\r
+/* Title font. */\r
+h1, h2, h3, h4, h5, h6,\r
+div.title, caption.title,\r
+thead, p.table.header,\r
+#toctitle,\r
+#author, #revnumber, #revdate, #revremark,\r
+#footer {\r
+ font-family: Arial,Helvetica,sans-serif;\r
+}\r
+\r
+body {\r
+ margin: 1em 5% 1em 5%;\r
+}\r
+\r
+a {\r
+ color: blue;\r
+ text-decoration: underline;\r
+}\r
+a:visited {\r
+ color: fuchsia;\r
+}\r
+\r
+em {\r
+ font-style: italic;\r
+ color: navy;\r
+}\r
+\r
+strong {\r
+ font-weight: bold;\r
+ color: #083194;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+ color: #527bbd;\r
+ margin-top: 1.2em;\r
+ margin-bottom: 0.5em;\r
+ line-height: 1.3;\r
+}\r
+\r
+h1, h2, h3 {\r
+ border-bottom: 2px solid silver;\r
+}\r
+h2 {\r
+ padding-top: 0.5em;\r
+}\r
+h3 {\r
+ float: left;\r
+}\r
+h3 + * {\r
+ clear: left;\r
+}\r
+h5 {\r
+ font-size: 1.0em;\r
+}\r
+\r
+div.sectionbody {\r
+ margin-left: 0;\r
+}\r
+\r
+hr {\r
+ border: 1px solid silver;\r
+}\r
+\r
+p {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+ul, ol, li > p {\r
+ margin-top: 0;\r
+}\r
+ul > li { color: #aaa; }\r
+ul > li > * { color: black; }\r
+\r
+.monospaced, code, pre {\r
+ font-family: "Courier New", Courier, monospace;\r
+ font-size: inherit;\r
+ color: navy;\r
+ padding: 0;\r
+ margin: 0;\r
+}\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
+\r
+#author {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ font-size: 1.1em;\r
+}\r
+#email {\r
+}\r
+#revnumber, #revdate, #revremark {\r
+}\r
+\r
+#footer {\r
+ font-size: small;\r
+ border-top: 2px solid silver;\r
+ padding-top: 0.5em;\r
+ margin-top: 4.0em;\r
+}\r
+#footer-text {\r
+ float: left;\r
+ padding-bottom: 0.5em;\r
+}\r
+#footer-badges {\r
+ float: right;\r
+ padding-bottom: 0.5em;\r
+}\r
+\r
+#preamble {\r
+ margin-top: 1.5em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.imageblock, div.exampleblock, div.verseblock,\r
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
+div.admonitionblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.admonitionblock {\r
+ margin-top: 2.0em;\r
+ margin-bottom: 2.0em;\r
+ margin-right: 10%;\r
+ color: #606060;\r
+}\r
+\r
+div.content { /* Block element content. */\r
+ padding: 0;\r
+}\r
+\r
+/* Block element titles. */\r
+div.title, caption.title {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ text-align: left;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.5em;\r
+}\r
+div.title + * {\r
+ margin-top: 0;\r
+}\r
+\r
+td div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content + div.title {\r
+ margin-top: 0.0em;\r
+}\r
+\r
+div.sidebarblock > div.content {\r
+ background: #ffffee;\r
+ border: 1px solid #dddddd;\r
+ border-left: 4px solid #f0f0f0;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.listingblock > div.content {\r
+ border: 1px solid #dddddd;\r
+ border-left: 5px solid #f0f0f0;\r
+ background: #f8f8f8;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.quoteblock, div.verseblock {\r
+ padding-left: 1.0em;\r
+ margin-left: 1.0em;\r
+ margin-right: 10%;\r
+ border-left: 5px solid #f0f0f0;\r
+ color: #888;\r
+}\r
+\r
+div.quoteblock > div.attribution {\r
+ padding-top: 0.5em;\r
+ text-align: right;\r
+}\r
+\r
+div.verseblock > pre.content {\r
+ font-family: inherit;\r
+ font-size: inherit;\r
+}\r
+div.verseblock > div.attribution {\r
+ padding-top: 0.75em;\r
+ text-align: left;\r
+}\r
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
+div.verseblock + div.attribution {\r
+ text-align: left;\r
+}\r
+\r
+div.admonitionblock .icon {\r
+ vertical-align: top;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: #527bbd;\r
+ padding-right: 0.5em;\r
+}\r
+div.admonitionblock td.content {\r
+ padding-left: 0.5em;\r
+ border-left: 3px solid #dddddd;\r
+}\r
+\r
+div.exampleblock > div.content {\r
+ border-left: 3px solid #dddddd;\r
+ padding-left: 0.5em;\r
+}\r
+\r
+div.imageblock div.content { padding-left: 0; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
+a.image:visited { color: white; }\r
+\r
+dl {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+dt {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0;\r
+ font-style: normal;\r
+ color: navy;\r
+}\r
+dd > *:first-child {\r
+ margin-top: 0.1em;\r
+}\r
+\r
+ul, ol {\r
+ list-style-position: outside;\r
+}\r
+ol.arabic {\r
+ list-style-type: decimal;\r
+}\r
+ol.loweralpha {\r
+ list-style-type: lower-alpha;\r
+}\r
+ol.upperalpha {\r
+ list-style-type: upper-alpha;\r
+}\r
+ol.lowerroman {\r
+ list-style-type: lower-roman;\r
+}\r
+ol.upperroman {\r
+ list-style-type: upper-roman;\r
+}\r
+\r
+div.compact ul, div.compact ol,\r
+div.compact p, div.compact p,\r
+div.compact div, div.compact div {\r
+ margin-top: 0.1em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+tfoot {\r
+ font-weight: bold;\r
+}\r
+td > div.verse {\r
+ white-space: pre;\r
+}\r
+\r
+div.hdlist {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+div.hdlist tr {\r
+ padding-bottom: 15px;\r
+}\r
+dt.hdlist1.strong, td.hdlist1.strong {\r
+ font-weight: bold;\r
+}\r
+td.hdlist1 {\r
+ vertical-align: top;\r
+ font-style: normal;\r
+ padding-right: 0.8em;\r
+ color: navy;\r
+}\r
+td.hdlist2 {\r
+ vertical-align: top;\r
+}\r
+div.hdlist.compact tr {\r
+ margin: 0;\r
+ padding-bottom: 0;\r
+}\r
+\r
+.comment {\r
+ background: yellow;\r
+}\r
+\r
+.footnote, .footnoteref {\r
+ font-size: 0.8em;\r
+}\r
+\r
+span.footnote, span.footnoteref {\r
+ vertical-align: super;\r
+}\r
+\r
+#footnotes {\r
+ margin: 20px 0 20px 0;\r
+ padding: 7px 0 0 0;\r
+}\r
+\r
+#footnotes div.footnote {\r
+ margin: 0 0 5px 0;\r
+}\r
+\r
+#footnotes hr {\r
+ border: none;\r
+ border-top: 1px solid silver;\r
+ height: 1px;\r
+ text-align: left;\r
+ margin-left: 0;\r
+ width: 20%;\r
+ min-width: 100px;\r
+}\r
+\r
+div.colist td {\r
+ padding-right: 0.5em;\r
+ padding-bottom: 0.3em;\r
+ vertical-align: top;\r
+}\r
+div.colist td img {\r
+ margin-top: 0.3em;\r
+}\r
+\r
+@media print {\r
+ #footer-badges { display: none; }\r
+}\r
+\r
+#toc {\r
+ margin-bottom: 2.5em;\r
+}\r
+\r
+#toctitle {\r
+ color: #527bbd;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
+ margin-top: 0;\r
+ margin-bottom: 0;\r
+}\r
+div.toclevel2 {\r
+ margin-left: 2em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel3 {\r
+ margin-left: 4em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel4 {\r
+ margin-left: 6em;\r
+ font-size: 0.9em;\r
+}\r
+\r
+span.aqua { color: aqua; }\r
+span.black { color: black; }\r
+span.blue { color: blue; }\r
+span.fuchsia { color: fuchsia; }\r
+span.gray { color: gray; }\r
+span.green { color: green; }\r
+span.lime { color: lime; }\r
+span.maroon { color: maroon; }\r
+span.navy { color: navy; }\r
+span.olive { color: olive; }\r
+span.purple { color: purple; }\r
+span.red { color: red; }\r
+span.silver { color: silver; }\r
+span.teal { color: teal; }\r
+span.white { color: white; }\r
+span.yellow { color: yellow; }\r
+\r
+span.aqua-background { background: aqua; }\r
+span.black-background { background: black; }\r
+span.blue-background { background: blue; }\r
+span.fuchsia-background { background: fuchsia; }\r
+span.gray-background { background: gray; }\r
+span.green-background { background: green; }\r
+span.lime-background { background: lime; }\r
+span.maroon-background { background: maroon; }\r
+span.navy-background { background: navy; }\r
+span.olive-background { background: olive; }\r
+span.purple-background { background: purple; }\r
+span.red-background { background: red; }\r
+span.silver-background { background: silver; }\r
+span.teal-background { background: teal; }\r
+span.white-background { background: white; }\r
+span.yellow-background { background: yellow; }\r
+\r
+span.big { font-size: 2em; }\r
+span.small { font-size: 0.6em; }\r
+\r
+span.underline { text-decoration: underline; }\r
+span.overline { text-decoration: overline; }\r
+span.line-through { text-decoration: line-through; }\r
+\r
+div.unbreakable { page-break-inside: avoid; }\r
+\r
+\r
+/*\r
+ * xhtml11 specific\r
+ *\r
+ * */\r
+\r
+div.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.tableblock > table {\r
+ border: 3px solid #527bbd;\r
+}\r
+thead, p.table.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.table {\r
+ margin-top: 0;\r
+}\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
+div.tableblock > table[frame="void"] {\r
+ border-style: none;\r
+}\r
+div.tableblock > table[frame="hsides"] {\r
+ border-left-style: none;\r
+ border-right-style: none;\r
+}\r
+div.tableblock > table[frame="vsides"] {\r
+ border-top-style: none;\r
+ border-bottom-style: none;\r
+}\r
+\r
+\r
+/*\r
+ * html5 specific\r
+ *\r
+ * */\r
+\r
+table.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+thead, p.tableblock.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.tableblock {\r
+ margin-top: 0;\r
+}\r
+table.tableblock {\r
+ border-width: 3px;\r
+ border-spacing: 0px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+ border-collapse: collapse;\r
+}\r
+th.tableblock, td.tableblock {\r
+ border-width: 1px;\r
+ padding: 4px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+}\r
+\r
+table.tableblock.frame-topbot {\r
+ border-left-style: hidden;\r
+ border-right-style: hidden;\r
+}\r
+table.tableblock.frame-sides {\r
+ border-top-style: hidden;\r
+ border-bottom-style: hidden;\r
+}\r
+table.tableblock.frame-none {\r
+ border-style: hidden;\r
+}\r
+\r
+th.tableblock.halign-left, td.tableblock.halign-left {\r
+ text-align: left;\r
+}\r
+th.tableblock.halign-center, td.tableblock.halign-center {\r
+ text-align: center;\r
+}\r
+th.tableblock.halign-right, td.tableblock.halign-right {\r
+ text-align: right;\r
+}\r
+\r
+th.tableblock.valign-top, td.tableblock.valign-top {\r
+ vertical-align: top;\r
+}\r
+th.tableblock.valign-middle, td.tableblock.valign-middle {\r
+ vertical-align: middle;\r
+}\r
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
+ vertical-align: bottom;\r
+}\r
+\r
+\r
+/*\r
+ * manpage specific\r
+ *\r
+ * */\r
+\r
+body.manpage h1 {\r
+ padding-top: 0.5em;\r
+ padding-bottom: 0.5em;\r
+ border-top: 2px solid silver;\r
+ border-bottom: 2px solid silver;\r
+}\r
+body.manpage h2 {\r
+ border-style: none;\r
+}\r
+body.manpage div.sectionbody {\r
+ margin-left: 3em;\r
+}\r
+\r
+@media print {\r
+ body.manpage div#toc { display: none; }\r
+}\r
+\r
+\r
+</style>\r
+<script type="text/javascript">\r
+/*<+'])');\r
+ // Function that scans the DOM tree for header elements (the DOM2\r
+ // nodeIterator API would be a better technique but not supported by all\r
+ // browsers).\r
+ var iterate = function (el) {\r
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
+ var mo = re.exec(i.tagName);\r
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
+ }\r
+ iterate(i);\r
+ }\r
+ }\r
+ }\r
+ iterate(el);\r
+ return result;\r
+ }\r
+\r
+ var toc = document.getElementById("toc");\r
+ if (!toc) {\r
+ return;\r
+ }\r
+\r
+ // Delete existing TOC entries in case we're reloading the TOC.\r
+ var tocEntriesToRemove = [];\r
+ var i;\r
+ for (i = 0; i < toc.childNodes.length; i++) {\r
+ var entry = toc.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div'\r
+ && entry.getAttribute("class")\r
+ && entry.getAttribute("class").match(/^toclevel/))\r
+ tocEntriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < tocEntriesToRemove.length; i++) {\r
+ toc.removeChild(tocEntriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild TOC entries.\r
+ var entries = tocEntries(document.getElementById("content"), toclevels);\r
+ for (var i = 0; i < entries.length; ++i) {\r
+ var entry = entries[i];\r
+ if (entry.element.id == "")\r
+ entry.element.id = "_toc_" + i;\r
+ var a = document.createElement("a");\r
+ a.href = "#" + entry.element.id;\r
+ a.appendChild(document.createTextNode(entry.text));\r
+ var div = document.createElement("div");\r
+ div.appendChild(a);\r
+ div.className = "toclevel" + entry.toclevel;\r
+ toc.appendChild(div);\r
+ }\r
+ if (entries.length == 0)\r
+ toc.parentNode.removeChild(toc);\r
+},\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Footnotes generator\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+/* Based on footnote generation code from:\r
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
+ */\r
+\r
+footnotes: function () {\r
+ // Delete existing footnote entries in case we're reloading the footnodes.\r
+ var i;\r
+ var noteholder = document.getElementById("footnotes");\r
+ if (!noteholder) {\r
+ return;\r
+ }\r
+ var entriesToRemove = [];\r
+ for (i = 0; i < noteholder.childNodes.length; i++) {\r
+ var entry = noteholder.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
+ entriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < entriesToRemove.length; i++) {\r
+ noteholder.removeChild(entriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild footnote entries.\r
+ var cont = document.getElementById("content");\r
+ var spans = cont.getElementsByTagName("span");\r
+ var refs = {};\r
+ var n = 0;\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnote") {\r
+ n++;\r
+ var note = spans[i].getAttribute("data-note");\r
+ if (!note) {\r
+ // Use [\s\S] in place of . so multi-line matches work.\r
+ // Because JavaScript has no s (dotall) regex flag.\r
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
+ spans[i].innerHTML =\r
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ spans[i].setAttribute("data-note", note);\r
+ }\r
+ noteholder.innerHTML +=\r
+ "<div class='footnote' id='_footnote_" + n + "'>" +\r
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
+ n + "</a>. " + note + "</div>";\r
+ var id =spans[i].getAttribute("id");\r
+ if (id != null) refs["#"+id] = n;\r
+ }\r
+ }\r
+ if (n == 0)\r
+ noteholder.parentNode.removeChild(noteholder);\r
+ else {\r
+ // Process footnoterefs.\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnoteref") {\r
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
+ href = href.match(/#.*/)[0]; // Because IE return full URL.\r
+ n = refs[href];\r
+ spans[i].innerHTML =\r
+ "[<a href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ }\r
+ }\r
+ }\r
+},\r
+\r
+install: function(toclevels) {\r
+ var timerId;\r
+\r
+ function reinstall() {\r
+ asciidoc.footnotes();\r
+ if (toclevels) {\r
+ asciidoc.toc(toclevels);\r
+ }\r
+ }\r
+\r
+ function reinstallAndRemoveTimer() {\r
+ clearInterval(timerId);\r
+ reinstall();\r
+ }\r
+\r
+ timerId = setInterval(reinstall, 500);\r
+ if (document.addEventListener)\r
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
+ else\r
+ window.onload = reinstallAndRemoveTimer;\r
+}\r
+\r
+}\r
+asciidoc.install(2);\r
+/*]]>*/\r
+</script>\r
+</head>\r
+<body class="article">\r
+<div id="header">\r
+<h1>ccache authors</h1>\r
+<span id="revnumber">version 3.4.2</span>\r
+<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>
+</div>\r
+</div>\r
+<div id="content">\r
+<div id="preamble">\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache was originally written by Andrew Tridgell and is currently developed and\r
+maintained by Joel Rosdahl.</p></div>\r
+<div class="paragraph"><p>ccache is a collective work with contributions from many people, including:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Alexey Tourbin <<a href="mailto:alexey.tourbin@gmail.com">alexey.tourbin@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Alfred Landrum <<a href="mailto:alfred.landrum@riverbed.com">alfred.landrum@riverbed.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Anders F Björklund <<a href="mailto:anders.f.bjorklund@gmail.com">anders.f.bjorklund@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Andrea Bittau <<a href="mailto:a.bittau@cs.ucl.ac.uk">a.bittau@cs.ucl.ac.uk</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Andreas Huber <<a href="mailto:andreas.huber@deltaww.com">andreas.huber@deltaww.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+André Klitzing <<a href="mailto:aklitzing@gmail.com">aklitzing@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Andrew P Boie <<a href="mailto:andrew.p.boie@intel.com">andrew.p.boie@intel.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Andrew Stubbs <<a href="mailto:ams@codesourcery.com">ams@codesourcery.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Andrew Tridgell <<a href="mailto:tridge@samba.org">tridge@samba.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bernhard Bauer <<a href="mailto:bauerb@chromium.org">bauerb@chromium.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Björn Jacke <<a href="mailto:bj@sernet.de">bj@sernet.de</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Chiaki Ishikawa <<a href="mailto:ishikawa@yk.rim.or.jp">ishikawa@yk.rim.or.jp</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Chris AtLee <<a href="mailto:catlee@mozilla.com">catlee@mozilla.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Clemens Rabe <<a href="mailto:clemens.rabe@gmail.com">clemens.rabe@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+David Givone <<a href="mailto:david@givone.net">david@givone.net</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Edward Z. Yang <<a href="mailto:ezyang@fb.com">ezyang@fb.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Francois Marier <<a href="mailto:francois@debian.org">francois@debian.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Geert Bosch <<a href="mailto:geert@mongodb.com">geert@mongodb.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Grigory Entin <<a href="mailto:grigorye@dins.ru">grigorye@dins.ru</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Hongli Lai <<a href="mailto:hongli@phusion.nl">hongli@phusion.nl</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Ivan Vaigult <<a href="mailto:i.vaigult@gmail.com">i.vaigult@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Jiang Jiang <<a href="mailto:jiangj@opera.com">jiangj@opera.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Joel Rosdahl <<a href="mailto:joel@rosdahl.net">joel@rosdahl.net</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+John Basila <<a href="mailto:jbasila@checkpoint.com">jbasila@checkpoint.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+John Coiner <<a href="mailto:john.coiner@amd.com">john.coiner@amd.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Jon Bernard <<a href="mailto:jbernard@tuxion.com">jbernard@tuxion.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Jørgen P. Tjernø <<a href="mailto:jorgen@valvesoftware.com">jorgen@valvesoftware.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Justin Lebar <<a href="mailto:justin.lebar@gmail.com">justin.lebar@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Karl Chen <<a href="mailto:quarl@cs.berkeley.edu">quarl@cs.berkeley.edu</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Kona Blend <<a href="mailto:kona8lend@gmail.com">kona8lend@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Kovarththanan Rajaratnam <<a href="mailto:kovarththanan.rajaratnam@gmail.com">kovarththanan.rajaratnam@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Lalit Chhabra <<a href="mailto:lchhabra@linuxmail.org">lchhabra@linuxmail.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Lars Gustäbel <<a href="mailto:lars@gustaebel.de">lars@gustaebel.de</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Leanid Chaika <<a href="mailto:leanid.chaika@gmail.com">leanid.chaika@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Luboš Luňák <<a href="mailto:l.lunak@centrum.cz">l.lunak@centrum.cz</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mark Starovoytov <<a href="mailto:starovoytov.mark@googlemail.com">starovoytov.mark@googlemail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Martin Ettl <<a href="mailto:ettl.martin78@gmail.com">ettl.martin78@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Martin Pool <<a href="mailto:mbp@sourcefrog.net">mbp@sourcefrog.net</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mathias De Maré <<a href="mailto:mathias.de_mare@nokia.com">mathias.de_mare@nokia.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Matthias Kretz <<a href="mailto:kretz@kde.org">kretz@kde.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Melven Roehrig-Zoellner <<a href="mailto:Melven.Roehrig-Zoellner@DLR.de">Melven.Roehrig-Zoellner@DLR.de</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Michael Marineau <<a href="mailto:michael.marineau@coreos.com">michael.marineau@coreos.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Michael Meeks <<a href="mailto:michael.meeks@suse.com">michael.meeks@suse.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mihai Serban <<a href="mailto:mihai.serban@intel.com">mihai.serban@intel.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mike Frysinger <<a href="mailto:vapier@gentoo.org">vapier@gentoo.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mikhail Kolomeytsev <<a href="mailto:mkolom@yandex-team.ru">mkolom@yandex-team.ru</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Mostyn Bramley-Moore <<a href="mailto:mostyn@antipode.se">mostyn@antipode.se</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Neil Mushell <<a href="mailto:nmushell@bloomberg.net">nmushell@bloomberg.net</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Nick Schultz <<a href="mailto:nick.schultz@intel.com">nick.schultz@intel.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Norbert Lange <<a href="mailto:nolange79@gmail.com">nolange79@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Oded Shimon <<a href="mailto:oded@istraresearch.com">oded@istraresearch.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Orgad Shaneh <<a href="mailto:orgad.shaneh@audiocodes.com">orgad.shaneh@audiocodes.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Orion Poplawski <<a href="mailto:orion@cora.nwra.com">orion@cora.nwra.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Owen Mann <<a href="mailto:owen@mann.org">owen@mann.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Patrick von Reth <<a href="mailto:vonreth@kde.org">vonreth@kde.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Paul Griffith <<a href="mailto:paulg@cse.yorku.ca">paulg@cse.yorku.ca</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Pavel Boldin <<a href="mailto:pboldin@cloudlinux.com">pboldin@cloudlinux.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Per Nordlöw <<a href="mailto:per.nordlow@autoliv.com">per.nordlow@autoliv.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Peter Budai <<a href="mailto:peterbudai@hotmail.com">peterbudai@hotmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Philippe Proulx <<a href="mailto:eeppeliteloop@gmail.com">eeppeliteloop@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Ramiro Polla <<a href="mailto:ramiro.polla@gmail.com">ramiro.polla@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Robin H. Johnson <<a href="mailto:robbat2@gentoo.org">robbat2@gentoo.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Rolf Bjarne Kvinge <<a href="mailto:rolf@xamarin.com">rolf@xamarin.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+RW <<a href="mailto:fbsd06@mlists.homeunix.com">fbsd06@mlists.homeunix.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Ryan Brown <<a href="mailto:ryb@ableton.com">ryb@ableton.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Sam Gross <<a href="mailto:sgross@fb.com">sgross@fb.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Thomas Röfer <<a href="mailto:Thomas.Roefer@dfki.de">Thomas.Roefer@dfki.de</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Timofei Kushnir <<a href="mailto:timophey@rdp.ru">timophey@rdp.ru</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Tim Potter <<a href="mailto:tpot@samba.org">tpot@samba.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Tom Hughes <<a href="mailto:tomtheengineer@gmail.com">tomtheengineer@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Tor Arne Vestbø <<a href="mailto:tor.arne.vestbo@qt.io">tor.arne.vestbo@qt.io</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Vadim Petrochenkov <<a href="mailto:vadim.petrochenkov@gmail.com">vadim.petrochenkov@gmail.com</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Ville Skyttä <<a href="mailto:ville.skytta@iki.fi">ville.skytta@iki.fi</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+William S Fulton <<a href="mailto:wsf@fultondesigns.co.uk">wsf@fultondesigns.co.uk</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Wilson Snyder <<a href="mailto:wsnyder@wsnyder.org">wsnyder@wsnyder.org</a>>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Yiding Jia <<a href="mailto:yiding@fb.com">yiding@fb.com</a>>\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>Thanks!</p></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div id="footnotes"><hr /></div>\r
+<div id="footer">\r
+<div id="footer-text">\r
+Version 3.4.2<br />\r
+Last updated\r
+ 2018-03-25 22:22:46 CEST\r
+</div>\r
+</div>\r
+</body>\r
+</html>\r
+++ /dev/null
-ccache authors
-==============
-
-ccache was originally written by Andrew Tridgell and is currently developed and
-maintained by Joel Rosdahl.
-
-ccache is a collective work with contributions from many people, including:
-
-* Alexey Tourbin <alexey.tourbin@gmail.com>
-* Alfred Landrum <alfred.landrum@riverbed.com>
-* Anders F Björklund <anders.f.bjorklund@gmail.com>
-* Andrea Bittau <a.bittau@cs.ucl.ac.uk>
-* Andreas Huber <andreas.huber@deltaww.com>
-* André Klitzing <aklitzing@gmail.com>
-* Andrew P Boie <andrew.p.boie@intel.com>
-* Andrew Stubbs <ams@codesourcery.com>
-* Andrew Tridgell <tridge@samba.org>
-* Bernhard Bauer <bauerb@chromium.org>
-* Björn Jacke <bj@sernet.de>
-* Chiaki Ishikawa <ishikawa@yk.rim.or.jp>
-* Chris AtLee <catlee@mozilla.com>
-* Clemens Rabe <clemens.rabe@gmail.com>
-* David Givone <david@givone.net>
-* Edward Z. Yang <ezyang@fb.com>
-* Francois Marier <francois@debian.org>
-* Geert Bosch <geert@mongodb.com>
-* Grigory Entin <grigorye@dins.ru>
-* Hongli Lai <hongli@phusion.nl>
-* Ivan Vaigult <i.vaigult@gmail.com>
-* Jiang Jiang <jiangj@opera.com>
-* Joel Rosdahl <joel@rosdahl.net>
-* John Basila <jbasila@checkpoint.com>
-* John Coiner <john.coiner@amd.com>
-* Jon Bernard <jbernard@tuxion.com>
-* Jørgen P. Tjernø <jorgen@valvesoftware.com>
-* Justin Lebar <justin.lebar@gmail.com>
-* Karl Chen <quarl@cs.berkeley.edu>
-* Kona Blend <kona8lend@gmail.com>
-* Kovarththanan Rajaratnam <kovarththanan.rajaratnam@gmail.com>
-* Lalit Chhabra <lchhabra@linuxmail.org>
-* Lars Gustäbel <lars@gustaebel.de>
-* Leanid Chaika <leanid.chaika@gmail.com>
-* Luboš Luňák <l.lunak@centrum.cz>
-* Mark Starovoytov <starovoytov.mark@googlemail.com>
-* Martin Ettl <ettl.martin78@gmail.com>
-* Martin Pool <mbp@sourcefrog.net>
-* Mathias De Maré <mathias.de_mare@nokia.com>
-* Matthias Kretz <kretz@kde.org>
-* Melven Roehrig-Zoellner <Melven.Roehrig-Zoellner@DLR.de>
-* Michael Marineau <michael.marineau@coreos.com>
-* Michael Meeks <michael.meeks@suse.com>
-* Mihai Serban <mihai.serban@intel.com>
-* Mike Frysinger <vapier@gentoo.org>
-* Mikhail Kolomeytsev <mkolom@yandex-team.ru>
-* Mostyn Bramley-Moore <mostyn@antipode.se>
-* Neil Mushell <nmushell@bloomberg.net>
-* Nick Schultz <nick.schultz@intel.com>
-* Norbert Lange <nolange79@gmail.com>
-* Oded Shimon <oded@istraresearch.com>
-* Orgad Shaneh <orgad.shaneh@audiocodes.com>
-* Orion Poplawski <orion@cora.nwra.com>
-* Owen Mann <owen@mann.org>
-* Patrick von Reth <vonreth@kde.org>
-* Paul Griffith <paulg@cse.yorku.ca>
-* Pavel Boldin <pboldin@cloudlinux.com>
-* Per Nordlöw <per.nordlow@autoliv.com>
-* Philippe Proulx <eeppeliteloop@gmail.com>
-* Ramiro Polla <ramiro.polla@gmail.com>
-* Robin H. Johnson <robbat2@gentoo.org>
-* Rolf Bjarne Kvinge <rolf@xamarin.com>
-* RW <fbsd06@mlists.homeunix.com>
-* Ryan Brown <ryb@ableton.com>
-* Sam Gross <sgross@fb.com>
-* Thomas Röfer <Thomas.Roefer@dfki.de>
-* Tim Potter <tpot@samba.org>
-* Tom Hughes <tomtheengineer@gmail.com>
-* Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-* Vadim Petrochenkov <vadim.petrochenkov@gmail.com>
-* Ville Skyttä <ville.skytta@iki.fi>
-* William S Fulton <wsf@fultondesigns.co.uk>
-* Wilson Snyder <wsnyder@wsnyder.org>
-* Yiding Jia <yiding@fb.com>
-
-Thanks!
--- /dev/null
+CCACHE(1)
+=========
+:man source: ccache
+:man version: {revnumber}
+:man manual: ccache Manual
+
+
+Name
+----
+
+ccache - a fast C/C++ compiler cache
+
+
+Synopsis
+--------
+
+[verse]
+*ccache* [_options_]
+*ccache* _compiler_ [_compiler options_]
+_compiler_ [_compiler options_] (via symbolic link)
+
+
+Description
+-----------
+
+ccache is a compiler cache. It speeds up recompilation by caching the result of
+previous compilations and detecting when the same compilation is being done
+again. Supported languages are C, C\+\+, Objective-C and Objective-C++.
+
+ccache has been carefully written to always produce exactly the same compiler
+output that you would get without the cache. The only way you should be able to
+tell that you are using ccache is the speed. Currently known exceptions to this
+goal are listed under <<_caveats,CAVEATS>>. If you ever discover an
+undocumented case where ccache changes the output of your compiler, please let
+us know.
+
+
+Features
+~~~~~~~~
+
+* Keeps statistics on hits/misses.
+* Automatic cache size management.
+* Can cache compilations that generate warnings.
+* Easy installation.
+* Low overhead.
+* Optionally compresses files in the cache to reduce disk space.
+
+
+Limitations
+~~~~~~~~~~~
+
+* Only knows how to cache the compilation of a single
+ C/C\+\+/Objective-C/Objective-C++ file. Other types of compilations
+ (multi-file compilation, linking, etc) will silently fall back to running the
+ real compiler.
+* Only works with GCC and compilers that behave similar enough.
+* Some compiler flags are not supported. If such a flag is detected, ccache
+ will silently fall back to running the real compiler.
+
+
+Run modes
+---------
+
+There are two ways to use ccache. You can either prefix your compilation
+commands with *ccache* or you can let ccache masquerade as the compiler by
+creating a symbolic link (named as the compiler) to ccache. The first method is
+most convenient if you just want to try out ccache or wish to use it for some
+specific projects. The second method is most useful for when you wish to use
+ccache for all your compilations.
+
+To use the first method, just make sure that *ccache* is in your *PATH*.
+
+To use the symlinks method, do something like this:
+
+-------------------------------------------------------------------------------
+cp ccache /usr/local/bin/
+ln -s ccache /usr/local/bin/gcc
+ln -s ccache /usr/local/bin/g++
+ln -s ccache /usr/local/bin/cc
+ln -s ccache /usr/local/bin/c++
+-------------------------------------------------------------------------------
+
+And so forth. This will work as long as the directory with symlinks comes
+before the path to the compiler (which is usually in `/usr/bin`). After
+installing you may wish to run ``which gcc'' to make sure that the correct link
+is being used.
+
+WARNING: The technique of letting ccache masquerade as the compiler works well,
+but currently doesn't interact well with other tools that do the same thing.
+See <<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER
+COMPILER WRAPPERS>>.
+
+WARNING: Do not use a hard link, use a symbolic link. A hard link will cause
+``interesting'' problems.
+
+Options
+-------
+
+These options only apply when you invoke ccache as ``ccache''. When invoked as
+a compiler (via a symlink as described in the previous section), the normal
+compiler options apply and you should refer to the compiler's documentation.
+
+*`-c, --cleanup`*::
+
+ Clean up the cache by removing old cached files until the specified file
+ number and cache size limits are not exceeded. This also recalculates the
+ cache file count and size totals. Normally, there is no need to initiate
+ cleanup manually as ccache keeps the cache below the specified limits at
+ runtime and keeps statistics up to date on each compilation. Forcing a
+ cleanup is mostly useful if you manually modify the cache contents or
+ believe that the cache size statistics may be inaccurate.
+
+*`-C, --clear`*::
+
+ Clear the entire cache, removing all cached files, but keeping the
+ configuration file.
+
+*`-F, --max-files`*=_N_::
+
+ Set the maximum number of files allowed in the cache. Use 0 for no limit.
+ The value is stored in a configuration file in the cache directory and
+ applies to all future compilations.
+
+*`-h, --help`*::
+
+ Print an options summary page.
+
+*`-M, --max-size`*=_SIZE_::
+
+ Set the maximum size of the files stored in the cache. _SIZE_ should be a
+ number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or
+ Ti (binary). The default suffix is G. Use 0 for no limit. The value is
+ stored in a configuration file in the cache directory and applies to all
+ future compilations.
+
+*`-o, --set-config`*=_KEY=VALUE_::
+
+ Set configuration _KEY_ to _VALUE_. See <<_configuration,CONFIGURATION>>
+ for more information.
+
+*`-p, --print-config`*::
+
+ Print current configuration options and from where they originate
+ (environment variable, configuration file or compile-time default).
+
+*`-s, --show-stats`*::
+
+ Print the current statistics summary for the cache.
+
+*`-V, --version`*::
+
+ Print version and copyright information.
+
+*`-z, --zero-stats`*::
+
+ Zero the cache statistics (but not the configuration options).
+
+
+Extra options
+-------------
+
+When run as a compiler, ccache usually just takes the same command line options
+as the compiler you are using. The only exception to this is the option
+*--ccache-skip*. That option can be used to tell ccache to avoid interpreting
+the next option in any way and to pass it along to the compiler as-is.
+
+NOTE: *--ccache-skip* currently only tells ccache not to interpret the next
+option as a special compiler option -- the option will still be included in the
+direct mode hash.
+
+The reason this can be important is that ccache does need to parse the command
+line and determine what is an input filename and what is a compiler option, as
+it needs the input filename to determine the name of the resulting object file
+(among other things). The heuristic ccache uses when parsing the command line
+is that any argument that exists as a file is treated as an input file name. By
+using *--ccache-skip* you can force an option to not be treated as an input
+file name and instead be passed along to the compiler as a command line option.
+
+Another case where *--ccache-skip* can be useful is if ccache interprets an
+option specially but shouldn't, since the option has another meaning for your
+compiler than what ccache thinks.
+
+
+Configuration
+-------------
+
+ccache's default behavior can be overridden by configuration file settings,
+which in turn can be overridden by environment variables with names starting
+with *CCACHE_*. ccache normally reads configuration from two files: first a
+system-level configuration file and secondly a cache-specific configuration
+file. The priority of configuration settings is as follows (where 1 is
+highest):
+
+1. Environment variables.
+2. The cache-specific configuration file *_<ccachedir>_/ccache.conf* (typically
+ *$HOME/.ccache/ccache.conf*).
+3. The system-wide configuration file *_<sysconfdir>_/ccache.conf* (typically
+ */etc/ccache.conf* or */usr/local/etc/ccache.conf*).
+4. Compile-time defaults.
+
+As a special case, if the environment variable *CCACHE_CONFIGPATH* is set,
+ccache reads configuration from the specified path instead of the default
+paths.
+
+
+Configuration file syntax
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Configuration files are in a simple ``key = value'' format, one setting per
+line. Lines starting with a hash sign are comments. Blank lines are ignored, as
+is whitespace surrounding keys and values. Example:
+
+-------------------------------------------------------------------------------
+# Set maximum cache size to 10 GB:
+max_size = 10G
+-------------------------------------------------------------------------------
+
+Boolean values
+~~~~~~~~~~~~~~
+
+Some settings are boolean values (i.e. truth values). In a configuration file,
+such values must be set to the string *true* or *false*. For the corresponding
+environment variables, the semantics are a bit different: a set environment
+variable means ``true'' (even if set to the empty string), the following
+case-insensitive negative values are considered an error (rather than
+surprising the user): *0*, *false*, *disable* and *no*, and an unset
+environment variable means ``false''. Each boolean environment variable also
+has a negated form starting with *CCACHE_NO*. For example, *CCACHE_COMPRESS*
+can be set to force compression and *CCACHE_NOCOMPRESS* can be set to force no
+compression.
+
+
+Configuration settings
+~~~~~~~~~~~~~~~~~~~~~~
+
+Below is a list of available configuration settings. The corresponding
+environment variable name is indicated in parentheses after each configuration
+setting key.
+
+*base_dir* (*CCACHE_BASEDIR*)::
+
+ This setting should be an absolute path to a directory. ccache then
+ rewrites absolute paths into relative paths before computing the hash that
+ identifies the compilation, but only for paths under the specified
+ directory. If set to the empty string (which is the default), no rewriting
+ is done. A typical path to use as the base directory is your home directory
+ or another directory that is a parent of your build directories. Don't use
+ `/` as the base directory since that will make ccache also rewrite paths to
+ system header files, which doesn't gain anything.
++
+See also the discussion under <<_compiling_in_different_directories,COMPILING
+IN DIFFERENT DIRECTORIES>>.
+
+*cache_dir* (*CCACHE_DIR*)::
+
+ This setting specifies where ccache will keep its cached compiler outputs.
+ It will only take effect if set in the system-wide configuration file or as
+ an environment variable. The default is *$HOME/.ccache*.
+
+*cache_dir_levels* (*CCACHE_NLEVELS*)::
+
+ This setting allows you to choose the number of directory levels in the
+ cache directory. The default is 2. The minimum is 1 and the maximum is 8.
+
+*compiler* (*CCACHE_CC*)::
+
+ This setting can be used to force the name of the compiler to use. If set
+ to the empty string (which is the default), ccache works it out from the
+ command line.
+
+*compiler_check* (*CCACHE_COMPILERCHECK*)::
+
+ By default, ccache includes the modification time (``mtime'') and size of
+ the compiler in the hash to ensure that results retrieved from the cache
+ are accurate. This setting can be used to select another strategy. Possible
+ values are:
++
+--
+*content*::
+ Hash the content of the compiler binary. This makes ccache very slightly
+ slower compared to the *mtime* setting, but makes it cope better with
+ compiler upgrades during a build bootstrapping process.
+*mtime*::
+ Hash the compiler's mtime and size, which is fast. This is the default.
+*none*::
+ Don't hash anything. This may be good for situations where you can safely
+ use the cached results even though the compiler's mtime or size has changed
+ (e.g. if the compiler is built as part of your build system and the
+ compiler's source has not changed, or if the compiler only has changes that
+ don't affect code generation). You should only use the *none* setting if
+ you know what you are doing.
+*string:value*::
+ Use *value* as the string to calculate hash from. This can be the compiler
+ revision number you retrieved earlier and set here via environment variable.
+_a command string_::
+ Hash the standard output and standard error output of the specified
+ command. The string will be split on whitespace to find out the command and
+ arguments to run. No other interpretation of the command string will be
+ done, except that the special word *%compiler%* will be replaced with the
+ path to the compiler. Several commands can be specified with semicolon as
+ separator. Examples:
++
+--
+
+----
+%compiler% -v
+----
+
+----
+%compiler% -dumpmachine; %compiler% -dumpversion
+----
+
+You should make sure that the specified command is as fast as possible since it
+will be run once for each ccache invocation.
+
+Identifying the compiler using a command is useful if you want to avoid cache
+misses when the compiler has been rebuilt but not changed.
+
+Another case is when the compiler (as seen by ccache) actually isn't the real
+compiler but another compiler wrapper -- in that case, the default *mtime*
+method will hash the mtime and size of the other compiler wrapper, which means
+that ccache won't be able to detect a compiler upgrade. Using a suitable
+command to identify the compiler is thus safer, but it's also slower, so you
+should consider continue using the *mtime* method in combination with
+the *prefix_command* setting if possible. See
+<<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER COMPILER
+WRAPPERS>>.
+--
+--
+
+*compression* (*CCACHE_COMPRESS* or *CCACHE_NOCOMPRESS*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will compress object files and other compiler output it
+ puts in the cache. However, this setting has no effect on how files are
+ retrieved from the cache; compressed and uncompressed results will still be
+ usable regardless of this setting. The default is false.
+
+*compression_level* (*CCACHE_COMPRESSLEVEL*)::
+
+ This setting determines the level at which ccache will compress object
+ files. It only has effect if *compression* is enabled. The value defaults
+ to 6, and must be no lower than 1 (fastest, worst compression) and no
+ higher than 9 (slowest, best compression).
+
+*cpp_extension* (*CCACHE_EXTENSION*)::
+
+ This setting can be used to force a certain extension for the intermediate
+ preprocessed file. The default is to automatically determine the extension
+ to use for intermediate preprocessor files based on the type of file being
+ compiled, but that sometimes doesn't work. For example, when using the
+ ``aCC'' compiler on HP-UX, set the cpp extension to *i*.
+
+*direct_mode* (*CCACHE_DIRECT* or *CCACHE_NODIRECT*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, the direct mode will be used. The default is true. See
+ <<_the_direct_mode,THE DIRECT MODE>>.
+
+*disable* (*CCACHE_DISABLE* or *CCACHE_NODISABLE*, see <<_boolean_values,Boolean values>> above)::
+
+ When true, ccache will just call the real compiler, bypassing the cache
+ completely. The default is false.
+
+*extra_files_to_hash* (*CCACHE_EXTRAFILES*)::
+
+ This setting is a list of paths to files that ccache will include in the
+ the hash sum that identifies the build. The list separator is semicolon on
+ Windows systems and colon on other systems.
+
+*hard_link* (*CCACHE_HARDLINK* or *CCACHE_NOHARDLINK*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will attempt to use hard links from the cache directory
+ when creating the compiler output rather than using a file copy. Hard links
+ are never made for compressed cache files. This means that you should not
+ enable compression if you want to use hard links. The default is false.
++
+WARNING: Do not enable this option unless you are aware of the consequences.
+Using hard links may be slightly faster in some situations, but there are
+several pitfalls since the resulting object file will share i-node with the
+cached object file:
++
+1. If the resulting object file is modified in any way, the cached object file
+ will be modified as well. For instance, if you run `strip object.o` or `echo
+ >object.o`, you will corrupt the cache.
+2. Programs that rely on modification times (like ``make'') can be confused
+ since ccache updates the cached files' modification times as part of the
+ automatic cache size management. This will affect object files in the build
+ tree as well, which can retrigger the linking step even though nothing
+ really has changed.
+
+*hash_dir* (*CCACHE_HASHDIR* or *CCACHE_NOHASHDIR*, see <<_boolean_values,Boolean values>> above)::
+
+ If true (which is the default), ccache will include the current working
+ directory (CWD) in the hash that is used to distinguish two compilations
+ when generating debug info (compiler option *-g* with variations).
+ Exception: The CWD will not be included in the hash if *base_dir* is set
+ (and matches the CWD) and the compiler option *-fdebug-prefix-map* is used.
+ See also the discussion under
+ <<_compiling_in_different_directories,COMPILING IN DIFFERENT DIRECTORIES>>.
++
+The reason for including the CWD in the hash by default is to prevent a problem
+with the storage of the current working directory in the debug info of an
+object file, which can lead ccache to return a cached object file that has the
+working directory in the debug info set incorrectly.
++
+You can disable this setting to get cache hits when compiling the same source
+code in different directories if you don't mind that CWD in the debug info
+might be incorrect.
+
+*ignore_headers_in_manifest* (*CCACHE_IGNOREHEADERS*)::
+
+ This setting is a list of paths to files (or directories with headers) that
+ ccache will *not* include in the manifest list that makes up the direct
+ mode. Note that this can cause stale cache hits if those headers do indeed
+ change. The list separator is semicolon on Windows systems and colon on
+ other systems.
+
+*keep_comments_cpp* (*CCACHE_COMMENTS* or *CCACHE_NOCOMMENTS*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will not discard the comments before hashing preprocessor
+ output. This can be used to check documentation with *-Wdocumentation*.
+
+*limit_multiple* (*CCACHE_LIMIT_MULTIPLE*)::
+
+ Sets the limit when cleaning up. Files are deleted (in LRU order) until the
+ levels are below the limit. The default is 0.8 (= 80%). See
+ <<_automatic_cleanup,AUTOMATIC CLEANUP>> for more information.
+
+*log_file* (*CCACHE_LOGFILE*)::
+
+ If set to a file path, ccache will write information on what it is doing to
+ the specified file. This is useful for tracking down problems.
+
+*max_files* (*CCACHE_MAXFILES*)::
+
+ This option specifies the maximum number of files to keep in the cache. Use
+ 0 for no limit (which is the default). See also
+ <<_cache_size_management,CACHE SIZE MANAGEMENT>>.
+
+*max_size* (*CCACHE_MAXSIZE*)::
+
+ This option specifies the maximum size of the cache. Use 0 for no limit.
+ The default value is 5G. Available suffixes: k, M, G, T (decimal) and Ki,
+ Mi, Gi, Ti (binary). The default suffix is G. See also
+ <<_cache_size_management,CACHE SIZE MANAGEMENT>>.
+
+*path* (*CCACHE_PATH*)::
+
+ If set, ccache will search directories in this list when looking for the
+ real compiler. The list separator is semicolon on Windows systems and colon
+ on other systems. If not set, ccache will look for the first executable
+ matching the compiler name in the normal *PATH* that isn't a symbolic link
+ to ccache itself.
+
+*prefix_command* (*CCACHE_PREFIX*)::
+
+ This option adds a list of prefixes (separated by space) to the command
+ line that ccache uses when invoking the compiler. See also
+ <<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER
+ COMPILER WRAPPERS>>.
+
+*prefix_command_cpp* (*CCACHE_PREFIX_CPP*)::
+
+ This option adds a list of prefixes (separated by space) to the command
+ line that ccache uses when invoking the preprocessor.
+
+*read_only* (*CCACHE_READONLY* or *CCACHE_NOREADONLY*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will attempt to use existing cached object files, but it
+ will not to try to add anything new to the cache. If you are using this
+ because your ccache directory is read-only, then you need to set
+ *temporary_dir* as otherwise ccache will fail to create temporary files.
+
+*read_only_direct* (*CCACHE_READONLY_DIRECT* or *CCACHE_NOREADONLY_DIRECT*, see <<_boolean_values,Boolean values>> above)::
+
+ Just like *read_only* except that ccache will only try to retrieve results
+ from the cache using the direct mode, not the preprocessor mode. See
+ documentation for *read_only* regarding using a read-only ccache directory.
+
+*recache* (*CCACHE_RECACHE* or *CCACHE_NORECACHE*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will not use any previously stored result. New results will
+ still be cached, possibly overwriting any pre-existing results.
+
+*run_second_cpp* (*CCACHE_CPP2* or *CCACHE_NOCPP2*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will first run the preprocessor to preprocess the source
+ code (see <<_the_preprocessor_mode,THE PREPROCESSOR MODE>>) and then on a
+ cache miss run the compiler on the source code to get hold of the object
+ file. This is the default.
++
+If false, ccache will first run preprocessor to preprocess the source code and
+then on a cache miss run the compiler on the _preprocessed source code_ instead
+of the original source code. This makes cache misses slightly faster since the
+source code only has to be preprocessed once. The downside is that some
+compilers won't produce the same result (for instance diagnostics warnings)
+when compiling preprocessed source code.
++
+A solution to the above mentioned downside is to set *run_second_cpp* to false
+and pass *-fdirectives-only* (for GCC) or *-frewrite-includes* (for Clang) to
+the compiler. This will cause the compiler to leave the macros and other
+preprocessor information, and only process the *#include* directives. When run
+in this way, the preprocessor arguments will be passed to the compiler since it
+still has to do _some_ preprocessing (like macros).
+
+*sloppiness* (*CCACHE_SLOPPINESS*)::
+
+ By default, ccache tries to give as few false cache hits as possible.
+ However, in certain situations it's possible that you know things that
+ ccache can't take for granted. This setting makes it possible to tell
+ ccache to relax some checks in order to increase the hit rate. The value
+ should be a comma-separated string with options. Available options are:
++
+--
+*file_macro*::
+ Ignore `__FILE__` being present in the source.
+*file_stat_matches*::
+ ccache normally examines a file's contents to determine whether it matches
+ the cached version. With this option set, ccache will consider a file as
+ matching its cached version if the mtimes and ctimes match.
+*include_file_ctime*::
+ By default, ccache also will not cache a file if it includes a header whose
+ ctime is too new. This option disables that check.
+*include_file_mtime*::
+ By default, ccache will not cache a file if it includes a header whose
+ mtime is too new. This option disables that check.
+*no_system_headers*::
+ By default, ccache will also include all system headers in the manifest.
+ With this option set, ccache will only include system headers in the hash
+ but not add the system header files to the list of include files.
+*pch_defines*::
+ Be sloppy about **#define**s when precompiling a header file. See
+ <<_precompiled_headers,PRECOMPILED HEADERS>> for more information.
+*time_macros*::
+ Ignore `__DATE__` and `__TIME__` being present in the source code.
+--
++
+See the discussion under <<_troubleshooting,TROUBLESHOOTING>> for more
+information.
+
+*stats* (*CCACHE_STATS* or *CCACHE_NOSTATS*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will update the statistics counters on each compilation.
+ The default is true.
+
+*temporary_dir* (*CCACHE_TEMPDIR*)::
+
+ This setting specifies where ccache will put temporary files. The default
+ is *<cache_dir>/tmp*.
++
+NOTE: In previous versions of ccache, *CCACHE_TEMPDIR* had to be on the same
+ filesystem as the *CCACHE_DIR* path, but this requirement has been
+ relaxed.)
+
+*umask* (*CCACHE_UMASK*)::
+
+ This setting specifies the umask for ccache and all child processes (such
+ as the compiler). This is mostly useful when you wish to share your cache
+ with other users. Note that this also affects the file permissions set on
+ the object files created from your compilations.
+
+*unify* (*CCACHE_UNIFY* or *CCACHE_NOUNIFY*, see <<_boolean_values,Boolean values>> above)::
+
+ If true, ccache will use a C/C++ unifier when hashing the preprocessor
+ output if the *-g* option is not used. The unifier is slower than a normal
+ hash, so setting this environment variable loses a little bit of speed, but
+ it means that ccache can take advantage of not recompiling when the changes
+ to the source code consist of reformatting only. Note that enabling the
+ unifier changes the hash, so cached compilations produced when the unifier
+ is enabled cannot be reused when the unifier is disabled, and vice versa.
+ Enabling the unifier may result in incorrect line number information in
+ compiler warning messages and expansions of the `__LINE__` macro.
+
+
+Cache size management
+---------------------
+
+By default, ccache has a 5 GB limit on the total size of files in the cache and
+no limit on the number of files. You can set different limits using the
+*-M*/*--max-size* and *-F*/*--max-files* options. Use *ccache -s/--show-stats*
+to see the cache size and the currently configured limits (in addition to other
+various statistics).
+
+Cleanup can be triggered in two different ways: automatic and manual.
+
+
+Automatic cleanup
+~~~~~~~~~~~~~~~~~
+
+ccache maintains counters for various statistics about the cache, including the
+size and number of all cached files. In order to improve performance and reduce
+issues with concurrent ccache invocations, there is one statistics file for
+each of the sixteen subdirectories in the cache.
+
+After a new compilation result has been written to the cache, ccache will
+update the size and file number statistics for the subdirectory (one of
+sixteen) to which the result was written. Then, if the size counter for said
+subdirectory is greater than *max_size / 16* or the file number counter is
+greater than *max_files / 16*, automatic cleanup is triggered.
+
+When automatic cleanup is triggered for a subdirectory in the cache, ccache
+will:
+
+1. Count all files in the subdirectory and compute their aggregated size.
+2. Remove files in LRU (least recently used) order until the size is at most
+ *limit_multiple * max_size / 16* and the number of files is at most
+ *limit_multiple * max_files / 16*, where *limit_multiple*, *max_size* and
+ *max_files* are configuration settings.
+3. Set the size and file number counters to match the files that were kept.
+
+The reason for removing more files than just those needed to not exceed the max
+limits is that a cleanup is a fairly slow operation, so it would not be a good
+idea to trigger it often, like after each cache miss.
+
+
+Manual cleanup
+~~~~~~~~~~~~~~
+
+You can run *ccache -c/--cleanup* to force cleanup of the whole cache, i.e. all
+of the sixteen subdirectories. This will recalculate the statistics counters
+and make sure that the *max_size* and *max_files* settings are not exceeded.
+Note that *limit_multiple* is not taken into account for manual cleanup.
+
+
+Cache compression
+-----------------
+
+ccache can optionally compress all files it puts into the cache using the
+compression library zlib. While this may involve a tiny performance slowdown,
+it increases the number of files that fit in the cache. You can turn on
+compression with the *compression* configuration setting and you can also tweak
+the compression level with *compression_level*.
+
+
+Cache statistics
+----------------
+
+*ccache -s/--show-stats* can show the following statistics:
+
+[options="header",cols="30%,70%"]
+|==============================================================================
+|Name | Description
+| autoconf compile/link |
+Uncachable compilation or linking by an autoconf test.
+
+| bad compiler arguments |
+Malformed compiler argument, e.g. missing a value for an option that requires
+an argument or failure to read a file specified by an option argument.
+
+| cache file missing |
+A file was unexpectedly missing from the cache. This only happens in rare
+situations, e.g. if one ccache instance is about to get a file from the cache
+while another instance removed the file as part of cache cleanup.
+
+| cache hit (direct) |
+A result was successfully found using <<_the_direct_mode,the direct mode>>.
+
+| cache hit (preprocessed) |
+A result was successfully found using <<_the_preprocessor_mode,the preprocessor
+mode>>.
+
+| cache miss |
+No result was found.
+
+| cache size |
+Current size of the cache.
+
+| called for link |
+The compiler was called for linking, not compiling.
+
+| called for preprocessing |
+The compiler was called for preprocessing, not compiling.
+
+| can't use precompiled header |
+Preconditions for using <<_precompiled_headers,precompiled headers>> were not
+fulfilled.
+
+| ccache internal error |
+Unexpected failure, e.g. due to problems reading/writing the cache.
+
+| cleanups performed |
+Number of cleanups performed, either implicitly due to the cache size limit
+being reached or due to explicit *ccache -c/--cleanup* calls.
+
+| compile failed |
+The compilation failed. No result stored in the cache.
+
+| compiler check failed |
+A compiler check program specified by *compiler_check* (*CCACHE_COMPILERCHECK*)
+failed.
+
+| compiler produced empty output |
+The compiler's output file (typically an object file) was empty after
+compilation.
+
+| compiler produced no output |
+The compiler's output file (typically an object file) was missing after
+compilation.
+
+| compiler produced stdout |
+The compiler wrote data to standard output. This is something that compilers
+normally never do, so ccache is not designed to store such output in the cache.
+
+| couldn't find the compiler |
+The compiler to execute could not be found.
+
+| error hashing extra file |
+Failure reading a file specified by *extra_files_to_hash*
+(*CCACHE_EXTRAFILES*).
+
+| files in cache |
+Current number of files in the cache.
+
+| multiple source files |
+The compiler was called to compile multiple source files in one go. This is not
+supported by ccache.
+
+| no input file |
+No input file was specified to the compiler.
+
+| output to a non-regular file |
+The output path specified with *-o* is not a file (e.g. a directory or a device
+node).
+
+| output to stdout |
+The compiler was instructed to write its output to standard output using *-o
+-*. This is not supported by ccache.
+
+| preprocessor error |
+Preprocessing the source code using the compiler's *-E* option failed.
+
+| unsupported code directive |
+Code like the assembler *.incbin* directive was found. This is not supported
+by ccache.
+
+| unsupported compiler option |
+A compiler option not supported by ccache was found.
+
+| unsupported source language |
+A source language e.g. specified with *-x* was unsupported by ccache.
+
+|==============================================================================
+
+
+How ccache works
+----------------
+
+The basic idea is to detect when you are compiling exactly the same code a
+second time and reuse the previously produced output. The detection is done by
+hashing different kinds of information that should be unique for the
+compilation and then using the hash sum to identify the cached output. ccache
+uses MD4, a very fast cryptographic hash algorithm, for the hashing. (MD4 is
+nowadays too weak to be useful in cryptographic contexts, but it should be safe
+enough to be used to identify recompilations.) On a cache hit, ccache is able
+to supply all of the correct compiler outputs (including all warnings,
+dependency file, etc) from the cache.
+
+ccache has two ways of doing the detection:
+
+* the *direct mode*, where ccache hashes the source code and include files
+ directly
+* the *preprocessor mode*, where ccache runs the preprocessor on the source
+ code and hashes the result
+
+The direct mode is generally faster since running the preprocessor has some
+overhead.
+
+
+Common hashed information
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For both modes, the following information is included in the hash:
+
+* the extension used by the compiler for a file with preprocessor output
+ (normally *.i* for C code and *.ii* for C++ code)
+* the compiler's size and modification time (or other compiler-specific
+ information specified by the *compiler_check* setting)
+* the name of the compiler
+* the current directory (if the *hash_dir* setting is enabled)
+* contents of files specified by the *extra_files_to_hash* setting (if any)
+
+
+The direct mode
+~~~~~~~~~~~~~~~
+
+In the direct mode, the hash is formed of the common information and:
+
+* the input source file
+* the command line options
+
+Based on the hash, a data structure called ``manifest'' is looked up in the
+cache. The manifest contains:
+
+* references to cached compilation results (object file, dependency file, etc)
+ that were produced by previous compilations that matched the hash
+* paths to the include files that were read at the time the compilation results
+ were stored in the cache
+* hash sums of the include files at the time the compilation results were
+ stored in the cache
+
+The current contents of the include files are then hashed and compared to the
+information in the manifest. If there is a match, ccache knows the result of
+the compilation. If there is no match, ccache falls back to running the
+preprocessor. The output from the preprocessor is parsed to find the include
+files that were read. The paths and hash sums of those include files are then
+stored in the manifest along with information about the produced compilation
+result.
+
+There is a catch with the direct mode: header files that were used by the
+compiler are recorded, but header files that were *not* used, but would have
+been used if they existed, are not. So, when ccache checks if a result can be
+taken from the cache, it currently can't check if the existence of a new header
+file should invalidate the result. In practice, the direct mode is safe to use
+in the absolute majority of cases.
+
+The direct mode will be disabled if any of the following holds:
+
+* the configuration setting *direct_mode* is false
+* a modification time of one of the include files is too new (needed to avoid a
+ race condition)
+* a compiler option not supported by the direct mode is used:
+** a *-Wp,_X_* compiler option other than *-Wp,-MD,_path_*,
+ *-Wp,-MMD,_path_* and *-Wp,-D_define_*
+** *-Xpreprocessor*
+* the string `__TIME__` is present in the source code
+
+
+The preprocessor mode
+~~~~~~~~~~~~~~~~~~~~~
+
+In the preprocessor mode, the hash is formed of the common information and:
+
+* the preprocessor output from running the compiler with *-E*
+* the command line options except options that affect include files (*-I*,
+ *-include*, *-D*, etc; the theory is that these options will change the
+ preprocessor output if they have any effect at all)
+* any standard error output generated by the preprocessor
+
+Based on the hash, the cached compilation result can be looked up directly in
+the cache.
+
+
+Compiling in different directories
+----------------------------------
+
+Some information included in the hash that identifies a unique compilation can
+contain absolute paths:
+
+* The preprocessed source code may contain absolute paths to include files if
+ the compiler option *-g* is used or if absolute paths are given to *-I* and
+ similar compiler options.
+* Paths specified by compiler options (such as *-I*, *-MF*, etc) on the command
+ line may be absolute.
+* The source code file path may be absolute, and that path may substituted for
+ `__FILE__` macros in the source code or included in warnings emitted to
+ standard error by the preprocessor.
+
+This means that if you compile the same code in different locations, you can't
+share compilation results between the different build directories since you get
+cache misses because of the absolute build directory paths that are part of the
+hash.
+
+Here's what can be done to enable cache hits between different build
+directories:
+
+* If you build with *-g* (or similar) to add debug information to the object
+ file, you must either:
++
+--
+** use the *-fdebug-prefix-map=_old_=_new_* option for relocating debug info to
+ a common prefix (e.g. *-fdebug-prefix-map=$PWD=.*); or
+** set *hash_dir = false*.
+--
+* If you use absolute paths anywhere on the command line (e.g. the source code
+ file path or an argument to compiler options like *-I* and *-MF*), you must
+ to set *base_dir* to an absolute path to a ``base directory''. ccache will
+ then rewrite absolute paths under that directory to relative before computing
+ the hash.
+
+
+Precompiled headers
+-------------------
+
+ccache has support for GCC's precompiled headers. However, you have to do some
+things to make it work properly:
+
+* You must set *sloppiness* to *pch_defines,time_macros*. The reason is that
+ ccache can't tell whether `__TIME__` or `__DATE__` is used when using a
+ precompiled header. Further, it can't detect changes in **#define**s in the
+ source code because of how preprocessing works in combination with
+ precompiled headers.
+* You must either:
++
+--
+** use the *-include* compiler option to include the precompiled header
+ (i.e., don't use *#include* in the source code to include the header); or
+** (for the Clang compiler) use the *-include-pch* compiler option to include
+ the PCH file generated from the precompiled header; or
+** add the *-fpch-preprocess* compiler option when compiling.
+
+If you don't do this, either the non-precompiled version of the header file
+will be used (if available) or ccache will fall back to running the real
+compiler and increase the statistics counter ``preprocessor error'' (if the
+non-precompiled header file is not available).
+--
+
+
+Sharing a cache
+---------------
+
+A group of developers can increase the cache hit rate by sharing a cache
+directory. To share a cache without unpleasant side effects, the following
+conditions should to be met:
+
+* Use the same cache directory.
+* Make sure that the configuration setting *hard_link* is false (which is the
+ default).
+* Make sure that all users are in the same group.
+* Set the configuration setting *umask* to 002. This ensures that cached files
+ are accessible to everyone in the group.
+* Make sure that all users have write permission in the entire cache directory
+ (and that you trust all users of the shared cache).
+* Make sure that the setgid bit is set on all directories in the cache. This
+ tells the filesystem to inherit group ownership for new directories. The
+ following command might be useful for this:
++
+--
+----
+find $CCACHE_DIR -type d | xargs chmod g+s
+----
+--
+
+The reason to avoid the hard link mode is that the hard links cause unwanted
+side effects, as all links to a cached file share the file's modification
+timestamp. This results in false dependencies to be triggered by
+timestamp-based build systems whenever another user links to an existing file.
+Typically, users will see that their libraries and binaries are relinked
+without reason.
+
+You may also want to make sure that a base directory is set appropriately, as
+discussed in a previous section.
+
+
+Sharing a cache on NFS
+----------------------
+
+It is possible to put the cache directory on an NFS filesystem (or similar
+filesystems), but keep in mind that:
+
+* Having the cache on NFS may slow down compilation. Make sure to do some
+ benchmarking to see if it's worth it.
+* ccache hasn't been tested very thoroughly on NFS.
+
+A tip is to set *temporary_dir* to a directory on the local host to avoid NFS
+traffic for temporary files.
+
+
+Using ccache with other compiler wrappers
+-----------------------------------------
+
+The recommended way of combining ccache with another compiler wrapper (such as
+``distcc'') is by letting ccache execute the compiler wrapper. This is
+accomplished by defining the configuration setting *prefix_command*, for
+example by setting the environment variable *CCACHE_PREFIX* to the name of the
+wrapper (e.g. *distcc*). ccache will then prefix the command line with the
+specified command when running the compiler. To specify several prefix
+commands, set *prefix_command* to a colon-separated list of commands.
+
+Unless you set *compiler_check* to a suitable command (see the description of
+that configuration option), it is not recommended to use the form *ccache
+anotherwrapper compiler args* as the compilation command. It's also not
+recommended to use the masquerading technique for the other compiler wrapper.
+The reason is that by default, ccache will in both cases hash the mtime and
+size of the other wrapper instead of the real compiler, which means that:
+
+* Compiler upgrades will not be detected properly.
+* The cached results will not be shared between compilations with and without
+ the other wrapper.
+
+Another minor thing is that if *prefix_command* is used, ccache will not invoke
+the other wrapper when running the preprocessor, which increases performance.
+You can use the *prefix_command_cpp* configuration setting if you also want to
+invoke the other wrapper when doing preprocessing (normally by adding *-E*).
+
+
+Caveats
+-------
+
+* The direct mode fails to pick up new header files in some rare scenarios. See
+ <<_the_direct_mode,THE DIRECT MODE>> above.
+* When run via ccache, warning messages produced by GCC 4.9 and newer will only
+ be colored when the environment variable *GCC_COLORS* is set. An alternative
+ to setting *GCC_COLORS* is to pass `-fdiagnostics-color` explicitly when
+ compiling (but then color codes will also be present when redirecting stderr
+ to a file).
+* If ccache guesses that the compiler may emit colored warnings, then a
+ compilation with stderr referring to a TTY will be considered different from
+ a compilation with a redirected stderr, thus not sharing cache entries. This
+ happens for clang by default and for GCC when *GCC_COLORS* is set as
+ mentioned above. If you want to share cache hits, you can pass
+ `-f[no-]diagnostics-color` (GCC) or `-f[no-]color-diagnostics` (clang)
+ explicitly when compiling (but then color codes will be either on or off for
+ both the TTY and the redirected case).
+
+
+Troubleshooting
+---------------
+
+General
+~~~~~~~
+
+A general tip for getting information about what ccache is doing is to enable
+debug logging by setting *log_file*. The log contains executed commands,
+important decisions that ccache makes, read and written files, etc. Another way
+of keeping track of what is happening is to check the output of *ccache -s*.
+
+
+Performance
+~~~~~~~~~~~
+
+ccache has been written to perform well out of the box, but sometimes you may
+have to do some adjustments of how you use the compiler and ccache in order to
+improve performance.
+
+Since ccache works best when I/O is fast, put the cache directory on a fast
+storage device if possible. Having lots of free memory so that files in the
+cache directory stay in the disk cache is also preferable.
+
+A good way of monitoring how well ccache works is to run *ccache -s* before and
+after your build and then compare the statistics counters. Here are some common
+problems and what may be done to increase the hit rate:
+
+* If ``cache hit (preprocessed)'' has been incremented instead of ``cache hit
+ (direct)'', ccache has fallen back to preprocessor mode, which is generally
+ slower. Some possible reasons are:
+** The source code has been modified in such a way that the preprocessor output
+ is not affected.
+** Compiler arguments that are hashed in the direct mode but not in the
+ preprocessor mode have changed (*-I*, *-include*, *-D*, etc) and they didn't
+ affect the preprocessor output.
+** The compiler option *-Xpreprocessor* or *-Wp,_X_* (except *-Wp,-MD,_path_*,
+ *-Wp,-MMD,_path_*, and *-Wp,-D_define_*) is used.
+** This was the first compilation with a new value of the base directory
+ setting.
+** A modification time of one of the include files is too new (created the same
+ second as the compilation is being done). This check is made to avoid a race
+ condition. To fix this, create the include file earlier in the build
+ process, if possible, or set *sloppiness* to *include_file_mtime* if you are
+ willing to take the risk. (The race condition consists of these events: the
+ preprocessor is run; an include file is modified by someone; the new include
+ file is hashed by ccache; the real compiler is run on the preprocessor's
+ output, which contains data from the old header file; the wrong object file
+ is stored in the cache.)
+** The `__TIME__` preprocessor macro is (potentially) being used. ccache turns
+ off direct mode if `__TIME__` is present in the source code. This is done as
+ a safety measure since the string indicates that a `__TIME__` macro _may_
+ affect the output. (To be sure, ccache would have to run the preprocessor,
+ but the sole point of the direct mode is to avoid that.) If you know that
+ `__TIME__` isn't used in practise, or don't care if ccache produces objects
+ where `__TIME__` is expanded to something in the past, you can set
+ *sloppiness* to *time_macros*.
+** The `__DATE__` preprocessor macro is (potentially) being used and the date
+ has changed. This is similar to how `__TIME__` is handled. If `__DATE__` is
+ present in the source code, ccache hashes the current date in order to be
+ able to produce the correct object file if the `__DATE__` macro affects the
+ output. If you know that `__DATE__` isn't used in practise, or don't care if
+ ccache produces objects where `__DATE__` is expanded to something in the
+ past, you can set *sloppiness* to *time_macros*.
+** The `__FILE__` preprocessor macro is (potentially) being used and the file
+ path has changed. If `__FILE__` is present in the source code, ccache hashes
+ the current input file path in order to be able to produce the correct
+ object file if the `__FILE__` macro affects the output. If you know that
+ `__FILE__` isn't used in practise, or don't care if ccache produces objects
+ where `__FILE__` is expanded to the wrong path, you can set *sloppiness* to
+ *file_macro*.
+* If ``cache miss'' has been incremented even though the same code has been
+ compiled and cached before, ccache has either detected that something has
+ changed anyway or a cleanup has been performed (either explicitly or
+ implicitly when a cache limit has been reached). Some perhaps unobvious
+ things that may result in a cache miss are usage of `__TIME__` or
+ `__DATE__` macros, or use of automatically generated code that contains a
+ timestamp, build counter or other volatile information.
+* If ``multiple source files'' has been incremented, it's an indication that
+ the compiler has been invoked on several source code files at once. ccache
+ doesn't support that. Compile the source code files separately if possible.
+* If ``unsupported compiler option'' has been incremented, enable debug logging
+ and check which option was rejected.
+* If ``preprocessor error'' has been incremented, one possible reason is that
+ precompiled headers are being used. See <<_precompiled_headers,PRECOMPILED
+ HEADERS>> for how to remedy this.
+* If ``can't use precompiled header'' has been incremented, see
+ <<_precompiled_headers,PRECOMPILED HEADERS>>.
+
+
+Corrupt object files
+~~~~~~~~~~~~~~~~~~~~
+
+It should be noted that ccache is susceptible to general storage problems. If a
+bad object file sneaks into the cache for some reason, it will of course stay
+bad. Some possible reasons for erroneous object files are bad hardware (disk
+drive, disk controller, memory, etc), buggy drivers or file systems, a bad
+*prefix_command* or compiler wrapper. If this happens, the easiest way of
+fixing it is this:
+
+1. Build so that the bad object file ends up in the build tree.
+2. Remove the bad object file from the build tree.
+3. Rebuild with *CCACHE_RECACHE* set.
+
+An alternative is to clear the whole cache with *ccache -C* if you don't mind
+losing other cached results.
+
+There are no reported issues about ccache producing broken object files
+reproducibly. That doesn't mean it can't happen, so if you find a repeatable
+case, please report it.
+
+
+More information
+----------------
+
+Credits, mailing list information, bug reporting instructions, source code,
+etc, can be found on ccache's web site: <https://ccache.samba.org>.
+
+
+Author
+------
+
+ccache was originally written by Andrew Tridgell and is currently developed and
+maintained by Joel Rosdahl. See AUTHORS.txt or AUTHORS.html and
+<https://ccache.samba.org/credits.html> for a list of contributors.
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
+<head>\r
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
+<meta name="generator" content="AsciiDoc 8.6.9" />\r
+<title>CCACHE(1)</title>\r
+<style type="text/css">\r
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
+\r
+/* Default font. */\r
+body {\r
+ font-family: Georgia,serif;\r
+}\r
+\r
+/* Title font. */\r
+h1, h2, h3, h4, h5, h6,\r
+div.title, caption.title,\r
+thead, p.table.header,\r
+#toctitle,\r
+#author, #revnumber, #revdate, #revremark,\r
+#footer {\r
+ font-family: Arial,Helvetica,sans-serif;\r
+}\r
+\r
+body {\r
+ margin: 1em 5% 1em 5%;\r
+}\r
+\r
+a {\r
+ color: blue;\r
+ text-decoration: underline;\r
+}\r
+a:visited {\r
+ color: fuchsia;\r
+}\r
+\r
+em {\r
+ font-style: italic;\r
+ color: navy;\r
+}\r
+\r
+strong {\r
+ font-weight: bold;\r
+ color: #083194;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+ color: #527bbd;\r
+ margin-top: 1.2em;\r
+ margin-bottom: 0.5em;\r
+ line-height: 1.3;\r
+}\r
+\r
+h1, h2, h3 {\r
+ border-bottom: 2px solid silver;\r
+}\r
+h2 {\r
+ padding-top: 0.5em;\r
+}\r
+h3 {\r
+ float: left;\r
+}\r
+h3 + * {\r
+ clear: left;\r
+}\r
+h5 {\r
+ font-size: 1.0em;\r
+}\r
+\r
+div.sectionbody {\r
+ margin-left: 0;\r
+}\r
+\r
+hr {\r
+ border: 1px solid silver;\r
+}\r
+\r
+p {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+ul, ol, li > p {\r
+ margin-top: 0;\r
+}\r
+ul > li { color: #aaa; }\r
+ul > li > * { color: black; }\r
+\r
+.monospaced, code, pre {\r
+ font-family: "Courier New", Courier, monospace;\r
+ font-size: inherit;\r
+ color: navy;\r
+ padding: 0;\r
+ margin: 0;\r
+}\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
+\r
+#author {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ font-size: 1.1em;\r
+}\r
+#email {\r
+}\r
+#revnumber, #revdate, #revremark {\r
+}\r
+\r
+#footer {\r
+ font-size: small;\r
+ border-top: 2px solid silver;\r
+ padding-top: 0.5em;\r
+ margin-top: 4.0em;\r
+}\r
+#footer-text {\r
+ float: left;\r
+ padding-bottom: 0.5em;\r
+}\r
+#footer-badges {\r
+ float: right;\r
+ padding-bottom: 0.5em;\r
+}\r
+\r
+#preamble {\r
+ margin-top: 1.5em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.imageblock, div.exampleblock, div.verseblock,\r
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
+div.admonitionblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.admonitionblock {\r
+ margin-top: 2.0em;\r
+ margin-bottom: 2.0em;\r
+ margin-right: 10%;\r
+ color: #606060;\r
+}\r
+\r
+div.content { /* Block element content. */\r
+ padding: 0;\r
+}\r
+\r
+/* Block element titles. */\r
+div.title, caption.title {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ text-align: left;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.5em;\r
+}\r
+div.title + * {\r
+ margin-top: 0;\r
+}\r
+\r
+td div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content + div.title {\r
+ margin-top: 0.0em;\r
+}\r
+\r
+div.sidebarblock > div.content {\r
+ background: #ffffee;\r
+ border: 1px solid #dddddd;\r
+ border-left: 4px solid #f0f0f0;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.listingblock > div.content {\r
+ border: 1px solid #dddddd;\r
+ border-left: 5px solid #f0f0f0;\r
+ background: #f8f8f8;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.quoteblock, div.verseblock {\r
+ padding-left: 1.0em;\r
+ margin-left: 1.0em;\r
+ margin-right: 10%;\r
+ border-left: 5px solid #f0f0f0;\r
+ color: #888;\r
+}\r
+\r
+div.quoteblock > div.attribution {\r
+ padding-top: 0.5em;\r
+ text-align: right;\r
+}\r
+\r
+div.verseblock > pre.content {\r
+ font-family: inherit;\r
+ font-size: inherit;\r
+}\r
+div.verseblock > div.attribution {\r
+ padding-top: 0.75em;\r
+ text-align: left;\r
+}\r
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
+div.verseblock + div.attribution {\r
+ text-align: left;\r
+}\r
+\r
+div.admonitionblock .icon {\r
+ vertical-align: top;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: #527bbd;\r
+ padding-right: 0.5em;\r
+}\r
+div.admonitionblock td.content {\r
+ padding-left: 0.5em;\r
+ border-left: 3px solid #dddddd;\r
+}\r
+\r
+div.exampleblock > div.content {\r
+ border-left: 3px solid #dddddd;\r
+ padding-left: 0.5em;\r
+}\r
+\r
+div.imageblock div.content { padding-left: 0; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
+a.image:visited { color: white; }\r
+\r
+dl {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+dt {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0;\r
+ font-style: normal;\r
+ color: navy;\r
+}\r
+dd > *:first-child {\r
+ margin-top: 0.1em;\r
+}\r
+\r
+ul, ol {\r
+ list-style-position: outside;\r
+}\r
+ol.arabic {\r
+ list-style-type: decimal;\r
+}\r
+ol.loweralpha {\r
+ list-style-type: lower-alpha;\r
+}\r
+ol.upperalpha {\r
+ list-style-type: upper-alpha;\r
+}\r
+ol.lowerroman {\r
+ list-style-type: lower-roman;\r
+}\r
+ol.upperroman {\r
+ list-style-type: upper-roman;\r
+}\r
+\r
+div.compact ul, div.compact ol,\r
+div.compact p, div.compact p,\r
+div.compact div, div.compact div {\r
+ margin-top: 0.1em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+tfoot {\r
+ font-weight: bold;\r
+}\r
+td > div.verse {\r
+ white-space: pre;\r
+}\r
+\r
+div.hdlist {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+div.hdlist tr {\r
+ padding-bottom: 15px;\r
+}\r
+dt.hdlist1.strong, td.hdlist1.strong {\r
+ font-weight: bold;\r
+}\r
+td.hdlist1 {\r
+ vertical-align: top;\r
+ font-style: normal;\r
+ padding-right: 0.8em;\r
+ color: navy;\r
+}\r
+td.hdlist2 {\r
+ vertical-align: top;\r
+}\r
+div.hdlist.compact tr {\r
+ margin: 0;\r
+ padding-bottom: 0;\r
+}\r
+\r
+.comment {\r
+ background: yellow;\r
+}\r
+\r
+.footnote, .footnoteref {\r
+ font-size: 0.8em;\r
+}\r
+\r
+span.footnote, span.footnoteref {\r
+ vertical-align: super;\r
+}\r
+\r
+#footnotes {\r
+ margin: 20px 0 20px 0;\r
+ padding: 7px 0 0 0;\r
+}\r
+\r
+#footnotes div.footnote {\r
+ margin: 0 0 5px 0;\r
+}\r
+\r
+#footnotes hr {\r
+ border: none;\r
+ border-top: 1px solid silver;\r
+ height: 1px;\r
+ text-align: left;\r
+ margin-left: 0;\r
+ width: 20%;\r
+ min-width: 100px;\r
+}\r
+\r
+div.colist td {\r
+ padding-right: 0.5em;\r
+ padding-bottom: 0.3em;\r
+ vertical-align: top;\r
+}\r
+div.colist td img {\r
+ margin-top: 0.3em;\r
+}\r
+\r
+@media print {\r
+ #footer-badges { display: none; }\r
+}\r
+\r
+#toc {\r
+ margin-bottom: 2.5em;\r
+}\r
+\r
+#toctitle {\r
+ color: #527bbd;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
+ margin-top: 0;\r
+ margin-bottom: 0;\r
+}\r
+div.toclevel2 {\r
+ margin-left: 2em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel3 {\r
+ margin-left: 4em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel4 {\r
+ margin-left: 6em;\r
+ font-size: 0.9em;\r
+}\r
+\r
+span.aqua { color: aqua; }\r
+span.black { color: black; }\r
+span.blue { color: blue; }\r
+span.fuchsia { color: fuchsia; }\r
+span.gray { color: gray; }\r
+span.green { color: green; }\r
+span.lime { color: lime; }\r
+span.maroon { color: maroon; }\r
+span.navy { color: navy; }\r
+span.olive { color: olive; }\r
+span.purple { color: purple; }\r
+span.red { color: red; }\r
+span.silver { color: silver; }\r
+span.teal { color: teal; }\r
+span.white { color: white; }\r
+span.yellow { color: yellow; }\r
+\r
+span.aqua-background { background: aqua; }\r
+span.black-background { background: black; }\r
+span.blue-background { background: blue; }\r
+span.fuchsia-background { background: fuchsia; }\r
+span.gray-background { background: gray; }\r
+span.green-background { background: green; }\r
+span.lime-background { background: lime; }\r
+span.maroon-background { background: maroon; }\r
+span.navy-background { background: navy; }\r
+span.olive-background { background: olive; }\r
+span.purple-background { background: purple; }\r
+span.red-background { background: red; }\r
+span.silver-background { background: silver; }\r
+span.teal-background { background: teal; }\r
+span.white-background { background: white; }\r
+span.yellow-background { background: yellow; }\r
+\r
+span.big { font-size: 2em; }\r
+span.small { font-size: 0.6em; }\r
+\r
+span.underline { text-decoration: underline; }\r
+span.overline { text-decoration: overline; }\r
+span.line-through { text-decoration: line-through; }\r
+\r
+div.unbreakable { page-break-inside: avoid; }\r
+\r
+\r
+/*\r
+ * xhtml11 specific\r
+ *\r
+ * */\r
+\r
+div.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.tableblock > table {\r
+ border: 3px solid #527bbd;\r
+}\r
+thead, p.table.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.table {\r
+ margin-top: 0;\r
+}\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
+div.tableblock > table[frame="void"] {\r
+ border-style: none;\r
+}\r
+div.tableblock > table[frame="hsides"] {\r
+ border-left-style: none;\r
+ border-right-style: none;\r
+}\r
+div.tableblock > table[frame="vsides"] {\r
+ border-top-style: none;\r
+ border-bottom-style: none;\r
+}\r
+\r
+\r
+/*\r
+ * html5 specific\r
+ *\r
+ * */\r
+\r
+table.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+thead, p.tableblock.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.tableblock {\r
+ margin-top: 0;\r
+}\r
+table.tableblock {\r
+ border-width: 3px;\r
+ border-spacing: 0px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+ border-collapse: collapse;\r
+}\r
+th.tableblock, td.tableblock {\r
+ border-width: 1px;\r
+ padding: 4px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+}\r
+\r
+table.tableblock.frame-topbot {\r
+ border-left-style: hidden;\r
+ border-right-style: hidden;\r
+}\r
+table.tableblock.frame-sides {\r
+ border-top-style: hidden;\r
+ border-bottom-style: hidden;\r
+}\r
+table.tableblock.frame-none {\r
+ border-style: hidden;\r
+}\r
+\r
+th.tableblock.halign-left, td.tableblock.halign-left {\r
+ text-align: left;\r
+}\r
+th.tableblock.halign-center, td.tableblock.halign-center {\r
+ text-align: center;\r
+}\r
+th.tableblock.halign-right, td.tableblock.halign-right {\r
+ text-align: right;\r
+}\r
+\r
+th.tableblock.valign-top, td.tableblock.valign-top {\r
+ vertical-align: top;\r
+}\r
+th.tableblock.valign-middle, td.tableblock.valign-middle {\r
+ vertical-align: middle;\r
+}\r
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
+ vertical-align: bottom;\r
+}\r
+\r
+\r
+/*\r
+ * manpage specific\r
+ *\r
+ * */\r
+\r
+body.manpage h1 {\r
+ padding-top: 0.5em;\r
+ padding-bottom: 0.5em;\r
+ border-top: 2px solid silver;\r
+ border-bottom: 2px solid silver;\r
+}\r
+body.manpage h2 {\r
+ border-style: none;\r
+}\r
+body.manpage div.sectionbody {\r
+ margin-left: 3em;\r
+}\r
+\r
+@media print {\r
+ body.manpage div#toc { display: none; }\r
+}\r
+\r
+\r
+</style>\r
+<script type="text/javascript">\r
+/*<+'])');\r
+ // Function that scans the DOM tree for header elements (the DOM2\r
+ // nodeIterator API would be a better technique but not supported by all\r
+ // browsers).\r
+ var iterate = function (el) {\r
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
+ var mo = re.exec(i.tagName);\r
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
+ }\r
+ iterate(i);\r
+ }\r
+ }\r
+ }\r
+ iterate(el);\r
+ return result;\r
+ }\r
+\r
+ var toc = document.getElementById("toc");\r
+ if (!toc) {\r
+ return;\r
+ }\r
+\r
+ // Delete existing TOC entries in case we're reloading the TOC.\r
+ var tocEntriesToRemove = [];\r
+ var i;\r
+ for (i = 0; i < toc.childNodes.length; i++) {\r
+ var entry = toc.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div'\r
+ && entry.getAttribute("class")\r
+ && entry.getAttribute("class").match(/^toclevel/))\r
+ tocEntriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < tocEntriesToRemove.length; i++) {\r
+ toc.removeChild(tocEntriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild TOC entries.\r
+ var entries = tocEntries(document.getElementById("content"), toclevels);\r
+ for (var i = 0; i < entries.length; ++i) {\r
+ var entry = entries[i];\r
+ if (entry.element.id == "")\r
+ entry.element.id = "_toc_" + i;\r
+ var a = document.createElement("a");\r
+ a.href = "#" + entry.element.id;\r
+ a.appendChild(document.createTextNode(entry.text));\r
+ var div = document.createElement("div");\r
+ div.appendChild(a);\r
+ div.className = "toclevel" + entry.toclevel;\r
+ toc.appendChild(div);\r
+ }\r
+ if (entries.length == 0)\r
+ toc.parentNode.removeChild(toc);\r
+},\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Footnotes generator\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+/* Based on footnote generation code from:\r
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
+ */\r
+\r
+footnotes: function () {\r
+ // Delete existing footnote entries in case we're reloading the footnodes.\r
+ var i;\r
+ var noteholder = document.getElementById("footnotes");\r
+ if (!noteholder) {\r
+ return;\r
+ }\r
+ var entriesToRemove = [];\r
+ for (i = 0; i < noteholder.childNodes.length; i++) {\r
+ var entry = noteholder.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
+ entriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < entriesToRemove.length; i++) {\r
+ noteholder.removeChild(entriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild footnote entries.\r
+ var cont = document.getElementById("content");\r
+ var spans = cont.getElementsByTagName("span");\r
+ var refs = {};\r
+ var n = 0;\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnote") {\r
+ n++;\r
+ var note = spans[i].getAttribute("data-note");\r
+ if (!note) {\r
+ // Use [\s\S] in place of . so multi-line matches work.\r
+ // Because JavaScript has no s (dotall) regex flag.\r
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
+ spans[i].innerHTML =\r
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ spans[i].setAttribute("data-note", note);\r
+ }\r
+ noteholder.innerHTML +=\r
+ "<div class='footnote' id='_footnote_" + n + "'>" +\r
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
+ n + "</a>. " + note + "</div>";\r
+ var id =spans[i].getAttribute("id");\r
+ if (id != null) refs["#"+id] = n;\r
+ }\r
+ }\r
+ if (n == 0)\r
+ noteholder.parentNode.removeChild(noteholder);\r
+ else {\r
+ // Process footnoterefs.\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnoteref") {\r
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
+ href = href.match(/#.*/)[0]; // Because IE return full URL.\r
+ n = refs[href];\r
+ spans[i].innerHTML =\r
+ "[<a href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ }\r
+ }\r
+ }\r
+},\r
+\r
+install: function(toclevels) {\r
+ var timerId;\r
+\r
+ function reinstall() {\r
+ asciidoc.footnotes();\r
+ if (toclevels) {\r
+ asciidoc.toc(toclevels);\r
+ }\r
+ }\r
+\r
+ function reinstallAndRemoveTimer() {\r
+ clearInterval(timerId);\r
+ reinstall();\r
+ }\r
+\r
+ timerId = setInterval(reinstall, 500);\r
+ if (document.addEventListener)\r
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
+ else\r
+ window.onload = reinstallAndRemoveTimer;\r
+}\r
+\r
+}\r
+asciidoc.install(2);\r
+/*]]>*/\r
+</script>\r
+</head>\r
+<body class="article">\r
+<div id="header">\r
+<h1>CCACHE(1)</h1>\r
+<span id="revnumber">version 3.4.2</span>\r
+<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>
+</div>\r
+</div>\r
+<div id="content">\r
+<div class="sect1">\r
+<h2 id="_name">Name</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache - a fast C/C++ compiler cache</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_synopsis">Synopsis</h2>\r
+<div class="sectionbody">\r
+<div class="verseblock">\r
+<pre class="content"><strong>ccache</strong> [<em>options</em>]\r
+<strong>ccache</strong> <em>compiler</em> [<em>compiler options</em>]\r
+<em>compiler</em> [<em>compiler options</em>] (via symbolic link)</pre>\r
+<div class="attribution">\r
+</div></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_description">Description</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache is a compiler cache. It speeds up recompilation by caching the result of\r
+previous compilations and detecting when the same compilation is being done\r
+again. Supported languages are C, C++, Objective-C and Objective-C++.</p></div>\r
+<div class="paragraph"><p>ccache has been carefully written to always produce exactly the same compiler\r
+output that you would get without the cache. The only way you should be able to\r
+tell that you are using ccache is the speed. Currently known exceptions to this\r
+goal are listed under <a href="#_caveats">CAVEATS</a>. If you ever discover an\r
+undocumented case where ccache changes the output of your compiler, please let\r
+us know.</p></div>\r
+<div class="sect2">\r
+<h3 id="_features">Features</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Keeps statistics on hits/misses.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Automatic cache size management.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Can cache compilations that generate warnings.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Easy installation.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Low overhead.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Optionally compresses files in the cache to reduce disk space.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_limitations">Limitations</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Only knows how to cache the compilation of a single\r
+ C/C++/Objective-C/Objective-C++ file. Other types of compilations\r
+ (multi-file compilation, linking, etc) will silently fall back to running the\r
+ real compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Only works with GCC and compilers that behave similar enough.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Some compiler flags are not supported. If such a flag is detected, ccache\r
+ will silently fall back to running the real compiler.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_run_modes">Run modes</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>There are two ways to use ccache. You can either prefix your compilation\r
+commands with <strong>ccache</strong> or you can let ccache masquerade as the compiler by\r
+creating a symbolic link (named as the compiler) to ccache. The first method is\r
+most convenient if you just want to try out ccache or wish to use it for some\r
+specific projects. The second method is most useful for when you wish to use\r
+ccache for all your compilations.</p></div>\r
+<div class="paragraph"><p>To use the first method, just make sure that <strong>ccache</strong> is in your <strong>PATH</strong>.</p></div>\r
+<div class="paragraph"><p>To use the symlinks method, do something like this:</p></div>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code>cp ccache /usr/local/bin/\r
+ln -s ccache /usr/local/bin/gcc\r
+ln -s ccache /usr/local/bin/g++\r
+ln -s ccache /usr/local/bin/cc\r
+ln -s ccache /usr/local/bin/c++</code></pre>\r
+</div></div>\r
+<div class="paragraph"><p>And so forth. This will work as long as the directory with symlinks comes\r
+before the path to the compiler (which is usually in <code>/usr/bin</code>). After\r
+installing you may wish to run “which gcc” to make sure that the correct link\r
+is being used.</p></div>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Warning</div>\r
+</td>\r
+<td class="content">The technique of letting ccache masquerade as the compiler works well,\r
+but currently doesn’t interact well with other tools that do the same thing.\r
+See <a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.</td>\r
+</tr></table>\r
+</div>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Warning</div>\r
+</td>\r
+<td class="content">Do not use a hard link, use a symbolic link. A hard link will cause\r
+“interesting” problems.</td>\r
+</tr></table>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_options">Options</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>These options only apply when you invoke ccache as “ccache”. When invoked as\r
+a compiler (via a symlink as described in the previous section), the normal\r
+compiler options apply and you should refer to the compiler’s documentation.</p></div>\r
+<div class="dlist"><dl>\r
+<dt class="hdlist1">\r
+<strong><code>-c, --cleanup</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Clean up the cache by removing old cached files until the specified file\r
+ number and cache size limits are not exceeded. This also recalculates the\r
+ cache file count and size totals. Normally, there is no need to initiate\r
+ cleanup manually as ccache keeps the cache below the specified limits at\r
+ runtime and keeps statistics up to date on each compilation. Forcing a\r
+ cleanup is mostly useful if you manually modify the cache contents or\r
+ believe that the cache size statistics may be inaccurate.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-C, --clear</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Clear the entire cache, removing all cached files, but keeping the\r
+ configuration file.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-F, --max-files</code></strong>=<em>N</em>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Set the maximum number of files allowed in the cache. Use 0 for no limit.\r
+ The value is stored in a configuration file in the cache directory and\r
+ applies to all future compilations.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-h, --help</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Print an options summary page.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-M, --max-size</code></strong>=<em>SIZE</em>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Set the maximum size of the files stored in the cache. <em>SIZE</em> should be a\r
+ number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or\r
+ Ti (binary). The default suffix is G. Use 0 for no limit. The value is\r
+ stored in a configuration file in the cache directory and applies to all\r
+ future compilations.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-o, --set-config</code></strong>=<em>KEY=VALUE</em>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Set configuration <em>KEY</em> to <em>VALUE</em>. See <a href="#_configuration">CONFIGURATION</a>\r
+ for more information.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-p, --print-config</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Print current configuration options and from where they originate\r
+ (environment variable, configuration file or compile-time default).\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-s, --show-stats</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Print the current statistics summary for the cache.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-V, --version</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Print version and copyright information.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong><code>-z, --zero-stats</code></strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Zero the cache statistics (but not the configuration options).\r
+</p>\r
+</dd>\r
+</dl></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_extra_options">Extra options</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>When run as a compiler, ccache usually just takes the same command line options\r
+as the compiler you are using. The only exception to this is the option\r
+<strong>--ccache-skip</strong>. That option can be used to tell ccache to avoid interpreting\r
+the next option in any way and to pass it along to the compiler as-is.</p></div>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Note</div>\r
+</td>\r
+<td class="content"><strong>--ccache-skip</strong> currently only tells ccache not to interpret the next\r
+option as a special compiler option — the option will still be included in the\r
+direct mode hash.</td>\r
+</tr></table>\r
+</div>\r
+<div class="paragraph"><p>The reason this can be important is that ccache does need to parse the command\r
+line and determine what is an input filename and what is a compiler option, as\r
+it needs the input filename to determine the name of the resulting object file\r
+(among other things). The heuristic ccache uses when parsing the command line\r
+is that any argument that exists as a file is treated as an input file name. By\r
+using <strong>--ccache-skip</strong> you can force an option to not be treated as an input\r
+file name and instead be passed along to the compiler as a command line option.</p></div>\r
+<div class="paragraph"><p>Another case where <strong>--ccache-skip</strong> can be useful is if ccache interprets an\r
+option specially but shouldn’t, since the option has another meaning for your\r
+compiler than what ccache thinks.</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_configuration">Configuration</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache’s default behavior can be overridden by configuration file settings,\r
+which in turn can be overridden by environment variables with names starting\r
+with <strong>CCACHE_</strong>. ccache normally reads configuration from two files: first a\r
+system-level configuration file and secondly a cache-specific configuration\r
+file. The priority of configuration settings is as follows (where 1 is\r
+highest):</p></div>\r
+<div class="olist arabic"><ol class="arabic">\r
+<li>\r
+<p>\r
+Environment variables.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The cache-specific configuration file <strong><em><ccachedir></em>/ccache.conf</strong> (typically\r
+ <strong>$HOME/.ccache/ccache.conf</strong>).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The system-wide configuration file <strong><em><sysconfdir></em>/ccache.conf</strong> (typically\r
+ <strong>/etc/ccache.conf</strong> or <strong>/usr/local/etc/ccache.conf</strong>).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Compile-time defaults.\r
+</p>\r
+</li>\r
+</ol></div>\r
+<div class="paragraph"><p>As a special case, if the environment variable <strong>CCACHE_CONFIGPATH</strong> is set,\r
+ccache reads configuration from the specified path instead of the default\r
+paths.</p></div>\r
+<div class="sect2">\r
+<h3 id="_configuration_file_syntax">Configuration file syntax</h3>\r
+<div class="paragraph"><p>Configuration files are in a simple “key = value” format, one setting per\r
+line. Lines starting with a hash sign are comments. Blank lines are ignored, as\r
+is whitespace surrounding keys and values. Example:</p></div>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code># Set maximum cache size to 10 GB:\r
+max_size = 10G</code></pre>\r
+</div></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_boolean_values">Boolean values</h3>\r
+<div class="paragraph"><p>Some settings are boolean values (i.e. truth values). In a configuration file,\r
+such values must be set to the string <strong>true</strong> or <strong>false</strong>. For the corresponding\r
+environment variables, the semantics are a bit different: a set environment\r
+variable means “true” (even if set to the empty string), the following\r
+case-insensitive negative values are considered an error (rather than\r
+surprising the user): <strong>0</strong>, <strong>false</strong>, <strong>disable</strong> and <strong>no</strong>, and an unset\r
+environment variable means “false”. Each boolean environment variable also\r
+has a negated form starting with <strong>CCACHE_NO</strong>. For example, <strong>CCACHE_COMPRESS</strong>\r
+can be set to force compression and <strong>CCACHE_NOCOMPRESS</strong> can be set to force no\r
+compression.</p></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_configuration_settings">Configuration settings</h3>\r
+<div class="paragraph"><p>Below is a list of available configuration settings. The corresponding\r
+environment variable name is indicated in parentheses after each configuration\r
+setting key.</p></div>\r
+<div class="dlist"><dl>\r
+<dt class="hdlist1">\r
+<strong>base_dir</strong> (<strong>CCACHE_BASEDIR</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting should be an absolute path to a directory. ccache then\r
+ rewrites absolute paths into relative paths before computing the hash that\r
+ identifies the compilation, but only for paths under the specified\r
+ directory. If set to the empty string (which is the default), no rewriting\r
+ is done. A typical path to use as the base directory is your home directory\r
+ or another directory that is a parent of your build directories. Don’t use\r
+ <code>/</code> as the base directory since that will make ccache also rewrite paths to\r
+ system header files, which doesn’t gain anything.\r
+</p>\r
+<div class="paragraph"><p>See also the discussion under <a href="#_compiling_in_different_directories">COMPILING IN DIFFERENT DIRECTORIES</a>.</p></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>cache_dir</strong> (<strong>CCACHE_DIR</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting specifies where ccache will keep its cached compiler outputs.\r
+ It will only take effect if set in the system-wide configuration file or as\r
+ an environment variable. The default is <strong>$HOME/.ccache</strong>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>cache_dir_levels</strong> (<strong>CCACHE_NLEVELS</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting allows you to choose the number of directory levels in the\r
+ cache directory. The default is 2. The minimum is 1 and the maximum is 8.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>compiler</strong> (<strong>CCACHE_CC</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting can be used to force the name of the compiler to use. If set\r
+ to the empty string (which is the default), ccache works it out from the\r
+ command line.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>compiler_check</strong> (<strong>CCACHE_COMPILERCHECK</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ By default, ccache includes the modification time (“mtime”) and size of\r
+ the compiler in the hash to ensure that results retrieved from the cache\r
+ are accurate. This setting can be used to select another strategy. Possible\r
+ values are:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="dlist"><dl>\r
+<dt class="hdlist1">\r
+<strong>content</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Hash the content of the compiler binary. This makes ccache very slightly\r
+ slower compared to the <strong>mtime</strong> setting, but makes it cope better with\r
+ compiler upgrades during a build bootstrapping process.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>mtime</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Hash the compiler’s mtime and size, which is fast. This is the default.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>none</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Don’t hash anything. This may be good for situations where you can safely\r
+ use the cached results even though the compiler’s mtime or size has changed\r
+ (e.g. if the compiler is built as part of your build system and the\r
+ compiler’s source has not changed, or if the compiler only has changes that\r
+ don’t affect code generation). You should only use the <strong>none</strong> setting if\r
+ you know what you are doing.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>string:value</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Use <strong>value</strong> as the string to calculate hash from. This can be the compiler\r
+ revision number you retrieved earlier and set here via environment variable.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<em>a command string</em>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Hash the standard output and standard error output of the specified\r
+ command. The string will be split on whitespace to find out the command and\r
+ arguments to run. No other interpretation of the command string will be\r
+ done, except that the special word <strong>%compiler%</strong> will be replaced with the\r
+ path to the compiler. Several commands can be specified with semicolon as\r
+ separator. Examples:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code>%compiler% -v</code></pre>\r
+</div></div>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code>%compiler% -dumpmachine; %compiler% -dumpversion</code></pre>\r
+</div></div>\r
+<div class="paragraph"><p>You should make sure that the specified command is as fast as possible since it\r
+will be run once for each ccache invocation.</p></div>\r
+<div class="paragraph"><p>Identifying the compiler using a command is useful if you want to avoid cache\r
+misses when the compiler has been rebuilt but not changed.</p></div>\r
+<div class="paragraph"><p>Another case is when the compiler (as seen by ccache) actually isn’t the real\r
+compiler but another compiler wrapper — in that case, the default <strong>mtime</strong>\r
+method will hash the mtime and size of the other compiler wrapper, which means\r
+that ccache won’t be able to detect a compiler upgrade. Using a suitable\r
+command to identify the compiler is thus safer, but it’s also slower, so you\r
+should consider continue using the <strong>mtime</strong> method in combination with\r
+the <strong>prefix_command</strong> setting if possible. See\r
+<a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.</p></div>\r
+</div></div>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>compression</strong> (<strong>CCACHE_COMPRESS</strong> or <strong>CCACHE_NOCOMPRESS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will compress object files and other compiler output it\r
+ puts in the cache. However, this setting has no effect on how files are\r
+ retrieved from the cache; compressed and uncompressed results will still be\r
+ usable regardless of this setting. The default is false.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>compression_level</strong> (<strong>CCACHE_COMPRESSLEVEL</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting determines the level at which ccache will compress object\r
+ files. It only has effect if <strong>compression</strong> is enabled. The value defaults\r
+ to 6, and must be no lower than 1 (fastest, worst compression) and no\r
+ higher than 9 (slowest, best compression).\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>cpp_extension</strong> (<strong>CCACHE_EXTENSION</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting can be used to force a certain extension for the intermediate\r
+ preprocessed file. The default is to automatically determine the extension\r
+ to use for intermediate preprocessor files based on the type of file being\r
+ compiled, but that sometimes doesn’t work. For example, when using the\r
+ “aCC” compiler on HP-UX, set the cpp extension to <strong>i</strong>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>direct_mode</strong> (<strong>CCACHE_DIRECT</strong> or <strong>CCACHE_NODIRECT</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, the direct mode will be used. The default is true. See\r
+ <a href="#_the_direct_mode">THE DIRECT MODE</a>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>disable</strong> (<strong>CCACHE_DISABLE</strong> or <strong>CCACHE_NODISABLE</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ When true, ccache will just call the real compiler, bypassing the cache\r
+ completely. The default is false.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>extra_files_to_hash</strong> (<strong>CCACHE_EXTRAFILES</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting is a list of paths to files that ccache will include in the\r
+ the hash sum that identifies the build. The list separator is semicolon on\r
+ Windows systems and colon on other systems.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>hard_link</strong> (<strong>CCACHE_HARDLINK</strong> or <strong>CCACHE_NOHARDLINK</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will attempt to use hard links from the cache directory\r
+ when creating the compiler output rather than using a file copy. Hard links\r
+ are never made for compressed cache files. This means that you should not\r
+ enable compression if you want to use hard links. The default is false.\r
+</p>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Warning</div>\r
+</td>\r
+<td class="content">Do not enable this option unless you are aware of the consequences.\r
+Using hard links may be slightly faster in some situations, but there are\r
+several pitfalls since the resulting object file will share i-node with the\r
+cached object file:</td>\r
+</tr></table>\r
+</div>\r
+<div class="olist arabic"><ol class="arabic">\r
+<li>\r
+<p>\r
+If the resulting object file is modified in any way, the cached object file\r
+ will be modified as well. For instance, if you run <code>strip object.o</code> or <code>echo\r
+ >object.o</code>, you will corrupt the cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Programs that rely on modification times (like “make”) can be confused\r
+ since ccache updates the cached files' modification times as part of the\r
+ automatic cache size management. This will affect object files in the build\r
+ tree as well, which can retrigger the linking step even though nothing\r
+ really has changed.\r
+</p>\r
+</li>\r
+</ol></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>hash_dir</strong> (<strong>CCACHE_HASHDIR</strong> or <strong>CCACHE_NOHASHDIR</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true (which is the default), ccache will include the current working\r
+ directory (CWD) in the hash that is used to distinguish two compilations\r
+ when generating debug info (compiler option <strong>-g</strong> with variations).\r
+ Exception: The CWD will not be included in the hash if <strong>base_dir</strong> is set\r
+ (and matches the CWD) and the compiler option <strong>-fdebug-prefix-map</strong> is used.\r
+ See also the discussion under\r
+ <a href="#_compiling_in_different_directories">COMPILING IN DIFFERENT DIRECTORIES</a>.\r
+</p>\r
+<div class="paragraph"><p>The reason for including the CWD in the hash by default is to prevent a problem\r
+with the storage of the current working directory in the debug info of an\r
+object file, which can lead ccache to return a cached object file that has the\r
+working directory in the debug info set incorrectly.</p></div>\r
+<div class="paragraph"><p>You can disable this setting to get cache hits when compiling the same source\r
+code in different directories if you don’t mind that CWD in the debug info\r
+might be incorrect.</p></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>ignore_headers_in_manifest</strong> (<strong>CCACHE_IGNOREHEADERS</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting is a list of paths to files (or directories with headers) that\r
+ ccache will <strong>not</strong> include in the manifest list that makes up the direct\r
+ mode. Note that this can cause stale cache hits if those headers do indeed\r
+ change. The list separator is semicolon on Windows systems and colon on\r
+ other systems.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>keep_comments_cpp</strong> (<strong>CCACHE_COMMENTS</strong> or <strong>CCACHE_NOCOMMENTS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will not discard the comments before hashing preprocessor\r
+ output. This can be used to check documentation with <strong>-Wdocumentation</strong>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>limit_multiple</strong> (<strong>CCACHE_LIMIT_MULTIPLE</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ Sets the limit when cleaning up. Files are deleted (in LRU order) until the\r
+ levels are below the limit. The default is 0.8 (= 80%). See\r
+ <a href="#_automatic_cleanup">AUTOMATIC CLEANUP</a> for more information.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>log_file</strong> (<strong>CCACHE_LOGFILE</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If set to a file path, ccache will write information on what it is doing to\r
+ the specified file. This is useful for tracking down problems.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>max_files</strong> (<strong>CCACHE_MAXFILES</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This option specifies the maximum number of files to keep in the cache. Use\r
+ 0 for no limit (which is the default). See also\r
+ <a href="#_cache_size_management">CACHE SIZE MANAGEMENT</a>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>max_size</strong> (<strong>CCACHE_MAXSIZE</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This option specifies the maximum size of the cache. Use 0 for no limit.\r
+ The default value is 5G. Available suffixes: k, M, G, T (decimal) and Ki,\r
+ Mi, Gi, Ti (binary). The default suffix is G. See also\r
+ <a href="#_cache_size_management">CACHE SIZE MANAGEMENT</a>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>path</strong> (<strong>CCACHE_PATH</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If set, ccache will search directories in this list when looking for the\r
+ real compiler. The list separator is semicolon on Windows systems and colon\r
+ on other systems. If not set, ccache will look for the first executable\r
+ matching the compiler name in the normal <strong>PATH</strong> that isn’t a symbolic link\r
+ to ccache itself.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>prefix_command</strong> (<strong>CCACHE_PREFIX</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This option adds a list of prefixes (separated by space) to the command\r
+ line that ccache uses when invoking the compiler. See also\r
+ <a href="#_using_ccache_with_other_compiler_wrappers">USING CCACHE WITH OTHER COMPILER WRAPPERS</a>.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>prefix_command_cpp</strong> (<strong>CCACHE_PREFIX_CPP</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This option adds a list of prefixes (separated by space) to the command\r
+ line that ccache uses when invoking the preprocessor.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>read_only</strong> (<strong>CCACHE_READONLY</strong> or <strong>CCACHE_NOREADONLY</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will attempt to use existing cached object files, but it\r
+ will not to try to add anything new to the cache. If you are using this\r
+ because your ccache directory is read-only, then you need to set\r
+ <strong>temporary_dir</strong> as otherwise ccache will fail to create temporary files.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>read_only_direct</strong> (<strong>CCACHE_READONLY_DIRECT</strong> or <strong>CCACHE_NOREADONLY_DIRECT</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ Just like <strong>read_only</strong> except that ccache will only try to retrieve results\r
+ from the cache using the direct mode, not the preprocessor mode. See\r
+ documentation for <strong>read_only</strong> regarding using a read-only ccache directory.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>recache</strong> (<strong>CCACHE_RECACHE</strong> or <strong>CCACHE_NORECACHE</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will not use any previously stored result. New results will\r
+ still be cached, possibly overwriting any pre-existing results.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>run_second_cpp</strong> (<strong>CCACHE_CPP2</strong> or <strong>CCACHE_NOCPP2</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will first run the preprocessor to preprocess the source\r
+ code (see <a href="#_the_preprocessor_mode">THE PREPROCESSOR MODE</a>) and then on a\r
+ cache miss run the compiler on the source code to get hold of the object\r
+ file. This is the default.\r
+</p>\r
+<div class="paragraph"><p>If false, ccache will first run preprocessor to preprocess the source code and\r
+then on a cache miss run the compiler on the <em>preprocessed source code</em> instead\r
+of the original source code. This makes cache misses slightly faster since the\r
+source code only has to be preprocessed once. The downside is that some\r
+compilers won’t produce the same result (for instance diagnostics warnings)\r
+when compiling preprocessed source code.</p></div>\r
+<div class="paragraph"><p>A solution to the above mentioned downside is to set <strong>run_second_cpp</strong> to false\r
+and pass <strong>-fdirectives-only</strong> (for GCC) or <strong>-frewrite-includes</strong> (for Clang) to\r
+the compiler. This will cause the compiler to leave the macros and other\r
+preprocessor information, and only process the <strong>#include</strong> directives. When run\r
+in this way, the preprocessor arguments will be passed to the compiler since it\r
+still has to do <em>some</em> preprocessing (like macros).</p></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>sloppiness</strong> (<strong>CCACHE_SLOPPINESS</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ By default, ccache tries to give as few false cache hits as possible.\r
+ However, in certain situations it’s possible that you know things that\r
+ ccache can’t take for granted. This setting makes it possible to tell\r
+ ccache to relax some checks in order to increase the hit rate. The value\r
+ should be a comma-separated string with options. Available options are:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="dlist"><dl>\r
+<dt class="hdlist1">\r
+<strong>file_macro</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Ignore <code>__FILE__</code> being present in the source.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>file_stat_matches</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ ccache normally examines a file’s contents to determine whether it matches\r
+ the cached version. With this option set, ccache will consider a file as\r
+ matching its cached version if the mtimes and ctimes match.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>include_file_ctime</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ By default, ccache also will not cache a file if it includes a header whose\r
+ ctime is too new. This option disables that check.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>include_file_mtime</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ By default, ccache will not cache a file if it includes a header whose\r
+ mtime is too new. This option disables that check.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>no_system_headers</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ By default, ccache will also include all system headers in the manifest.\r
+ With this option set, ccache will only include system headers in the hash\r
+ but not add the system header files to the list of include files.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>pch_defines</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Be sloppy about <strong>#define</strong>s when precompiling a header file. See\r
+ <a href="#_precompiled_headers">PRECOMPILED HEADERS</a> for more information.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>time_macros</strong>\r
+</dt>\r
+<dd>\r
+<p>\r
+ Ignore <code>__DATE__</code> and <code>__TIME__</code> being present in the source code.\r
+</p>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+<div class="paragraph"><p>See the discussion under <a href="#_troubleshooting">TROUBLESHOOTING</a> for more\r
+information.</p></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>stats</strong> (<strong>CCACHE_STATS</strong> or <strong>CCACHE_NOSTATS</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will update the statistics counters on each compilation.\r
+ The default is true.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>temporary_dir</strong> (<strong>CCACHE_TEMPDIR</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting specifies where ccache will put temporary files. The default\r
+ is <strong><cache_dir>/tmp</strong>.\r
+</p>\r
+<div class="admonitionblock">\r
+<table><tr>\r
+<td class="icon">\r
+<div class="title">Note</div>\r
+</td>\r
+<td class="content">In previous versions of ccache, <strong>CCACHE_TEMPDIR</strong> had to be on the same\r
+ filesystem as the <strong>CCACHE_DIR</strong> path, but this requirement has been\r
+ relaxed.)</td>\r
+</tr></table>\r
+</div>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>umask</strong> (<strong>CCACHE_UMASK</strong>)\r
+</dt>\r
+<dd>\r
+<p>\r
+ This setting specifies the umask for ccache and all child processes (such\r
+ as the compiler). This is mostly useful when you wish to share your cache\r
+ with other users. Note that this also affects the file permissions set on\r
+ the object files created from your compilations.\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+<strong>unify</strong> (<strong>CCACHE_UNIFY</strong> or <strong>CCACHE_NOUNIFY</strong>, see <a href="#_boolean_values">Boolean values</a> above)\r
+</dt>\r
+<dd>\r
+<p>\r
+ If true, ccache will use a C/C++ unifier when hashing the preprocessor\r
+ output if the <strong>-g</strong> option is not used. The unifier is slower than a normal\r
+ hash, so setting this environment variable loses a little bit of speed, but\r
+ it means that ccache can take advantage of not recompiling when the changes\r
+ to the source code consist of reformatting only. Note that enabling the\r
+ unifier changes the hash, so cached compilations produced when the unifier\r
+ is enabled cannot be reused when the unifier is disabled, and vice versa.\r
+ Enabling the unifier may result in incorrect line number information in\r
+ compiler warning messages and expansions of the <code>__LINE__</code> macro.\r
+</p>\r
+</dd>\r
+</dl></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_cache_size_management">Cache size management</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>By default, ccache has a 5 GB limit on the total size of files in the cache and\r
+no limit on the number of files. You can set different limits using the\r
+<strong>-M</strong>/<strong>--max-size</strong> and <strong>-F</strong>/<strong>--max-files</strong> options. Use <strong>ccache -s/--show-stats</strong>\r
+to see the cache size and the currently configured limits (in addition to other\r
+various statistics).</p></div>\r
+<div class="paragraph"><p>Cleanup can be triggered in two different ways: automatic and manual.</p></div>\r
+<div class="sect2">\r
+<h3 id="_automatic_cleanup">Automatic cleanup</h3>\r
+<div class="paragraph"><p>ccache maintains counters for various statistics about the cache, including the\r
+size and number of all cached files. In order to improve performance and reduce\r
+issues with concurrent ccache invocations, there is one statistics file for\r
+each of the sixteen subdirectories in the cache.</p></div>\r
+<div class="paragraph"><p>After a new compilation result has been written to the cache, ccache will\r
+update the size and file number statistics for the subdirectory (one of\r
+sixteen) to which the result was written. Then, if the size counter for said\r
+subdirectory is greater than <strong>max_size / 16</strong> or the file number counter is\r
+greater than <strong>max_files / 16</strong>, automatic cleanup is triggered.</p></div>\r
+<div class="paragraph"><p>When automatic cleanup is triggered for a subdirectory in the cache, ccache\r
+will:</p></div>\r
+<div class="olist arabic"><ol class="arabic">\r
+<li>\r
+<p>\r
+Count all files in the subdirectory and compute their aggregated size.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Remove files in LRU (least recently used) order until the size is at most\r
+ <strong>limit_multiple * max_size / 16</strong> and the number of files is at most\r
+ <strong>limit_multiple * max_files / 16</strong>, where <strong>limit_multiple</strong>, <strong>max_size</strong> and\r
+ <strong>max_files</strong> are configuration settings.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Set the size and file number counters to match the files that were kept.\r
+</p>\r
+</li>\r
+</ol></div>\r
+<div class="paragraph"><p>The reason for removing more files than just those needed to not exceed the max\r
+limits is that a cleanup is a fairly slow operation, so it would not be a good\r
+idea to trigger it often, like after each cache miss.</p></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_manual_cleanup">Manual cleanup</h3>\r
+<div class="paragraph"><p>You can run <strong>ccache -c/--cleanup</strong> to force cleanup of the whole cache, i.e. all\r
+of the sixteen subdirectories. This will recalculate the statistics counters\r
+and make sure that the <strong>max_size</strong> and <strong>max_files</strong> settings are not exceeded.\r
+Note that <strong>limit_multiple</strong> is not taken into account for manual cleanup.</p></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_cache_compression">Cache compression</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache can optionally compress all files it puts into the cache using the\r
+compression library zlib. While this may involve a tiny performance slowdown,\r
+it increases the number of files that fit in the cache. You can turn on\r
+compression with the <strong>compression</strong> configuration setting and you can also tweak\r
+the compression level with <strong>compression_level</strong>.</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_cache_statistics">Cache statistics</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p><strong>ccache -s/--show-stats</strong> can show the following statistics:</p></div>\r
+<div class="tableblock">\r
+<table rules="all"\r
+width="100%"\r
+frame="border"\r
+cellspacing="0" cellpadding="4">\r
+<col width="30%" />\r
+<col width="70%" />\r
+<thead>\r
+<tr>\r
+<th align="left" valign="top">Name </th>\r
+<th align="left" valign="top"> Description</th>\r
+</tr>\r
+</thead>\r
+<tbody>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">autoconf compile/link</p></td>\r
+<td align="left" valign="top"><p class="table">Uncachable compilation or linking by an autoconf test.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">bad compiler arguments</p></td>\r
+<td align="left" valign="top"><p class="table">Malformed compiler argument, e.g. missing a value for an option that requires\r
+an argument or failure to read a file specified by an option argument.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cache file missing</p></td>\r
+<td align="left" valign="top"><p class="table">A file was unexpectedly missing from the cache. This only happens in rare\r
+situations, e.g. if one ccache instance is about to get a file from the cache\r
+while another instance removed the file as part of cache cleanup.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cache hit (direct)</p></td>\r
+<td align="left" valign="top"><p class="table">A result was successfully found using <a href="#_the_direct_mode">the direct mode</a>.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cache hit (preprocessed)</p></td>\r
+<td align="left" valign="top"><p class="table">A result was successfully found using <a href="#_the_preprocessor_mode">the preprocessor mode</a>.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cache miss</p></td>\r
+<td align="left" valign="top"><p class="table">No result was found.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cache size</p></td>\r
+<td align="left" valign="top"><p class="table">Current size of the cache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">called for link</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler was called for linking, not compiling.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">called for preprocessing</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler was called for preprocessing, not compiling.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">can’t use precompiled header</p></td>\r
+<td align="left" valign="top"><p class="table">Preconditions for using <a href="#_precompiled_headers">precompiled headers</a> were not\r
+fulfilled.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">ccache internal error</p></td>\r
+<td align="left" valign="top"><p class="table">Unexpected failure, e.g. due to problems reading/writing the cache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">cleanups performed</p></td>\r
+<td align="left" valign="top"><p class="table">Number of cleanups performed, either implicitly due to the cache size limit\r
+being reached or due to explicit <strong>ccache -c/--cleanup</strong> calls.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">compile failed</p></td>\r
+<td align="left" valign="top"><p class="table">The compilation failed. No result stored in the cache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">compiler check failed</p></td>\r
+<td align="left" valign="top"><p class="table">A compiler check program specified by <strong>compiler_check</strong> (<strong>CCACHE_COMPILERCHECK</strong>)\r
+failed.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">compiler produced empty output</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler’s output file (typically an object file) was empty after\r
+compilation.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">compiler produced no output</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler’s output file (typically an object file) was missing after\r
+compilation.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">compiler produced stdout</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler wrote data to standard output. This is something that compilers\r
+normally never do, so ccache is not designed to store such output in the cache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">couldn’t find the compiler</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler to execute could not be found.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">error hashing extra file</p></td>\r
+<td align="left" valign="top"><p class="table">Failure reading a file specified by <strong>extra_files_to_hash</strong>\r
+(<strong>CCACHE_EXTRAFILES</strong>).</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">files in cache</p></td>\r
+<td align="left" valign="top"><p class="table">Current number of files in the cache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">multiple source files</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler was called to compile multiple source files in one go. This is not\r
+supported by ccache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">no input file</p></td>\r
+<td align="left" valign="top"><p class="table">No input file was specified to the compiler.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">output to a non-regular file</p></td>\r
+<td align="left" valign="top"><p class="table">The output path specified with <strong>-o</strong> is not a file (e.g. a directory or a device\r
+node).</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">output to stdout</p></td>\r
+<td align="left" valign="top"><p class="table">The compiler was instructed to write its output to standard output using <strong>-o\r
+-</strong>. This is not supported by ccache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">preprocessor error</p></td>\r
+<td align="left" valign="top"><p class="table">Preprocessing the source code using the compiler’s <strong>-E</strong> option failed.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">unsupported code directive</p></td>\r
+<td align="left" valign="top"><p class="table">Code like the assembler <strong>.incbin</strong> directive was found. This is not supported\r
+by ccache.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">unsupported compiler option</p></td>\r
+<td align="left" valign="top"><p class="table">A compiler option not supported by ccache was found.</p></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><p class="table">unsupported source language</p></td>\r
+<td align="left" valign="top"><p class="table">A source language e.g. specified with <strong>-x</strong> was unsupported by ccache.</p></td>\r
+</tr>\r
+</tbody>\r
+</table>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_how_ccache_works">How ccache works</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>The basic idea is to detect when you are compiling exactly the same code a\r
+second time and reuse the previously produced output. The detection is done by\r
+hashing different kinds of information that should be unique for the\r
+compilation and then using the hash sum to identify the cached output. ccache\r
+uses MD4, a very fast cryptographic hash algorithm, for the hashing. (MD4 is\r
+nowadays too weak to be useful in cryptographic contexts, but it should be safe\r
+enough to be used to identify recompilations.) On a cache hit, ccache is able\r
+to supply all of the correct compiler outputs (including all warnings,\r
+dependency file, etc) from the cache.</p></div>\r
+<div class="paragraph"><p>ccache has two ways of doing the detection:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+the <strong>direct mode</strong>, where ccache hashes the source code and include files\r
+ directly\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the <strong>preprocessor mode</strong>, where ccache runs the preprocessor on the source\r
+ code and hashes the result\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>The direct mode is generally faster since running the preprocessor has some\r
+overhead.</p></div>\r
+<div class="sect2">\r
+<h3 id="_common_hashed_information">Common hashed information</h3>\r
+<div class="paragraph"><p>For both modes, the following information is included in the hash:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+the extension used by the compiler for a file with preprocessor output\r
+ (normally <strong>.i</strong> for C code and <strong>.ii</strong> for C++ code)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the compiler’s size and modification time (or other compiler-specific\r
+ information specified by the <strong>compiler_check</strong> setting)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the name of the compiler\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the current directory (if the <strong>hash_dir</strong> setting is enabled)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+contents of files specified by the <strong>extra_files_to_hash</strong> setting (if any)\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_the_direct_mode">The direct mode</h3>\r
+<div class="paragraph"><p>In the direct mode, the hash is formed of the common information and:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+the input source file\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the command line options\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>Based on the hash, a data structure called “manifest” is looked up in the\r
+cache. The manifest contains:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+references to cached compilation results (object file, dependency file, etc)\r
+ that were produced by previous compilations that matched the hash\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+paths to the include files that were read at the time the compilation results\r
+ were stored in the cache\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+hash sums of the include files at the time the compilation results were\r
+ stored in the cache\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>The current contents of the include files are then hashed and compared to the\r
+information in the manifest. If there is a match, ccache knows the result of\r
+the compilation. If there is no match, ccache falls back to running the\r
+preprocessor. The output from the preprocessor is parsed to find the include\r
+files that were read. The paths and hash sums of those include files are then\r
+stored in the manifest along with information about the produced compilation\r
+result.</p></div>\r
+<div class="paragraph"><p>There is a catch with the direct mode: header files that were used by the\r
+compiler are recorded, but header files that were <strong>not</strong> used, but would have\r
+been used if they existed, are not. So, when ccache checks if a result can be\r
+taken from the cache, it currently can’t check if the existence of a new header\r
+file should invalidate the result. In practice, the direct mode is safe to use\r
+in the absolute majority of cases.</p></div>\r
+<div class="paragraph"><p>The direct mode will be disabled if any of the following holds:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+the configuration setting <strong>direct_mode</strong> is false\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+a modification time of one of the include files is too new (needed to avoid a\r
+ race condition)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+a compiler option not supported by the direct mode is used:\r
+</p>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+a <strong>-Wp,<em>X</em></strong> compiler option other than <strong>-Wp,-MD,<em>path</em></strong>,\r
+ <strong>-Wp,-MMD,<em>path</em></strong> and <strong>-Wp,-D_define_</strong>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<strong>-Xpreprocessor</strong>\r
+</p>\r
+</li>\r
+</ul></div>\r
+</li>\r
+<li>\r
+<p>\r
+the string <code>__TIME__</code> is present in the source code\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_the_preprocessor_mode">The preprocessor mode</h3>\r
+<div class="paragraph"><p>In the preprocessor mode, the hash is formed of the common information and:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+the preprocessor output from running the compiler with <strong>-E</strong>\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+the command line options except options that affect include files (<strong>-I</strong>,\r
+ <strong>-include</strong>, <strong>-D</strong>, etc; the theory is that these options will change the\r
+ preprocessor output if they have any effect at all)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+any standard error output generated by the preprocessor\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>Based on the hash, the cached compilation result can be looked up directly in\r
+the cache.</p></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_compiling_in_different_directories">Compiling in different directories</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Some information included in the hash that identifies a unique compilation can\r
+contain absolute paths:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The preprocessed source code may contain absolute paths to include files if\r
+ the compiler option <strong>-g</strong> is used or if absolute paths are given to <strong>-I</strong> and\r
+ similar compiler options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Paths specified by compiler options (such as <strong>-I</strong>, <strong>-MF</strong>, etc) on the command\r
+ line may be absolute.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The source code file path may be absolute, and that path may substituted for\r
+ <code>__FILE__</code> macros in the source code or included in warnings emitted to\r
+ standard error by the preprocessor.\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>This means that if you compile the same code in different locations, you can’t\r
+share compilation results between the different build directories since you get\r
+cache misses because of the absolute build directory paths that are part of the\r
+hash.</p></div>\r
+<div class="paragraph"><p>Here’s what can be done to enable cache hits between different build\r
+directories:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+If you build with <strong>-g</strong> (or similar) to add debug information to the object\r
+ file, you must either:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+use the <strong>-fdebug-prefix-map=<em>old</em>=<em>new</em></strong> option for relocating debug info to\r
+ a common prefix (e.g. <strong>-fdebug-prefix-map=$PWD=.</strong>); or\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+set <strong>hash_dir = false</strong>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div></div>\r
+</li>\r
+<li>\r
+<p>\r
+If you use absolute paths anywhere on the command line (e.g. the source code\r
+ file path or an argument to compiler options like <strong>-I</strong> and <strong>-MF</strong>), you must\r
+ to set <strong>base_dir</strong> to an absolute path to a “base directory”. ccache will\r
+ then rewrite absolute paths under that directory to relative before computing\r
+ the hash.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_precompiled_headers">Precompiled headers</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache has support for GCC’s precompiled headers. However, you have to do some\r
+things to make it work properly:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+You must set <strong>sloppiness</strong> to <strong>pch_defines,time_macros</strong>. The reason is that\r
+ ccache can’t tell whether <code>__TIME__</code> or <code>__DATE__</code> is used when using a\r
+ precompiled header. Further, it can’t detect changes in <strong>#define</strong>s in the\r
+ source code because of how preprocessing works in combination with\r
+ precompiled headers.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+You must either:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+use the <strong>-include</strong> compiler option to include the precompiled header\r
+ (i.e., don’t use <strong>#include</strong> in the source code to include the header); or\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+(for the Clang compiler) use the <strong>-include-pch</strong> compiler option to include\r
+ the PCH file generated from the precompiled header; or\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+add the <strong>-fpch-preprocess</strong> compiler option when compiling.\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>If you don’t do this, either the non-precompiled version of the header file\r
+will be used (if available) or ccache will fall back to running the real\r
+compiler and increase the statistics counter “preprocessor error” (if the\r
+non-precompiled header file is not available).</p></div>\r
+</div></div>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_sharing_a_cache">Sharing a cache</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>A group of developers can increase the cache hit rate by sharing a cache\r
+directory. To share a cache without unpleasant side effects, the following\r
+conditions should to be met:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Use the same cache directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Make sure that the configuration setting <strong>hard_link</strong> is false (which is the\r
+ default).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Make sure that all users are in the same group.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Set the configuration setting <strong>umask</strong> to 002. This ensures that cached files\r
+ are accessible to everyone in the group.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Make sure that all users have write permission in the entire cache directory\r
+ (and that you trust all users of the shared cache).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Make sure that the setgid bit is set on all directories in the cache. This\r
+ tells the filesystem to inherit group ownership for new directories. The\r
+ following command might be useful for this:\r
+</p>\r
+<div class="openblock">\r
+<div class="content">\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code>find $CCACHE_DIR -type d | xargs chmod g+s</code></pre>\r
+</div></div>\r
+</div></div>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>The reason to avoid the hard link mode is that the hard links cause unwanted\r
+side effects, as all links to a cached file share the file’s modification\r
+timestamp. This results in false dependencies to be triggered by\r
+timestamp-based build systems whenever another user links to an existing file.\r
+Typically, users will see that their libraries and binaries are relinked\r
+without reason.</p></div>\r
+<div class="paragraph"><p>You may also want to make sure that a base directory is set appropriately, as\r
+discussed in a previous section.</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_sharing_a_cache_on_nfs">Sharing a cache on NFS</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>It is possible to put the cache directory on an NFS filesystem (or similar\r
+filesystems), but keep in mind that:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Having the cache on NFS may slow down compilation. Make sure to do some\r
+ benchmarking to see if it’s worth it.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache hasn’t been tested very thoroughly on NFS.\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>A tip is to set <strong>temporary_dir</strong> to a directory on the local host to avoid NFS\r
+traffic for temporary files.</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_using_ccache_with_other_compiler_wrappers">Using ccache with other compiler wrappers</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>The recommended way of combining ccache with another compiler wrapper (such as\r
+“distcc”) is by letting ccache execute the compiler wrapper. This is\r
+accomplished by defining the configuration setting <strong>prefix_command</strong>, for\r
+example by setting the environment variable <strong>CCACHE_PREFIX</strong> to the name of the\r
+wrapper (e.g. <strong>distcc</strong>). ccache will then prefix the command line with the\r
+specified command when running the compiler. To specify several prefix\r
+commands, set <strong>prefix_command</strong> to a colon-separated list of commands.</p></div>\r
+<div class="paragraph"><p>Unless you set <strong>compiler_check</strong> to a suitable command (see the description of\r
+that configuration option), it is not recommended to use the form <strong>ccache\r
+anotherwrapper compiler args</strong> as the compilation command. It’s also not\r
+recommended to use the masquerading technique for the other compiler wrapper.\r
+The reason is that by default, ccache will in both cases hash the mtime and\r
+size of the other wrapper instead of the real compiler, which means that:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Compiler upgrades will not be detected properly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The cached results will not be shared between compilations with and without\r
+ the other wrapper.\r
+</p>\r
+</li>\r
+</ul></div>\r
+<div class="paragraph"><p>Another minor thing is that if <strong>prefix_command</strong> is used, ccache will not invoke\r
+the other wrapper when running the preprocessor, which increases performance.\r
+You can use the <strong>prefix_command_cpp</strong> configuration setting if you also want to\r
+invoke the other wrapper when doing preprocessing (normally by adding <strong>-E</strong>).</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_caveats">Caveats</h2>\r
+<div class="sectionbody">\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The direct mode fails to pick up new header files in some rare scenarios. See\r
+ <a href="#_the_direct_mode">THE DIRECT MODE</a> above.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+When run via ccache, warning messages produced by GCC 4.9 and newer will only\r
+ be colored when the environment variable <strong>GCC_COLORS</strong> is set. An alternative\r
+ to setting <strong>GCC_COLORS</strong> is to pass <code>-fdiagnostics-color</code> explicitly when\r
+ compiling (but then color codes will also be present when redirecting stderr\r
+ to a file).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If ccache guesses that the compiler may emit colored warnings, then a\r
+ compilation with stderr referring to a TTY will be considered different from\r
+ a compilation with a redirected stderr, thus not sharing cache entries. This\r
+ happens for clang by default and for GCC when <strong>GCC_COLORS</strong> is set as\r
+ mentioned above. If you want to share cache hits, you can pass\r
+ <code>-f[no-]diagnostics-color</code> (GCC) or <code>-f[no-]color-diagnostics</code> (clang)\r
+ explicitly when compiling (but then color codes will be either on or off for\r
+ both the TTY and the redirected case).\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_troubleshooting">Troubleshooting</h2>\r
+<div class="sectionbody">\r
+<div class="sect2">\r
+<h3 id="_general">General</h3>\r
+<div class="paragraph"><p>A general tip for getting information about what ccache is doing is to enable\r
+debug logging by setting <strong>log_file</strong>. The log contains executed commands,\r
+important decisions that ccache makes, read and written files, etc. Another way\r
+of keeping track of what is happening is to check the output of <strong>ccache -s</strong>.</p></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_performance">Performance</h3>\r
+<div class="paragraph"><p>ccache has been written to perform well out of the box, but sometimes you may\r
+have to do some adjustments of how you use the compiler and ccache in order to\r
+improve performance.</p></div>\r
+<div class="paragraph"><p>Since ccache works best when I/O is fast, put the cache directory on a fast\r
+storage device if possible. Having lots of free memory so that files in the\r
+cache directory stay in the disk cache is also preferable.</p></div>\r
+<div class="paragraph"><p>A good way of monitoring how well ccache works is to run <strong>ccache -s</strong> before and\r
+after your build and then compare the statistics counters. Here are some common\r
+problems and what may be done to increase the hit rate:</p></div>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+If “cache hit (preprocessed)” has been incremented instead of “cache hit\r
+ (direct)”, ccache has fallen back to preprocessor mode, which is generally\r
+ slower. Some possible reasons are:\r
+</p>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The source code has been modified in such a way that the preprocessor output\r
+ is not affected.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Compiler arguments that are hashed in the direct mode but not in the\r
+ preprocessor mode have changed (<strong>-I</strong>, <strong>-include</strong>, <strong>-D</strong>, etc) and they didn’t\r
+ affect the preprocessor output.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The compiler option <strong>-Xpreprocessor</strong> or <strong>-Wp,<em>X</em></strong> (except <strong>-Wp,-MD,<em>path</em></strong>,\r
+ <strong>-Wp,-MMD,<em>path</em></strong>, and <strong>-Wp,-D_define_</strong>) is used.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+This was the first compilation with a new value of the base directory\r
+ setting.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+A modification time of one of the include files is too new (created the same\r
+ second as the compilation is being done). This check is made to avoid a race\r
+ condition. To fix this, create the include file earlier in the build\r
+ process, if possible, or set <strong>sloppiness</strong> to <strong>include_file_mtime</strong> if you are\r
+ willing to take the risk. (The race condition consists of these events: the\r
+ preprocessor is run; an include file is modified by someone; the new include\r
+ file is hashed by ccache; the real compiler is run on the preprocessor’s\r
+ output, which contains data from the old header file; the wrong object file\r
+ is stored in the cache.)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The <code>__TIME__</code> preprocessor macro is (potentially) being used. ccache turns\r
+ off direct mode if <code>__TIME__</code> is present in the source code. This is done as\r
+ a safety measure since the string indicates that a <code>__TIME__</code> macro <em>may</em>\r
+ affect the output. (To be sure, ccache would have to run the preprocessor,\r
+ but the sole point of the direct mode is to avoid that.) If you know that\r
+ <code>__TIME__</code> isn’t used in practise, or don’t care if ccache produces objects\r
+ where <code>__TIME__</code> is expanded to something in the past, you can set\r
+ <strong>sloppiness</strong> to <strong>time_macros</strong>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The <code>__DATE__</code> preprocessor macro is (potentially) being used and the date\r
+ has changed. This is similar to how <code>__TIME__</code> is handled. If <code>__DATE__</code> is\r
+ present in the source code, ccache hashes the current date in order to be\r
+ able to produce the correct object file if the <code>__DATE__</code> macro affects the\r
+ output. If you know that <code>__DATE__</code> isn’t used in practise, or don’t care if\r
+ ccache produces objects where <code>__DATE__</code> is expanded to something in the\r
+ past, you can set <strong>sloppiness</strong> to <strong>time_macros</strong>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The <code>__FILE__</code> preprocessor macro is (potentially) being used and the file\r
+ path has changed. If <code>__FILE__</code> is present in the source code, ccache hashes\r
+ the current input file path in order to be able to produce the correct\r
+ object file if the <code>__FILE__</code> macro affects the output. If you know that\r
+ <code>__FILE__</code> isn’t used in practise, or don’t care if ccache produces objects\r
+ where <code>__FILE__</code> is expanded to the wrong path, you can set <strong>sloppiness</strong> to\r
+ <strong>file_macro</strong>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</li>\r
+<li>\r
+<p>\r
+If “cache miss” has been incremented even though the same code has been\r
+ compiled and cached before, ccache has either detected that something has\r
+ changed anyway or a cleanup has been performed (either explicitly or\r
+ implicitly when a cache limit has been reached). Some perhaps unobvious\r
+ things that may result in a cache miss are usage of <code>__TIME__</code> or\r
+ <code>__DATE__</code> macros, or use of automatically generated code that contains a\r
+ timestamp, build counter or other volatile information.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If “multiple source files” has been incremented, it’s an indication that\r
+ the compiler has been invoked on several source code files at once. ccache\r
+ doesn’t support that. Compile the source code files separately if possible.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If “unsupported compiler option” has been incremented, enable debug logging\r
+ and check which option was rejected.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If “preprocessor error” has been incremented, one possible reason is that\r
+ precompiled headers are being used. See <a href="#_precompiled_headers">PRECOMPILED HEADERS</a> for how to remedy this.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If “can’t use precompiled header” has been incremented, see\r
+ <a href="#_precompiled_headers">PRECOMPILED HEADERS</a>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_corrupt_object_files">Corrupt object files</h3>\r
+<div class="paragraph"><p>It should be noted that ccache is susceptible to general storage problems. If a\r
+bad object file sneaks into the cache for some reason, it will of course stay\r
+bad. Some possible reasons for erroneous object files are bad hardware (disk\r
+drive, disk controller, memory, etc), buggy drivers or file systems, a bad\r
+<strong>prefix_command</strong> or compiler wrapper. If this happens, the easiest way of\r
+fixing it is this:</p></div>\r
+<div class="olist arabic"><ol class="arabic">\r
+<li>\r
+<p>\r
+Build so that the bad object file ends up in the build tree.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Remove the bad object file from the build tree.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Rebuild with <strong>CCACHE_RECACHE</strong> set.\r
+</p>\r
+</li>\r
+</ol></div>\r
+<div class="paragraph"><p>An alternative is to clear the whole cache with <strong>ccache -C</strong> if you don’t mind\r
+losing other cached results.</p></div>\r
+<div class="paragraph"><p>There are no reported issues about ccache producing broken object files\r
+reproducibly. That doesn’t mean it can’t happen, so if you find a repeatable\r
+case, please report it.</p></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_more_information">More information</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Credits, mailing list information, bug reporting instructions, source code,\r
+etc, can be found on ccache’s web site: <a href="https://ccache.samba.org">https://ccache.samba.org</a>.</p></div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_author">Author</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>ccache was originally written by Andrew Tridgell and is currently developed and\r
+maintained by Joel Rosdahl. See AUTHORS.txt or AUTHORS.html and\r
+<a href="https://ccache.samba.org/credits.html">https://ccache.samba.org/credits.html</a> for a list of contributors.</p></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div id="footnotes"><hr /></div>\r
+<div id="footer">\r
+<div id="footer-text">\r
+Version 3.4.2<br />\r
+Last updated\r
+ 2018-03-15 21:34:36 CET\r
+</div>\r
+</div>\r
+</body>\r
+</html>\r
+++ /dev/null
-CCACHE(1)
-=========
-:man source: ccache
-:man version: {revnumber}
-:man manual: ccache Manual
-
-
-Name
-----
-
-ccache - a fast C/C++ compiler cache
-
-
-Synopsis
---------
-
-[verse]
-*ccache* ['options']
-*ccache* 'compiler' ['compiler options']
-'compiler' ['compiler options'] (via symbolic link)
-
-
-Description
------------
-
-ccache is a compiler cache. It speeds up recompilation by caching the result of
-previous compilations and detecting when the same compilation is being done
-again. Supported languages are C, C\+\+, Objective-C and Objective-C++.
-
-ccache has been carefully written to always produce exactly the same compiler
-output that you would get without the cache. The only way you should be able to
-tell that you are using ccache is the speed. Currently known exceptions to this
-goal are listed under <<_caveats,CAVEATS>>. If you ever discover an
-undocumented case where ccache changes the output of your compiler, please let
-us know.
-
-
-Features
-~~~~~~~~
-
-* Keeps statistics on hits/misses.
-* Automatic cache size management.
-* Can cache compilations that generate warnings.
-* Easy installation.
-* Low overhead.
-* Optionally compresses files in the cache to reduce disk space.
-
-
-Limitations
-~~~~~~~~~~~
-
-* Only knows how to cache the compilation of a single
- C/C\+\+/Objective-C/Objective-C++ file. Other types of compilations
- (multi-file compilation, linking, etc) will silently fall back to running the
- real compiler.
-* Only works with GCC and compilers that behave similar enough.
-* Some compiler flags are not supported. If such a flag is detected, ccache
- will silently fall back to running the real compiler.
-
-
-Run modes
----------
-
-There are two ways to use ccache. You can either prefix your compilation
-commands with *ccache* or you can let ccache masquerade as the compiler by
-creating a symbolic link (named as the compiler) to ccache. The first method is
-most convenient if you just want to try out ccache or wish to use it for some
-specific projects. The second method is most useful for when you wish to use
-ccache for all your compilations.
-
-To use the first method, just make sure that *ccache* is in your *PATH*.
-
-To use the symlinks method, do something like this:
-
--------------------------------------------------------------------------------
-cp ccache /usr/local/bin/
-ln -s ccache /usr/local/bin/gcc
-ln -s ccache /usr/local/bin/g++
-ln -s ccache /usr/local/bin/cc
-ln -s ccache /usr/local/bin/c++
--------------------------------------------------------------------------------
-
-And so forth. This will work as long as the directory with symlinks comes
-before the path to the compiler (which is usually in +/usr/bin+). After
-installing you may wish to run ``which gcc'' to make sure that the correct link
-is being used.
-
-WARNING: The technique of letting ccache masquerade as the compiler works well,
-but currently doesn't interact well with other tools that do the same thing.
-See <<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER
-COMPILER WRAPPERS>>.
-
-WARNING: Do not use a hard link, use a symbolic link. A hard link will cause
-``interesting'' problems.
-
-Options
--------
-
-These options only apply when you invoke ccache as ``ccache''. When invoked as
-a compiler (via a symlink as described in the previous section), the normal
-compiler options apply and you should refer to the compiler's documentation.
-
-*-c, --cleanup*::
-
- Clean up the cache by removing old cached files until the specified file
- number and cache size limits are not exceeded. This also recalculates the
- cache file count and size totals. Normally, there is no need to initiate
- cleanup manually as ccache keeps the cache below the specified limits at
- runtime and keeps statistics up to date on each compilation. Forcing a
- cleanup is mostly useful if you manually modify the cache contents or
- believe that the cache size statistics may be inaccurate.
-
-*-C, --clear*::
-
- Clear the entire cache, removing all cached files, but keeping the
- configuration file.
-
-*-F, --max-files*='N'::
-
- Set the maximum number of files allowed in the cache. Use 0 for no limit.
- The value is stored in a configuration file in the cache directory and
- applies to all future compilations.
-
-*-h, --help*::
-
- Print an options summary page.
-
-*-M, --max-size*='SIZE'::
-
- Set the maximum size of the files stored in the cache. 'SIZE' should be a
- number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or
- Ti (binary). The default suffix is G. Use 0 for no limit. The value is
- stored in a configuration file in the cache directory and applies to all
- future compilations.
-
-*-o, --set-config*='KEY=VALUE'::
-
- Set configuration 'KEY' to 'VALUE'. See <<_configuration,CONFIGURATION>>
- for more information.
-
-*-p, --print-config*::
-
- Print current configuration options and from where they originate
- (environment variable, configuration file or compile-time default).
-
-*-s, --show-stats*::
-
- Print the current statistics summary for the cache.
-
-*-V, --version*::
-
- Print version and copyright information.
-
-*-z, --zero-stats*::
-
- Zero the cache statistics (but not the configuration options).
-
-
-Extra options
--------------
-
-When run as a compiler, ccache usually just takes the same command line options
-as the compiler you are using. The only exception to this is the option
-*--ccache-skip*. That option can be used to tell ccache to avoid interpreting
-the next option in any way and to pass it along to the compiler as-is.
-
-NOTE: *--ccache-skip* currently only tells ccache not to interpret the next
-option as a special compiler option -- the option will still be included in the
-direct mode hash.
-
-The reason this can be important is that ccache does need to parse the command
-line and determine what is an input filename and what is a compiler option, as
-it needs the input filename to determine the name of the resulting object file
-(among other things). The heuristic ccache uses when parsing the command line
-is that any argument that exists as a file is treated as an input file name. By
-using *--ccache-skip* you can force an option to not be treated as an input
-file name and instead be passed along to the compiler as a command line option.
-
-Another case where *--ccache-skip* can be useful is if ccache interprets an
-option specially but shouldn't, since the option has another meaning for your
-compiler than what ccache thinks.
-
-
-Configuration
--------------
-
-ccache's default behavior can be overridden by configuration file settings,
-which in turn can be overridden by environment variables with names starting
-with *CCACHE_*. ccache normally reads configuration from two files: first a
-system-level configuration file and secondly a cache-specific configuration
-file. The priority of configuration settings is as follows (where 1 is
-highest):
-
-1. Environment variables.
-2. The cache-specific configuration file *<ccachedir>/ccache.conf* (typically
- *$HOME/.ccache/ccache.conf*).
-3. The system-wide configuration file *<sysconfdir>/ccache.conf* (typically
- */etc/ccache.conf* or */usr/local/etc/ccache.conf*).
-4. Compile-time defaults.
-
-As a special case, if the environment variable *CCACHE_CONFIGPATH* is set,
-ccache reads configuration from the specified path instead of the default
-paths.
-
-
-Configuration file syntax
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Configuration files are in a simple ``key = value'' format, one setting per
-line. Lines starting with a hash sign are comments. Blank lines are ignored, as
-is whitespace surrounding keys and values. Example:
-
--------------------------------------------------------------------------------
-# Set maximum cache size to 10 GB:
-max_size = 10G
--------------------------------------------------------------------------------
-
-Boolean values
-~~~~~~~~~~~~~~
-
-Some settings are boolean values (i.e. truth values). In a configuration file,
-such values must be set to the string *true* or *false*. For the corresponding
-environment variables, the semantics are a bit different: a set environment
-variable means ``true'' (even if set to the empty string), the following
-case-insensitive negative values are considered an error (rather than
-surprising the user): *0*, *false*, *disable* and *no*, and an unset
-environment variable means ``false''. Each boolean environment variable also
-has a negated form starting with *CCACHE_NO*. For example, *CCACHE_COMPRESS*
-can be set to force compression and *CCACHE_NOCOMPRESS* can be set to force no
-compression.
-
-
-Configuration settings
-~~~~~~~~~~~~~~~~~~~~~~
-
-Below is a list of available configuration settings. The corresponding
-environment variable name is indicated in parentheses after each configuration
-setting key.
-
-*base_dir* (*CCACHE_BASEDIR*)::
-
- This setting should be an absolute path to a directory. ccache then
- rewrites absolute paths into relative paths before computing the hash that
- identifies the compilation, but only for paths under the specified
- directory. If set to the empty string (which is the default), no rewriting
- is done. A typical path to use as the base directory is your home directory
- or another directory that is a parent of your build directories. Don't use
- +/+ as the base directory since that will make ccache also rewrite paths to
- system header files, which doesn't gain anything.
-+
-See also the discussion under <<_compiling_in_different_directories,COMPILING
-IN DIFFERENT DIRECTORIES>>.
-
-*cache_dir* (*CCACHE_DIR*)::
-
- This setting specifies where ccache will keep its cached compiler outputs.
- It will only take effect if set in the system-wide configuration file or as
- an environment variable. The default is *$HOME/.ccache*.
-
-*cache_dir_levels* (*CCACHE_NLEVELS*)::
-
- This setting allows you to choose the number of directory levels in the
- cache directory. The default is 2. The minimum is 1 and the maximum is 8.
-
-*compiler* (*CCACHE_CC*)::
-
- This setting can be used to force the name of the compiler to use. If set
- to the empty string (which is the default), ccache works it out from the
- command line.
-
-*compiler_check* (*CCACHE_COMPILERCHECK*)::
-
- By default, ccache includes the modification time (``mtime'') and size of
- the compiler in the hash to ensure that results retrieved from the cache
- are accurate. This setting can be used to select another strategy. Possible
- values are:
-+
---
-*content*::
- Hash the content of the compiler binary. This makes ccache very slightly
- slower compared to the *mtime* setting, but makes it cope better with
- compiler upgrades during a build bootstrapping process.
-*mtime*::
- Hash the compiler's mtime and size, which is fast. This is the default.
-*none*::
- Don't hash anything. This may be good for situations where you can safely
- use the cached results even though the compiler's mtime or size has changed
- (e.g. if the compiler is built as part of your build system and the
- compiler's source has not changed, or if the compiler only has changes that
- don't affect code generation). You should only use the *none* setting if
- you know what you are doing.
-*string:value*::
- Use *value* as the string to calculate hash from. This can be the compiler
- revision number you retrieved earlier and set here via environment variable.
-_a command string_::
- Hash the standard output and standard error output of the specified
- command. The string will be split on whitespace to find out the command and
- arguments to run. No other interpretation of the command string will be
- done, except that the special word *%compiler%* will be replaced with the
- path to the compiler. Several commands can be specified with semicolon as
- separator. Examples:
-+
---
-
-----
-%compiler% -v
-----
-
-----
-%compiler% -dumpmachine; %compiler% -dumpversion
-----
-
-You should make sure that the specified command is as fast as possible since it
-will be run once for each ccache invocation.
-
-Identifying the compiler using a command is useful if you want to avoid cache
-misses when the compiler has been rebuilt but not changed.
-
-Another case is when the compiler (as seen by ccache) actually isn't the real
-compiler but another compiler wrapper -- in that case, the default *mtime*
-method will hash the mtime and size of the other compiler wrapper, which means
-that ccache won't be able to detect a compiler upgrade. Using a suitable
-command to identify the compiler is thus safer, but it's also slower, so you
-should consider continue using the *mtime* method in combination with
-the *prefix_command* setting if possible. See
-<<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER COMPILER
-WRAPPERS>>.
---
---
-
-*compression* (*CCACHE_COMPRESS* or *CCACHE_NOCOMPRESS*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will compress object files and other compiler output it
- puts in the cache. However, this setting has no effect on how files are
- retrieved from the cache; compressed and uncompressed results will still be
- usable regardless of this setting. The default is false.
-
-*compression_level* (*CCACHE_COMPRESSLEVEL*)::
-
- This setting determines the level at which ccache will compress object
- files. It only has effect if *compression* is enabled. The value defaults
- to 6, and must be no lower than 1 (fastest, worst compression) and no
- higher than 9 (slowest, best compression).
-
-*cpp_extension* (*CCACHE_EXTENSION*)::
-
- This setting can be used to force a certain extension for the intermediate
- preprocessed file. The default is to automatically determine the extension
- to use for intermediate preprocessor files based on the type of file being
- compiled, but that sometimes doesn't work. For example, when using the
- ``aCC'' compiler on HP-UX, set the cpp extension to *i*.
-
-*direct_mode* (*CCACHE_DIRECT* or *CCACHE_NODIRECT*, see <<_boolean_values,Boolean values>> above)::
-
- If true, the direct mode will be used. The default is true. See
- <<_the_direct_mode,THE DIRECT MODE>>.
-
-*disable* (*CCACHE_DISABLE* or *CCACHE_NODISABLE*, see <<_boolean_values,Boolean values>> above)::
-
- When true, ccache will just call the real compiler, bypassing the cache
- completely. The default is false.
-
-*extra_files_to_hash* (*CCACHE_EXTRAFILES*)::
-
- This setting is a list of paths to files that ccache will include in the
- the hash sum that identifies the build. The list separator is semicolon on
- Windows systems and colon on other systems.
-
-*hard_link* (*CCACHE_HARDLINK* or *CCACHE_NOHARDLINK*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will attempt to use hard links from the cache directory
- when creating the compiler output rather than using a file copy. Hard links
- are never made for compressed cache files. This means that you should not
- enable compression if you want to use hard links. The default is false.
-+
-WARNING: Do not enable this option unless you are aware of the consequences.
-Using hard links may be slightly faster in some situations, but there are
-several pitfalls since the resulting object file will share i-node with the
-cached object file:
-+
-1. If the resulting object file is modified in any way, the cached object file
- will be modified as well. For instance, if you run *strip object.o* or *echo
- >object.o*, you will corrupt the cache.
-2. Programs that rely on modification times (like ``make'') can be confused
- since ccache updates the cached files' modification times as part of the
- automatic cache size management. This will affect object files in the build
- tree as well, which can retrigger the linking step even though nothing
- really has changed.
-
-*hash_dir* (*CCACHE_HASHDIR* or *CCACHE_NOHASHDIR*, see <<_boolean_values,Boolean values>> above)::
-
- If true (which is the default), ccache will include the current working
- directory (CWD) in the hash that is used to distinguish two compilations
- when generating debug info (compiler option *-g* with variations).
- Exception: The CWD will not be included in the hash if *base_dir* is set
- (and matches the CWD) and the compiler option *-fdebug-prefix-map* is used.
- See also the discussion under
- <<_compiling_in_different_directories,COMPILING IN DIFFERENT DIRECTORIES>>.
-+
-The reason for including the CWD in the hash by default is to prevent a problem
-with the storage of the current working directory in the debug info of an
-object file, which can lead ccache to return a cached object file that has the
-working directory in the debug info set incorrectly.
-+
-You can disable this setting to get cache hits when compiling the same source
-code in different directories if you don't mind that CWD in the debug info
-might be incorrect.
-
-*ignore_headers_in_manifest* (*CCACHE_IGNOREHEADERS*)::
-
- This setting is a list of paths to files (or directories with headers) that
- ccache will *not* include in the manifest list that makes up the direct
- mode. Note that this can cause stale cache hits if those headers do indeed
- change. The list separator is semicolon on Windows systems and colon on
- other systems.
-
-*keep_comments_cpp* (*CCACHE_COMMENTS* or *CCACHE_NOCOMMENTS*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will not discard the comments before hashing preprocessor
- output. This can be used to check documentation with *-Wdocumentation*.
-
-*limit_multiple* (*CCACHE_LIMIT_MULTIPLE*)::
-
- Sets the limit when cleaning up. Files are deleted (in LRU order) until the
- levels are below the limit. The default is 0.8 (= 80%). See
- <<_automatic_cleanup,AUTOMATIC CLEANUP>> for more information.
-
-*log_file* (*CCACHE_LOGFILE*)::
-
- If set to a file path, ccache will write information on what it is doing to
- the specified file. This is useful for tracking down problems.
-
-*max_files* (*CCACHE_MAXFILES*)::
-
- This option specifies the maximum number of files to keep in the cache. Use
- 0 for no limit (which is the default). See also
- <<_cache_size_management,CACHE SIZE MANAGEMENT>>.
-
-*max_size* (*CCACHE_MAXSIZE*)::
-
- This option specifies the maximum size of the cache. Use 0 for no limit.
- The default value is 5G. Available suffixes: k, M, G, T (decimal) and Ki,
- Mi, Gi, Ti (binary). The default suffix is "G". See also
- <<_cache_size_management,CACHE SIZE MANAGEMENT>>.
-
-*path* (*CCACHE_PATH*)::
-
- If set, ccache will search directories in this list when looking for the
- real compiler. The list separator is semicolon on Windows systems and colon
- on other systems. If not set, ccache will look for the first executable
- matching the compiler name in the normal *PATH* that isn't a symbolic link
- to ccache itself.
-
-*prefix_command* (*CCACHE_PREFIX*)::
-
- This option adds a list of prefixes (separated by space) to the command
- line that ccache uses when invoking the compiler. See also
- <<_using_ccache_with_other_compiler_wrappers,USING CCACHE WITH OTHER
- COMPILER WRAPPERS>>.
-
-*prefix_command_cpp* (*CCACHE_PREFIX_CPP*)::
-
- This option adds a list of prefixes (separated by space) to the command
- line that ccache uses when invoking the preprocessor.
-
-*read_only* (*CCACHE_READONLY* or *CCACHE_NOREADONLY*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will attempt to use existing cached object files, but it
- will not to try to add anything new to the cache. If you are using this
- because your ccache directory is read-only, then you need to set
- *temporary_dir* as otherwise ccache will fail to create temporary files.
-
-*read_only_direct* (*CCACHE_READONLY_DIRECT* or *CCACHE_NOREADONLY_DIRECT*, see <<_boolean_values,Boolean values>> above)::
-
- Just like *read_only* except that ccache will only try to retrieve results
- from the cache using the direct mode, not the preprocessor mode. See
- documentation for *read_only* regarding using a read-only ccache directory.
-
-*recache* (*CCACHE_RECACHE* or *CCACHE_NORECACHE*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will not use any previously stored result. New results will
- still be cached, possibly overwriting any pre-existing results.
-
-*run_second_cpp* (*CCACHE_CPP2* or *CCACHE_NOCPP2*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will first run the preprocessor to preprocess the source
- code (see <<_the_preprocessor_mode,THE PREPROCESSOR MODE>>) and then on a
- cache miss run the compiler on the source code to get hold of the object
- file. This is the default.
-+
-If false, ccache will first run preprocessor to preprocess the source code and
-then on a cache miss run the compiler on the _preprocessed source code_ instead
-of the original source code. This makes cache misses slightly faster since the
-source code only has to be preprocessed once. The downside is that some
-compilers won't produce the same result (for instance diagnostics warnings)
-when compiling preprocessed source code.
-+
-A solution to the above mentioned downside is to set *run_second_cpp* to false
-and pass *-fdirectives-only* (for GCC) or *-frewrite-includes* (for Clang) to
-the compiler. This will cause the compiler to leave the macros and other
-preprocessor information, and only process the *#include* directives. When run
-in this way, the preprocessor arguments will be passed to the compiler since it
-still has to do _some_ preprocessing (like macros).
-
-*sloppiness* (*CCACHE_SLOPPINESS*)::
-
- By default, ccache tries to give as few false cache hits as possible.
- However, in certain situations it's possible that you know things that
- ccache can't take for granted. This setting makes it possible to tell
- ccache to relax some checks in order to increase the hit rate. The value
- should be a comma-separated string with options. Available options are:
-+
---
-*file_macro*::
- Ignore *\_\_FILE__* being present in the source.
-*file_stat_matches*::
- ccache normally examines a file's contents to determine whether it matches
- the cached version. With this option set, ccache will consider a file as
- matching its cached version if the mtimes and ctimes match.
-*include_file_ctime*::
- By default, ccache also will not cache a file if it includes a header whose
- ctime is too new. This option disables that check.
-*include_file_mtime*::
- By default, ccache will not cache a file if it includes a header whose
- mtime is too new. This option disables that check.
-*no_system_headers*::
- By default, ccache will also include all system headers in the manifest.
- With this option set, ccache will only include system headers in the hash
- but not add the system header files to the list of include files.
-*pch_defines*::
- Be sloppy about **#define**s when precompiling a header file. See
- <<_precompiled_headers,PRECOMPILED HEADERS>> for more information.
-*time_macros*::
- Ignore *\_\_DATE\__* and *\_\_TIME__* being present in the source code.
---
-+
-See the discussion under <<_troubleshooting,TROUBLESHOOTING>> for more
-information.
-
-*stats* (*CCACHE_STATS* or *CCACHE_NOSTATS*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will update the statistics counters on each compilation.
- The default is true.
-
-*temporary_dir* (*CCACHE_TEMPDIR*)::
-
- This setting specifies where ccache will put temporary files. The default
- is *<cache_dir>/tmp*.
-+
-NOTE: In previous versions of ccache, *CCACHE_TEMPDIR* had to be on the same
- filesystem as the *CCACHE_DIR* path, but this requirement has been
- relaxed.)
-
-*umask* (*CCACHE_UMASK*)::
-
- This setting specifies the umask for ccache and all child processes (such
- as the compiler). This is mostly useful when you wish to share your cache
- with other users. Note that this also affects the file permissions set on
- the object files created from your compilations.
-
-*unify* (*CCACHE_UNIFY* or *CCACHE_NOUNIFY*, see <<_boolean_values,Boolean values>> above)::
-
- If true, ccache will use a C/C++ unifier when hashing the preprocessor
- output if the *-g* option is not used. The unifier is slower than a normal
- hash, so setting this environment variable loses a little bit of speed, but
- it means that ccache can take advantage of not recompiling when the changes
- to the source code consist of reformatting only. Note that enabling the
- unifier changes the hash, so cached compilations produced when the unifier
- is enabled cannot be reused when the unifier is disabled, and vice versa.
- Enabling the unifier may result in incorrect line number information in
- compiler warning messages and expansions of the *\_\_LINE__* macro.
-
-
-Cache size management
----------------------
-
-By default, ccache has a 5 GB limit on the total size of files in the cache and
-no limit on the number of files. You can set different limits using the
-*-M*/*--max-size* and *-F*/*--max-files* options. Use *ccache -s/--show-stats*
-to see the cache size and the currently configured limits (in addition to other
-various statistics).
-
-Cleanup can be triggered in two different ways: automatic and manual.
-
-
-Automatic cleanup
-~~~~~~~~~~~~~~~~~
-
-ccache maintains counters for various statistics about the cache, including the
-size and number of all cached files. In order to improve performance and reduce
-issues with concurrent ccache invocations, there is one statistics file for
-each of the sixteen subdirectories in the cache.
-
-After a new compilation result has been written to the cache, ccache will
-update the size and file number statistics for the subdirectory (one of
-sixteen) to which the result was written. Then, if the size counter for said
-subdirectory is greater than *max_size / 16* or the file number counter is
-greater than *max_files / 16*, automatic cleanup is triggered.
-
-When automatic cleanup is triggered for a subdirectory in the cache, ccache
-will:
-
-1. Count all files in the subdirectory and compute their aggregated size.
-2. Remove files in LRU (least recently used) order until the size is at most
- *limit_multiple * max_size / 16* and the number of files is at most
- *limit_multiple * max_files / 16*, where *limit_multiple*, *max_size* and
- *max_files* are configuration settings.
-3. Set the size and file number counters to match the files that were kept.
-
-The reason for removing more files than just those needed to not exceed the max
-limits is that a cleanup is a fairly slow operation, so it would not be a good
-idea to trigger it often, like after each cache miss.
-
-
-Manual cleanup
-~~~~~~~~~~~~~~
-
-You can run *ccache -c/--cleanup* to force cleanup of the whole cache, i.e. all
-of the sixteen subdirectories. This will recalculate the statistics counters
-and make sure that the *max_size* and *max_files* settings are not exceeded.
-Note that *limit_multiple* is not taken into account for manual cleanup.
-
-
-Cache compression
------------------
-
-ccache can optionally compress all files it puts into the cache using the
-compression library zlib. While this may involve a tiny performance slowdown,
-it increases the number of files that fit in the cache. You can turn on
-compression with the *compression* configuration setting and you can also tweak
-the compression level with *compression_level*.
-
-
-Cache statistics
-----------------
-
-*ccache -s/--show-stats* can show the following statistics:
-
-[options="header",cols="30%,70%"]
-|==============================================================================
-|Name | Description
-| autoconf compile/link |
-Uncachable compilation or linking by an autoconf test.
-
-| bad compiler arguments |
-Malformed compiler argument, e.g. missing a value for an option that requires
-an argument or failure to read a file specified by an option argument.
-
-| cache file missing |
-A file was unexpectedly missing from the cache. This only happens in rare
-situations, e.g. if one ccache instance is about to get a file from the cache
-while another instance removed the file as part of cache cleanup.
-
-| cache hit (direct) |
-A result was successfully found using <<_the_direct_mode,the direct mode>>.
-
-| cache hit (preprocessed) |
-A result was successfully found using <<_the_preprocessor_mode,the preprocessor
-mode>>.
-
-| cache miss |
-No result was found.
-
-| cache size |
-Current size of the cache.
-
-| called for link |
-The compiler was called for linking, not compiling.
-
-| called for preprocessing |
-The compiler was called for preprocessing, not compiling.
-
-| can't use precompiled header |
-Preconditions for using <<_precompiled_headers,precompiled headers>> were not
-fulfilled.
-
-| ccache internal error |
-Unexpected failure, e.g. due to problems reading/writing the cache.
-
-| cleanups performed |
-Number of cleanups performed, either implicitly due to the cache size limit
-being reached or due to explicit *ccache -c/--cleanup* calls.
-
-| compile failed |
-The compilation failed. No result stored in the cache.
-
-| compiler check failed |
-A compiler check program specified by *compiler_check* (*CCACHE_COMPILERCHECK*)
-failed.
-
-| compiler produced empty output |
-The compiler's output file (typically an object file) was empty after
-compilation.
-
-| compiler produced no output |
-The compiler's output file (typically an object file) was missing after
-compilation.
-
-| compiler produced stdout |
-The compiler wrote data to standard output. This is something that compilers
-normally never do, so ccache is not designed to store such output in the cache.
-
-| couldn't find the compiler |
-The compiler to execute could not be found.
-
-| error hashing extra file |
-Failure reading a file specified by *extra_files_to_hash*
-(*CCACHE_EXTRAFILES*).
-
-| files in cache |
-Current number of files in the cache.
-
-| multiple source files |
-The compiler was called to compile multiple source files in one go. This is not
-supported by ccache.
-
-| no input file |
-No input file was specified to the compiler.
-
-| output to a non-regular file |
-The output path specified with *-o* is not a file (e.g. a directory or a device
-node).
-
-| output to stdout |
-The compiler was instructed to write its output to standard output using *-o
--*. This is not supported by ccache.
-
-| preprocessor error |
-Preprocessing the source code using the compiler's *-E* option failed.
-
-| unsupported code directive |
-Code like the assembler ``.incbin'' directive was found. This is not supported
-by ccache.
-
-| unsupported compiler option |
-A compiler option not supported by ccache was found.
-
-| unsupported source language |
-A source language e.g. specified with *-x* was unsupported by ccache.
-
-|==============================================================================
-
-
-How ccache works
-----------------
-
-The basic idea is to detect when you are compiling exactly the same code a
-second time and reuse the previously produced output. The detection is done by
-hashing different kinds of information that should be unique for the
-compilation and then using the hash sum to identify the cached output. ccache
-uses MD4, a very fast cryptographic hash algorithm, for the hashing. (MD4 is
-nowadays too weak to be useful in cryptographic contexts, but it should be safe
-enough to be used to identify recompilations.) On a cache hit, ccache is able
-to supply all of the correct compiler outputs (including all warnings,
-dependency file, etc) from the cache.
-
-ccache has two ways of doing the detection:
-
-* the *direct mode*, where ccache hashes the source code and include files
- directly
-* the *preprocessor mode*, where ccache runs the preprocessor on the source
- code and hashes the result
-
-The direct mode is generally faster since running the preprocessor has some
-overhead.
-
-
-Common hashed information
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-For both modes, the following information is included in the hash:
-
-* the extension used by the compiler for a file with preprocessor output
- (normally *.i* for C code and *.ii* for C++ code)
-* the compiler's size and modification time (or other compiler-specific
- information specified by the *compiler_check* setting)
-* the name of the compiler
-* the current directory (if the *hash_dir* setting is enabled)
-* contents of files specified by the *extra_files_to_hash* setting (if any)
-
-
-The direct mode
-~~~~~~~~~~~~~~~
-
-In the direct mode, the hash is formed of the common information and:
-
-* the input source file
-* the command line options
-
-Based on the hash, a data structure called ``manifest'' is looked up in the
-cache. The manifest contains:
-
-* references to cached compilation results (object file, dependency file, etc)
- that were produced by previous compilations that matched the hash
-* paths to the include files that were read at the time the compilation results
- were stored in the cache
-* hash sums of the include files at the time the compilation results were
- stored in the cache
-
-The current contents of the include files are then hashed and compared to the
-information in the manifest. If there is a match, ccache knows the result of
-the compilation. If there is no match, ccache falls back to running the
-preprocessor. The output from the preprocessor is parsed to find the include
-files that were read. The paths and hash sums of those include files are then
-stored in the manifest along with information about the produced compilation
-result.
-
-There is a catch with the direct mode: header files that were used by the
-compiler are recorded, but header files that were *not* used, but would have
-been used if they existed, are not. So, when ccache checks if a result can be
-taken from the cache, it currently can't check if the existence of a new header
-file should invalidate the result. In practice, the direct mode is safe to use
-in the absolute majority of cases.
-
-The direct mode will be disabled if any of the following holds:
-
-* the configuration setting *direct_mode* is false
-* a modification time of one of the include files is too new (needed to avoid a
- race condition)
-* a compiler option not supported by the direct mode is used:
-** a *-Wp,_X_* compiler option other than *-Wp,-MD,_path_*,
- *-Wp,-MMD,_path_* and *-Wp,-D_define_*
-** *-Xpreprocessor*
-* the string ``\_\_TIME__'' is present in the source code
-
-
-The preprocessor mode
-~~~~~~~~~~~~~~~~~~~~~
-
-In the preprocessor mode, the hash is formed of the common information and:
-
-* the preprocessor output from running the compiler with *-E*
-* the command line options except options that affect include files (*-I*,
- *-include*, *-D*, etc; the theory is that these options will change the
- preprocessor output if they have any effect at all)
-* any standard error output generated by the preprocessor
-
-Based on the hash, the cached compilation result can be looked up directly in
-the cache.
-
-
-Compiling in different directories
-----------------------------------
-
-Some information included in the hash that identifies a unique compilation can
-contain absolute paths:
-
-* The preprocessed source code may contain absolute paths to include files if
- the compiler option *-g* is used or if absolute paths are given to *-I* and
- similar compiler options.
-* Paths specified by compiler options (such as *-I*, *-MF*, etc) on the command
- line may be absolute.
-* The source code file path may be absolute, and that path may substituted for
- *\_\_FILE__* macros in the source code or included in warnings emitted to
- standard error by the preprocessor.
-
-This means that if you compile the same code in different locations, you can't
-share compilation results between the different build directories since you get
-cache misses because of the absolute build directory paths that are part of the
-hash.
-
-Here's what can be done to enable cache hits between different build
-directories:
-
-* If you build with *-g* (or similar) to add debug information to the object
- file, you must either:
-+
---
-** use the *-fdebug-prefix-map=_old_=_new_* option for relocating debug info to
- a common prefix (e.g. *-fdebug-prefix-map=$PWD=.*); or
-** set *hash_dir = false*.
---
-* If you use absolute paths anywhere on the command line (e.g. the source code
- file path or an argument to compiler options like *-I* and *-MF*), you must
- to set *base_dir* to an absolute path to a ``base directory''. ccache will
- then rewrite absolute paths under that directory to relative before computing
- the hash.
-
-
-Precompiled headers
--------------------
-
-ccache has support for GCC's precompiled headers. However, you have to do some
-things to make it work properly:
-
-* You must set *sloppiness* to *pch_defines,time_macros*. The reason is that
- ccache can't tell whether *\_\_TIME\__* or *\_\_DATE__* is used when using a
- precompiled header. Further, it can't detect changes in **#define**s in the
- source code because of how preprocessing works in combination with
- precompiled headers.
-* You must either:
-+
---
-** use the *-include* compiler option to include the precompiled header
- (i.e., don't use *#include* in the source code to include the header); or
-** (for the Clang compiler) use the *-include-pch* compiler option to include
- the PCH file generated from the precompiled header; or
-** add the *-fpch-preprocess* compiler option when compiling.
-
-If you don't do this, either the non-precompiled version of the header file
-will be used (if available) or ccache will fall back to running the real
-compiler and increase the statistics counter ``preprocessor error'' (if the
-non-precompiled header file is not available).
---
-
-
-Sharing a cache
----------------
-
-A group of developers can increase the cache hit rate by sharing a cache
-directory. To share a cache without unpleasant side effects, the following
-conditions should to be met:
-
-* Use the same cache directory.
-* Make sure that the configuration setting *hard_link* is false (which is the
- default).
-* Make sure that all users are in the same group.
-* Set the configuration setting *umask* to 002. This ensures that cached files
- are accessible to everyone in the group.
-* Make sure that all users have write permission in the entire cache directory
- (and that you trust all users of the shared cache).
-* Make sure that the setgid bit is set on all directories in the cache. This
- tells the filesystem to inherit group ownership for new directories. The
- following command might be useful for this:
-+
---
-----
-find $CCACHE_DIR -type d | xargs chmod g+s
-----
---
-
-The reason to avoid the hard link mode is that the hard links cause unwanted
-side effects, as all links to a cached file share the file's modification
-timestamp. This results in false dependencies to be triggered by
-timestamp-based build systems whenever another user links to an existing file.
-Typically, users will see that their libraries and binaries are relinked
-without reason.
-
-You may also want to make sure that a base directory is set appropriately, as
-discussed in a previous section.
-
-
-Sharing a cache on NFS
-----------------------
-
-It is possible to put the cache directory on an NFS filesystem (or similar
-filesystems), but keep in mind that:
-
-* Having the cache on NFS may slow down compilation. Make sure to do some
- benchmarking to see if it's worth it.
-* ccache hasn't been tested very thoroughly on NFS.
-
-A tip is to set *temporary_dir* to a directory on the local host to avoid NFS
-traffic for temporary files.
-
-
-Using ccache with other compiler wrappers
------------------------------------------
-
-The recommended way of combining ccache with another compiler wrapper (such as
-``distcc'') is by letting ccache execute the compiler wrapper. This is
-accomplished by defining the configuration setting *prefix_command*, for
-example by setting the environment variable *CCACHE_PREFIX* to the name of the
-wrapper (e.g. *distcc*). ccache will then prefix the command line with the
-specified command when running the compiler. To specify several prefix
-commands, set *prefix_command* to a colon-separated list of commands.
-
-Unless you set *compiler_check* to a suitable command (see the description of
-that configuration option), it is not recommended to use the form *ccache
-anotherwrapper compiler args* as the compilation command. It's also not
-recommended to use the masquerading technique for the other compiler wrapper.
-The reason is that by default, ccache will in both cases hash the mtime and
-size of the other wrapper instead of the real compiler, which means that:
-
-* Compiler upgrades will not be detected properly.
-* The cached results will not be shared between compilations with and without
- the other wrapper.
-
-Another minor thing is that if *prefix_command* is used, ccache will not invoke
-the other wrapper when running the preprocessor, which increases performance.
-You can use the *prefix_command_cpp* configuration setting if you also want to
-invoke the other wrapper when doing preprocessing (normally by adding *-E*).
-
-
-Caveats
--------
-
-* The direct mode fails to pick up new header files in some rare scenarios. See
- <<_the_direct_mode,THE DIRECT MODE>> above.
-* When run via ccache, warning messages produced by GCC 4.9 and newer will only
- be colored when the environment variable *GCC_COLORS* is set. An alternative
- to setting *GCC_COLORS* is to pass `-fdiagnostics-color` explicitly when
- compiling (but then color codes will also be present when redirecting stderr
- to a file).
-* If ccache guesses that the compiler may emit colored warnings, then a
- compilation with stderr referring to a TTY will be considered different from
- a compilation with a redirected stderr, thus not sharing cache entries. This
- happens for clang by default and for GCC when *GCC_COLORS* is set as
- mentioned above. If you want to share cache hits, you can pass
- `-f[no-]diagnostics-color` (GCC) or `-f[no-]color-diagnostics` (clang)
- explicitly when compiling (but then color codes will be either on or off for
- both the TTY and the redirected case).
-
-
-Troubleshooting
----------------
-
-General
-~~~~~~~
-
-A general tip for getting information about what ccache is doing is to enable
-debug logging by setting *log_file*. The log contains executed commands,
-important decisions that ccache makes, read and written files, etc. Another way
-of keeping track of what is happening is to check the output of *ccache -s*.
-
-
-Performance
-~~~~~~~~~~~
-
-ccache has been written to perform well out of the box, but sometimes you may
-have to do some adjustments of how you use the compiler and ccache in order to
-improve performance.
-
-Since ccache works best when I/O is fast, put the cache directory on a fast
-storage device if possible. Having lots of free memory so that files in the
-cache directory stay in the disk cache is also preferable.
-
-A good way of monitoring how well ccache works is to run *ccache -s* before and
-after your build and then compare the statistics counters. Here are some common
-problems and what may be done to increase the hit rate:
-
-* If ``cache hit (preprocessed)'' has been incremented instead of ``cache hit
- (direct)'', ccache has fallen back to preprocessor mode, which is generally
- slower. Some possible reasons are:
-** The source code has been modified in such a way that the preprocessor output
- is not affected.
-** Compiler arguments that are hashed in the direct mode but not in the
- preprocessor mode have changed (*-I*, *-include*, *-D*, etc) and they didn't
- affect the preprocessor output.
-** The compiler option *-Xpreprocessor* or *-Wp,_X_* (except *-Wp,-MD,_path_*,
- *-Wp,-MMD,_path_*, and *-Wp,-D_define_*) is used.
-** This was the first compilation with a new value of the base directory
- setting.
-** A modification time of one of the include files is too new (created the same
- second as the compilation is being done). This check is made to avoid a race
- condition. To fix this, create the include file earlier in the build
- process, if possible, or set *sloppiness* to *include_file_mtime* if you are
- willing to take the risk. (The race condition consists of these events: the
- preprocessor is run; an include file is modified by someone; the new include
- file is hashed by ccache; the real compiler is run on the preprocessor's
- output, which contains data from the old header file; the wrong object file
- is stored in the cache.)
-** The *\_\_TIME\__* preprocessor macro is (potentially) being used. ccache
- turns off direct mode if ``\_\_TIME\__'' is present in the source code. This
- is done as a safety measure since the string indicates that a *\_\_TIME\__*
- macro _may_ affect the output. (To be sure, ccache would have to run the
- preprocessor, but the sole point of the direct mode is to avoid that.) If
- you know that *\_\_TIME\__* isn't used in practise, or don't care if ccache
- produces objects where *\_\_TIME__* is expanded to something in the past,
- you can set *sloppiness* to *time_macros*.
-** The *\_\_DATE\__* preprocessor macro is (potentially) being used and the
- date has changed. This is similar to how *\_\_TIME\__* is handled. If
- ``\_\_DATE\__'' is present in the source code, ccache hashes the current
- date in order to be able to produce the correct object file if the
- *\_\_DATE\__* macro affects the output. If you know that *\_\_DATE\__* isn't
- used in practise, or don't care if ccache produces objects where
- *\_\_DATE__* is expanded to something in the past, you can set *sloppiness*
- to *time_macros*.
-** The *\_\_FILE\__* preprocessor macro is (potentially) being used and the
- file path has changed. If ``\_\_FILE\__'' is present in the source code,
- ccache hashes the current input file path in order to be able to produce the
- correct object file if the *\_\_FILE\__* macro affects the output. If you
- know that *\_\_FILE\__* isn't used in practise, or don't care if ccache
- produces objects where *\_\_FILE__* is expanded to the wrong path, you can
- set *sloppiness* to *file_macro*.
-* If ``cache miss'' has been incremented even though the same code has been
- compiled and cached before, ccache has either detected that something has
- changed anyway or a cleanup has been performed (either explicitly or
- implicitly when a cache limit has been reached). Some perhaps unobvious
- things that may result in a cache miss are usage of *\_\_TIME\__* or
- *\_\_DATE__* macros, or use of automatically generated code that contains a
- timestamp, build counter or other volatile information.
-* If ``multiple source files'' has been incremented, it's an indication that
- the compiler has been invoked on several source code files at once. ccache
- doesn't support that. Compile the source code files separately if possible.
-* If ``unsupported compiler option'' has been incremented, enable debug logging
- and check which option was rejected.
-* If ``preprocessor error'' has been incremented, one possible reason is that
- precompiled headers are being used. See <<_precompiled_headers,PRECOMPILED
- HEADERS>> for how to remedy this.
-* If ``can't use precompiled header'' has been incremented, see
- <<_precompiled_headers,PRECOMPILED HEADERS>>.
-
-
-Corrupt object files
-~~~~~~~~~~~~~~~~~~~~
-
-It should be noted that ccache is susceptible to general storage problems. If a
-bad object file sneaks into the cache for some reason, it will of course stay
-bad. Some possible reasons for erroneous object files are bad hardware (disk
-drive, disk controller, memory, etc), buggy drivers or file systems, a bad
-*prefix_command* or compiler wrapper. If this happens, the easiest way of
-fixing it is this:
-
-1. Build so that the bad object file ends up in the build tree.
-2. Remove the bad object file from the build tree.
-3. Rebuild with *CCACHE_RECACHE* set.
-
-An alternative is to clear the whole cache with *ccache -C* if you don't mind
-losing other cached results.
-
-There are no reported issues about ccache producing broken object files
-reproducibly. That doesn't mean it can't happen, so if you find a repeatable
-case, please report it.
-
-
-More information
-----------------
-
-Credits, mailing list information, bug reporting instructions, source code,
-etc, can be found on ccache's web site: <https://ccache.samba.org>.
-
-
-Author
-------
-
-ccache was originally written by Andrew Tridgell and is currently developed and
-maintained by Joel Rosdahl. See AUTHORS.txt or AUTHORS.html and
-<https://ccache.samba.org/credits.html> for a list of contributors.
--- /dev/null
+ccache news
+===========
+
+ccache 3.4.2
+------------
+Release date: 2018-03-25
+
+Bug fixes
+~~~~~~~~~
+
+- The cleanup algorithm has been fixed to not misbehave when files are removed
+ by another process while the cleanup process is running. Previously, too many
+ files could be removed from the cache if multiple cleanup processes were
+ triggered at the same time, in extreme cases trimming the cache to a much
+ smaller size than the configured limits.
+
+- Correctly hash preprocessed headers located in a ``.gch directory''.
+ Previously, ccache would not pick up changes to such precompiled headers,
+ risking false positive cache hits.
+
+- Fixed build failure when using the bundled zlib sources.
+
+- ccache 3.3.5 added a workaround for not triggering Clang errors when a
+ precompiled header's dependency has an updated timestamp (but identical
+ content). That workaround is now only applied when the compiler is Clang.
+
+- Made it possible to perform out-of-source builds in dev mode again.
+
+
+ccache 3.4.1
+------------
+Release date: 2018-02-11
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed printing of version number in `ccache --version`.
+
+
+ccache 3.4
+----------
+Release date: 2018-02-11
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- The compiler option form `--sysroot arg` is now handled like the documented
+ `--sysroot=arg` form.
+
+- Added support for caching `.su` files generated by GCC flag `-fstack-usage`.
+
+- ccache should now work with distcc's ``pump'' wrapper.
+
+- The optional unifier is no longer disabled when the direct mode is enabled.
+
+- Added support for NVCC compiler options `--compiler-bindir/-ccbin`,
+ `--output-directory/-odir` and `--libdevice-directory/-ldir`.
+
+- Boolean environment variable settings no longer accept the following
+ (case-insensitive) values: `0`, `false`, `disable` and `no`. All other values
+ are accepted and taken to mean ``true''. This is to stop users from setting
+ e.g. `CCACHE_DISABLE=0` and then expect the cache to be used.
+
+- Improved support for `run_second_cpp = false`: If combined with passing
+ `-fdirectives-only` (GCC) or `frewrite-includes` (Clang) to the compiler,
+ diagnostics warnings and similar will be correct.
+
+- An implicit `-MQ` is now passed to the preprocessor only if the object file
+ extension is non-standard. This should make it easier to use EDG-based
+ compilers (e.g. GHS) which don't understand `-MQ`.
+
+- ccache now treats an unreadable configuration file just like a missing
+ configuration file.
+
+- Documented more pitfalls with enabling `hard_links` (`CCACHE_HARDLINK`).
+
+- Documented caveats related to colored warnings from compilers.
+
+
+Bug fixes
+~~~~~~~~~
+
+- File size and number counters are now updated correctly when files are
+ overwritten in the cache, e.g. when using `CCACHE_RECACHE`.
+
+- `run_second_cpp` is now forced for NVCC.
+
+- Fixed how the NVCC options `-optf` and `-odir` are handled.
+
+
+ccache 3.3.6
+------------
+Release date: 2018-01-28
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Improved instructions on how to get cache hits between different working
+ directories.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed regression in ccache 3.3.5 related to the `UNCACHED_ERR_FD` feature.
+
+
+ccache 3.3.5
+------------
+Release date: 2018-01-13
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Documented how automatic cache cleanup works.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a regression where the original order of debug options could be lost.
+ This reverts the ``Improved parsing of `-g*` options'' feature in ccache 3.3.
+
+- Multiple `-fdebug-prefix-map` options should now be handled correctly.
+
+- Fixed matching of directories in the `ignore_headers_in_manifest`
+ configuration option.
+
+- Fixed detection of missing argument to `-opt`/`--options-file`.
+
+- ccache now bails out when building a precompiled header if any of the
+ corresponding header files has an updated timestamp. This fixes complaints
+ from Clang.
+
+- Fixed a bug related to erroneously storing a dependency file with absolute
+ paths in the cache on a preprocessed hit.
+
+- `ccache -c/--cleanup` now works like documented: it just recalculates size
+ counters and trims the cache to not exceed the max size and file number
+ limits. Previously, the forced cleanup took ``limit_multiple'' into account,
+ so that `ccache -c/--cleanup` by default would trim the cache to 80% of the
+ max limit.
+
+- ccache no longer ignores linker arguments for Clang since Clang warns about
+ them.
+
+- Plugged a couple of file descriptor leaks.
+
+- Fixed a bug where ccache would skip hashing the compiler argument following a
+ `-fno-working-directory`, `-fworking-directory`, `-nostdinc`, `-nostdinc++`,
+ `-remap` or `-trigraphs` option in preprocessor mode.
+
+
+ccache 3.3.4
+------------
+Release date: 2017-02-17
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Documented the different cache statistics counters.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a regression in ccache 3.3 related to potentially bad content of
+ dependency files when compiling identical source code but with different
+ source paths. This was only partially fixed in 3.3.2 and reverts the new
+ ``Names of included files are no longer included in the hash of the
+ compiler's preprocessed output'' feature in 3.3.
+
+- Corrected statistics counter for `-optf`/`--options-file` failure.
+
+- Fixed undefined behavior warnings in ccache found by `-fsanitize=undefined`.
+
+ccache 3.3.3
+------------
+Release date: 2016-10-26
+
+Bug fixes
+~~~~~~~~~
+
+- ccache now detects usage of `.incbin` assembler directives in the source code
+ and avoids caching such compilations.
+
+
+ccache 3.3.2
+------------
+Release date: 2016-09-28
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a regression in ccache 3.3 related to potentially bad content of
+ dependency files when compiling identical source code but with different
+ source paths.
+
+- Fixed a regression in ccache 3.3.1: ccache could get confused when using the
+ compiler option `-Wp,` to pass multiple options to the preprocessor,
+ resulting in missing dependency files from direct mode cache hits.
+
+
+ccache 3.3.1
+------------
+Release date: 2016-09-07
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a problem in the ``multiple `-arch` options'' support introduced in
+ 3.3. When using the direct mode (the default), different combinations of
+ `-arch` options were not detected properly.
+
+- Fixed an issue when compiler option `-Wp,-MT,path` is used instead of `-MT
+ path` (and similar for `-MF`, `-MP` and `-MQ`) and `run_second_cpp`
+ (`CCACHE_CPP2`) is enabled.
+
+
+ccache 3.3
+----------
+Release date: 2016-08-27
+
+Notes
+~~~~~
+
+- A C99-compatible compiler is now required to build ccache.
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- The configuration option `run_second_cpp` (`CCACHE_CPP2`) now defaults to
+ true. This improves ccache's out-of-the-box experience for compilers that
+ can't compile their own preprocessed output with the same outcome as if they
+ compiled the real source code directly, e.g. newer versions of GCC and Clang.
+
+- The configuration option `hash_dir` (`CCACHE_HASHDIR`) now defaults to true.
+
+- Added a new `ignore_headers_in_manifest` configuration option, which
+ specifies headers that should be ignored in the direct mode.
+
+- Added a new `prefix_command_cpp` (`CCACHE_PREFIX_CPP`) configuration option,
+ which specifies one or several prefixes to add to the command line ccache
+ uses when invoking the preprocessor.
+
+- Added a new `limit_multiple` (`CCACHE_LIMIT_MULTIPLE`) configuration option,
+ which specifies how much of the cache to remove when cleaning.
+
+- Added a new `keep_comments_cpp` (`CCACHE_COMMENTS`) configuration option,
+ which tells ccache not to discard the comments before hashing preprocessor
+ output. This can be used to check documentation with *-Wdocumentation*.
+
+- Added a new sloppiness option `no_system_headers`, which tells ccache not to
+ include system headers in manifest files.
+
+- Added a new statistics counter that tracks the number of performed cleanups
+ due to the cache size being over the limit. The value is shown in the output
+ of ``ccache -s''.
+
+- Added support for relocating debug info directory using `-fdebug-prefix-map`.
+ This allows for cache hits even when `hash_dir` is used in combination with
+ `base_dir`.
+
+- Added a new ``cache hit rate'' field to the output of ``ccache -s''.
+
+- Added support for caching compilation of assembler code produced by e.g.
+ ``gcc -S file.c''.
+
+- Added support for cuda including the -optf/--options-file option.
+
+- Added support for Fortran 77.
+
+- Added support for multiple `-arch` options to produce "fat binaries".
+
+- Multiple identical `-arch` arguments are now handled without bailing.
+
+- The concatenated form of some long compiler options is now recognized, for
+ example when using `-isystemPATH` instead of `-isystem PATH`.
+
+- If hard-linking is enabled and but fails (e.g. due to cross-device linking),
+ ccache now falls back to copying instead of running the compiler.
+
+- Made the `hash_dir` option only have effect when generating debug info.
+
+- ccache now knows how to convert absolute paths to relative paths inside
+ dependency files when using `base_dir`.
+
+- Improved parsing of `-g*` options.
+
+- Made ccache understand `-Wp,-D*` options.
+
+- ccache now understands the undocumented `-coverage` (only one dash) GCC
+ option.
+
+- Names of included files are no longer included in the hash of the compiler's
+ preprocessed output. This leads to more potential cache hits when not using
+ the direct mode.
+
+- Increased buffer size used when reading file data. This improves performance
+ slightly.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Bail out on too hard compiler option `-P`.
+
+- Fixed Clang test suite when running on Linux.
+
+- Fixed build and test for MinGW32 and Windows.
+
+
+ccache 3.2.9
+------------
+Release date: 2016-09-28
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a regression in ccache 3.2.8: ccache could get confused when using the
+ compiler option `-Wp,` to pass multiple options to the preprocessor,
+ resulting in missing dependency files from direct mode cache hits.
+
+
+ccache 3.2.8
+------------
+Release date: 2016-09-07
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed an issue when compiler option `-Wp,-MT,path` is used instead of `-MT
+ path` (and similar for `-MF`, `-MP` and `-MQ`) and `run_second_cpp`
+ (`CCACHE_CPP2`) is enabled.
+
+- ccache now understands the undocumented `-coverage` (only one dash) GCC
+ option.
+
+
+ccache 3.2.7
+------------
+Release date: 2016-07-20
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed a bug which could lead to false cache hits for compiler command lines
+ with a missing argument to an option that takes an argument.
+
+- ccache now knows how to work around a glitch in the output of GCC 6's
+ preprocessor.
+
+
+ccache 3.2.6
+------------
+Release date: 2016-07-12
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed build problem on QNX, which lacks ``SA_RESTART''.
+
+- Bail out on compiler option `-fstack-usage` since it creates a `.su` file
+ which ccache currently doesn't handle.
+
+- 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.2.5
+------------
+Release date: 2016-04-17
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Only pass Clang-specific `-stdlib=` to the preprocessor.
+
+- Improved handling of stale NFS handles.
+
+- Made it harder to misinterpret documentation of boolean environment settings'
+ semantics.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Include m4 files used by configure.ac in the source dist archives.
+
+- Corrected "Performance" section in the manual regarding `__DATE_`, `__TIME__`
+ and `__FILE__` macros.
+
+- Fixed build on Solaris 10+ and AIX 7.
+
+- Fixed failure to create directories on QNX.
+
+- Don't (try to) update manifest file in ``read-only'' and ``read-only direct''
+ modes.
+
+- Fixed a bug in caching of `stat` system calls in ``file_stat_matches
+ sloppiness mode''.
+
+- Fixed bug in hashing of Clang plugins, leading to unnecessary cache misses.
+
+- Fixed --print-config to show ``pch_defines sloppiness''.
+
+- The man page is now built when running ``make install'' from Git repository
+ sources.
+
+
+ccache 3.2.4
+------------
+Release date: 2015-10-08
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed build error related to zlib on systems with older make versions
+ (regression in ccache 3.2.3).
+
+- Made conversion-to-bool explicit to avoid build warnings (and potential
+ runtime errors) on legacy systems.
+
+- Improved signal handling: Kill compiler on SIGTERM; wait for compiler to exit
+ before exiting; die appropriately.
+
+- Minor fixes related to Windows support.
+
+- The correct compression level is now used if compression is requested.
+
+- Fixed a bug where cache cleanup could be run too early for caches larger than
+ 64 GiB on 32-bit systems.
+
+
+ccache 3.2.3
+------------
+Release date: 2015-08-16
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added support for compiler option `-gsplit-dwarf`.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Support external zlib in nonstandard directory.
+
+- Avoid calling `exit()` inside an exit handler.
+
+- Let exit handler terminate properly.
+
+- Bail out on compiler option `--save-temps` in addition to `-save-temps`.
+
+- Only log "Disabling direct mode" once when failing to read potential include
+ files.
+
+
+ccache 3.2.2
+------------
+Release date: 2015-05-10
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added support for `CCACHE_COMPILERCHECK=string:<value>`. This is a faster
+ alternative to `CCACHE_COMPILERCHECK=<command>` if the command's output can
+ be precalculated by the build system.
+
+- Add support for caching code coverage results (compiling for gcov).
+
+
+Bug fixes
+~~~~~~~~~
+
+- 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.
+
+- Fixed a bug where ccache deleted Clang diagnostics after compiler failures.
+
+- Avoid performing an unnecessary copy of the object file on a cache miss.
+
+- Bail out on too hard compiler option `-fmodules`.
+
+- Bail out on too hard compiler option `-fplugin=libcc1plugin` (interaction
+ with GDB).
+
+- Fixed build error when compiling ccache with recent Clang versions.
+
+- Removed signal-unsafe code from signal handler.
+
+- Corrected logic for when to output cached stderr.
+
+- Wipe the whole cached result on failure retrieving a cached file.
+
+- Fixed build error when compiling ccache with recent Clang versions.
+
+
+ccache 3.2.1
+------------
+Release date: 2014-12-10
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed regression in temporary file handling, which lead to incorrect
+ permissions for stats, manifest and ccache.conf files in the cache.
+
+- `CACHEDIR.TAG` files are now created in the [0-9a-f] subdirectories so that
+ ccache.conf is not lost in backups.
+
+- Made the default cache size suffix `G`, as previously documented.
+
+- `-fdiagnostics-color=auto` is now passed to the compiler even if stderr is
+ redirected. This fixes a problem when, for instance, a configure test probes
+ if the compiler (wrapped via ccache) supports `-fdiagnostics-color=auto`.
+
+- Added missing documentation for `max_files` and `max_size` configuration
+ options.
+
+
+ccache 3.2
+----------
+Release date: 2014-11-17
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added support for configuring ccache via one or several configuration files
+ instead of via environment variables. Environment variables still have
+ priority but are no longer the recommended way of customizing ccache
+ behavior. See the manual for more information.
+
+- Added support for compiler error/warning messages with color.
+
+- Made creation of temporary directories and cache directories smarter to avoid
+ unnecessary `stat` calls.
+
+- Improved efficiency of the algorithm that scans for `__DATE_` and `__TIME__`
+ tokens in the hashed source code.
+
+- Added support for several binaries (separated by space) in `CCACHE_PREFIX`.
+
+- The `-c` option is no longer passed to the preprocessor. This fixes problems
+ with Clang and Solaris's C++ compiler.
+
+- ccache no longer passes preprocessor options like `-D` and `-I` to the
+ compiler when compiling preprocessed output. This fixes warnings emitted by
+ Clang.
+
+- Compiler options `-fprofile-generate`, `-fprofile-arcs`, `-fprofile-use` and
+ `-fbranch-probabilities` are now handled without bailing.
+
+- Added support for Clang's `--serialize-diagnostic` option, storing the
+ diagnostic file (`.dia`) in the cache.
+
+- Added support for precompiled headers when using Clang.
+
+- Added support for Clang `.pth` (pretokenized header) files.
+
+- Changed the `-x` language option to use the new objective C standard for GCC
+ and Clang.
+
+- On a cache miss, ccache now instructs the compiler to create the object file
+ at the real destination and then copies the file into the cache instead of
+ the other way around. This is needed to support compiler options like
+ `-fprofile-arcs` and `--serialize-diagnostics`.
+
+- ccache now checks that included files' ctimes aren't too new. This check can
+ be turned off by adding `include_file_ctime` to the ``ccache sloppiness''
+ setting.
+
+- Added possibility to get cache hits based on filename, size, mtime and ctime
+ only. On other words, source code files are not even read, only stat-ed. This
+ operation mode is opt-in by adding `file_stat_matches` to the ``ccache
+ sloppiness'' setting.
+
+- The filename part of options like `-Wp,-MDfilename` is no longer included in
+ the hash since the filename doesn't have any bearing on the result.
+
+- Added a ``read-only direct'' configuration setting, which is like the
+ ordinary read-only setting except that ccache will only try to retrieve
+ results from the cache using the direct mode, not the preprocessor mode.
+
+- The display and interpretation of cache size has been changed to use SI
+ units.
+
+- Default cache size is now 5 GB (was previously 1 GiB).
+
+- Added configuration option to set the compression level of compressed object
+ files in the cache.
+
+- Added support for `@file` and `-@file` arguments (reading options from a
+ file).
+
+- `-Wl,` options are no longer included in the hash since they don't affect
+ compilation.
+
+- Bail out on too hard compiler option `-Wp,-P`.
+
+- Optimized MD4 calculation code on little-endian systems.
+
+- Various improvements and fixes on win32.
+
+- Improved logging to the ccache log file.
+
+- Added `--dump-manifest` command-line option for debugging purposes.
+
+- Added `--with-bundled-zlib` configure option.
+
+- Upgraded bundled zlib to version 1.2.8.
+
+- Improved `dev.mk` to be more platform independent.
+
+- Made the test suite work with Clang and gcc-llvm on OS X.
+
+- Various other improvements of the test suite.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Any previous `.stderr` is now removed from the cache when recaching.
+
+- Fixed an issue when handling the `-arch` compiler option with an argument.
+
+- Fixed race condition when creating the initial cache directory.
+
+- Fixed test suite failures when `CC` is a ccache-wrapped compiler.
+
+
+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
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added support for the `-Xclang` compiler option.
+
+- Improved handling of exit code of internally executed processes.
+
+- Zero length object files in the cache are now rejected as invalid.
+
+- Bail out on option `-gsplit-dwarf` (since it produces multiple output files).
+
+- Compiler option `-fdebug-prefix-map` is now ignored (not part of the hash).
+ (The `-fdebug-prefix-map` option may be used in combination with
+ `CCACHE_BASEDIR` to reuse results across different directories.)
+
+- Added note in documentation that `--ccache-skip` currently does not mean
+ ``don't hash the following option''.
+
+- 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 defined macros have been
+ changed.
+
+- Stale files in the internal temporary directory (`<ccache_dir>/tmp`) are now
+ cleaned up if they are older than one hour.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed path canonicalization in `make_relative_path()` when path doesn't
+ exist.
+
+- Fixed bug in `common_dir_prefix_length()`. This corrects the `CCACHE_BASEDIR`
+ behavior.
+
+- ccache no longer tries to create the cache directory when `CCACHE_DISABLE` is
+ set.
+
+- Fixed bug when reading manifests with a very large number of file info
+ entries.
+
+- Fixed problem with logging of current working directory.
+
+
+ccache 3.1.9
+------------
+Release date: 2013-01-06
+
+
+Bug fixes
+~~~~~~~~~
+
+- The EAGAIN signal is now handled correctly when emitting cached stderr
+ output. This fixes a problem triggered by large error outputs from the
+ compiler.
+
+- Subdirectories in the cache are no longer created in read-only mode.
+
+- Fixed so that ccache's log file descriptor is not made available to the
+ compiler.
+
+- Improved error reporting when failing to create temporary stdout/stderr files
+ when executing the compiler.
+
+- Disappearing temporary stdout/stderr files are now handled gracefully.
+
+
+Other
+~~~~~
+
+- Fixed test suite to work on ecryptfs.
+
+
+ccache 3.1.8
+------------
+Release date: 2012-08-11
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Made paths to dependency files relative in order to increase cache hits.
+
+- Added work-around to make ccache work with buggy GCC 4.1 when creating a
+ pre-compiled header.
+
+- Clang plugins are now hashed to catch plugin upgrades.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Fixed crash when the current working directory has been removed.
+
+- Fixed crash when stderr is closed.
+
+- Corrected a corner case when parsing backslash escapes in string
+ literals.
+
+- Paths are now correctly canonicalized when computing paths relative to the
+ base directory.
+
+
+Other
+~~~~~
+
+- Made git version macro work when compiling outside of the source directory.
+
+- Fixed `static_assert` macro definition clash with GCC 4.7.
+
+
+ccache 3.1.7
+------------
+Release date: 2012-01-08
+
+
+Bug fixes
+~~~~~~~~~
+
+- Non-writable `CCACHE_DIR` is now handled gracefully when `CCACHE_READONLY` is
+ set.
+
+- Made failure to create files (typically due to bad directory permissions) in
+ the cache directory fatal. Previously, such failures were silently and
+ erroneously flagged as "compiler produced stdout".
+
+- Both the `-specs=file` and `--specs=file` forms are now recognized.
+
+- Added recognition and hashing of GCC plugins specified with `-fplugin=file`.
+
+- `CCACHE_COMPILERCHECK` now also determines how to hash explicit specs files
+ (`-specs=file`).
+
+- Added `CPATH`, `C_INCLUDE_PATH` and similar environment variables to the hash
+ to avoid false cache hits when such variables have changed.
+
+- Corrected log message when unify mode is enabled.
+
+- Reverted the GCC bug compatibility introduced in ccache 3.1.5 for `-MT`/`-MQ`
+ options with concatenated arguments. (The bug is fixed in recent GCC
+ versions.)
+
+
+Other
+~~~~~
+
+- Corrected license header for `mdfour.c`.
+
+- Improved documentation on how to fix bad object files in the cache.
+
+
+
+ccache 3.1.6
+------------
+Release date: 2011-08-21
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Rewrite argument to `--sysroot` if `CCACHE_BASEDIR` is used.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Don't crash if `getcwd()` fails.
+
+- Fixed alignment of ``called for preprocessing'' counter.
+
+
+ccache 3.1.5
+------------
+Release date: 2011-05-29
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added a new statistics counter named ``called for preprocessing''.
+
+- The original command line is now logged to the file specified with
+ `CCACHE_LOGFILE`.
+
+- Improved error logging when system calls fail.
+
+- Added support for rewriting absolute paths in `-F`/`-iframework` GCC
+ options.
+
+- Improved order of statistics counters in `ccache -s` output.
+
+
+Bug fixes
+~~~~~~~~~
+
+- The `-MF`/`-MT`/`-MQ` options with concatenated argument are now handled
+ correctly when they are last on the command line.
+
+- ccache is now bug compatible with GCC for the `-MT`/`-MQ` options with
+ concatenated arguments.
+
+- Fixed a minor memory leak.
+
+- Systems that lack (and don't need to be linked with) libm are now supported.
+
+
+ccache 3.1.4
+------------
+Release date: 2011-01-09
+
+
+Bug fixes
+~~~~~~~~~
+
+- Made a work-around for a bug in `gzputc()` in zlib 1.2.5.
+
+- Corrupt manifest files are now removed so that they won't block direct mode
+ hits.
+
+- ccache now copes with file systems that don't know about symbolic links.
+
+- The file handle in now correctly closed on write error when trying to create
+ a cache dir tag.
+
+
+ccache 3.1.3
+------------
+Release date: 2010-11-28
+
+
+Bug fixes
+~~~~~~~~~
+
+- The -MFarg, -MTarg and -MQarg compiler options (i.e, without space between
+ option and argument) are now handled correctly.
+
+
+Other
+~~~~~
+
+- Portability fixes for HP-UX 11.00 and other esoteric systems.
+
+
+ccache 3.1.2
+------------
+Release date: 2010-11-21
+
+
+Bug fixes
+~~~~~~~~~
+
+- Bail out on too hard compiler options `-fdump-*`.
+
+- NULL return values from malloc/calloc of zero bytes are now handled
+ correctly.
+
+- Fixed issue when parsing precompiler output on AIX.
+
+
+Other
+~~~~~
+
+- Improved documentation on which information is included in the hash sum.
+
+- Made the ``too new header file'' test case work on file systems with
+ unsynchronized clocks.
+
+- The test suite now also works on systems that lack a /dev/zero.
+
+
+ccache 3.1.1
+------------
+Release date: 2010-11-07
+
+
+Bug fixes
+~~~~~~~~~
+
+- ccache now falls back to preprocessor mode when a non-regular include file
+ (device, socket, etc) has been detected so that potential hanging due to
+ blocking reads is avoided.
+
+- CRC errors are now detected when decompressing compressed files in the cache.
+
+- Fixed potential object file corruption race on NFS.
+
+- Minor documentation corrections.
+
+- Fixed configure detection of ar.
+
+- ccache development version (set by dev.mk) now works with gits whose
+ `describe` command doesn't understand `--dirty`.
+
+
+Other
+~~~~~
+
+- Minor debug log message improvements.
+
+
+ccache 3.1
+----------
+Release date: 2010-09-16
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- Added support for hashing the output of a custom command (e.g. `%compiler%
+ --version`) to identify the compiler instead of stat-ing or hashing the
+ compiler binary. This can improve robustness when the compiler (as seen by
+ ccache) actually isn't the real compiler but another compiler wrapper.
+
+- Added support for caching compilations that use precompiled headers. (See the
+ manual for important instructions regarding this.)
+
+- Locking of the files containing statistics counters is now done using
+ symlinks instead of POSIX locks. This should make ccache behave a lot better
+ on file systems where POSIX locks are slow or broken (e.g. NFS on some
+ systems).
+
+- Manifest files are now updated without the need of taking locks.
+
+- Updates of statistics counters are now always done in one of the sub-level
+ statistics files. This reduces lock contention, which especially improves
+ performance on slow NFS mounts.
+
+- Reading and writing of statistics counters has been made forward-compatible
+ (unknown counters are retained).
+
+- Files are now read without using `mmap()`. This has two benefits: it's more
+ robust against file changes during reading and it improves performance on
+ poor systems where `mmap()` doesn't use the disk cache.
+
+- Added `.cp` and `.CP` as known C++ suffixes.
+
+- Improved logging.
+
+- Added `-install_name` as an option known to take an argument. (This improves
+ statistics when using the Darwin linker.)
+
+
+Bug fixes
+~~~~~~~~~
+
+- Non-fatal error messages are now never printed to stderr but logged instead.
+
+- Fixed a bug affecting failing commands when `--ccache-skip` is used.
+
+- Made `--ccache-skip` work for all options.
+
+- EINTR is now handled correctly.
+
+
+Other
+~~~~~
+
+- Work on porting ccache to win32 (native), mostly done by Ramiro Polla. The
+ port is not yet finished, but will hopefully be complete in some subsequent
+ release.
+
+- Added a `--nostats` flag to the performance benchmark program.
+
+- Made the performance benchmark program more accurate when measuring cache
+ hits.
+
+- Added a new test framework for unit tests written in C.
+
+- Got rid of `configure-dev`; dev mode is now given by `dev.mk.in` presence.
+
+- Improved documentation on how to combine ccache with other compiler wrappers
+ (like `distcc`).
+
+- New `LICENSE.txt` file with licensing and copyright details about bundled
+ source code.
+
+- New `AUTHORS.txt` file with a list of ccache contributors.
+
+- New `HACKING.txt` file with some notes about ccache code conventions.
+
+
+ccache 3.0.1
+------------
+Release date: 2010-07-15
+
+
+Bug fixes
+~~~~~~~~~
+
+- The statistics counter ``called for link'' is now correctly updated when
+ linking with a single object file.
+
+- Fixed a problem with out-of-source builds.
+
+
+ccache 3.0
+----------
+Release date: 2010-06-20
+
+
+General
+~~~~~~~
+
+- ccache is now licensed under the GNU General Public License (GPL) version 3
+ or later.
+
+
+Upgrade notes
+~~~~~~~~~~~~~
+
+- The way the hashes are calculated has changed, so you won't get cache hits
+ for compilation results stored by older ccache versions. Because of this, you
+ might as well clear the old cache directory with `ccache --clear` if you
+ want, unless you plan to keep using an older ccache version.
+
+
+New features and enhancements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- ccache now has a ``direct mode'' where it computes a hash of the source code
+ (including all included files) and compiler options without running the
+ preprocessor. By not running the preprocessor, CPU usage is reduced; the
+ speed is somewhere between 1 and 5 times that of ccache running in
+ traditional mode, depending on the circumstances. The speedup will be higher
+ when I/O is fast (e.g., when files are in the disk cache). The direct mode
+ can be disabled by setting +CCACHE_NODIRECT+.
+
+- Support has been added for rewriting absolute paths to relative paths when
+ hashing, in order to increase cache hit rate when building the same source
+ code in different directories even when compiling with `-g` and when using
+ absolute include directory paths. This is done by setting the
+ `CCACHE_BASEDIR` environment variable to an absolute path that specifies
+ which paths to rewrite.
+
+- Object files are now optionally stored compressed in the cache. The runtime
+ cost is negligible, and more files will fit in the ccache directory and in
+ the disk cache. Set `CCACHE_COMPRESS` to enable object file compression. Note
+ that you can't use compression in combination with the hard link feature.
+
+- A `CCACHE_COMPILERCHECK` option has been added. This option tells ccache what
+ compiler-identifying information to hash to ensure that results retrieved
+ from the cache are accurate. Possible values are: none (don't hash anything),
+ mtime (hash the compiler's mtime and size) and content (hash the content of
+ the compiler binary). The default is mtime.
+
+- It is now possible to specify extra files whose contents should be included
+ in the hash sum by setting the `CCACHE_EXTRAFILES` option.
+
+- Added support for Objective-C and Objective-C\+\+. The statistics counter
+ ``not a C/C++ file'' has been renamed to ``unsupported source language''.
+
+- Added support for the `-x` compiler option.
+
+- Added support for long command-line options.
+
+- A `CACHEDIR.TAG` file is now created in the cache directory. See
+ <http://www.brynosaurus.com/cachedir/>.
+
+- Messages printed to the debug log (specified by `CCACHE_LOGFILE`) have been
+ improved.
+
+- You can relax some checks that ccache does in direct mode by setting
+ `CCACHE_SLOPPINESS`. See the manual for more information.
+
+- `CCACHE_TEMPDIR` no longer needs to be on the same filesystem as
+ `CCACHE_DIR`.
+
+- The default value of `CCACHE_TEMPDIR` has been changed to `$CCACHE_DIR/tmp`
+ to avoid cluttering the top directory.
+
+- Temporary files that later will be moved into the cache are now created in
+ the cache directory they will end up in. This makes ccache more friendly to
+ Linux's directory layout.
+
+- Improved the test suite and added tests for most of the new functionality.
+ It's now also possible to specify a subset of tests to run.
+
+- Standard error output from the compiler is now only stored in the cache if
+ it's non-empty.
+
+- If the compiler produces no object file or an empty object file, but gives a
+ zero exit status (could be due to a file system problem, a buggy program
+ specified by `CCACHE_PREFIX`, etc.), ccache copes with it properly.
+
+- Added `installcheck` and `distcheck` make targets.
+
+- Clarified cache size limit options' and cleanup semantics.
+
+- Improved display of cache max size values.
+
+- The following options are no longer hashed in the preprocessor mode:
+ `-imacros`, `-imultilib`, `-iprefix`, `-iquote`, `-isysroot`, `-iwithprefix`,
+ `-iwithprefixbefore`, `-nostdinc`, `-nostdinc++` and `-U`.
+
+
+Bug fixes
+~~~~~~~~~
+
+- Various portability improvements.
+
+- Improved detection of home directory.
+
+- User-defined `CPPFLAGS` and `LDFLAGS` are now respected in the Makefile.
+
+- Fixed NFS issues.
+
+- Computation of the hash sum has been improved to decrease the risk of hash
+ collisions. For instance, the compiler options `-X -Y` and `-X-Y` previously
+ contributed equally to the hash sum.
+
+- Bail out on too hard compiler options `--coverage`, `-fprofile-arcs`,
+ `-fprofile-generate`, `-fprofile-use`, `-frepo`, `-ftest-coverage` and
+ `-save-temps`. Also bail out on `@file` style options.
+
+- Errors when using multiple `-arch` compiler options are now noted as
+ ``unsupported compiler option''.
+
+- `-MD`/`-MMD` options without `-MT`/`-MF` are now handled correctly.
+
+- The `-finput-charset` option is now handled correctly.
+
+- Added support for `-Wp,-MD` and `-Wp,-MMD` options.
+
+- The compiler options `-Xassembler`, `-b`, `-G` and `-V` are now correctly
+ recognized as taking an argument.
+
+- Debug information containing line numbers of predefined and command-line
+ macros (enabled with the compiler option `-g3`) will now be correct.
+
+- Corrected LRU cleanup handling of object files.
+
+- `utimes()` is now used instead of `utime()` when available.
+
+- Non-writable cache directories are now handled gracefully.
+
+- Corrected documentation about sharing the cache directory.
+
+- Fixed compilation warnings from GCC 4.3.
+
+- The command specified by `CCACHE_PREFIX` is no longer part of the hash.
+
+- Fixed bad memory access spotted by Valgrind.
+
+- Fixed a bug in `x_realloc`.
+
+- Freed memory is no longer referenced when compiling a `.i`/`.ii` file and
+ falling back to running the real compiler.
+
+- The test suite is now immune to external values of the `CCACHE_*` environment
+ variables.
+
+- Improved detection of recursive invocation.
+
+- The ccache binary is now not unconditionally stripped when installing.
+
+- Statistics counters are now correctly updated for -E option failures and
+ internal errors.
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
+<head>\r
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
+<meta name="generator" content="AsciiDoc 8.6.9" />\r
+<title>ccache news</title>\r
+<style type="text/css">\r
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
+\r
+/* Default font. */\r
+body {\r
+ font-family: Georgia,serif;\r
+}\r
+\r
+/* Title font. */\r
+h1, h2, h3, h4, h5, h6,\r
+div.title, caption.title,\r
+thead, p.table.header,\r
+#toctitle,\r
+#author, #revnumber, #revdate, #revremark,\r
+#footer {\r
+ font-family: Arial,Helvetica,sans-serif;\r
+}\r
+\r
+body {\r
+ margin: 1em 5% 1em 5%;\r
+}\r
+\r
+a {\r
+ color: blue;\r
+ text-decoration: underline;\r
+}\r
+a:visited {\r
+ color: fuchsia;\r
+}\r
+\r
+em {\r
+ font-style: italic;\r
+ color: navy;\r
+}\r
+\r
+strong {\r
+ font-weight: bold;\r
+ color: #083194;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+ color: #527bbd;\r
+ margin-top: 1.2em;\r
+ margin-bottom: 0.5em;\r
+ line-height: 1.3;\r
+}\r
+\r
+h1, h2, h3 {\r
+ border-bottom: 2px solid silver;\r
+}\r
+h2 {\r
+ padding-top: 0.5em;\r
+}\r
+h3 {\r
+ float: left;\r
+}\r
+h3 + * {\r
+ clear: left;\r
+}\r
+h5 {\r
+ font-size: 1.0em;\r
+}\r
+\r
+div.sectionbody {\r
+ margin-left: 0;\r
+}\r
+\r
+hr {\r
+ border: 1px solid silver;\r
+}\r
+\r
+p {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+ul, ol, li > p {\r
+ margin-top: 0;\r
+}\r
+ul > li { color: #aaa; }\r
+ul > li > * { color: black; }\r
+\r
+.monospaced, code, pre {\r
+ font-family: "Courier New", Courier, monospace;\r
+ font-size: inherit;\r
+ color: navy;\r
+ padding: 0;\r
+ margin: 0;\r
+}\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
+\r
+#author {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ font-size: 1.1em;\r
+}\r
+#email {\r
+}\r
+#revnumber, #revdate, #revremark {\r
+}\r
+\r
+#footer {\r
+ font-size: small;\r
+ border-top: 2px solid silver;\r
+ padding-top: 0.5em;\r
+ margin-top: 4.0em;\r
+}\r
+#footer-text {\r
+ float: left;\r
+ padding-bottom: 0.5em;\r
+}\r
+#footer-badges {\r
+ float: right;\r
+ padding-bottom: 0.5em;\r
+}\r
+\r
+#preamble {\r
+ margin-top: 1.5em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.imageblock, div.exampleblock, div.verseblock,\r
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
+div.admonitionblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.admonitionblock {\r
+ margin-top: 2.0em;\r
+ margin-bottom: 2.0em;\r
+ margin-right: 10%;\r
+ color: #606060;\r
+}\r
+\r
+div.content { /* Block element content. */\r
+ padding: 0;\r
+}\r
+\r
+/* Block element titles. */\r
+div.title, caption.title {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ text-align: left;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.5em;\r
+}\r
+div.title + * {\r
+ margin-top: 0;\r
+}\r
+\r
+td div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content + div.title {\r
+ margin-top: 0.0em;\r
+}\r
+\r
+div.sidebarblock > div.content {\r
+ background: #ffffee;\r
+ border: 1px solid #dddddd;\r
+ border-left: 4px solid #f0f0f0;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.listingblock > div.content {\r
+ border: 1px solid #dddddd;\r
+ border-left: 5px solid #f0f0f0;\r
+ background: #f8f8f8;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.quoteblock, div.verseblock {\r
+ padding-left: 1.0em;\r
+ margin-left: 1.0em;\r
+ margin-right: 10%;\r
+ border-left: 5px solid #f0f0f0;\r
+ color: #888;\r
+}\r
+\r
+div.quoteblock > div.attribution {\r
+ padding-top: 0.5em;\r
+ text-align: right;\r
+}\r
+\r
+div.verseblock > pre.content {\r
+ font-family: inherit;\r
+ font-size: inherit;\r
+}\r
+div.verseblock > div.attribution {\r
+ padding-top: 0.75em;\r
+ text-align: left;\r
+}\r
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
+div.verseblock + div.attribution {\r
+ text-align: left;\r
+}\r
+\r
+div.admonitionblock .icon {\r
+ vertical-align: top;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: #527bbd;\r
+ padding-right: 0.5em;\r
+}\r
+div.admonitionblock td.content {\r
+ padding-left: 0.5em;\r
+ border-left: 3px solid #dddddd;\r
+}\r
+\r
+div.exampleblock > div.content {\r
+ border-left: 3px solid #dddddd;\r
+ padding-left: 0.5em;\r
+}\r
+\r
+div.imageblock div.content { padding-left: 0; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
+a.image:visited { color: white; }\r
+\r
+dl {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+dt {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0;\r
+ font-style: normal;\r
+ color: navy;\r
+}\r
+dd > *:first-child {\r
+ margin-top: 0.1em;\r
+}\r
+\r
+ul, ol {\r
+ list-style-position: outside;\r
+}\r
+ol.arabic {\r
+ list-style-type: decimal;\r
+}\r
+ol.loweralpha {\r
+ list-style-type: lower-alpha;\r
+}\r
+ol.upperalpha {\r
+ list-style-type: upper-alpha;\r
+}\r
+ol.lowerroman {\r
+ list-style-type: lower-roman;\r
+}\r
+ol.upperroman {\r
+ list-style-type: upper-roman;\r
+}\r
+\r
+div.compact ul, div.compact ol,\r
+div.compact p, div.compact p,\r
+div.compact div, div.compact div {\r
+ margin-top: 0.1em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+tfoot {\r
+ font-weight: bold;\r
+}\r
+td > div.verse {\r
+ white-space: pre;\r
+}\r
+\r
+div.hdlist {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+div.hdlist tr {\r
+ padding-bottom: 15px;\r
+}\r
+dt.hdlist1.strong, td.hdlist1.strong {\r
+ font-weight: bold;\r
+}\r
+td.hdlist1 {\r
+ vertical-align: top;\r
+ font-style: normal;\r
+ padding-right: 0.8em;\r
+ color: navy;\r
+}\r
+td.hdlist2 {\r
+ vertical-align: top;\r
+}\r
+div.hdlist.compact tr {\r
+ margin: 0;\r
+ padding-bottom: 0;\r
+}\r
+\r
+.comment {\r
+ background: yellow;\r
+}\r
+\r
+.footnote, .footnoteref {\r
+ font-size: 0.8em;\r
+}\r
+\r
+span.footnote, span.footnoteref {\r
+ vertical-align: super;\r
+}\r
+\r
+#footnotes {\r
+ margin: 20px 0 20px 0;\r
+ padding: 7px 0 0 0;\r
+}\r
+\r
+#footnotes div.footnote {\r
+ margin: 0 0 5px 0;\r
+}\r
+\r
+#footnotes hr {\r
+ border: none;\r
+ border-top: 1px solid silver;\r
+ height: 1px;\r
+ text-align: left;\r
+ margin-left: 0;\r
+ width: 20%;\r
+ min-width: 100px;\r
+}\r
+\r
+div.colist td {\r
+ padding-right: 0.5em;\r
+ padding-bottom: 0.3em;\r
+ vertical-align: top;\r
+}\r
+div.colist td img {\r
+ margin-top: 0.3em;\r
+}\r
+\r
+@media print {\r
+ #footer-badges { display: none; }\r
+}\r
+\r
+#toc {\r
+ margin-bottom: 2.5em;\r
+}\r
+\r
+#toctitle {\r
+ color: #527bbd;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
+ margin-top: 0;\r
+ margin-bottom: 0;\r
+}\r
+div.toclevel2 {\r
+ margin-left: 2em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel3 {\r
+ margin-left: 4em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel4 {\r
+ margin-left: 6em;\r
+ font-size: 0.9em;\r
+}\r
+\r
+span.aqua { color: aqua; }\r
+span.black { color: black; }\r
+span.blue { color: blue; }\r
+span.fuchsia { color: fuchsia; }\r
+span.gray { color: gray; }\r
+span.green { color: green; }\r
+span.lime { color: lime; }\r
+span.maroon { color: maroon; }\r
+span.navy { color: navy; }\r
+span.olive { color: olive; }\r
+span.purple { color: purple; }\r
+span.red { color: red; }\r
+span.silver { color: silver; }\r
+span.teal { color: teal; }\r
+span.white { color: white; }\r
+span.yellow { color: yellow; }\r
+\r
+span.aqua-background { background: aqua; }\r
+span.black-background { background: black; }\r
+span.blue-background { background: blue; }\r
+span.fuchsia-background { background: fuchsia; }\r
+span.gray-background { background: gray; }\r
+span.green-background { background: green; }\r
+span.lime-background { background: lime; }\r
+span.maroon-background { background: maroon; }\r
+span.navy-background { background: navy; }\r
+span.olive-background { background: olive; }\r
+span.purple-background { background: purple; }\r
+span.red-background { background: red; }\r
+span.silver-background { background: silver; }\r
+span.teal-background { background: teal; }\r
+span.white-background { background: white; }\r
+span.yellow-background { background: yellow; }\r
+\r
+span.big { font-size: 2em; }\r
+span.small { font-size: 0.6em; }\r
+\r
+span.underline { text-decoration: underline; }\r
+span.overline { text-decoration: overline; }\r
+span.line-through { text-decoration: line-through; }\r
+\r
+div.unbreakable { page-break-inside: avoid; }\r
+\r
+\r
+/*\r
+ * xhtml11 specific\r
+ *\r
+ * */\r
+\r
+div.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.tableblock > table {\r
+ border: 3px solid #527bbd;\r
+}\r
+thead, p.table.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.table {\r
+ margin-top: 0;\r
+}\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
+div.tableblock > table[frame="void"] {\r
+ border-style: none;\r
+}\r
+div.tableblock > table[frame="hsides"] {\r
+ border-left-style: none;\r
+ border-right-style: none;\r
+}\r
+div.tableblock > table[frame="vsides"] {\r
+ border-top-style: none;\r
+ border-bottom-style: none;\r
+}\r
+\r
+\r
+/*\r
+ * html5 specific\r
+ *\r
+ * */\r
+\r
+table.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+thead, p.tableblock.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.tableblock {\r
+ margin-top: 0;\r
+}\r
+table.tableblock {\r
+ border-width: 3px;\r
+ border-spacing: 0px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+ border-collapse: collapse;\r
+}\r
+th.tableblock, td.tableblock {\r
+ border-width: 1px;\r
+ padding: 4px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+}\r
+\r
+table.tableblock.frame-topbot {\r
+ border-left-style: hidden;\r
+ border-right-style: hidden;\r
+}\r
+table.tableblock.frame-sides {\r
+ border-top-style: hidden;\r
+ border-bottom-style: hidden;\r
+}\r
+table.tableblock.frame-none {\r
+ border-style: hidden;\r
+}\r
+\r
+th.tableblock.halign-left, td.tableblock.halign-left {\r
+ text-align: left;\r
+}\r
+th.tableblock.halign-center, td.tableblock.halign-center {\r
+ text-align: center;\r
+}\r
+th.tableblock.halign-right, td.tableblock.halign-right {\r
+ text-align: right;\r
+}\r
+\r
+th.tableblock.valign-top, td.tableblock.valign-top {\r
+ vertical-align: top;\r
+}\r
+th.tableblock.valign-middle, td.tableblock.valign-middle {\r
+ vertical-align: middle;\r
+}\r
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
+ vertical-align: bottom;\r
+}\r
+\r
+\r
+/*\r
+ * manpage specific\r
+ *\r
+ * */\r
+\r
+body.manpage h1 {\r
+ padding-top: 0.5em;\r
+ padding-bottom: 0.5em;\r
+ border-top: 2px solid silver;\r
+ border-bottom: 2px solid silver;\r
+}\r
+body.manpage h2 {\r
+ border-style: none;\r
+}\r
+body.manpage div.sectionbody {\r
+ margin-left: 3em;\r
+}\r
+\r
+@media print {\r
+ body.manpage div#toc { display: none; }\r
+}\r
+\r
+\r
+</style>\r
+<script type="text/javascript">\r
+/*<+'])');\r
+ // Function that scans the DOM tree for header elements (the DOM2\r
+ // nodeIterator API would be a better technique but not supported by all\r
+ // browsers).\r
+ var iterate = function (el) {\r
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
+ var mo = re.exec(i.tagName);\r
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
+ }\r
+ iterate(i);\r
+ }\r
+ }\r
+ }\r
+ iterate(el);\r
+ return result;\r
+ }\r
+\r
+ var toc = document.getElementById("toc");\r
+ if (!toc) {\r
+ return;\r
+ }\r
+\r
+ // Delete existing TOC entries in case we're reloading the TOC.\r
+ var tocEntriesToRemove = [];\r
+ var i;\r
+ for (i = 0; i < toc.childNodes.length; i++) {\r
+ var entry = toc.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div'\r
+ && entry.getAttribute("class")\r
+ && entry.getAttribute("class").match(/^toclevel/))\r
+ tocEntriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < tocEntriesToRemove.length; i++) {\r
+ toc.removeChild(tocEntriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild TOC entries.\r
+ var entries = tocEntries(document.getElementById("content"), toclevels);\r
+ for (var i = 0; i < entries.length; ++i) {\r
+ var entry = entries[i];\r
+ if (entry.element.id == "")\r
+ entry.element.id = "_toc_" + i;\r
+ var a = document.createElement("a");\r
+ a.href = "#" + entry.element.id;\r
+ a.appendChild(document.createTextNode(entry.text));\r
+ var div = document.createElement("div");\r
+ div.appendChild(a);\r
+ div.className = "toclevel" + entry.toclevel;\r
+ toc.appendChild(div);\r
+ }\r
+ if (entries.length == 0)\r
+ toc.parentNode.removeChild(toc);\r
+},\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Footnotes generator\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+/* Based on footnote generation code from:\r
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
+ */\r
+\r
+footnotes: function () {\r
+ // Delete existing footnote entries in case we're reloading the footnodes.\r
+ var i;\r
+ var noteholder = document.getElementById("footnotes");\r
+ if (!noteholder) {\r
+ return;\r
+ }\r
+ var entriesToRemove = [];\r
+ for (i = 0; i < noteholder.childNodes.length; i++) {\r
+ var entry = noteholder.childNodes[i];\r
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")\r
+ entriesToRemove.push(entry);\r
+ }\r
+ for (i = 0; i < entriesToRemove.length; i++) {\r
+ noteholder.removeChild(entriesToRemove[i]);\r
+ }\r
+\r
+ // Rebuild footnote entries.\r
+ var cont = document.getElementById("content");\r
+ var spans = cont.getElementsByTagName("span");\r
+ var refs = {};\r
+ var n = 0;\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnote") {\r
+ n++;\r
+ var note = spans[i].getAttribute("data-note");\r
+ if (!note) {\r
+ // Use [\s\S] in place of . so multi-line matches work.\r
+ // Because JavaScript has no s (dotall) regex flag.\r
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
+ spans[i].innerHTML =\r
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ spans[i].setAttribute("data-note", note);\r
+ }\r
+ noteholder.innerHTML +=\r
+ "<div class='footnote' id='_footnote_" + n + "'>" +\r
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
+ n + "</a>. " + note + "</div>";\r
+ var id =spans[i].getAttribute("id");\r
+ if (id != null) refs["#"+id] = n;\r
+ }\r
+ }\r
+ if (n == 0)\r
+ noteholder.parentNode.removeChild(noteholder);\r
+ else {\r
+ // Process footnoterefs.\r
+ for (i=0; i<spans.length; i++) {\r
+ if (spans[i].className == "footnoteref") {\r
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
+ href = href.match(/#.*/)[0]; // Because IE return full URL.\r
+ n = refs[href];\r
+ spans[i].innerHTML =\r
+ "[<a href='#_footnote_" + n +\r
+ "' title='View footnote' class='footnote'>" + n + "</a>]";\r
+ }\r
+ }\r
+ }\r
+},\r
+\r
+install: function(toclevels) {\r
+ var timerId;\r
+\r
+ function reinstall() {\r
+ asciidoc.footnotes();\r
+ if (toclevels) {\r
+ asciidoc.toc(toclevels);\r
+ }\r
+ }\r
+\r
+ function reinstallAndRemoveTimer() {\r
+ clearInterval(timerId);\r
+ reinstall();\r
+ }\r
+\r
+ timerId = setInterval(reinstall, 500);\r
+ if (document.addEventListener)\r
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);\r
+ else\r
+ window.onload = reinstallAndRemoveTimer;\r
+}\r
+\r
+}\r
+asciidoc.install(2);\r
+/*]]>*/\r
+</script>\r
+</head>\r
+<body class="article">\r
+<div id="header">\r
+<h1>ccache news</h1>\r
+<span id="revnumber">version 3.4.2</span>\r
+<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>
+</div>\r
+</div>\r
+<div id="content">\r
+<div class="sect1">\r
+<h2 id="_ccache_3_4_2">ccache 3.4.2</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2018-03-25</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The cleanup algorithm has been fixed to not misbehave when files are removed\r
+ by another process while the cleanup process is running. Previously, too many\r
+ files could be removed from the cache if multiple cleanup processes were\r
+ triggered at the same time, in extreme cases trimming the cache to a much\r
+ smaller size than the configured limits.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Correctly hash preprocessed headers located in a “.gch directory”.\r
+ Previously, ccache would not pick up changes to such precompiled headers,\r
+ risking false positive cache hits.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed build failure when using the bundled zlib sources.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache 3.3.5 added a workaround for not triggering Clang errors when a\r
+ precompiled header’s dependency has an updated timestamp (but identical\r
+ content). That workaround is now only applied when the compiler is Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made it possible to perform out-of-source builds in dev mode again.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_4_1">ccache 3.4.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2018-02-11</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_2">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed printing of version number in <code>ccache --version</code>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_4">ccache 3.4</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2018-02-11</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The compiler option form <code>--sysroot arg</code> is now handled like the documented\r
+ <code>--sysroot=arg</code> form.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for caching <code>.su</code> files generated by GCC flag <code>-fstack-usage</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache should now work with distcc’s “pump” wrapper.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The optional unifier is no longer disabled when the direct mode is enabled.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for NVCC compiler options <code>--compiler-bindir/-ccbin</code>,\r
+ <code>--output-directory/-odir</code> and <code>--libdevice-directory/-ldir</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Boolean environment variable settings no longer accept the following\r
+ (case-insensitive) values: <code>0</code>, <code>false</code>, <code>disable</code> and <code>no</code>. All other values\r
+ are accepted and taken to mean “true”. This is to stop users from setting\r
+ e.g. <code>CCACHE_DISABLE=0</code> and then expect the cache to be used.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved support for <code>run_second_cpp = false</code>: If combined with passing\r
+ <code>-fdirectives-only</code> (GCC) or <code>frewrite-includes</code> (Clang) to the compiler,\r
+ diagnostics warnings and similar will be correct.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+An implicit <code>-MQ</code> is now passed to the preprocessor only if the object file\r
+ extension is non-standard. This should make it easier to use EDG-based\r
+ compilers (e.g. GHS) which don’t understand <code>-MQ</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now treats an unreadable configuration file just like a missing\r
+ configuration file.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Documented more pitfalls with enabling <code>hard_links</code> (<code>CCACHE_HARDLINK</code>).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Documented caveats related to colored warnings from compilers.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_3">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+File size and number counters are now updated correctly when files are\r
+ overwritten in the cache, e.g. when using <code>CCACHE_RECACHE</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>run_second_cpp</code> is now forced for NVCC.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed how the NVCC options <code>-optf</code> and <code>-odir</code> are handled.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_6">ccache 3.3.6</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2018-01-28</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_2">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Improved instructions on how to get cache hits between different working\r
+ directories.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_4">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed regression in ccache 3.3.5 related to the <code>UNCACHED_ERR_FD</code> feature.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_5">ccache 3.3.5</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2018-01-13</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_3">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Documented how automatic cache cleanup works.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_5">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a regression where the original order of debug options could be lost.\r
+ This reverts the “Improved parsing of <code>-g*</code> options” feature in ccache 3.3.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Multiple <code>-fdebug-prefix-map</code> options should now be handled correctly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed matching of directories in the <code>ignore_headers_in_manifest</code>\r
+ configuration option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed detection of missing argument to <code>-opt</code>/<code>--options-file</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now bails out when building a precompiled header if any of the\r
+ corresponding header files has an updated timestamp. This fixes complaints\r
+ from Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug related to erroneously storing a dependency file with absolute\r
+ paths in the cache on a preprocessed hit.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>ccache -c/--cleanup</code> now works like documented: it just recalculates size\r
+ counters and trims the cache to not exceed the max size and file number\r
+ limits. Previously, the forced cleanup took “limit_multiple” into account,\r
+ so that <code>ccache -c/--cleanup</code> by default would trim the cache to 80% of the\r
+ max limit.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache no longer ignores linker arguments for Clang since Clang warns about\r
+ them.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Plugged a couple of file descriptor leaks.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug where ccache would skip hashing the compiler argument following a\r
+ <code>-fno-working-directory</code>, <code>-fworking-directory</code>, <code>-nostdinc</code>, <code>-nostdinc++</code>,\r
+ <code>-remap</code> or <code>-trigraphs</code> option in preprocessor mode.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_4">ccache 3.3.4</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2017-02-17</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_4">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Documented the different cache statistics counters.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_6">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a regression in ccache 3.3 related to potentially bad content of\r
+ dependency files when compiling identical source code but with different\r
+ source paths. This was only partially fixed in 3.3.2 and reverts the new\r
+ “Names of included files are no longer included in the hash of the\r
+ compiler’s preprocessed output” feature in 3.3.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected statistics counter for <code>-optf</code>/<code>--options-file</code> failure.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed undefined behavior warnings in ccache found by <code>-fsanitize=undefined</code>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_3">ccache 3.3.3</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-10-26</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_7">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+ccache now detects usage of <code>.incbin</code> assembler directives in the source code\r
+ and avoids caching such compilations.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_2">ccache 3.3.2</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-09-28</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_8">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a regression in ccache 3.3 related to potentially bad content of\r
+ dependency files when compiling identical source code but with different\r
+ source paths.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a regression in ccache 3.3.1: ccache could get confused when using the\r
+ compiler option <code>-Wp,</code> to pass multiple options to the preprocessor,\r
+ resulting in missing dependency files from direct mode cache hits.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3_1">ccache 3.3.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-09-07</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_9">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a problem in the “multiple <code>-arch</code> options” support introduced in\r
+ 3.3. When using the direct mode (the default), different combinations of\r
+ <code>-arch</code> options were not detected properly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed an issue when compiler option <code>-Wp,-MT,path</code> is used instead of <code>-MT\r
+ path</code> (and similar for <code>-MF</code>, <code>-MP</code> and <code>-MQ</code>) and <code>run_second_cpp</code>\r
+ (<code>CCACHE_CPP2</code>) is enabled.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_3">ccache 3.3</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-08-27</p></div>\r
+<div class="sect2">\r
+<h3 id="_notes">Notes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+A C99-compatible compiler is now required to build ccache.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_5">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The configuration option <code>run_second_cpp</code> (<code>CCACHE_CPP2</code>) now defaults to\r
+ true. This improves ccache’s out-of-the-box experience for compilers that\r
+ can’t compile their own preprocessed output with the same outcome as if they\r
+ compiled the real source code directly, e.g. newer versions of GCC and Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The configuration option <code>hash_dir</code> (<code>CCACHE_HASHDIR</code>) now defaults to true.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new <code>ignore_headers_in_manifest</code> configuration option, which\r
+ specifies headers that should be ignored in the direct mode.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new <code>prefix_command_cpp</code> (<code>CCACHE_PREFIX_CPP</code>) configuration option,\r
+ which specifies one or several prefixes to add to the command line ccache\r
+ uses when invoking the preprocessor.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new <code>limit_multiple</code> (<code>CCACHE_LIMIT_MULTIPLE</code>) configuration option,\r
+ which specifies how much of the cache to remove when cleaning.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new <code>keep_comments_cpp</code> (<code>CCACHE_COMMENTS</code>) configuration option,\r
+ which tells ccache not to discard the comments before hashing preprocessor\r
+ output. This can be used to check documentation with <strong>-Wdocumentation</strong>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new sloppiness option <code>no_system_headers</code>, which tells ccache not to\r
+ include system headers in manifest files.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new statistics counter that tracks the number of performed cleanups\r
+ due to the cache size being over the limit. The value is shown in the output\r
+ of “ccache -s”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for relocating debug info directory using <code>-fdebug-prefix-map</code>.\r
+ This allows for cache hits even when <code>hash_dir</code> is used in combination with\r
+ <code>base_dir</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new “cache hit rate” field to the output of “ccache -s”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for caching compilation of assembler code produced by e.g.\r
+ “gcc -S file.c”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for cuda including the -optf/--options-file option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for Fortran 77.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for multiple <code>-arch</code> options to produce "fat binaries".\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Multiple identical <code>-arch</code> arguments are now handled without bailing.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The concatenated form of some long compiler options is now recognized, for\r
+ example when using <code>-isystemPATH</code> instead of <code>-isystem PATH</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If hard-linking is enabled and but fails (e.g. due to cross-device linking),\r
+ ccache now falls back to copying instead of running the compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made the <code>hash_dir</code> option only have effect when generating debug info.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now knows how to convert absolute paths to relative paths inside\r
+ dependency files when using <code>base_dir</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved parsing of <code>-g*</code> options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made ccache understand <code>-Wp,-D*</code> options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now understands the undocumented <code>-coverage</code> (only one dash) GCC\r
+ option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Names of included files are no longer included in the hash of the compiler’s\r
+ preprocessed output. This leads to more potential cache hits when not using\r
+ the direct mode.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Increased buffer size used when reading file data. This improves performance\r
+ slightly.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_10">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler option <code>-P</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed Clang test suite when running on Linux.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed build and test for MinGW32 and Windows.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_9">ccache 3.2.9</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-09-28</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_11">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a regression in ccache 3.2.8: ccache could get confused when using the\r
+ compiler option <code>-Wp,</code> to pass multiple options to the preprocessor,\r
+ resulting in missing dependency files from direct mode cache hits.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_8">ccache 3.2.8</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-09-07</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_12">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed an issue when compiler option <code>-Wp,-MT,path</code> is used instead of <code>-MT\r
+ path</code> (and similar for <code>-MF</code>, <code>-MP</code> and <code>-MQ</code>) and <code>run_second_cpp</code>\r
+ (<code>CCACHE_CPP2</code>) is enabled.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now understands the undocumented <code>-coverage</code> (only one dash) GCC\r
+ option.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_7">ccache 3.2.7</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-07-20</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_13">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a bug which could lead to false cache hits for compiler command lines\r
+ with a missing argument to an option that takes an argument.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now knows how to work around a glitch in the output of GCC 6’s\r
+ preprocessor.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_6">ccache 3.2.6</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-07-12</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_14">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed build problem on QNX, which lacks “SA_RESTART”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on compiler option <code>-fstack-usage</code> since it creates a <code>.su</code> file\r
+ which ccache currently doesn’t handle.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug where (due to ccache rewriting paths) the compiler could choose\r
+ incorrect include files if <code>CCACHE_BASEDIR</code> is used and the source file path\r
+ is absolute and is a symlink.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_5">ccache 3.2.5</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-04-17</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_6">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Only pass Clang-specific <code>-stdlib=</code> to the preprocessor.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved handling of stale NFS handles.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made it harder to misinterpret documentation of boolean environment settings'\r
+ semantics.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_15">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Include m4 files used by configure.ac in the source dist archives.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected "Performance" section in the manual regarding <code>__DATE_</code>, <code>__TIME__</code>\r
+ and <code>__FILE__</code> macros.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed build on Solaris 10+ and AIX 7.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed failure to create directories on QNX.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Don’t (try to) update manifest file in “read-only” and “read-only direct”\r
+ modes.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug in caching of <code>stat</code> system calls in “file_stat_matches\r
+ sloppiness mode”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed bug in hashing of Clang plugins, leading to unnecessary cache misses.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed --print-config to show “pch_defines sloppiness”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The man page is now built when running “make install” from Git repository\r
+ sources.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_4">ccache 3.2.4</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2015-10-08</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_16">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed build error related to zlib on systems with older make versions\r
+ (regression in ccache 3.2.3).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made conversion-to-bool explicit to avoid build warnings (and potential\r
+ runtime errors) on legacy systems.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved signal handling: Kill compiler on SIGTERM; wait for compiler to exit\r
+ before exiting; die appropriately.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Minor fixes related to Windows support.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The correct compression level is now used if compression is requested.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug where cache cleanup could be run too early for caches larger than\r
+ 64 GiB on 32-bit systems.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_3">ccache 3.2.3</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2015-08-16</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_7">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added support for compiler option <code>-gsplit-dwarf</code>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_17">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Support external zlib in nonstandard directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Avoid calling <code>exit()</code> inside an exit handler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Let exit handler terminate properly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on compiler option <code>--save-temps</code> in addition to <code>-save-temps</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Only log "Disabling direct mode" once when failing to read potential include\r
+ files.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_2">ccache 3.2.2</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2015-05-10</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_8">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added support for <code>CCACHE_COMPILERCHECK=string:<value></code>. This is a faster\r
+ alternative to <code>CCACHE_COMPILERCHECK=<command></code> if the command’s output can\r
+ be precalculated by the build system.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Add support for caching code coverage results (compiling for gcov).\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_18">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Made hash of cached result created with and without <code>CCACHE_CPP2</code> different.\r
+ This makes it possible to rebuild with <code>CCACHE_CPP2</code> set without having to\r
+ clear the cache to get new results.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Don’t try to reset a non-existing stats file. This avoids “No such file or\r
+ directory” messages in the ccache log when the cache directory doesn’t\r
+ exist.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug where ccache deleted Clang diagnostics after compiler failures.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Avoid performing an unnecessary copy of the object file on a cache miss.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler option <code>-fmodules</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler option <code>-fplugin=libcc1plugin</code> (interaction\r
+ with GDB).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed build error when compiling ccache with recent Clang versions.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Removed signal-unsafe code from signal handler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected logic for when to output cached stderr.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Wipe the whole cached result on failure retrieving a cached file.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed build error when compiling ccache with recent Clang versions.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2_1">ccache 3.2.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2014-12-10</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_19">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed regression in temporary file handling, which lead to incorrect\r
+ permissions for stats, manifest and ccache.conf files in the cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>CACHEDIR.TAG</code> files are now created in the [0-9a-f] subdirectories so that\r
+ ccache.conf is not lost in backups.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made the default cache size suffix <code>G</code>, as previously documented.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>-fdiagnostics-color=auto</code> is now passed to the compiler even if stderr is\r
+ redirected. This fixes a problem when, for instance, a configure test probes\r
+ if the compiler (wrapped via ccache) supports <code>-fdiagnostics-color=auto</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added missing documentation for <code>max_files</code> and <code>max_size</code> configuration\r
+ options.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_2">ccache 3.2</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2014-11-17</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_9">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added support for configuring ccache via one or several configuration files\r
+ instead of via environment variables. Environment variables still have\r
+ priority but are no longer the recommended way of customizing ccache\r
+ behavior. See the manual for more information.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for compiler error/warning messages with color.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made creation of temporary directories and cache directories smarter to avoid\r
+ unnecessary <code>stat</code> calls.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved efficiency of the algorithm that scans for <code>__DATE_</code> and <code>__TIME__</code>\r
+ tokens in the hashed source code.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for several binaries (separated by space) in <code>CCACHE_PREFIX</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The <code>-c</code> option is no longer passed to the preprocessor. This fixes problems\r
+ with Clang and Solaris’s C++ compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache no longer passes preprocessor options like <code>-D</code> and <code>-I</code> to the\r
+ compiler when compiling preprocessed output. This fixes warnings emitted by\r
+ Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Compiler options <code>-fprofile-generate</code>, <code>-fprofile-arcs</code>, <code>-fprofile-use</code> and\r
+ <code>-fbranch-probabilities</code> are now handled without bailing.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for Clang’s <code>--serialize-diagnostic</code> option, storing the\r
+ diagnostic file (<code>.dia</code>) in the cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for precompiled headers when using Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for Clang <code>.pth</code> (pretokenized header) files.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Changed the <code>-x</code> language option to use the new objective C standard for GCC\r
+ and Clang.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+On a cache miss, ccache now instructs the compiler to create the object file\r
+ at the real destination and then copies the file into the cache instead of\r
+ the other way around. This is needed to support compiler options like\r
+ <code>-fprofile-arcs</code> and <code>--serialize-diagnostics</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now checks that included files' ctimes aren’t too new. This check can\r
+ be turned off by adding <code>include_file_ctime</code> to the “ccache sloppiness”\r
+ setting.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added possibility to get cache hits based on filename, size, mtime and ctime\r
+ only. On other words, source code files are not even read, only stat-ed. This\r
+ operation mode is opt-in by adding <code>file_stat_matches</code> to the “ccache\r
+ sloppiness” setting.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The filename part of options like <code>-Wp,-MDfilename</code> is no longer included in\r
+ the hash since the filename doesn’t have any bearing on the result.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a “read-only direct” configuration setting, which is like the\r
+ ordinary read-only setting except that ccache will only try to retrieve\r
+ results from the cache using the direct mode, not the preprocessor mode.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The display and interpretation of cache size has been changed to use SI\r
+ units.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Default cache size is now 5 GB (was previously 1 GiB).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added configuration option to set the compression level of compressed object\r
+ files in the cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for <code>@file</code> and <code>-@file</code> arguments (reading options from a\r
+ file).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>-Wl,</code> options are no longer included in the hash since they don’t affect\r
+ compilation.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler option <code>-Wp,-P</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Optimized MD4 calculation code on little-endian systems.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Various improvements and fixes on win32.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved logging to the ccache log file.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>--dump-manifest</code> command-line option for debugging purposes.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>--with-bundled-zlib</code> configure option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Upgraded bundled zlib to version 1.2.8.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved <code>dev.mk</code> to be more platform independent.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made the test suite work with Clang and gcc-llvm on OS X.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Various other improvements of the test suite.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_20">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Any previous <code>.stderr</code> is now removed from the cache when recaching.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed an issue when handling the <code>-arch</code> compiler option with an argument.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed race condition when creating the initial cache directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed test suite failures when <code>CC</code> is a ccache-wrapped compiler.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_12">ccache 3.1.12</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2016-07-12</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_21">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed a bug where (due to ccache rewriting paths) the compiler could choose\r
+ incorrect include files if <code>CCACHE_BASEDIR</code> is used and the source file path\r
+ is absolute and is a symlink.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_11">ccache 3.1.11</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2015-03-07</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_22">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed bug which could result in false cache hits when source code contains\r
+ <code>'"'</code> followed by <code>" /*"</code> or <code>" //"</code> (with variations).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made hash of cached result created with and without <code>CCACHE_CPP2</code> different.\r
+ This makes it possible to rebuild with <code>CCACHE_CPP2</code> set without having to\r
+ clear the cache to get new results.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Don’t try to reset a non-existing stats file. This avoids “No such file or\r
+ directory” messages in the ccache log when the cache directory doesn’t\r
+ exist.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_10">ccache 3.1.10</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2014-10-19</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_10">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added support for the <code>-Xclang</code> compiler option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved handling of exit code of internally executed processes.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Zero length object files in the cache are now rejected as invalid.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on option <code>-gsplit-dwarf</code> (since it produces multiple output files).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Compiler option <code>-fdebug-prefix-map</code> is now ignored (not part of the hash).\r
+ (The <code>-fdebug-prefix-map</code> option may be used in combination with\r
+ <code>CCACHE_BASEDIR</code> to reuse results across different directories.)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added note in documentation that <code>--ccache-skip</code> currently does not mean\r
+ “don’t hash the following option”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+To enable support for precompiled headers (PCH), <code>CCACHE_SLOPPINESS</code> now also\r
+ needs to include the new <code>pch_defines</code> sloppiness. This is because ccache\r
+ can’t detect changes in the source code when only defined macros have been\r
+ changed.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Stale files in the internal temporary directory (<code><ccache_dir>/tmp</code>) are now\r
+ cleaned up if they are older than one hour.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_23">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed path canonicalization in <code>make_relative_path()</code> when path doesn’t\r
+ exist.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed bug in <code>common_dir_prefix_length()</code>. This corrects the <code>CCACHE_BASEDIR</code>\r
+ behavior.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache no longer tries to create the cache directory when <code>CCACHE_DISABLE</code> is\r
+ set.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed bug when reading manifests with a very large number of file info\r
+ entries.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed problem with logging of current working directory.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_9">ccache 3.1.9</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2013-01-06</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_24">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The EAGAIN signal is now handled correctly when emitting cached stderr\r
+ output. This fixes a problem triggered by large error outputs from the\r
+ compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Subdirectories in the cache are no longer created in read-only mode.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed so that ccache’s log file descriptor is not made available to the\r
+ compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved error reporting when failing to create temporary stdout/stderr files\r
+ when executing the compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Disappearing temporary stdout/stderr files are now handled gracefully.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed test suite to work on ecryptfs.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_8">ccache 3.1.8</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2012-08-11</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_11">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Made paths to dependency files relative in order to increase cache hits.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added work-around to make ccache work with buggy GCC 4.1 when creating a\r
+ pre-compiled header.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Clang plugins are now hashed to catch plugin upgrades.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_25">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Fixed crash when the current working directory has been removed.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed crash when stderr is closed.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected a corner case when parsing backslash escapes in string\r
+ literals.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Paths are now correctly canonicalized when computing paths relative to the\r
+ base directory.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_2">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Made git version macro work when compiling outside of the source directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed <code>static_assert</code> macro definition clash with GCC 4.7.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_7">ccache 3.1.7</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2012-01-08</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_26">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Non-writable <code>CCACHE_DIR</code> is now handled gracefully when <code>CCACHE_READONLY</code> is\r
+ set.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made failure to create files (typically due to bad directory permissions) in\r
+ the cache directory fatal. Previously, such failures were silently and\r
+ erroneously flagged as "compiler produced stdout".\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Both the <code>-specs=file</code> and <code>--specs=file</code> forms are now recognized.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added recognition and hashing of GCC plugins specified with <code>-fplugin=file</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>CCACHE_COMPILERCHECK</code> now also determines how to hash explicit specs files\r
+ (<code>-specs=file</code>).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>CPATH</code>, <code>C_INCLUDE_PATH</code> and similar environment variables to the hash\r
+ to avoid false cache hits when such variables have changed.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected log message when unify mode is enabled.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Reverted the GCC bug compatibility introduced in ccache 3.1.5 for <code>-MT</code>/<code>-MQ</code>\r
+ options with concatenated arguments. (The bug is fixed in recent GCC\r
+ versions.)\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_3">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Corrected license header for <code>mdfour.c</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved documentation on how to fix bad object files in the cache.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_6">ccache 3.1.6</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2011-08-21</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_12">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Rewrite argument to <code>--sysroot</code> if <code>CCACHE_BASEDIR</code> is used.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_27">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Don’t crash if <code>getcwd()</code> fails.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed alignment of “called for preprocessing” counter.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_5">ccache 3.1.5</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2011-05-29</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_13">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added a new statistics counter named “called for preprocessing”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The original command line is now logged to the file specified with\r
+ <code>CCACHE_LOGFILE</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved error logging when system calls fail.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for rewriting absolute paths in <code>-F</code>/<code>-iframework</code> GCC\r
+ options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved order of statistics counters in <code>ccache -s</code> output.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_28">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The <code>-MF</code>/<code>-MT</code>/<code>-MQ</code> options with concatenated argument are now handled\r
+ correctly when they are last on the command line.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache is now bug compatible with GCC for the <code>-MT</code>/<code>-MQ</code> options with\r
+ concatenated arguments.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a minor memory leak.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Systems that lack (and don’t need to be linked with) libm are now supported.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_4">ccache 3.1.4</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2011-01-09</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_29">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Made a work-around for a bug in <code>gzputc()</code> in zlib 1.2.5.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrupt manifest files are now removed so that they won’t block direct mode\r
+ hits.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache now copes with file systems that don’t know about symbolic links.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The file handle in now correctly closed on write error when trying to create\r
+ a cache dir tag.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_3">ccache 3.1.3</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-11-28</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_30">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The -MFarg, -MTarg and -MQarg compiler options (i.e, without space between\r
+ option and argument) are now handled correctly.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_4">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Portability fixes for HP-UX 11.00 and other esoteric systems.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_2">ccache 3.1.2</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-11-21</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_31">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler options <code>-fdump-*</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+NULL return values from malloc/calloc of zero bytes are now handled\r
+ correctly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed issue when parsing precompiler output on AIX.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_5">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Improved documentation on which information is included in the hash sum.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made the “too new header file” test case work on file systems with\r
+ unsynchronized clocks.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The test suite now also works on systems that lack a /dev/zero.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1_1">ccache 3.1.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-11-07</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_32">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+ccache now falls back to preprocessor mode when a non-regular include file\r
+ (device, socket, etc) has been detected so that potential hanging due to\r
+ blocking reads is avoided.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+CRC errors are now detected when decompressing compressed files in the cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed potential object file corruption race on NFS.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Minor documentation corrections.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed configure detection of ar.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+ccache development version (set by dev.mk) now works with gits whose\r
+ <code>describe</code> command doesn’t understand <code>--dirty</code>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_6">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Minor debug log message improvements.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_1">ccache 3.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-09-16</p></div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_14">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Added support for hashing the output of a custom command (e.g. <code>%compiler%\r
+ --version</code>) to identify the compiler instead of stat-ing or hashing the\r
+ compiler binary. This can improve robustness when the compiler (as seen by\r
+ ccache) actually isn’t the real compiler but another compiler wrapper.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for caching compilations that use precompiled headers. (See the\r
+ manual for important instructions regarding this.)\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Locking of the files containing statistics counters is now done using\r
+ symlinks instead of POSIX locks. This should make ccache behave a lot better\r
+ on file systems where POSIX locks are slow or broken (e.g. NFS on some\r
+ systems).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Manifest files are now updated without the need of taking locks.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Updates of statistics counters are now always done in one of the sub-level\r
+ statistics files. This reduces lock contention, which especially improves\r
+ performance on slow NFS mounts.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Reading and writing of statistics counters has been made forward-compatible\r
+ (unknown counters are retained).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Files are now read without using <code>mmap()</code>. This has two benefits: it’s more\r
+ robust against file changes during reading and it improves performance on\r
+ poor systems where <code>mmap()</code> doesn’t use the disk cache.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>.cp</code> and <code>.CP</code> as known C++ suffixes.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved logging.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>-install_name</code> as an option known to take an argument. (This improves\r
+ statistics when using the Darwin linker.)\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_33">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Non-fatal error messages are now never printed to stderr but logged instead.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug affecting failing commands when <code>--ccache-skip</code> is used.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made <code>--ccache-skip</code> work for all options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+EINTR is now handled correctly.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_other_7">Other</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Work on porting ccache to win32 (native), mostly done by Ramiro Polla. The\r
+ port is not yet finished, but will hopefully be complete in some subsequent\r
+ release.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a <code>--nostats</code> flag to the performance benchmark program.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Made the performance benchmark program more accurate when measuring cache\r
+ hits.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added a new test framework for unit tests written in C.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Got rid of <code>configure-dev</code>; dev mode is now given by <code>dev.mk.in</code> presence.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved documentation on how to combine ccache with other compiler wrappers\r
+ (like <code>distcc</code>).\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+New <code>LICENSE.txt</code> file with licensing and copyright details about bundled\r
+ source code.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+New <code>AUTHORS.txt</code> file with a list of ccache contributors.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+New <code>HACKING.txt</code> file with some notes about ccache code conventions.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_0_1">ccache 3.0.1</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-07-15</p></div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_34">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The statistics counter “called for link” is now correctly updated when\r
+ linking with a single object file.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a problem with out-of-source builds.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+<div class="sect1">\r
+<h2 id="_ccache_3_0">ccache 3.0</h2>\r
+<div class="sectionbody">\r
+<div class="paragraph"><p>Release date: 2010-06-20</p></div>\r
+<div class="sect2">\r
+<h3 id="_general">General</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+ccache is now licensed under the GNU General Public License (GPL) version 3\r
+ or later.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_upgrade_notes">Upgrade notes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+The way the hashes are calculated has changed, so you won’t get cache hits\r
+ for compilation results stored by older ccache versions. Because of this, you\r
+ might as well clear the old cache directory with <code>ccache --clear</code> if you\r
+ want, unless you plan to keep using an older ccache version.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_new_features_and_enhancements_15">New features and enhancements</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+ccache now has a “direct mode” where it computes a hash of the source code\r
+ (including all included files) and compiler options without running the\r
+ preprocessor. By not running the preprocessor, CPU usage is reduced; the\r
+ speed is somewhere between 1 and 5 times that of ccache running in\r
+ traditional mode, depending on the circumstances. The speedup will be higher\r
+ when I/O is fast (e.g., when files are in the disk cache). The direct mode\r
+ can be disabled by setting <code>CCACHE_NODIRECT</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Support has been added for rewriting absolute paths to relative paths when\r
+ hashing, in order to increase cache hit rate when building the same source\r
+ code in different directories even when compiling with <code>-g</code> and when using\r
+ absolute include directory paths. This is done by setting the\r
+ <code>CCACHE_BASEDIR</code> environment variable to an absolute path that specifies\r
+ which paths to rewrite.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Object files are now optionally stored compressed in the cache. The runtime\r
+ cost is negligible, and more files will fit in the ccache directory and in\r
+ the disk cache. Set <code>CCACHE_COMPRESS</code> to enable object file compression. Note\r
+ that you can’t use compression in combination with the hard link feature.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+A <code>CCACHE_COMPILERCHECK</code> option has been added. This option tells ccache what\r
+ compiler-identifying information to hash to ensure that results retrieved\r
+ from the cache are accurate. Possible values are: none (don’t hash anything),\r
+ mtime (hash the compiler’s mtime and size) and content (hash the content of\r
+ the compiler binary). The default is mtime.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+It is now possible to specify extra files whose contents should be included\r
+ in the hash sum by setting the <code>CCACHE_EXTRAFILES</code> option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for Objective-C and Objective-C++. The statistics counter\r
+ “not a C/C++ file” has been renamed to “unsupported source language”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for the <code>-x</code> compiler option.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for long command-line options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+A <code>CACHEDIR.TAG</code> file is now created in the cache directory. See\r
+ <a href="http://www.brynosaurus.com/cachedir/">http://www.brynosaurus.com/cachedir/</a>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Messages printed to the debug log (specified by <code>CCACHE_LOGFILE</code>) have been\r
+ improved.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+You can relax some checks that ccache does in direct mode by setting\r
+ <code>CCACHE_SLOPPINESS</code>. See the manual for more information.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>CCACHE_TEMPDIR</code> no longer needs to be on the same filesystem as\r
+ <code>CCACHE_DIR</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The default value of <code>CCACHE_TEMPDIR</code> has been changed to <code>$CCACHE_DIR/tmp</code>\r
+ to avoid cluttering the top directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Temporary files that later will be moved into the cache are now created in\r
+ the cache directory they will end up in. This makes ccache more friendly to\r
+ Linux’s directory layout.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved the test suite and added tests for most of the new functionality.\r
+ It’s now also possible to specify a subset of tests to run.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Standard error output from the compiler is now only stored in the cache if\r
+ it’s non-empty.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+If the compiler produces no object file or an empty object file, but gives a\r
+ zero exit status (could be due to a file system problem, a buggy program\r
+ specified by <code>CCACHE_PREFIX</code>, etc.), ccache copes with it properly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added <code>installcheck</code> and <code>distcheck</code> make targets.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Clarified cache size limit options' and cleanup semantics.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved display of cache max size values.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The following options are no longer hashed in the preprocessor mode:\r
+ <code>-imacros</code>, <code>-imultilib</code>, <code>-iprefix</code>, <code>-iquote</code>, <code>-isysroot</code>, <code>-iwithprefix</code>,\r
+ <code>-iwithprefixbefore</code>, <code>-nostdinc</code>, <code>-nostdinc++</code> and <code>-U</code>.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+<div class="sect2">\r
+<h3 id="_bug_fixes_35">Bug fixes</h3>\r
+<div class="ulist"><ul>\r
+<li>\r
+<p>\r
+Various portability improvements.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved detection of home directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+User-defined <code>CPPFLAGS</code> and <code>LDFLAGS</code> are now respected in the Makefile.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed NFS issues.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Computation of the hash sum has been improved to decrease the risk of hash\r
+ collisions. For instance, the compiler options <code>-X -Y</code> and <code>-X-Y</code> previously\r
+ contributed equally to the hash sum.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Bail out on too hard compiler options <code>--coverage</code>, <code>-fprofile-arcs</code>,\r
+ <code>-fprofile-generate</code>, <code>-fprofile-use</code>, <code>-frepo</code>, <code>-ftest-coverage</code> and\r
+ <code>-save-temps</code>. Also bail out on <code>@file</code> style options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Errors when using multiple <code>-arch</code> compiler options are now noted as\r
+ “unsupported compiler option”.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>-MD</code>/<code>-MMD</code> options without <code>-MT</code>/<code>-MF</code> are now handled correctly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The <code>-finput-charset</code> option is now handled correctly.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Added support for <code>-Wp,-MD</code> and <code>-Wp,-MMD</code> options.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The compiler options <code>-Xassembler</code>, <code>-b</code>, <code>-G</code> and <code>-V</code> are now correctly\r
+ recognized as taking an argument.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Debug information containing line numbers of predefined and command-line\r
+ macros (enabled with the compiler option <code>-g3</code>) will now be correct.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected LRU cleanup handling of object files.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+<code>utimes()</code> is now used instead of <code>utime()</code> when available.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Non-writable cache directories are now handled gracefully.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Corrected documentation about sharing the cache directory.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed compilation warnings from GCC 4.3.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The command specified by <code>CCACHE_PREFIX</code> is no longer part of the hash.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed bad memory access spotted by Valgrind.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Fixed a bug in <code>x_realloc</code>.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Freed memory is no longer referenced when compiling a <code>.i</code>/<code>.ii</code> file and\r
+ falling back to running the real compiler.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The test suite is now immune to external values of the <code>CCACHE_*</code> environment\r
+ variables.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Improved detection of recursive invocation.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+The ccache binary is now not unconditionally stripped when installing.\r
+</p>\r
+</li>\r
+<li>\r
+<p>\r
+Statistics counters are now correctly updated for -E option failures and\r
+ internal errors.\r
+</p>\r
+</li>\r
+</ul></div>\r
+</div>\r
+</div>\r
+</div>\r
+</div>\r
+<div id="footnotes"><hr /></div>\r
+<div id="footer">\r
+<div id="footer-text">\r
+Version 3.4.2<br />\r
+Last updated\r
+ 2018-03-25 22:13:04 CEST\r
+</div>\r
+</div>\r
+</body>\r
+</html>\r
+++ /dev/null
-ccache news
-===========
-
-ccache 3.4.1
-------------
-Release date: 2018-02-11
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed printing of version number in `ccache --version`.
-
-
-ccache 3.4
-----------
-Release date: 2018-02-11
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- The compiler option form `--sysroot arg` is now handled like the documented
- `--sysroot=arg` form.
-
-- Added support for caching `.su` files generated by GCC flag `-fstack-usage`.
-
-- ccache should now work with distcc's ``pump'' wrapper.
-
-- The optional unifier is no longer disabled when the direct mode is enabled.
-
-- Added support for nvcc compiler options `--compiler-bindir/-ccbin`,
- `--output-directory/-odir` and `--libdevice-directory/-ldir`.
-
-- Boolean environment variable settings no longer accept the following
- (case-insensitive) values: `0`, `false`, `disable` and `no`. All other values
- are accepted and taken to mean ``true''. This is to stop users from setting
- e.g. `CCACHE_DISABLE=0` and then expect the cache to be used.
-
-- Improved support for `run_second_cpp = false`: If combined with passing
- `-fdirectives-only` (GCC) or `frewrite-includes` (Clang) to the compiler,
- diagnostics warnings and similar will be correct.
-
-- An implicit `-MQ` is now passed to the preprocessor only if the object file
- extension is non-standard. This should make it easier to use EDG-based
- compilers (e.g. GHS) which don't understand `-MQ`.
-
-- ccache now treats an unreadable configuration file just like a missing
- configuration file.
-
-- Documented more pitfalls with enabling `hard_links` (`CCACHE_HARDLINK`).
-
-- Documented caveats related to colored warnings from compilers.
-
-
-Bug fixes
-~~~~~~~~~
-
-- File size and number counters are now updated correctly when files are
- overwritten in the cache, e.g. when using `CCACHE_RECACHE`.
-
-- `run_second_cpp` is now forced for nvcc.
-
-- Fixed how the nvcc options `-optf` and `-odir` are handled.
-
-
-ccache 3.3.6
-------------
-Release date: 2018-01-28
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Improved instructions on how to get cache hits between different working
- directories.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed regression in ccache 3.3.5 related to the `UNCACHED_ERR_FD` feature.
-
-
-ccache 3.3.5
-------------
-Release date: 2018-01-13
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Documented how automatic cache cleanup works.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a regression where the original order of debug options could be lost.
- This reverts the ``Improved parsing of `-g*` options'' feature in ccache 3.3.
-
-- Multiple `-fdebug-prefix-map` options should now be handled correctly.
-
-- Fixed matching of directories in the `ignore_headers_in_manifest`
- configuration option.
-
-- Fixed detection of missing argument to `-opt`/`--options-file`.
-
-- ccache now bails out when building a precompiled header if any of the
- corresponding header files have an updated timestamp. This fixes complaints
- from clang.
-
-- Fixed a bug related to erroneously storing a dependency file with absolute
- paths in the cache on a preprocessed hit.
-
-- `ccache -c/--cleanup` now works like documented: it just recalculates size
- counters and trims the cache to not exceed the max size and file number
- limits. Previously, the forced cleanup took ``limit_multiple'' into account,
- so that `ccache -c/--cleanup` by default would trim the cache to 80% of the
- max limit.
-
-- ccache no longer ignores linker arguments for clang since clang warns about
- them.
-
-- Plugged a couple of file descriptor leaks.
-
-- Fixed a bug where ccache would skip hashing the compiler argument following a
- `-fno-working-directory`, `-fworking-directory`, `-nostdinc`, `-nostdinc++`,
- `-remap` or `-trigraphs` option in preprocessor mode.
-
-
-ccache 3.3.4
-------------
-Release date: 2017-02-17
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Documented the different cache statistics counters.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a regression in ccache 3.3 related to potentially bad content of
- dependency files when compiling identical source code but with different
- source paths. This was only partially fixed in 3.3.2 and reverts the new
- ``Names of included files are no longer included in the hash of the
- compiler's preprocessed output'' feature in 3.3.
-
-- Corrected statistics counter for `-optf`/`--options-file` failure.
-
-- Fixed undefined behavior warnings in ccache found by `-fsanitize=undefined`.
-
-ccache 3.3.3
-------------
-Release date: 2016-10-26
-
-Bug fixes
-~~~~~~~~~
-
-- ccache now detects usage of `.incbin` assembler directives in the source code
- and avoids caching such compilations.
-
-
-ccache 3.3.2
-------------
-Release date: 2016-09-28
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a regression in ccache 3.3 related to potentially bad content of
- dependency files when compiling identical source code but with different
- source paths.
-
-- Fixed a regression in ccache 3.3.1: ccache could get confused when using the
- compiler option `-Wp,` to pass multiple options to the preprocessor,
- resulting in missing dependency files from direct mode cache hits.
-
-
-ccache 3.3.1
-------------
-Release date: 2016-09-07
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a problem in the ``multiple `-arch` options'' support introduced in
- 3.3. When using the direct mode (the default), different combinations of
- `-arch` options were not detected properly.
-
-- Fixed an issue when compiler option `-Wp,-MT,path` is used instead of `-MT
- path` (and similar for `-MF`, `-MP` and `-MQ`) and `run_second_cpp`
- (`CCACHE_CPP2`) is enabled.
-
-
-ccache 3.3
-----------
-Release date: 2016-08-27
-
-Notes
-~~~~~
-
-- A C99-compatible compiler is now required to build ccache.
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- The configuration option `run_second_cpp` (`CCACHE_CPP2`) now defaults to
- true. This improves ccache's out-of-the-box experience for compilers that
- can't compile their own preprocessed output with the same outcome as if they
- compiled the real source code directly, e.g. newer versions of GCC and Clang.
-
-- The configuration option `hash_dir` (`CCACHE_HASHDIR`) now defaults to true.
-
-- Added a new `ignore_headers_in_manifest` configuration option, which
- specifies headers that should be ignored in the direct mode.
-
-- Added a new `prefix_command_cpp` (`CCACHE_PREFIX_CPP`) configuration option,
- which specifies one or several prefixes to add to the command line ccache
- uses when invoking the preprocessor.
-
-- Added a new `limit_multiple` (`CCACHE_LIMIT_MULTIPLE`) configuration option,
- which specifies how much of the cache to remove when cleaning.
-
-- Added a new `keep_comments_cpp` (`CCACHE_COMMENTS`) configuration option,
- which tells ccache not to discard the comments before hashing preprocessor
- output. This can be used to check documentation with *-Wdocumentation*.
-
-- Added a new sloppiness option `no_system_headers`, which tells ccache not to
- include system headers in manifest files.
-
-- Added a new statistics counter that tracks the number of performed cleanups
- due to the cache size being over the limit. The value is shown in the output
- of ``ccache -s''.
-
-- Added support for relocating debug info directory using `-fdebug-prefix-map`.
- This allows for cache hits even when `hash_dir` is used in combination with
- `base_dir`.
-
-- Added a new ``cache hit rate'' field to the output of ``ccache -s''.
-
-- Added support for caching compilation of assembler code produced by e.g.
- ``gcc -S file.c''.
-
-- Added support for cuda including the -optf/--options-file option.
-
-- Added support for Fortran 77.
-
-- Added support for multiple `-arch` options to produce "fat binaries".
-
-- Multiple identical `-arch` arguments are now handled without bailing.
-
-- The concatenated form of some long compiler options is now recognized, for
- example when using `-isystemPATH` instead of `-isystem PATH`.
-
-- If hard-linking is enabled and but fails (e.g. due to cross-device linking),
- ccache now falls back to copying instead of running the compiler.
-
-- Made the `hash_dir` option only have effect when generating debug info.
-
-- ccache now knows how to convert absolute paths to relative paths inside
- dependency files when using `base_dir`.
-
-- Improved parsing of `-g*` options.
-
-- Made ccache understand `-Wp,-D*` options.
-
-- ccache now understands the undocumented `-coverage` (only one dash) GCC
- option.
-
-- Names of included files are no longer included in the hash of the compiler's
- preprocessed output. This leads to more potential cache hits when not using
- the direct mode.
-
-- Increased buffer size used when reading file data. This improves performance
- slightly.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Bail out on too hard compiler option `-P`.
-
-- Fixed clang test suite when running on Linux.
-
-- Fixed build and test for MinGW32 and Windows.
-
-
-ccache 3.2.9
-------------
-Release date: 2016-09-28
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a regression in ccache 3.2.8: ccache could get confused when using the
- compiler option `-Wp,` to pass multiple options to the preprocessor,
- resulting in missing dependency files from direct mode cache hits.
-
-
-ccache 3.2.8
-------------
-Release date: 2016-09-07
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed an issue when compiler option `-Wp,-MT,path` is used instead of `-MT
- path` (and similar for `-MF`, `-MP` and `-MQ`) and `run_second_cpp`
- (`CCACHE_CPP2`) is enabled.
-
-- ccache now understands the undocumented `-coverage` (only one dash) GCC
- option.
-
-
-ccache 3.2.7
-------------
-Release date: 2016-07-20
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed a bug which could lead to false cache hits for compiler command lines
- with a missing argument to an option that takes an argument.
-
-- ccache now knows how to work around a glitch in the output of GCC 6's
- preprocessor.
-
-
-ccache 3.2.6
-------------
-Release date: 2016-07-12
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed build problem on QNX, which lacks ``SA_RESTART''.
-
-- Bail out on compiler option `-fstack-usage` since it creates a `.su` file
- which ccache currently doesn't handle.
-
-- 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.2.5
-------------
-Release date: 2016-04-17
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Only pass clang-specific `-stdlib=` to the preprocessor.
-
-- Improved handling of stale NFS handles.
-
-- Made it harder to misinterpret documentation of boolean environment settings'
- semantics.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Include m4 files used by configure.ac in the source dist archives.
-
-- Corrected "Performance" section in the manual regarding `__DATE_`, `__TIME__`
- and `__FILE__` macros.
-
-- Fixed build on Solaris 10+ and AIX 7.
-
-- Fixed failure to create directories on QNX.
-
-- Don't (try to) update manifest file in ``read-only'' and ``read-only direct''
- modes.
-
-- Fixed a bug in caching of `stat` system calls in ``file_stat_matches
- sloppiness mode''.
-
-- Fixed bug in hashing of clang plugins, leading to unnecessary cache misses.
-
-- Fixed --print-config to show ``pch_defines sloppiness''.
-
-- The man page is now built when running ``make install'' from Git repository
- sources.
-
-
-ccache 3.2.4
-------------
-Release date: 2015-10-08
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed build error related to zlib on systems with older make versions
- (regression in ccache 3.2.3).
-
-- Made conversion-to-bool explicit to avoid build warnings (and potential
- runtime errors) on legacy systems.
-
-- Improved signal handling: Kill compiler on SIGTERM; wait for compiler to exit
- before exiting; die appropriately.
-
-- Minor fixes related to Windows support.
-
-- The correct compression level is now used if compression is requested.
-
-- Fixed a bug where cache cleanup could be run too early for caches larger than
- 64 GiB on 32-bit systems.
-
-
-ccache 3.2.3
-------------
-Release date: 2015-08-16
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added support for compiler option `-gsplit-dwarf`.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Support external zlib in nonstandard directory.
-
-- Avoid calling `exit()` inside an exit handler.
-
-- Let exit handler terminate properly.
-
-- Bail out on compiler option `--save-temps` in addition to `-save-temps`.
-
-- Only log "Disabling direct mode" once when failing to read potential include
- files.
-
-
-ccache 3.2.2
-------------
-Release date: 2015-05-10
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added support for `CCACHE_COMPILERCHECK=string:<value>`. This is a faster
- alternative to `CCACHE_COMPILERCHECK=<command>` if the command's output can
- be precalculated by the build system.
-
-- Add support for caching code coverage results (compiling for gcov).
-
-
-Bug fixes
-~~~~~~~~~
-
-- 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.
-
-- Fixed a bug where ccache deleted clang diagnostics after compiler failures.
-
-- Avoid performing an unnecessary copy of the object file on a cache miss.
-
-- Bail out on too hard compiler option `-fmodules`.
-
-- Bail out on too hard compiler option `-fplugin=libcc1plugin` (interaction
- with GDB).
-
-- Fixed build error when compiling ccache with recent clang versions.
-
-- Removed signal-unsafe code from signal handler.
-
-- Corrected logic for when to output cached stderr.
-
-- Wipe the whole cached result on failure retrieving a cached file.
-
-- Fixed build error when compiling ccache with recent clang versions.
-
-
-ccache 3.2.1
-------------
-Release date: 2014-12-10
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed regression in temporary file handling, which lead to incorrect
- permissions for stats, manifest and ccache.conf files in the cache.
-
-- `CACHEDIR.TAG` files are now created in the [0-9a-f] subdirectories so that
- ccache.conf is not lost in backups.
-
-- Made the default cache size suffix `G`, as previously documented.
-
-- `-fdiagnostics-color=auto` is now passed to the compiler even if stderr is
- redirected. This fixes a problem when, for instance, a configure test probes
- if the compiler (wrapped via ccache) supports `-fdiagnostics-color=auto`.
-
-- Added missing documentation for `max_files` and `max_size` configuration
- options.
-
-
-ccache 3.2
-----------
-Release date: 2014-11-17
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added support for configuring ccache via one or several configuration files
- instead of via environment variables. Environment variables still have
- priority but are no longer the recommended way of customizing ccache
- behavior. See the manual for more information.
-
-- Added support for compiler error/warning messages with color.
-
-- Made creation of temporary directories and cache directories smarter to avoid
- unnecessary `stat` calls.
-
-- Improved efficiency of the algorithm that scans for `__DATE_` and `__TIME__`
- tokens in the hashed source code.
-
-- Added support for several binaries (separated by space) in `CCACHE_PREFIX`.
-
-- The `-c` option is no longer passed to the preprocessor. This fixes problems
- with clang and Solaris's C++ compiler.
-
-- ccache no longer passes preprocessor options like `-D` and `-I` to the
- compiler when compiling preprocessed output. This fixes warnings emitted by
- clang.
-
-- Compiler options `-fprofile-generate`, `-fprofile-arcs`, `-fprofile-use` and
- `-fbranch-probabilities` are now handled without bailing.
-
-- Added support for clang's `--serialize-diagnostic` option, storing the
- diagnostic file (`.dia`) in the cache.
-
-- Added support for precompiled headers when using clang.
-
-- Added support for clang `.pth` (pretokenized header) files.
-
-- Changed the `-x` language option to use the new objective C standard for GCC
- and clang.
-
-- On a cache miss, ccache now instructs the compiler to create the object file
- at the real destination and then copies the file into the cache instead of
- the other way around. This is needed to support compiler options like
- `-fprofile-arcs` and `--serialize-diagnostics`.
-
-- ccache now checks that included files' ctimes aren't too new. This check can
- be turned off by adding `include_file_ctime` to the ``ccache sloppiness''
- setting.
-
-- Added possibility to get cache hits based on filename, size, mtime and ctime
- only. On other words, source code files are not even read, only stat-ed. This
- operation mode is opt-in by adding `file_stat_matches` to the ``ccache
- sloppiness'' setting.
-
-- The filename part of options like `-Wp,-MDfilename` is no longer included in
- the hash since the filename doesn't have any bearing on the result.
-
-- Added a ``read-only direct'' configuration setting, which is like the
- ordinary read-only setting except that ccache will only try to retrieve
- results from the cache using the direct mode, not the preprocessor mode.
-
-- The display and interpretation of cache size has been changed to use SI
- units.
-
-- Default cache size is now 5 GB (was previously 1 GiB).
-
-- Added configuration option to set the compression level of compressed object
- files in the cache.
-
-- Added support for `@file` and `-@file` arguments (reading options from a
- file).
-
-- `-Wl,` options are no longer included in the hash since they don't affect
- compilation.
-
-- Bail out on too hard compiler option `-Wp,-P`.
-
-- Optimized MD4 calculation code on little-endian systems.
-
-- Various improvements and fixes on win32.
-
-- Improved logging to the ccache log file.
-
-- Added `--dump-manifest` command-line option for debugging purposes.
-
-- Added `--with-bundled-zlib` configure option.
-
-- Upgraded bundled zlib to version 1.2.8.
-
-- Improved `dev.mk` to be more platform independent.
-
-- Made the test suite work with clang and gcc-llvm on OS X.
-
-- Various other improvements of the test suite.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Any previous `.stderr` is now removed from the cache when recaching.
-
-- Fixed an issue when handling the `-arch` compiler option with an argument.
-
-- Fixed race condition when creating the initial cache directory.
-
-- Fixed test suite failures when `CC` is a ccache-wrapped compiler.
-
-
-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
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added support for the `-Xclang` compiler option.
-
-- Improved handling of exit code of internally executed processes.
-
-- Zero length object files in the cache are now rejected as invalid.
-
-- Bail out on option `-gsplit-dwarf` (since it produces multiple output files).
-
-- Compiler option `-fdebug-prefix-map` is now ignored (not part of the hash).
- (The `-fdebug-prefix-map` option may be used in combination with
- `CCACHE_BASEDIR` to reuse results across different directories.)
-
-- Added note in documentation that `--ccache-skip` currently does not mean
- ``don't hash the following option''.
-
-- 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 defined macros have been
- changed.
-
-- Stale files in the internal temporary directory (`<ccache_dir>/tmp`) are now
- cleaned up if they are older than one hour.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed path canonicalization in `make_relative_path()` when path doesn't
- exist.
-
-- Fixed bug in `common_dir_prefix_length()`. This corrects the `CCACHE_BASEDIR`
- behavior.
-
-- ccache no longer tries to create the cache directory when `CCACHE_DISABLE` is
- set.
-
-- Fixed bug when reading manifests with a very large number of file info
- entries.
-
-- Fixed problem with logging of current working directory.
-
-
-ccache 3.1.9
-------------
-Release date: 2013-01-06
-
-
-Bug fixes
-~~~~~~~~~
-
-- The EAGAIN signal is now handled correctly when emitting cached stderr
- output. This fixes a problem triggered by large error outputs from the
- compiler.
-
-- Subdirectories in the cache are no longer created in read-only mode.
-
-- Fixed so that ccache's log file descriptor is not made available to the
- compiler.
-
-- Improved error reporting when failing to create temporary stdout/stderr files
- when executing the compiler.
-
-- Disappearing temporary stdout/stderr files are now handled gracefully.
-
-
-Other
-~~~~~
-
-- Fixed test suite to work on ecryptfs.
-
-
-ccache 3.1.8
-------------
-Release date: 2012-08-11
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Made paths to dependency files relative in order to increase cache hits.
-
-- Added work-around to make ccache work with buggy GCC 4.1 when creating a
- pre-compiled header.
-
-- Clang plugins are now hashed to catch plugin upgrades.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Fixed crash when the current working directory has been removed.
-
-- Fixed crash when stderr is closed.
-
-- Corrected a corner case when parsing backslash escapes in string
- literals.
-
-- Paths are now correctly canonicalized when computing paths relative to the
- base directory.
-
-
-Other
-~~~~~
-
-- Made git version macro work when compiling outside of the source directory.
-
-- Fixed `static_assert` macro definition clash with GCC 4.7.
-
-
-ccache 3.1.7
-------------
-Release date: 2012-01-08
-
-
-Bug fixes
-~~~~~~~~~
-
-- Non-writable `CCACHE_DIR` is now handled gracefully when `CCACHE_READONLY` is
- set.
-
-- Made failure to create files (typically due to bad directory permissions) in
- the cache directory fatal. Previously, such failures were silently and
- erroneously flagged as "compiler produced stdout".
-
-- Both the `-specs=file` and `--specs=file` forms are now recognized.
-
-- Added recognition and hashing of GCC plugins specified with `-fplugin=file`.
-
-- `CCACHE_COMPILERCHECK` now also determines how to hash explicit specs files
- (`-specs=file`).
-
-- Added `CPATH`, `C_INCLUDE_PATH` and similar environment variables to the hash
- to avoid false cache hits when such variables have changed.
-
-- Corrected log message when unify mode is enabled.
-
-- Reverted the GCC bug compatibility introduced in ccache 3.1.5 for `-MT`/`-MQ`
- options with concatenated arguments. (The bug is fixed in recent GCC
- versions.)
-
-
-Other
-~~~~~
-
-- Corrected license header for `mdfour.c`.
-
-- Improved documentation on how to fix bad object files in the cache.
-
-
-
-ccache 3.1.6
-------------
-Release date: 2011-08-21
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Rewrite argument to `--sysroot` if `CCACHE_BASEDIR` is used.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Don't crash if `getcwd()` fails.
-
-- Fixed alignment of ``called for preprocessing'' counter.
-
-
-ccache 3.1.5
-------------
-Release date: 2011-05-29
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added a new statistics counter named ``called for preprocessing''.
-
-- The original command line is now logged to the file specified with
- `CCACHE_LOGFILE`.
-
-- Improved error logging when system calls fail.
-
-- Added support for rewriting absolute paths in `-F`/`-iframework` GCC
- options.
-
-- Improved order of statistics counters in `ccache -s` output.
-
-
-Bug fixes
-~~~~~~~~~
-
-- The `-MF`/`-MT`/`-MQ` options with concatenated argument are now handled
- correctly when they are last on the command line.
-
-- ccache is now bug compatible with GCC for the `-MT`/`-MQ` options with
- concatenated arguments.
-
-- Fixed a minor memory leak.
-
-- Systems that lack (and don't need to be linked with) libm are now supported.
-
-
-ccache 3.1.4
-------------
-Release date: 2011-01-09
-
-
-Bug fixes
-~~~~~~~~~
-
-- Made a work-around for a bug in `gzputc()` in zlib 1.2.5.
-
-- Corrupt manifest files are now removed so that they won't block direct mode
- hits.
-
-- ccache now copes with file systems that don't know about symbolic links.
-
-- The file handle in now correctly closed on write error when trying to create
- a cache dir tag.
-
-
-ccache 3.1.3
-------------
-Release date: 2010-11-28
-
-
-Bug fixes
-~~~~~~~~~
-
-- The -MFarg, -MTarg and -MQarg compiler options (i.e, without space between
- option and argument) are now handled correctly.
-
-
-Other
-~~~~~
-
-- Portability fixes for HP-UX 11.00 and other esoteric systems.
-
-
-ccache 3.1.2
-------------
-Release date: 2010-11-21
-
-
-Bug fixes
-~~~~~~~~~
-
-- Bail out on too hard compiler options `-fdump-*`.
-
-- NULL return values from malloc/calloc of zero bytes are now handled
- correctly.
-
-- Fixed issue when parsing precompiler output on AIX.
-
-
-Other
-~~~~~
-
-- Improved documentation on which information is included in the hash sum.
-
-- Made the ``too new header file'' test case work on file systems with
- unsynchronized clocks.
-
-- The test suite now also works on systems that lack a /dev/zero.
-
-
-ccache 3.1.1
-------------
-Release date: 2010-11-07
-
-
-Bug fixes
-~~~~~~~~~
-
-- ccache now falls back to preprocessor mode when a non-regular include file
- (device, socket, etc) has been detected so that potential hanging due to
- blocking reads is avoided.
-
-- CRC errors are now detected when decompressing compressed files in the cache.
-
-- Fixed potential object file corruption race on NFS.
-
-- Minor documentation corrections.
-
-- Fixed configure detection of ar.
-
-- ccache development version (set by dev.mk) now works with gits whose
- `describe` command doesn't understand `--dirty`.
-
-
-Other
-~~~~~
-
-- Minor debug log message improvements.
-
-
-ccache 3.1
-----------
-Release date: 2010-09-16
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- Added support for hashing the output of a custom command (e.g. `%compiler%
- --version`) to identify the compiler instead of stat-ing or hashing the
- compiler binary. This can improve robustness when the compiler (as seen by
- ccache) actually isn't the real compiler but another compiler wrapper.
-
-- Added support for caching compilations that use precompiled headers. (See the
- manual for important instructions regarding this.)
-
-- Locking of the files containing statistics counters is now done using
- symlinks instead of POSIX locks. This should make ccache behave a lot better
- on file systems where POSIX locks are slow or broken (e.g. NFS on some
- systems).
-
-- Manifest files are now updated without the need of taking locks.
-
-- Updates of statistics counters are now always done in one of the sub-level
- statistics files. This reduces lock contention, which especially improves
- performance on slow NFS mounts.
-
-- Reading and writing of statistics counters has been made forward-compatible
- (unknown counters are retained).
-
-- Files are now read without using `mmap()`. This has two benefits: it's more
- robust against file changes during reading and it improves performance on
- poor systems where `mmap()` doesn't use the disk cache.
-
-- Added `.cp` and `.CP` as known C++ suffixes.
-
-- Improved logging.
-
-- Added `-install_name` as an option known to take an argument. (This improves
- statistics when using the Darwin linker.)
-
-
-Bug fixes
-~~~~~~~~~
-
-- Non-fatal error messages are now never printed to stderr but logged instead.
-
-- Fixed a bug affecting failing commands when `--ccache-skip` is used.
-
-- Made `--ccache-skip` work for all options.
-
-- EINTR is now handled correctly.
-
-
-Other
-~~~~~
-
-- Work on porting ccache to win32 (native), mostly done by Ramiro Polla. The
- port is not yet finished, but will hopefully be complete in some subsequent
- release.
-
-- Added a `--nostats` flag to the performance benchmark program.
-
-- Made the performance benchmark program more accurate when measuring cache
- hits.
-
-- Added a new test framework for unit tests written in C.
-
-- Got rid of `configure-dev`; dev mode is now given by `dev.mk.in` presence.
-
-- Improved documentation on how to combine ccache with other compiler wrappers
- (like `distcc`).
-
-- New `LICENSE.txt` file with licensing and copyright details about bundled
- source code.
-
-- New `AUTHORS.txt` file with a list of ccache contributors.
-
-- New `HACKING.txt` file with some notes about ccache code conventions.
-
-
-ccache 3.0.1
-------------
-Release date: 2010-07-15
-
-
-Bug fixes
-~~~~~~~~~
-
-- The statistics counter ``called for link'' is now correctly updated when
- linking with a single object file.
-
-- Fixed a problem with out-of-source builds.
-
-
-ccache 3.0
-----------
-Release date: 2010-06-20
-
-
-General
-~~~~~~~
-
-- ccache is now licensed under the GNU General Public License (GPL) version 3
- or later.
-
-
-Upgrade notes
-~~~~~~~~~~~~~
-
-- The way the hashes are calculated has changed, so you won't get cache hits
- for compilation results stored by older ccache versions. Because of this, you
- might as well clear the old cache directory with `ccache --clear` if you
- want, unless you plan to keep using an older ccache version.
-
-
-New features and enhancements
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-- ccache now has a ``direct mode'' where it computes a hash of the source code
- (including all included files) and compiler options without running the
- preprocessor. By not running the preprocessor, CPU usage is reduced; the
- speed is somewhere between 1 and 5 times that of ccache running in
- traditional mode, depending on the circumstances. The speedup will be higher
- when I/O is fast (e.g., when files are in the disk cache). The direct mode
- can be disabled by setting +CCACHE_NODIRECT+.
-
-- Support has been added for rewriting absolute paths to relative paths when
- hashing, in order to increase cache hit rate when building the same source
- code in different directories even when compiling with `-g` and when using
- absolute include directory paths. This is done by setting the
- `CCACHE_BASEDIR` environment variable to an absolute path that specifies
- which paths to rewrite.
-
-- Object files are now optionally stored compressed in the cache. The runtime
- cost is negligible, and more files will fit in the ccache directory and in
- the disk cache. Set `CCACHE_COMPRESS` to enable object file compression. Note
- that you can't use compression in combination with the hard link feature.
-
-- A `CCACHE_COMPILERCHECK` option has been added. This option tells ccache what
- compiler-identifying information to hash to ensure that results retrieved
- from the cache are accurate. Possible values are: none (don't hash anything),
- mtime (hash the compiler's mtime and size) and content (hash the content of
- the compiler binary). The default is mtime.
-
-- It is now possible to specify extra files whose contents should be included
- in the hash sum by setting the `CCACHE_EXTRAFILES` option.
-
-- Added support for Objective-C and Objective-C\+\+. The statistics counter
- ``not a C/C++ file'' has been renamed to ``unsupported source language''.
-
-- Added support for the `-x` compiler option.
-
-- Added support for long command-line options.
-
-- A `CACHEDIR.TAG` file is now created in the cache directory. See
- <http://www.brynosaurus.com/cachedir/>.
-
-- Messages printed to the debug log (specified by `CCACHE_LOGFILE`) have been
- improved.
-
-- You can relax some checks that ccache does in direct mode by setting
- `CCACHE_SLOPPINESS`. See the manual for more information.
-
-- `CCACHE_TEMPDIR` no longer needs to be on the same filesystem as
- `CCACHE_DIR`.
-
-- The default value of `CCACHE_TEMPDIR` has been changed to `$CCACHE_DIR/tmp`
- to avoid cluttering the top directory.
-
-- Temporary files that later will be moved into the cache are now created in
- the cache directory they will end up in. This makes ccache more friendly to
- Linux's directory layout.
-
-- Improved the test suite and added tests for most of the new functionality.
- It's now also possible to specify a subset of tests to run.
-
-- Standard error output from the compiler is now only stored in the cache if
- it's non-empty.
-
-- If the compiler produces no object file or an empty object file, but gives a
- zero exit status (could be due to a file system problem, a buggy program
- specified by `CCACHE_PREFIX`, etc.), ccache copes with it properly.
-
-- Added `installcheck` and `distcheck` make targets.
-
-- Clarified cache size limit options' and cleanup semantics.
-
-- Improved display of cache max size values.
-
-- The following options are no longer hashed in the preprocessor mode:
- `-imacros`, `-imultilib`, `-iprefix`, `-iquote`, `-isysroot`, `-iwithprefix`,
- `-iwithprefixbefore`, `-nostdinc`, `-nostdinc++` and `-U`.
-
-
-Bug fixes
-~~~~~~~~~
-
-- Various portability improvements.
-
-- Improved detection of home directory.
-
-- User-defined `CPPFLAGS` and `LDFLAGS` are now respected in the Makefile.
-
-- Fixed NFS issues.
-
-- Computation of the hash sum has been improved to decrease the risk of hash
- collisions. For instance, the compiler options `-X -Y` and `-X-Y` previously
- contributed equally to the hash sum.
-
-- Bail out on too hard compiler options `--coverage`, `-fprofile-arcs`,
- `-fprofile-generate`, `-fprofile-use`, `-frepo`, `-ftest-coverage` and
- `-save-temps`. Also bail out on `@file` style options.
-
-- Errors when using multiple `-arch` compiler options are now noted as
- ``unsupported compiler option''.
-
-- `-MD`/`-MMD` options without `-MT`/`-MF` are now handled correctly.
-
-- The `-finput-charset` option is now handled correctly.
-
-- Added support for `-Wp,-MD` and `-Wp,-MMD` options.
-
-- The compiler options `-Xassembler`, `-b`, `-G` and `-V` are now correctly
- recognized as taking an argument.
-
-- Debug information containing line numbers of predefined and command-line
- macros (enabled with the compiler option `-g3`) will now be correct.
-
-- Corrected LRU cleanup handling of object files.
-
-- `utimes()` is now used instead of `utime()` when available.
-
-- Non-writable cache directories are now handled gracefully.
-
-- Corrected documentation about sharing the cache directory.
-
-- Fixed compilation warnings from GCC 4.3.
-
-- The command specified by `CCACHE_PREFIX` is no longer part of the hash.
-
-- Fixed bad memory access spotted by Valgrind.
-
-- Fixed a bug in `x_realloc`.
-
-- Freed memory is no longer referenced when compiling a `.i`/`.ii` file and
- falling back to running the real compiler.
-
-- The test suite is now immune to external values of the `CCACHE_*` environment
- variables.
-
-- Improved detection of recursive invocation.
-
-- The ccache binary is now not unconditionally stripped when installing.
-
-- Statistics counters are now correctly updated for -E option failures and
- internal errors.
--- /dev/null
+'\" t
+.\" Title: ccache
+.\" Author: [see the "Author" section]
+.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
+.\" Date: 03/25/2018
+.\" Manual: ccache Manual
+.\" Source: ccache 3.4.2
+.\" Language: English
+.\"
+.TH "CCACHE" "1" "03/25/2018" "ccache 3\&.4\&.2" "ccache Manual"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\" -----------------------------------------------------------------
+.\" * set default formatting
+.\" -----------------------------------------------------------------
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.\" -----------------------------------------------------------------
+.\" * MAIN CONTENT STARTS HERE *
+.\" -----------------------------------------------------------------
+.SH "NAME"
+ccache \- a fast C/C++ compiler cache
+.SH "SYNOPSIS"
+.sp
+.nf
+\fBccache\fR [\fIoptions\fR]
+\fBccache\fR \fIcompiler\fR [\fIcompiler options\fR]
+\fIcompiler\fR [\fIcompiler options\fR] (via symbolic link)
+.fi
+.SH "DESCRIPTION"
+.sp
+ccache is a compiler cache\&. It speeds up recompilation by caching the result of previous compilations and detecting when the same compilation is being done again\&. Supported languages are C, C++, Objective\-C and Objective\-C++\&.
+.sp
+ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache\&. The only way you should be able to tell that you are using ccache is the speed\&. Currently known exceptions to this goal are listed under CAVEATS\&. If you ever discover an undocumented case where ccache changes the output of your compiler, please let us know\&.
+.SS "Features"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Keeps statistics on hits/misses\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Automatic cache size management\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Can cache compilations that generate warnings\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Easy installation\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Low overhead\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Optionally compresses files in the cache to reduce disk space\&.
+.RE
+.SS "Limitations"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Only knows how to cache the compilation of a single C/C++/Objective\-C/Objective\-C++ file\&. Other types of compilations (multi\-file compilation, linking, etc) will silently fall back to running the real compiler\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Only works with GCC and compilers that behave similar enough\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Some compiler flags are not supported\&. If such a flag is detected, ccache will silently fall back to running the real compiler\&.
+.RE
+.SH "RUN MODES"
+.sp
+There are two ways to use ccache\&. You can either prefix your compilation commands with \fBccache\fR or you can let ccache masquerade as the compiler by creating a symbolic link (named as the compiler) to ccache\&. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects\&. The second method is most useful for when you wish to use ccache for all your compilations\&.
+.sp
+To use the first method, just make sure that \fBccache\fR is in your \fBPATH\fR\&.
+.sp
+To use the symlinks method, do something like this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+cp ccache /usr/local/bin/
+ln \-s ccache /usr/local/bin/gcc
+ln \-s ccache /usr/local/bin/g++
+ln \-s ccache /usr/local/bin/cc
+ln \-s ccache /usr/local/bin/c++
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+And so forth\&. This will work as long as the directory with symlinks comes before the path to the compiler (which is usually in \fB/usr/bin\fR)\&. After installing you may wish to run \(lqwhich gcc\(rq to make sure that the correct link is being used\&.
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBWarning\fR
+.ps -1
+.br
+.sp
+The technique of letting ccache masquerade as the compiler works well, but currently doesn\(cqt interact well with other tools that do the same thing\&. See USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
+.sp .5v
+.RE
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBWarning\fR
+.ps -1
+.br
+.sp
+Do not use a hard link, use a symbolic link\&. A hard link will cause \(lqinteresting\(rq problems\&.
+.sp .5v
+.RE
+.SH "OPTIONS"
+.sp
+These options only apply when you invoke ccache as \(lqccache\(rq\&. When invoked as a compiler (via a symlink as described in the previous section), the normal compiler options apply and you should refer to the compiler\(cqs documentation\&.
+.PP
+\fB\fB\-c, \-\-cleanup\fR\fR
+.RS 4
+Clean up the cache by removing old cached files until the specified file number and cache size limits are not exceeded\&. This also recalculates the cache file count and size totals\&. Normally, there is no need to initiate cleanup manually as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compilation\&. Forcing a cleanup is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate\&.
+.RE
+.PP
+\fB\fB\-C, \-\-clear\fR\fR
+.RS 4
+Clear the entire cache, removing all cached files, but keeping the configuration file\&.
+.RE
+.PP
+\fB\fB\-F, \-\-max\-files\fR\fR=\fIN\fR
+.RS 4
+Set the maximum number of files allowed in the cache\&. Use 0 for no limit\&. The value is stored in a configuration file in the cache directory and applies to all future compilations\&.
+.RE
+.PP
+\fB\fB\-h, \-\-help\fR\fR
+.RS 4
+Print an options summary page\&.
+.RE
+.PP
+\fB\fB\-M, \-\-max\-size\fR\fR=\fISIZE\fR
+.RS 4
+Set the maximum size of the files stored in the cache\&.
+\fISIZE\fR
+should be a number followed by an optional suffix: k, M, G, T (decimal), Ki, Mi, Gi or Ti (binary)\&. The default suffix is G\&. Use 0 for no limit\&. The value is stored in a configuration file in the cache directory and applies to all future compilations\&.
+.RE
+.PP
+\fB\fB\-o, \-\-set\-config\fR\fR=\fIKEY=VALUE\fR
+.RS 4
+Set configuration
+\fIKEY\fR
+to
+\fIVALUE\fR\&. See
+CONFIGURATION
+for more information\&.
+.RE
+.PP
+\fB\fB\-p, \-\-print\-config\fR\fR
+.RS 4
+Print current configuration options and from where they originate (environment variable, configuration file or compile\-time default)\&.
+.RE
+.PP
+\fB\fB\-s, \-\-show\-stats\fR\fR
+.RS 4
+Print the current statistics summary for the cache\&.
+.RE
+.PP
+\fB\fB\-V, \-\-version\fR\fR
+.RS 4
+Print version and copyright information\&.
+.RE
+.PP
+\fB\fB\-z, \-\-zero\-stats\fR\fR
+.RS 4
+Zero the cache statistics (but not the configuration options)\&.
+.RE
+.SH "EXTRA OPTIONS"
+.sp
+When run as a compiler, ccache usually just takes the same command line options as the compiler you are using\&. The only exception to this is the option \fB\-\-ccache\-skip\fR\&. That option can be used to tell ccache to avoid interpreting the next option in any way and to pass it along to the compiler as\-is\&.
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBNote\fR
+.ps -1
+.br
+.sp
+\fB\-\-ccache\-skip\fR currently only tells ccache not to interpret the next option as a special compiler option \(em the option will still be included in the direct mode hash\&.
+.sp .5v
+.RE
+.sp
+The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things)\&. The heuristic ccache uses when parsing the command line is that any argument that exists as a file is treated as an input file name\&. By using \fB\-\-ccache\-skip\fR you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option\&.
+.sp
+Another case where \fB\-\-ccache\-skip\fR can be useful is if ccache interprets an option specially but shouldn\(cqt, since the option has another meaning for your compiler than what ccache thinks\&.
+.SH "CONFIGURATION"
+.sp
+ccache\(cqs default behavior can be overridden by configuration file settings, which in turn can be overridden by environment variables with names starting with \fBCCACHE_\fR\&. ccache normally reads configuration from two files: first a system\-level configuration file and secondly a cache\-specific configuration file\&. The priority of configuration settings is as follows (where 1 is highest):
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 1." 4.2
+.\}
+Environment variables\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 2." 4.2
+.\}
+The cache\-specific configuration file
+\fB\fI<ccachedir>\fR\fR\fB/ccache\&.conf\fR
+(typically
+\fB$HOME/\&.ccache/ccache\&.conf\fR)\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 3.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 3." 4.2
+.\}
+The system\-wide configuration file
+\fB\fI<sysconfdir>\fR\fR\fB/ccache\&.conf\fR
+(typically
+\fB/etc/ccache\&.conf\fR
+or
+\fB/usr/local/etc/ccache\&.conf\fR)\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 4.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 4." 4.2
+.\}
+Compile\-time defaults\&.
+.RE
+.sp
+As a special case, if the environment variable \fBCCACHE_CONFIGPATH\fR is set, ccache reads configuration from the specified path instead of the default paths\&.
+.SS "Configuration file syntax"
+.sp
+Configuration files are in a simple \(lqkey = value\(rq format, one setting per line\&. Lines starting with a hash sign are comments\&. Blank lines are ignored, as is whitespace surrounding keys and values\&. Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# Set maximum cache size to 10 GB:
+max_size = 10G
+.fi
+.if n \{\
+.RE
+.\}
+.SS "Boolean values"
+.sp
+Some settings are boolean values (i\&.e\&. truth values)\&. In a configuration file, such values must be set to the string \fBtrue\fR or \fBfalse\fR\&. For the corresponding environment variables, the semantics are a bit different: a set environment variable means \(lqtrue\(rq (even if set to the empty string), the following case\-insensitive negative values are considered an error (rather than surprising the user): \fB0\fR, \fBfalse\fR, \fBdisable\fR and \fBno\fR, and an unset environment variable means \(lqfalse\(rq\&. Each boolean environment variable also has a negated form starting with \fBCCACHE_NO\fR\&. For example, \fBCCACHE_COMPRESS\fR can be set to force compression and \fBCCACHE_NOCOMPRESS\fR can be set to force no compression\&.
+.SS "Configuration settings"
+.sp
+Below is a list of available configuration settings\&. The corresponding environment variable name is indicated in parentheses after each configuration setting key\&.
+.PP
+\fBbase_dir\fR (\fBCCACHE_BASEDIR\fR)
+.RS 4
+This setting should be an absolute path to a directory\&. ccache then rewrites absolute paths into relative paths before computing the hash that identifies the compilation, but only for paths under the specified directory\&. If set to the empty string (which is the default), no rewriting is done\&. A typical path to use as the base directory is your home directory or another directory that is a parent of your build directories\&. Don\(cqt use
+\fB/\fR
+as the base directory since that will make ccache also rewrite paths to system header files, which doesn\(cqt gain anything\&.
+.sp
+See also the discussion under
+COMPILING IN DIFFERENT DIRECTORIES\&.
+.RE
+.PP
+\fBcache_dir\fR (\fBCCACHE_DIR\fR)
+.RS 4
+This setting specifies where ccache will keep its cached compiler outputs\&. It will only take effect if set in the system\-wide configuration file or as an environment variable\&. The default is
+\fB$HOME/\&.ccache\fR\&.
+.RE
+.PP
+\fBcache_dir_levels\fR (\fBCCACHE_NLEVELS\fR)
+.RS 4
+This setting allows you to choose the number of directory levels in the cache directory\&. The default is 2\&. The minimum is 1 and the maximum is 8\&.
+.RE
+.PP
+\fBcompiler\fR (\fBCCACHE_CC\fR)
+.RS 4
+This setting can be used to force the name of the compiler to use\&. If set to the empty string (which is the default), ccache works it out from the command line\&.
+.RE
+.PP
+\fBcompiler_check\fR (\fBCCACHE_COMPILERCHECK\fR)
+.RS 4
+By default, ccache includes the modification time (\(lqmtime\(rq) and size of the compiler in the hash to ensure that results retrieved from the cache are accurate\&. This setting can be used to select another strategy\&. Possible values are:
+.PP
+\fBcontent\fR
+.RS 4
+Hash the content of the compiler binary\&. This makes ccache very slightly slower compared to the
+\fBmtime\fR
+setting, but makes it cope better with compiler upgrades during a build bootstrapping process\&.
+.RE
+.PP
+\fBmtime\fR
+.RS 4
+Hash the compiler\(cqs mtime and size, which is fast\&. This is the default\&.
+.RE
+.PP
+\fBnone\fR
+.RS 4
+Don\(cqt hash anything\&. This may be good for situations where you can safely use the cached results even though the compiler\(cqs mtime or size has changed (e\&.g\&. if the compiler is built as part of your build system and the compiler\(cqs source has not changed, or if the compiler only has changes that don\(cqt affect code generation)\&. You should only use the
+\fBnone\fR
+setting if you know what you are doing\&.
+.RE
+.PP
+\fBstring:value\fR
+.RS 4
+Use
+\fBvalue\fR
+as the string to calculate hash from\&. This can be the compiler revision number you retrieved earlier and set here via environment variable\&.
+.RE
+.PP
+\fIa command string\fR
+.RS 4
+Hash the standard output and standard error output of the specified command\&. The string will be split on whitespace to find out the command and arguments to run\&. No other interpretation of the command string will be done, except that the special word
+\fB%compiler%\fR
+will be replaced with the path to the compiler\&. Several commands can be specified with semicolon as separator\&. Examples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+%compiler% \-v
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+%compiler% \-dumpmachine; %compiler% \-dumpversion
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+You should make sure that the specified command is as fast as possible since it will be run once for each ccache invocation\&.
+.sp
+Identifying the compiler using a command is useful if you want to avoid cache misses when the compiler has been rebuilt but not changed\&.
+.sp
+Another case is when the compiler (as seen by ccache) actually isn\(cqt the real compiler but another compiler wrapper \(em in that case, the default
+\fBmtime\fR
+method will hash the mtime and size of the other compiler wrapper, which means that ccache won\(cqt be able to detect a compiler upgrade\&. Using a suitable command to identify the compiler is thus safer, but it\(cqs also slower, so you should consider continue using the
+\fBmtime\fR
+method in combination with the
+\fBprefix_command\fR
+setting if possible\&. See
+USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
+.RE
+.RE
+.PP
+\fBcompression\fR (\fBCCACHE_COMPRESS\fR or \fBCCACHE_NOCOMPRESS\fR, see Boolean values above)
+.RS 4
+If true, ccache will compress object files and other compiler output it puts in the cache\&. However, this setting has no effect on how files are retrieved from the cache; compressed and uncompressed results will still be usable regardless of this setting\&. The default is false\&.
+.RE
+.PP
+\fBcompression_level\fR (\fBCCACHE_COMPRESSLEVEL\fR)
+.RS 4
+This setting determines the level at which ccache will compress object files\&. It only has effect if
+\fBcompression\fR
+is enabled\&. The value defaults to 6, and must be no lower than 1 (fastest, worst compression) and no higher than 9 (slowest, best compression)\&.
+.RE
+.PP
+\fBcpp_extension\fR (\fBCCACHE_EXTENSION\fR)
+.RS 4
+This setting can be used to force a certain extension for the intermediate preprocessed file\&. The default is to automatically determine the extension to use for intermediate preprocessor files based on the type of file being compiled, but that sometimes doesn\(cqt work\&. For example, when using the \(lqaCC\(rq compiler on HP\-UX, set the cpp extension to
+\fBi\fR\&.
+.RE
+.PP
+\fBdirect_mode\fR (\fBCCACHE_DIRECT\fR or \fBCCACHE_NODIRECT\fR, see Boolean values above)
+.RS 4
+If true, the direct mode will be used\&. The default is true\&. See
+THE DIRECT MODE\&.
+.RE
+.PP
+\fBdisable\fR (\fBCCACHE_DISABLE\fR or \fBCCACHE_NODISABLE\fR, see Boolean values above)
+.RS 4
+When true, ccache will just call the real compiler, bypassing the cache completely\&. The default is false\&.
+.RE
+.PP
+\fBextra_files_to_hash\fR (\fBCCACHE_EXTRAFILES\fR)
+.RS 4
+This setting is a list of paths to files that ccache will include in the the hash sum that identifies the build\&. The list separator is semicolon on Windows systems and colon on other systems\&.
+.RE
+.PP
+\fBhard_link\fR (\fBCCACHE_HARDLINK\fR or \fBCCACHE_NOHARDLINK\fR, see Boolean values above)
+.RS 4
+If true, ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy\&. Hard links are never made for compressed cache files\&. This means that you should not enable compression if you want to use hard links\&. The default is false\&.
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBWarning\fR
+.ps -1
+.br
+Do not enable this option unless you are aware of the consequences\&. Using hard links may be slightly faster in some situations, but there are several pitfalls since the resulting object file will share i\-node with the cached object file:
+.sp .5v
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 1." 4.2
+.\}
+If the resulting object file is modified in any way, the cached object file will be modified as well\&. For instance, if you run
+\fBstrip object\&.o\fR
+or
+echo >object\&.o, you will corrupt the cache\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 2." 4.2
+.\}
+Programs that rely on modification times (like \(lqmake\(rq) can be confused since ccache updates the cached files\*(Aq modification times as part of the automatic cache size management\&. This will affect object files in the build tree as well, which can retrigger the linking step even though nothing really has changed\&.
+.RE
+.RE
+.PP
+\fBhash_dir\fR (\fBCCACHE_HASHDIR\fR or \fBCCACHE_NOHASHDIR\fR, see Boolean values above)
+.RS 4
+If true (which is the default), ccache will include the current working directory (CWD) in the hash that is used to distinguish two compilations when generating debug info (compiler option
+\fB\-g\fR
+with variations)\&. Exception: The CWD will not be included in the hash if
+\fBbase_dir\fR
+is set (and matches the CWD) and the compiler option
+\fB\-fdebug\-prefix\-map\fR
+is used\&. See also the discussion under
+COMPILING IN DIFFERENT DIRECTORIES\&.
+.sp
+The reason for including the CWD in the hash by default is to prevent a problem with the storage of the current working directory in the debug info of an object file, which can lead ccache to return a cached object file that has the working directory in the debug info set incorrectly\&.
+.sp
+You can disable this setting to get cache hits when compiling the same source code in different directories if you don\(cqt mind that CWD in the debug info might be incorrect\&.
+.RE
+.PP
+\fBignore_headers_in_manifest\fR (\fBCCACHE_IGNOREHEADERS\fR)
+.RS 4
+This setting is a list of paths to files (or directories with headers) that ccache will
+\fBnot\fR
+include in the manifest list that makes up the direct mode\&. Note that this can cause stale cache hits if those headers do indeed change\&. The list separator is semicolon on Windows systems and colon on other systems\&.
+.RE
+.PP
+\fBkeep_comments_cpp\fR (\fBCCACHE_COMMENTS\fR or \fBCCACHE_NOCOMMENTS\fR, see Boolean values above)
+.RS 4
+If true, ccache will not discard the comments before hashing preprocessor output\&. This can be used to check documentation with
+\fB\-Wdocumentation\fR\&.
+.RE
+.PP
+\fBlimit_multiple\fR (\fBCCACHE_LIMIT_MULTIPLE\fR)
+.RS 4
+Sets the limit when cleaning up\&. Files are deleted (in LRU order) until the levels are below the limit\&. The default is 0\&.8 (= 80%)\&. See
+AUTOMATIC CLEANUP
+for more information\&.
+.RE
+.PP
+\fBlog_file\fR (\fBCCACHE_LOGFILE\fR)
+.RS 4
+If set to a file path, ccache will write information on what it is doing to the specified file\&. This is useful for tracking down problems\&.
+.RE
+.PP
+\fBmax_files\fR (\fBCCACHE_MAXFILES\fR)
+.RS 4
+This option specifies the maximum number of files to keep in the cache\&. Use 0 for no limit (which is the default)\&. See also
+CACHE SIZE MANAGEMENT\&.
+.RE
+.PP
+\fBmax_size\fR (\fBCCACHE_MAXSIZE\fR)
+.RS 4
+This option specifies the maximum size of the cache\&. Use 0 for no limit\&. The default value is 5G\&. Available suffixes: k, M, G, T (decimal) and Ki, Mi, Gi, Ti (binary)\&. The default suffix is G\&. See also
+CACHE SIZE MANAGEMENT\&.
+.RE
+.PP
+\fBpath\fR (\fBCCACHE_PATH\fR)
+.RS 4
+If set, ccache will search directories in this list when looking for the real compiler\&. The list separator is semicolon on Windows systems and colon on other systems\&. If not set, ccache will look for the first executable matching the compiler name in the normal
+\fBPATH\fR
+that isn\(cqt a symbolic link to ccache itself\&.
+.RE
+.PP
+\fBprefix_command\fR (\fBCCACHE_PREFIX\fR)
+.RS 4
+This option adds a list of prefixes (separated by space) to the command line that ccache uses when invoking the compiler\&. See also
+USING CCACHE WITH OTHER COMPILER WRAPPERS\&.
+.RE
+.PP
+\fBprefix_command_cpp\fR (\fBCCACHE_PREFIX_CPP\fR)
+.RS 4
+This option adds a list of prefixes (separated by space) to the command line that ccache uses when invoking the preprocessor\&.
+.RE
+.PP
+\fBread_only\fR (\fBCCACHE_READONLY\fR or \fBCCACHE_NOREADONLY\fR, see Boolean values above)
+.RS 4
+If true, ccache will attempt to use existing cached object files, but it will not to try to add anything new to the cache\&. If you are using this because your ccache directory is read\-only, then you need to set
+\fBtemporary_dir\fR
+as otherwise ccache will fail to create temporary files\&.
+.RE
+.PP
+\fBread_only_direct\fR (\fBCCACHE_READONLY_DIRECT\fR or \fBCCACHE_NOREADONLY_DIRECT\fR, see Boolean values above)
+.RS 4
+Just like
+\fBread_only\fR
+except that ccache will only try to retrieve results from the cache using the direct mode, not the preprocessor mode\&. See documentation for
+\fBread_only\fR
+regarding using a read\-only ccache directory\&.
+.RE
+.PP
+\fBrecache\fR (\fBCCACHE_RECACHE\fR or \fBCCACHE_NORECACHE\fR, see Boolean values above)
+.RS 4
+If true, ccache will not use any previously stored result\&. New results will still be cached, possibly overwriting any pre\-existing results\&.
+.RE
+.PP
+\fBrun_second_cpp\fR (\fBCCACHE_CPP2\fR or \fBCCACHE_NOCPP2\fR, see Boolean values above)
+.RS 4
+If true, ccache will first run the preprocessor to preprocess the source code (see
+THE PREPROCESSOR MODE) and then on a cache miss run the compiler on the source code to get hold of the object file\&. This is the default\&.
+.sp
+If false, ccache will first run preprocessor to preprocess the source code and then on a cache miss run the compiler on the
+\fIpreprocessed source code\fR
+instead of the original source code\&. This makes cache misses slightly faster since the source code only has to be preprocessed once\&. The downside is that some compilers won\(cqt produce the same result (for instance diagnostics warnings) when compiling preprocessed source code\&.
+.sp
+A solution to the above mentioned downside is to set
+\fBrun_second_cpp\fR
+to false and pass
+\fB\-fdirectives\-only\fR
+(for GCC) or
+\fB\-frewrite\-includes\fR
+(for Clang) to the compiler\&. This will cause the compiler to leave the macros and other preprocessor information, and only process the
+\fB#include\fR
+directives\&. When run in this way, the preprocessor arguments will be passed to the compiler since it still has to do
+\fIsome\fR
+preprocessing (like macros)\&.
+.RE
+.PP
+\fBsloppiness\fR (\fBCCACHE_SLOPPINESS\fR)
+.RS 4
+By default, ccache tries to give as few false cache hits as possible\&. However, in certain situations it\(cqs possible that you know things that ccache can\(cqt take for granted\&. This setting makes it possible to tell ccache to relax some checks in order to increase the hit rate\&. The value should be a comma\-separated string with options\&. Available options are:
+.PP
+\fBfile_macro\fR
+.RS 4
+Ignore
+\fB__FILE__\fR
+being present in the source\&.
+.RE
+.PP
+\fBfile_stat_matches\fR
+.RS 4
+ccache normally examines a file\(cqs contents to determine whether it matches the cached version\&. With this option set, ccache will consider a file as matching its cached version if the mtimes and ctimes match\&.
+.RE
+.PP
+\fBinclude_file_ctime\fR
+.RS 4
+By default, ccache also will not cache a file if it includes a header whose ctime is too new\&. This option disables that check\&.
+.RE
+.PP
+\fBinclude_file_mtime\fR
+.RS 4
+By default, ccache will not cache a file if it includes a header whose mtime is too new\&. This option disables that check\&.
+.RE
+.PP
+\fBno_system_headers\fR
+.RS 4
+By default, ccache will also include all system headers in the manifest\&. With this option set, ccache will only include system headers in the hash but not add the system header files to the list of include files\&.
+.RE
+.PP
+\fBpch_defines\fR
+.RS 4
+Be sloppy about
+\fB#define\fRs when precompiling a header file\&. See
+PRECOMPILED HEADERS
+for more information\&.
+.RE
+.PP
+\fBtime_macros\fR
+.RS 4
+Ignore
+\fB__DATE__\fR
+and
+\fB__TIME__\fR
+being present in the source code\&.
+.RE
+.sp
+See the discussion under
+TROUBLESHOOTING
+for more information\&.
+.RE
+.PP
+\fBstats\fR (\fBCCACHE_STATS\fR or \fBCCACHE_NOSTATS\fR, see Boolean values above)
+.RS 4
+If true, ccache will update the statistics counters on each compilation\&. The default is true\&.
+.RE
+.PP
+\fBtemporary_dir\fR (\fBCCACHE_TEMPDIR\fR)
+.RS 4
+This setting specifies where ccache will put temporary files\&. The default is
+\fB<cache_dir>/tmp\fR\&.
+.if n \{\
+.sp
+.\}
+.RS 4
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.br
+.ps +1
+\fBNote\fR
+.ps -1
+.br
+In previous versions of ccache,
+\fBCCACHE_TEMPDIR\fR
+had to be on the same filesystem as the
+\fBCCACHE_DIR\fR
+path, but this requirement has been relaxed\&.)
+.sp .5v
+.RE
+.RE
+.PP
+\fBumask\fR (\fBCCACHE_UMASK\fR)
+.RS 4
+This setting specifies the umask for ccache and all child processes (such as the compiler)\&. This is mostly useful when you wish to share your cache with other users\&. Note that this also affects the file permissions set on the object files created from your compilations\&.
+.RE
+.PP
+\fBunify\fR (\fBCCACHE_UNIFY\fR or \fBCCACHE_NOUNIFY\fR, see Boolean values above)
+.RS 4
+If true, ccache will use a C/C++ unifier when hashing the preprocessor output if the
+\fB\-g\fR
+option is not used\&. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only\&. Note that enabling the unifier changes the hash, so cached compilations produced when the unifier is enabled cannot be reused when the unifier is disabled, and vice versa\&. Enabling the unifier may result in incorrect line number information in compiler warning messages and expansions of the
+\fB__LINE__\fR
+macro\&.
+.RE
+.SH "CACHE SIZE MANAGEMENT"
+.sp
+By default, ccache has a 5 GB limit on the total size of files in the cache and no limit on the number of files\&. You can set different limits using the \fB\-M\fR/\fB\-\-max\-size\fR and \fB\-F\fR/\fB\-\-max\-files\fR options\&. Use \fBccache \-s/\-\-show\-stats\fR to see the cache size and the currently configured limits (in addition to other various statistics)\&.
+.sp
+Cleanup can be triggered in two different ways: automatic and manual\&.
+.SS "Automatic cleanup"
+.sp
+ccache maintains counters for various statistics about the cache, including the size and number of all cached files\&. In order to improve performance and reduce issues with concurrent ccache invocations, there is one statistics file for each of the sixteen subdirectories in the cache\&.
+.sp
+After a new compilation result has been written to the cache, ccache will update the size and file number statistics for the subdirectory (one of sixteen) to which the result was written\&. Then, if the size counter for said subdirectory is greater than \fBmax_size / 16\fR or the file number counter is greater than \fBmax_files / 16\fR, automatic cleanup is triggered\&.
+.sp
+When automatic cleanup is triggered for a subdirectory in the cache, ccache will:
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 1." 4.2
+.\}
+Count all files in the subdirectory and compute their aggregated size\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 2." 4.2
+.\}
+Remove files in LRU (least recently used) order until the size is at most
+\fBlimit_multiple * max_size / 16\fR
+and the number of files is at most
+\fBlimit_multiple * max_files / 16\fR, where
+\fBlimit_multiple\fR,
+\fBmax_size\fR
+and
+\fBmax_files\fR
+are configuration settings\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 3.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 3." 4.2
+.\}
+Set the size and file number counters to match the files that were kept\&.
+.RE
+.sp
+The reason for removing more files than just those needed to not exceed the max limits is that a cleanup is a fairly slow operation, so it would not be a good idea to trigger it often, like after each cache miss\&.
+.SS "Manual cleanup"
+.sp
+You can run \fBccache \-c/\-\-cleanup\fR to force cleanup of the whole cache, i\&.e\&. all of the sixteen subdirectories\&. This will recalculate the statistics counters and make sure that the \fBmax_size\fR and \fBmax_files\fR settings are not exceeded\&. Note that \fBlimit_multiple\fR is not taken into account for manual cleanup\&.
+.SH "CACHE COMPRESSION"
+.sp
+ccache can optionally compress all files it puts into the cache using the compression library zlib\&. While this may involve a tiny performance slowdown, it increases the number of files that fit in the cache\&. You can turn on compression with the \fBcompression\fR configuration setting and you can also tweak the compression level with \fBcompression_level\fR\&.
+.SH "CACHE STATISTICS"
+.sp
+\fBccache \-s/\-\-show\-stats\fR can show the following statistics:
+.TS
+allbox tab(:);
+ltB ltB.
+T{
+Name
+T}:T{
+Description
+T}
+.T&
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt
+lt lt.
+T{
+.sp
+autoconf compile/link
+T}:T{
+.sp
+Uncachable compilation or linking by an autoconf test\&.
+T}
+T{
+.sp
+bad compiler arguments
+T}:T{
+.sp
+Malformed compiler argument, e\&.g\&. missing a value for an option that requires an argument or failure to read a file specified by an option argument\&.
+T}
+T{
+.sp
+cache file missing
+T}:T{
+.sp
+A file was unexpectedly missing from the cache\&. This only happens in rare situations, e\&.g\&. if one ccache instance is about to get a file from the cache while another instance removed the file as part of cache cleanup\&.
+T}
+T{
+.sp
+cache hit (direct)
+T}:T{
+.sp
+A result was successfully found using the direct mode\&.
+T}
+T{
+.sp
+cache hit (preprocessed)
+T}:T{
+.sp
+A result was successfully found using the preprocessor mode\&.
+T}
+T{
+.sp
+cache miss
+T}:T{
+.sp
+No result was found\&.
+T}
+T{
+.sp
+cache size
+T}:T{
+.sp
+Current size of the cache\&.
+T}
+T{
+.sp
+called for link
+T}:T{
+.sp
+The compiler was called for linking, not compiling\&.
+T}
+T{
+.sp
+called for preprocessing
+T}:T{
+.sp
+The compiler was called for preprocessing, not compiling\&.
+T}
+T{
+.sp
+can\(cqt use precompiled header
+T}:T{
+.sp
+Preconditions for using precompiled headers were not fulfilled\&.
+T}
+T{
+.sp
+ccache internal error
+T}:T{
+.sp
+Unexpected failure, e\&.g\&. due to problems reading/writing the cache\&.
+T}
+T{
+.sp
+cleanups performed
+T}:T{
+.sp
+Number of cleanups performed, either implicitly due to the cache size limit being reached or due to explicit \fBccache \-c/\-\-cleanup\fR calls\&.
+T}
+T{
+.sp
+compile failed
+T}:T{
+.sp
+The compilation failed\&. No result stored in the cache\&.
+T}
+T{
+.sp
+compiler check failed
+T}:T{
+.sp
+A compiler check program specified by \fBcompiler_check\fR (\fBCCACHE_COMPILERCHECK\fR) failed\&.
+T}
+T{
+.sp
+compiler produced empty output
+T}:T{
+.sp
+The compiler\(cqs output file (typically an object file) was empty after compilation\&.
+T}
+T{
+.sp
+compiler produced no output
+T}:T{
+.sp
+The compiler\(cqs output file (typically an object file) was missing after compilation\&.
+T}
+T{
+.sp
+compiler produced stdout
+T}:T{
+.sp
+The compiler wrote data to standard output\&. This is something that compilers normally never do, so ccache is not designed to store such output in the cache\&.
+T}
+T{
+.sp
+couldn\(cqt find the compiler
+T}:T{
+.sp
+The compiler to execute could not be found\&.
+T}
+T{
+.sp
+error hashing extra file
+T}:T{
+.sp
+Failure reading a file specified by \fBextra_files_to_hash\fR (\fBCCACHE_EXTRAFILES\fR)\&.
+T}
+T{
+.sp
+files in cache
+T}:T{
+.sp
+Current number of files in the cache\&.
+T}
+T{
+.sp
+multiple source files
+T}:T{
+.sp
+The compiler was called to compile multiple source files in one go\&. This is not supported by ccache\&.
+T}
+T{
+.sp
+no input file
+T}:T{
+.sp
+No input file was specified to the compiler\&.
+T}
+T{
+.sp
+output to a non\-regular file
+T}:T{
+.sp
+The output path specified with \fB\-o\fR is not a file (e\&.g\&. a directory or a device node)\&.
+T}
+T{
+.sp
+output to stdout
+T}:T{
+.sp
+The compiler was instructed to write its output to standard output using \fB\-o \-\fR\&. This is not supported by ccache\&.
+T}
+T{
+.sp
+preprocessor error
+T}:T{
+.sp
+Preprocessing the source code using the compiler\(cqs \fB\-E\fR option failed\&.
+T}
+T{
+.sp
+unsupported code directive
+T}:T{
+.sp
+Code like the assembler \fB\&.incbin\fR directive was found\&. This is not supported by ccache\&.
+T}
+T{
+.sp
+unsupported compiler option
+T}:T{
+.sp
+A compiler option not supported by ccache was found\&.
+T}
+T{
+.sp
+unsupported source language
+T}:T{
+.sp
+A source language e\&.g\&. specified with \fB\-x\fR was unsupported by ccache\&.
+T}
+.TE
+.sp 1
+.SH "HOW CCACHE WORKS"
+.sp
+The basic idea is to detect when you are compiling exactly the same code a second time and reuse the previously produced output\&. The detection is done by hashing different kinds of information that should be unique for the compilation and then using the hash sum to identify the cached output\&. ccache uses MD4, a very fast cryptographic hash algorithm, for the hashing\&. (MD4 is nowadays too weak to be useful in cryptographic contexts, but it should be safe enough to be used to identify recompilations\&.) On a cache hit, ccache is able to supply all of the correct compiler outputs (including all warnings, dependency file, etc) from the cache\&.
+.sp
+ccache has two ways of doing the detection:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the
+\fBdirect mode\fR, where ccache hashes the source code and include files directly
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the
+\fBpreprocessor mode\fR, where ccache runs the preprocessor on the source code and hashes the result
+.RE
+.sp
+The direct mode is generally faster since running the preprocessor has some overhead\&.
+.SS "Common hashed information"
+.sp
+For both modes, the following information is included in the hash:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the extension used by the compiler for a file with preprocessor output (normally
+\fB\&.i\fR
+for C code and
+\fB\&.ii\fR
+for C++ code)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the compiler\(cqs size and modification time (or other compiler\-specific information specified by the
+\fBcompiler_check\fR
+setting)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the name of the compiler
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the current directory (if the
+\fBhash_dir\fR
+setting is enabled)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+contents of files specified by the
+\fBextra_files_to_hash\fR
+setting (if any)
+.RE
+.SS "The direct mode"
+.sp
+In the direct mode, the hash is formed of the common information and:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the input source file
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the command line options
+.RE
+.sp
+Based on the hash, a data structure called \(lqmanifest\(rq is looked up in the cache\&. The manifest contains:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+references to cached compilation results (object file, dependency file, etc) that were produced by previous compilations that matched the hash
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+paths to the include files that were read at the time the compilation results were stored in the cache
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+hash sums of the include files at the time the compilation results were stored in the cache
+.RE
+.sp
+The current contents of the include files are then hashed and compared to the information in the manifest\&. If there is a match, ccache knows the result of the compilation\&. If there is no match, ccache falls back to running the preprocessor\&. The output from the preprocessor is parsed to find the include files that were read\&. The paths and hash sums of those include files are then stored in the manifest along with information about the produced compilation result\&.
+.sp
+There is a catch with the direct mode: header files that were used by the compiler are recorded, but header files that were \fBnot\fR used, but would have been used if they existed, are not\&. So, when ccache checks if a result can be taken from the cache, it currently can\(cqt check if the existence of a new header file should invalidate the result\&. In practice, the direct mode is safe to use in the absolute majority of cases\&.
+.sp
+The direct mode will be disabled if any of the following holds:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the configuration setting
+\fBdirect_mode\fR
+is false
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+a modification time of one of the include files is too new (needed to avoid a race condition)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+a compiler option not supported by the direct mode is used:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+a
+\fB\-Wp,\fR\fB\fIX\fR\fR
+compiler option other than
+\fB\-Wp,\-MD,\fR\fB\fIpath\fR\fR,
+\fB\-Wp,\-MMD,\fR\fB\fIpath\fR\fR
+and
+\fB\-Wp,\-D_define_\fR
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+\fB\-Xpreprocessor\fR
+.RE
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the string
+\fB__TIME__\fR
+is present in the source code
+.RE
+.SS "The preprocessor mode"
+.sp
+In the preprocessor mode, the hash is formed of the common information and:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the preprocessor output from running the compiler with
+\fB\-E\fR
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+the command line options except options that affect include files (\fB\-I\fR,
+\fB\-include\fR,
+\fB\-D\fR, etc; the theory is that these options will change the preprocessor output if they have any effect at all)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+any standard error output generated by the preprocessor
+.RE
+.sp
+Based on the hash, the cached compilation result can be looked up directly in the cache\&.
+.SH "COMPILING IN DIFFERENT DIRECTORIES"
+.sp
+Some information included in the hash that identifies a unique compilation can contain absolute paths:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The preprocessed source code may contain absolute paths to include files if the compiler option
+\fB\-g\fR
+is used or if absolute paths are given to
+\fB\-I\fR
+and similar compiler options\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Paths specified by compiler options (such as
+\fB\-I\fR,
+\fB\-MF\fR, etc) on the command line may be absolute\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The source code file path may be absolute, and that path may substituted for
+\fB__FILE__\fR
+macros in the source code or included in warnings emitted to standard error by the preprocessor\&.
+.RE
+.sp
+This means that if you compile the same code in different locations, you can\(cqt share compilation results between the different build directories since you get cache misses because of the absolute build directory paths that are part of the hash\&.
+.sp
+Here\(cqs what can be done to enable cache hits between different build directories:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If you build with
+\fB\-g\fR
+(or similar) to add debug information to the object file, you must either:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+use the
+\fB\-fdebug\-prefix\-map=\fR\fB\fIold\fR\fR\fB=\fR\fB\fInew\fR\fR
+option for relocating debug info to a common prefix (e\&.g\&.
+\fB\-fdebug\-prefix\-map=$PWD=\&.\fR); or
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+set
+\fBhash_dir = false\fR\&.
+.RE
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If you use absolute paths anywhere on the command line (e\&.g\&. the source code file path or an argument to compiler options like
+\fB\-I\fR
+and
+\fB\-MF\fR), you must to set
+\fBbase_dir\fR
+to an absolute path to a \(lqbase directory\(rq\&. ccache will then rewrite absolute paths under that directory to relative before computing the hash\&.
+.RE
+.SH "PRECOMPILED HEADERS"
+.sp
+ccache has support for GCC\(cqs precompiled headers\&. However, you have to do some things to make it work properly:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+You must set
+\fBsloppiness\fR
+to
+\fBpch_defines,time_macros\fR\&. The reason is that ccache can\(cqt tell whether
+\fB__TIME__\fR
+or
+\fB__DATE__\fR
+is used when using a precompiled header\&. Further, it can\(cqt detect changes in
+\fB#define\fRs in the source code because of how preprocessing works in combination with precompiled headers\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+You must either:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+use the
+\fB\-include\fR
+compiler option to include the precompiled header (i\&.e\&., don\(cqt use
+\fB#include\fR
+in the source code to include the header); or
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+(for the Clang compiler) use the
+\fB\-include\-pch\fR
+compiler option to include the PCH file generated from the precompiled header; or
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+add the
+\fB\-fpch\-preprocess\fR
+compiler option when compiling\&.
+.RE
+.sp
+If you don\(cqt do this, either the non\-precompiled version of the header file will be used (if available) or ccache will fall back to running the real compiler and increase the statistics counter \(lqpreprocessor error\(rq (if the non\-precompiled header file is not available)\&.
+.RE
+.SH "SHARING A CACHE"
+.sp
+A group of developers can increase the cache hit rate by sharing a cache directory\&. To share a cache without unpleasant side effects, the following conditions should to be met:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Use the same cache directory\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Make sure that the configuration setting
+\fBhard_link\fR
+is false (which is the default)\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Make sure that all users are in the same group\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Set the configuration setting
+\fBumask\fR
+to 002\&. This ensures that cached files are accessible to everyone in the group\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache)\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Make sure that the setgid bit is set on all directories in the cache\&. This tells the filesystem to inherit group ownership for new directories\&. The following command might be useful for this:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+find $CCACHE_DIR \-type d | xargs chmod g+s
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+The reason to avoid the hard link mode is that the hard links cause unwanted side effects, as all links to a cached file share the file\(cqs modification timestamp\&. This results in false dependencies to be triggered by timestamp\-based build systems whenever another user links to an existing file\&. Typically, users will see that their libraries and binaries are relinked without reason\&.
+.sp
+You may also want to make sure that a base directory is set appropriately, as discussed in a previous section\&.
+.SH "SHARING A CACHE ON NFS"
+.sp
+It is possible to put the cache directory on an NFS filesystem (or similar filesystems), but keep in mind that:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Having the cache on NFS may slow down compilation\&. Make sure to do some benchmarking to see if it\(cqs worth it\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+ccache hasn\(cqt been tested very thoroughly on NFS\&.
+.RE
+.sp
+A tip is to set \fBtemporary_dir\fR to a directory on the local host to avoid NFS traffic for temporary files\&.
+.SH "USING CCACHE WITH OTHER COMPILER WRAPPERS"
+.sp
+The recommended way of combining ccache with another compiler wrapper (such as \(lqdistcc\(rq) is by letting ccache execute the compiler wrapper\&. This is accomplished by defining the configuration setting \fBprefix_command\fR, for example by setting the environment variable \fBCCACHE_PREFIX\fR to the name of the wrapper (e\&.g\&. \fBdistcc\fR)\&. ccache will then prefix the command line with the specified command when running the compiler\&. To specify several prefix commands, set \fBprefix_command\fR to a colon\-separated list of commands\&.
+.sp
+Unless you set \fBcompiler_check\fR to a suitable command (see the description of that configuration option), it is not recommended to use the form \fBccache anotherwrapper compiler args\fR as the compilation command\&. It\(cqs also not recommended to use the masquerading technique for the other compiler wrapper\&. The reason is that by default, ccache will in both cases hash the mtime and size of the other wrapper instead of the real compiler, which means that:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Compiler upgrades will not be detected properly\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The cached results will not be shared between compilations with and without the other wrapper\&.
+.RE
+.sp
+Another minor thing is that if \fBprefix_command\fR is used, ccache will not invoke the other wrapper when running the preprocessor, which increases performance\&. You can use the \fBprefix_command_cpp\fR configuration setting if you also want to invoke the other wrapper when doing preprocessing (normally by adding \fB\-E\fR)\&.
+.SH "CAVEATS"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The direct mode fails to pick up new header files in some rare scenarios\&. See
+THE DIRECT MODE
+above\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+When run via ccache, warning messages produced by GCC 4\&.9 and newer will only be colored when the environment variable
+\fBGCC_COLORS\fR
+is set\&. An alternative to setting
+\fBGCC_COLORS\fR
+is to pass
+\fB\-fdiagnostics\-color\fR
+explicitly when compiling (but then color codes will also be present when redirecting stderr to a file)\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If ccache guesses that the compiler may emit colored warnings, then a compilation with stderr referring to a TTY will be considered different from a compilation with a redirected stderr, thus not sharing cache entries\&. This happens for clang by default and for GCC when
+\fBGCC_COLORS\fR
+is set as mentioned above\&. If you want to share cache hits, you can pass
+\fB\-f[no\-]diagnostics\-color\fR
+(GCC) or
+\fB\-f[no\-]color\-diagnostics\fR
+(clang) explicitly when compiling (but then color codes will be either on or off for both the TTY and the redirected case)\&.
+.RE
+.SH "TROUBLESHOOTING"
+.SS "General"
+.sp
+A general tip for getting information about what ccache is doing is to enable debug logging by setting \fBlog_file\fR\&. The log contains executed commands, important decisions that ccache makes, read and written files, etc\&. Another way of keeping track of what is happening is to check the output of \fBccache \-s\fR\&.
+.SS "Performance"
+.sp
+ccache has been written to perform well out of the box, but sometimes you may have to do some adjustments of how you use the compiler and ccache in order to improve performance\&.
+.sp
+Since ccache works best when I/O is fast, put the cache directory on a fast storage device if possible\&. Having lots of free memory so that files in the cache directory stay in the disk cache is also preferable\&.
+.sp
+A good way of monitoring how well ccache works is to run \fBccache \-s\fR before and after your build and then compare the statistics counters\&. Here are some common problems and what may be done to increase the hit rate:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqcache hit (preprocessed)\(rq has been incremented instead of \(lqcache hit (direct)\(rq, ccache has fallen back to preprocessor mode, which is generally slower\&. Some possible reasons are:
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The source code has been modified in such a way that the preprocessor output is not affected\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Compiler arguments that are hashed in the direct mode but not in the preprocessor mode have changed (\fB\-I\fR,
+\fB\-include\fR,
+\fB\-D\fR, etc) and they didn\(cqt affect the preprocessor output\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The compiler option
+\fB\-Xpreprocessor\fR
+or
+\fB\-Wp,\fR\fB\fIX\fR\fR
+(except
+\fB\-Wp,\-MD,\fR\fB\fIpath\fR\fR,
+\fB\-Wp,\-MMD,\fR\fB\fIpath\fR\fR, and
+\fB\-Wp,\-D_define_\fR) is used\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+This was the first compilation with a new value of the base directory setting\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+A modification time of one of the include files is too new (created the same second as the compilation is being done)\&. This check is made to avoid a race condition\&. To fix this, create the include file earlier in the build process, if possible, or set
+\fBsloppiness\fR
+to
+\fBinclude_file_mtime\fR
+if you are willing to take the risk\&. (The race condition consists of these events: the preprocessor is run; an include file is modified by someone; the new include file is hashed by ccache; the real compiler is run on the preprocessor\(cqs output, which contains data from the old header file; the wrong object file is stored in the cache\&.)
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The
+\fB__TIME__\fR
+preprocessor macro is (potentially) being used\&. ccache turns off direct mode if
+\fB__TIME__\fR
+is present in the source code\&. This is done as a safety measure since the string indicates that a
+\fB__TIME__\fR
+macro
+\fImay\fR
+affect the output\&. (To be sure, ccache would have to run the preprocessor, but the sole point of the direct mode is to avoid that\&.) If you know that
+\fB__TIME__\fR
+isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
+\fB__TIME__\fR
+is expanded to something in the past, you can set
+\fBsloppiness\fR
+to
+\fBtime_macros\fR\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The
+\fB__DATE__\fR
+preprocessor macro is (potentially) being used and the date has changed\&. This is similar to how
+\fB__TIME__\fR
+is handled\&. If
+\fB__DATE__\fR
+is present in the source code, ccache hashes the current date in order to be able to produce the correct object file if the
+\fB__DATE__\fR
+macro affects the output\&. If you know that
+\fB__DATE__\fR
+isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
+\fB__DATE__\fR
+is expanded to something in the past, you can set
+\fBsloppiness\fR
+to
+\fBtime_macros\fR\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+The
+\fB__FILE__\fR
+preprocessor macro is (potentially) being used and the file path has changed\&. If
+\fB__FILE__\fR
+is present in the source code, ccache hashes the current input file path in order to be able to produce the correct object file if the
+\fB__FILE__\fR
+macro affects the output\&. If you know that
+\fB__FILE__\fR
+isn\(cqt used in practise, or don\(cqt care if ccache produces objects where
+\fB__FILE__\fR
+is expanded to the wrong path, you can set
+\fBsloppiness\fR
+to
+\fBfile_macro\fR\&.
+.RE
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqcache miss\(rq has been incremented even though the same code has been compiled and cached before, ccache has either detected that something has changed anyway or a cleanup has been performed (either explicitly or implicitly when a cache limit has been reached)\&. Some perhaps unobvious things that may result in a cache miss are usage of
+\fB__TIME__\fR
+or
+\fB__DATE__\fR
+macros, or use of automatically generated code that contains a timestamp, build counter or other volatile information\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqmultiple source files\(rq has been incremented, it\(cqs an indication that the compiler has been invoked on several source code files at once\&. ccache doesn\(cqt support that\&. Compile the source code files separately if possible\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqunsupported compiler option\(rq has been incremented, enable debug logging and check which option was rejected\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqpreprocessor error\(rq has been incremented, one possible reason is that precompiled headers are being used\&. See
+PRECOMPILED HEADERS
+for how to remedy this\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+If \(lqcan\(cqt use precompiled header\(rq has been incremented, see
+PRECOMPILED HEADERS\&.
+.RE
+.SS "Corrupt object files"
+.sp
+It should be noted that ccache is susceptible to general storage problems\&. If a bad object file sneaks into the cache for some reason, it will of course stay bad\&. Some possible reasons for erroneous object files are bad hardware (disk drive, disk controller, memory, etc), buggy drivers or file systems, a bad \fBprefix_command\fR or compiler wrapper\&. If this happens, the easiest way of fixing it is this:
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 1." 4.2
+.\}
+Build so that the bad object file ends up in the build tree\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 2." 4.2
+.\}
+Remove the bad object file from the build tree\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04' 3.\h'+01'\c
+.\}
+.el \{\
+.sp -1
+.IP " 3." 4.2
+.\}
+Rebuild with
+\fBCCACHE_RECACHE\fR
+set\&.
+.RE
+.sp
+An alternative is to clear the whole cache with \fBccache \-C\fR if you don\(cqt mind losing other cached results\&.
+.sp
+There are no reported issues about ccache producing broken object files reproducibly\&. That doesn\(cqt mean it can\(cqt happen, so if you find a repeatable case, please report it\&.
+.SH "MORE INFORMATION"
+.sp
+Credits, mailing list information, bug reporting instructions, source code, etc, can be found on ccache\(cqs web site: https://ccache\&.samba\&.org\&.
+.SH "AUTHOR"
+.sp
+ccache was originally written by Andrew Tridgell and is currently developed and maintained by Joel Rosdahl\&. See AUTHORS\&.txt or AUTHORS\&.html and https://ccache\&.samba\&.org/credits\&.html for a list of contributors\&.
// Whether the output is a precompiled header.
bool output_is_precompiled_header = false;
+// Compiler guessing is currently only based on the compiler name, so nothing
+// should hard-depend on it if possible.
+enum guessed_compiler guessed_compiler = GUESSED_UNKNOWN;
+
// Profile generation / usage information.
static char *profile_dir = NULL;
static bool profile_use = false;
closedir(dir);
}
-// Note that these compiler checks are unreliable, so nothing should
-// hard-depend on them.
-
-static bool
-compiler_is_clang(struct args *args)
-{
- char *name = basename(args->argv[0]);
- bool result = strstr(name, "clang") != NULL;
- free(name);
- return result;
-}
-
-static bool
-compiler_is_gcc(struct args *args)
+static enum guessed_compiler
+guess_compiler(const char *path)
{
- char *name = basename(args->argv[0]);
- bool result = strstr(name, "gcc") || strstr(name, "g++");
- free(name);
- return result;
-}
-
-static bool
-compiler_is_nvcc(struct args *args)
-{
- char *name = basename(args->argv[0]);
- bool result = strstr(name, "nvcc") != NULL;
- free(name);
- return result;
-}
-
-static bool
-compiler_is_pump(struct args *args)
-{
- char *name = basename(args->argv[0]);
- bool result = str_eq(name, "pump") || str_eq(name, "distcc-pump");
+ char *name = basename(path);
+ enum guessed_compiler result = GUESSED_UNKNOWN;
+ if (strstr(name, "clang")) {
+ result = GUESSED_CLANG;
+ } else if (strstr(name, "gcc") || strstr(name, "g++")) {
+ result = GUESSED_GCC;
+ } else if (strstr(name, "nvcc")) {
+ result = GUESSED_NVCC;
+ } else if (str_eq(name, "pump") || str_eq(name, "distcc-pump")) {
+ result = GUESSED_PUMP;
+ }
free(name);
return result;
}
// The comparison using >= is intentional, due to a possible race between
// starting compilation and writing the include file. See also the notes
- // under "Performance" in MANUAL.txt.
+ // under "Performance" in doc/MANUAL.adoc.
if (!(conf->sloppiness & SLOPPY_INCLUDE_FILE_MTIME)
&& st.st_mtime >= time_of_compilation) {
cc_log("Include file %s too new", path);
// distcc-pump outputs lines like this:
// __________Using # distcc servers in pump mode
- if (st.st_size != 0 && !compiler_is_pump(args)) {
+ if (st.st_size != 0 && guessed_compiler != GUESSED_PUMP) {
cc_log("Compiler produced stdout");
stats_update(STATS_STDOUT);
tmp_unlink(tmp_stdout);
{
time_of_compilation = time(NULL);
- char *path_stderr = format("%s/tmp.cpp_stderr", temp_dir());
- int path_stderr_fd = create_tmp_fd(&path_stderr);
- add_pending_tmp_file(path_stderr);
-
+ char *path_stderr = NULL;
char *path_stdout;
int status;
if (direct_i_file) {
int path_stdout_fd = create_tmp_fd(&path_stdout);
add_pending_tmp_file(path_stdout);
+ path_stderr = format("%s/tmp.cpp_stderr", temp_dir());
+ int path_stderr_fd = create_tmp_fd(&path_stderr);
+ add_pending_tmp_file(path_stderr);
+
int args_added = 2;
args_add(args, "-E");
if (conf->keep_comments_cpp) {
} else {
hash_delimiter(hash, "cpp");
if (!process_preprocessed_file(hash, path_stdout,
- compiler_is_pump(args))) {
+ guessed_compiler == GUESSED_PUMP)) {
stats_update(STATS_ERROR);
failed();
}
}
hash_delimiter(hash, "cppstderr");
- if (!hash_file(hash, path_stderr)) {
+ if (!direct_i_file && !hash_file(hash, path_stderr)) {
fatal("Failed to open %s: %s", path_stderr, strerror(errno));
}
}
// Possibly hash GCC_COLORS (for color diagnostics).
- if (compiler_is_gcc(args)) {
+ if (guessed_compiler == GUESSED_GCC) {
const char *gcc_colors = getenv("GCC_COLORS");
if (gcc_colors) {
hash_delimiter(hash, "gcccolors");
// clang will emit warnings for unused linker flags, so we shouldn't skip
// those arguments.
- int is_clang = compiler_is_clang(args);
+ int is_clang = guessed_compiler == GUESSED_CLANG;
// First the arguments.
for (int i = 1; i < args->argc; i++) {
return;
}
- // We can't trust the objects based on running the preprocessor
- // when the output is precompiled headers, as the hash does not
- // include the mtime of each included header, breaking compilation
- // with clang when the precompiled header is used after touching
- // one of the included files.
- if (output_is_precompiled_header && mode == FROMCACHE_CPP_MODE) {
- cc_log("Not using preprocessed cached object for precompiled header");
+ // If we're using Clang, we can't trust a precompiled header object based on
+ // running the preprocessor since clang will produce a fatal error when the
+ // precompiled header is used and one of the included files has an updated
+ // timestamp:
+ //
+ // file 'foo.h' has been modified since the precompiled header 'foo.pch'
+ // was built
+ if (guessed_compiler == GUESSED_CLANG
+ && output_is_precompiled_header
+ && mode == FROMCACHE_CPP_MODE) {
+ cc_log("Not considering cached precompiled header in preprocessor mode");
return;
}
is_precompiled_header(const char *path)
{
const char *ext = get_extension(path);
- return str_eq(ext, ".gch") || str_eq(ext, ".pch") || str_eq(ext, ".pth");
+ char *dir = dirname(path);
+ const char *dir_ext = get_extension(dir);
+ bool result =
+ str_eq(ext, ".gch")
+ || str_eq(ext, ".pch")
+ || str_eq(ext, ".pth")
+ || str_eq(dir_ext, ".gch"); // See "Precompiled Headers" in GCC docs.
+ free(dir);
+ return result;
}
static bool
}
// Handle cuda "-optf" and "--options-file" argument.
- if ((str_eq(argv[i], "-optf") || str_eq(argv[i], "--options-file"))
- && compiler_is_nvcc(args)) {
+ if (guessed_compiler == GUESSED_NVCC
+ && (str_eq(argv[i], "-optf") || str_eq(argv[i], "--options-file"))) {
if (i == argc - 1) {
cc_log("Expected argument after %s", argv[i]);
stats_update(STATS_ARGS);
}
// Alternate form of -o with no space. Nvcc does not support this.
- if (str_startswith(argv[i], "-o") && !compiler_is_nvcc(args)) {
+ if (str_startswith(argv[i], "-o") && guessed_compiler != GUESSED_NVCC) {
output_obj = make_relative_path(x_strdup(&argv[i][2]));
continue;
}
// Since output is redirected, compilers will not color their output by
// default, so force it explicitly if it would be otherwise done.
if (!found_color_diagnostics && color_output_possible()) {
- if (compiler_is_clang(args)) {
+ if (guessed_compiler == GUESSED_CLANG) {
if (!str_eq(actual_language, "assembler")) {
args_add(stripped_args, "-fcolor-diagnostics");
cc_log("Automatically enabling colors");
}
- } else if (compiler_is_gcc(args)) {
+ } else if (guessed_compiler == GUESSED_GCC) {
// GCC has it since 4.9, but that'd require detecting what GCC version is
// used for the actual compile. However it requires also GCC_COLORS to be
// set (and not empty), so use that for detecting if GCC would use
conf->limit_multiple = MIN(MAX(conf->limit_multiple, 0.0), 1.0);
+ guessed_compiler = guess_compiler(orig_args->argv[0]);
+
// Arguments (except -E) to send to the preprocessor.
struct args *preprocessor_args;
// Arguments to send to the real compiler.
STATS_END
};
+enum guessed_compiler {
+ GUESSED_CLANG,
+ GUESSED_GCC,
+ GUESSED_NVCC,
+ GUESSED_PUMP,
+ GUESSED_UNKNOWN
+};
+
+extern enum guessed_compiler guessed_compiler;
+
#define SLOPPY_INCLUDE_FILE_MTIME 1
#define SLOPPY_INCLUDE_FILE_CTIME 2
#define SLOPPY_FILE_MACRO 4
int x_rename(const char *oldpath, const char *newpath);
int tmp_unlink(const char *path);
int x_unlink(const char *path);
+int x_try_unlink(const char *path);
#ifndef _WIN32
char *x_readlink(const char *path);
#endif
}
static void
-delete_file(const char *path, size_t size)
+delete_file(const char *path, size_t size, bool update_counters)
{
- if (x_unlink(path) == 0) {
+ bool deleted = x_try_unlink(path) == 0;
+ if (!deleted && errno != ENOENT && errno != ESTALE) {
+ cc_log("Failed to unlink %s (%s)", path, strerror(errno));
+ } else if (update_counters) {
+ // The counters are intentionally subtracted even if there was no file to
+ // delete since the final cache size calculation will be incorrect if they
+ // aren't. (This can happen when there are several parallel ongoing
+ // cleanups of the same directory.)
cache_size -= size;
files_in_cache--;
- } else if (errno != ENOENT && errno != ESTALE) {
- cc_log("Failed to unlink %s (%s)", path, strerror(errno));
- }
-}
-
-static void
-delete_sibling_file(const char *base, const char *extension)
-{
- struct stat st;
- char *path = format("%s%s", base, extension);
- if (lstat(path, &st) == 0) {
- delete_file(path, file_size(&st));
- } else if (errno != ENOENT && errno != ESTALE) {
- cc_log("Failed to stat %s: %s", path, strerror(errno));
}
- free(path);
}
// Sort the files we've found and delete the oldest ones until we are below the
}
// Delete enough files to bring us below the threshold.
- char *last_base = x_strdup("");
bool cleaned = false;
for (unsigned i = 0; i < num_files; i++) {
const char *ext;
}
ext = get_extension(files[i]->fname);
- if (str_eq(ext, ".o")
- || str_eq(ext, ".d")
- || str_eq(ext, ".gcno")
- || str_eq(ext, ".dia")
- || str_eq(ext, ".stderr")
- || str_eq(ext, "")) {
+ if (str_eq(ext, ".stderr")) {
+ // Make sure that the .o file is deleted before .stderr, because if the
+ // ccache process gets killed after deleting the .stderr but before
+ // deleting the .o, the cached result will be inconsistent. (.stderr is
+ // the only file that is optional; any other file missing from the cache
+ // will be detected by get_file_from_cache.)
char *base = remove_extension(files[i]->fname);
- if (!str_eq(base, last_base)) { // Avoid redundant unlinks.
- // Make sure that all sibling files are deleted so that a cached result
- // is removed completely. Note the order of deletions -- the stderr
- // file must be deleted last because if the ccache process gets killed
- // after deleting the .stderr but before deleting the .o, the cached
- // result would be inconsistent.
- delete_sibling_file(base, ".o");
- delete_sibling_file(base, ".d");
- delete_sibling_file(base, ".gcno");
- delete_sibling_file(base, ".dia");
- delete_sibling_file(base, ".stderr");
- delete_sibling_file(base, ""); // Object file from ccache 2.4.
- }
- free(last_base);
- last_base = base;
- } else {
- // .manifest or unknown file.
- delete_file(files[i]->fname, files[i]->size);
+ char *o_file = format("%s.o", base);
+
+ // Don't subtract this extra deletion from the cache size; that
+ // bookkeeping will be done when the loop reaches the .o file. If the
+ // loop doesn't reach the .o file since the target limits have been
+ // reached, the bookkeeping won't happen, but that small counter
+ // discrepancy won't do much harm and it will correct itself in the next
+ // cleanup.
+ delete_file(o_file, 0, false);
+
+ free(o_file);
+ free(base);
}
+ delete_file(files[i]->fname, files[i]->size, true);
cleaned = true;
}
- free(last_base);
return cleaned;
}
traverse(dir, traverse_fn);
// Clean the cache.
+ cc_log("Before cleanup: %lu KiB, %zu files",
+ (unsigned long)cache_size / 1024,
+ files_in_cache);
bool cleaned = sort_and_clean();
+ cc_log("After cleanup: %lu KiB, %zu files",
+ (unsigned long)cache_size / 1024,
+ files_in_cache);
+
if (cleaned) {
cc_log("Cleaned up cache directory %s", dir);
stats_add_cleanup(dir, 1);
}
- cc_log("After cleanup: %lu KiB, %zu files",
- (unsigned long)cache_size / 1024,
- files_in_cache);
stats_set_sizes(dir, files_in_cache, cache_size);
// Free it up.
break;
case '"':
bs = (bs << 1) + 1;
+ // Fallthrough.
default:
k += bs + 1;
bs = 0;
-// Copyright (C) 2009-2016 Joel Rosdahl
+// Copyright (C) 2009-2018 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
// Clang stores the mtime of the included files in the precompiled header,
// and will error out if that header is later used without rebuilding.
- if (output_is_precompiled_header && fi->mtime != st->mtime) {
+ if (guessed_compiler == GUESSED_CLANG
+ && output_is_precompiled_header
+ && fi->mtime != st->mtime) {
cc_log("Precompiled header includes %s, which has a new mtime", path);
return 0;
}
return rc;
}
-// Remove path, NFS safe.
-int
-x_unlink(const char *path)
+static int
+do_x_unlink(const char *path, bool log_failure)
{
int saved_errno = 0;
// file. We don't care if the temp file is trashed, so it's always safe to
// unlink it first.
char *tmp_name = format("%s.rm.%s", path, tmp_string());
- cc_log("Unlink %s via %s", path, tmp_name);
int result = 0;
if (x_rename(path, tmp_name) == -1) {
}
out:
- free(tmp_name);
- if (result) {
- cc_log("x_unlink failed: %s", strerror(saved_errno));
+ if (result == 0 || log_failure) {
+ cc_log("Unlink %s via %s", path, tmp_name);
+ if (result != 0 && log_failure) {
+ cc_log("x_unlink failed: %s", strerror(saved_errno));
+ }
}
+ free(tmp_name);
errno = saved_errno;
return result;
}
+// Remove path, NFS safe, log both successes and failures.
+int
+x_unlink(const char *path)
+{
+ return do_x_unlink(path, true);
+}
+
+// Remove path, NFS safe, only log successes.
+int
+x_try_unlink(const char *path)
+{
+ return do_x_unlink(path, false);
+}
+
#ifndef _WIN32
// Like readlink() but returns the string or NULL on failure. Caller frees.
char *
if (flags >= 0) {
fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
}
+#else
+ (void)fd;
#endif
}
-const char CCACHE_VERSION[] = "3.4.1";
+const char CCACHE_VERSION[] = "3.4.2";
}
backdate() {
- touch -t 199901010000 "$@"
+ if [[ $1 =~ ^[0-9]+$ ]]; then
+ m=$1
+ shift
+ else
+ m=0
+ fi
+ touch -t 1999010100$(printf "%02u" $m) "$@"
}
expect_stat() {
fi
}
+expect_file_exists() {
+ if [ ! -f "$1" ]; then
+ test_failed "Expected $1 to exist, but it's missing"
+ fi
+}
+
+expect_file_missing() {
+ if [ -f "$1" ]; then
+ test_failed "Expected $1 to be missing, but it exists"
+ fi
+}
+
expect_equal_files() {
if [ ! -e "$1" ]; then
- test_failed "compare_files: $1 missing"
+ test_failed "expect_equal_files: $1 missing"
fi
if [ ! -e "$2" ]; then
- test_failed "compare_files: $2 missing"
+ test_failed "expect_equal_files: $2 missing"
fi
if ! cmp -s "$1" "$2"; then
- test_failed "compare_files: $1 and $2 differ"
+ test_failed "$1 and $2 differ"
fi
}
expect_different_files() {
if [ ! -e "$1" ]; then
- test_failed "compare_files: $1 missing"
+ test_failed "expect_different_files: $1 missing"
fi
if [ ! -e "$2" ]; then
- test_failed "compare_files: $2 missing"
+ test_failed "expect_different_files: $2 missing"
fi
if cmp -s "$1" "$2"; then
- test_failed "compare_files: $1 and $2 are identical"
+ test_failed "$1 and $2 are identical"
fi
}
local expected=$1
local pattern=$2
local dir=$3
- local actual=`find $dir -name "$pattern" | wc -l`
+ local actual=`find $dir -type f -name "$pattern" | wc -l`
if [ $actual -ne $expected ]; then
test_failed "Found $actual (expected $expected) $pattern files in $dir"
fi
$CCACHE_COMPILE -c test1.c
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
-
- num=`find $CCACHE_DIR -name '*.stderr' | wc -l`
- if [ $num -ne 0 ]; then
- test_failed "$num stderr files found, expected 0 (#1)"
- fi
+ expect_file_count 0 '*.stderr' $CCACHE_DIR
obj_file=`find $CCACHE_DIR -name '*.o'`
stderr_file=`echo $obj_file | sed 's/..$/.stderr/'`
echo "Warning: foo" >$stderr_file
CCACHE_RECACHE=1 $CCACHE_COMPILE -c test1.c
- num=`find $CCACHE_DIR -name '*.stderr' | wc -l`
- if [ $num -ne 0 ]; then
- test_failed "$num stderr files found, expected 0 (#2)"
- fi
+ expect_file_count 0 '*.stderr' $CCACHE_DIR
# -------------------------------------------------------------------------
TEST "No object file"
}
EOF
$CCACHE_COMPILE -Wall -W -c stderr.c 2>/dev/null
- num=`find $CCACHE_DIR -name '*.stderr' | wc -l`
- if [ $num -ne 1 ]; then
- test_failed "$num stderr files found, expected 1"
- fi
+ expect_file_count 1 '*.stderr' $CCACHE_DIR
expect_stat 'files in cache' 2
# -------------------------------------------------------------------------
mkdir -p $dir
for i in $(seq 0 9); do
printf '%4017s' '' | tr ' ' 'A' >$dir/result$i-4017.o
- touch $dir/result$i-4017.stderr
- touch $dir/result$i-4017.d
- if [ $i -gt 5 ]; then
- backdate $dir/result$i-4017.stderr
- fi
+ backdate $((3 * i + 1)) $dir/result$i-4017.o
+ backdate $((3 * i + 2)) $dir/result$i-4017.d
+ backdate $((3 * i + 3)) $dir/result$i-4017.stderr
done
# NUMFILES: 30, TOTALSIZE: 40 KiB, MAXFILES: 0, MAXSIZE: 0
echo "0 0 0 0 0 0 0 0 0 0 0 30 40 0 0" >$dir/stats
# Reduce file limit
#
- # 21 * 16 = 336
- $CCACHE -F 336 -M 0 >/dev/null
+ # 22 * 16 = 352
+ $CCACHE -F 352 -M 0 >/dev/null
$CCACHE -c >/dev/null
expect_file_count 7 '*.o' $CCACHE_DIR
expect_file_count 7 '*.d' $CCACHE_DIR
- expect_file_count 7 '*.stderr' $CCACHE_DIR
- expect_stat 'files in cache' 21
+ expect_file_count 8 '*.stderr' $CCACHE_DIR
+ expect_stat 'files in cache' 22
expect_stat 'cleanups performed' 1
- for i in 0 1 2 3 4 5 9; do
+ for i in 0 1 2; do
file=$CCACHE_DIR/a/result$i-4017.o
- if [ ! -f $file ]; then
- test_failed "File $file removed when it shouldn't"
- fi
+ expect_file_missing $CCACHE_DIR/a/result$i-4017.o
done
- for i in 6 7 8; do
+ for i in 3 4 5 6 7 8 9; do
file=$CCACHE_DIR/a/result$i-4017.o
- if [ -f $file ]; then
- test_failed "File $file not removed when it should"
- fi
+ expect_file_exists $file
done
# -------------------------------------------------------------------------
$CCACHE -F 0 -M 256K >/dev/null
CCACHE_LOGFILE=/tmp/foo $CCACHE -c >/dev/null
expect_file_count 3 '*.o' $CCACHE_DIR
- expect_file_count 3 '*.d' $CCACHE_DIR
- expect_file_count 3 '*.stderr' $CCACHE_DIR
- expect_stat 'files in cache' 9
+ expect_file_count 4 '*.d' $CCACHE_DIR
+ expect_file_count 4 '*.stderr' $CCACHE_DIR
+ expect_stat 'files in cache' 11
expect_stat 'cleanups performed' 1
- for i in 3 4 5; do
+ for i in 0 1 2 3 4 5 6; do
file=$CCACHE_DIR/a/result$i-4017.o
- if [ ! -f $file ]; then
- test_failed "File $file removed when it shouldn't"
- fi
+ expect_file_missing $file
done
- for i in 0 1 2 6 7 8 9; do
+ for i in 7 8 9; do
file=$CCACHE_DIR/a/result$i-4017.o
- if [ -f $file ]; then
- test_failed "File $file not removed when it should"
- fi
+ expect_file_exists $file
done
# -------------------------------------------------------------------------
touch empty.c
CCACHE_LIMIT_MULTIPLE=0.9 $CCACHE_COMPILE -c empty.c -o empty.o
expect_file_count 159 '*.o' $CCACHE_DIR
- expect_file_count 158 '*.d' $CCACHE_DIR
- expect_file_count 158 '*.stderr' $CCACHE_DIR
- expect_stat 'files in cache' 475
+ expect_file_count 159 '*.d' $CCACHE_DIR
+ expect_file_count 159 '*.stderr' $CCACHE_DIR
+ expect_stat 'files in cache' 477
expect_stat 'cleanups performed' 1
# -------------------------------------------------------------------------
touch empty.c
CCACHE_LIMIT_MULTIPLE=0.7 $CCACHE_COMPILE -c empty.c -o empty.o
expect_file_count 157 '*.o' $CCACHE_DIR
- expect_file_count 156 '*.d' $CCACHE_DIR
- expect_file_count 156 '*.stderr' $CCACHE_DIR
- expect_stat 'files in cache' 469
+ expect_file_count 157 '*.d' $CCACHE_DIR
+ expect_file_count 157 '*.stderr' $CCACHE_DIR
+ expect_stat 'files in cache' 471
expect_stat 'cleanups performed' 1
# -------------------------------------------------------------------------
- TEST "Cleanup of sibling files"
+ TEST ".o file is removed before .stderr"
prepare_cleanup_test_dir $CCACHE_DIR/a
+ $CCACHE -F 474 -M 0 >/dev/null
+ backdate 0 $CCACHE_DIR/a/result9-4017.stderr
+ $CCACHE -c >/dev/null
+ expect_file_missing $CCACHE_DIR/a/result9-4017.stderr
+ expect_file_missing $CCACHE_DIR/a/result9-4017.o
+
+ # Counters expectedly doesn't match reality if x.stderr is found before
+ # x.o and the cleanup stops before x.o is found.
+ expect_stat 'files in cache' 29
+ expect_file_count 28 '*.*' $CCACHE_DIR/a
+
+ # -------------------------------------------------------------------------
+ TEST ".stderr file is not removed before .o"
- $CCACHE -F 336 -M 0 >/dev/null
- backdate $CCACHE_DIR/a/result2-4017.stderr
+ prepare_cleanup_test_dir $CCACHE_DIR/a
+ $CCACHE -F 474 -M 0 >/dev/null
+ backdate 0 $CCACHE_DIR/a/result9-4017.o
$CCACHE -c >/dev/null
- # floor(0.8 * 9) = 7
- expect_file_count 7 '*.o' $CCACHE_DIR
- expect_file_count 7 '*.d' $CCACHE_DIR
- expect_file_count 7 '*.stderr' $CCACHE_DIR
- expect_stat 'files in cache' 21
- for i in 0 1 3 4 5 8 9; do
- file=$CCACHE_DIR/a/result$i-4017.o
- if [ ! -f $file ]; then
- test_failed "File $file removed when it shouldn't"
- fi
- done
- for i in 2 6 7; do
- file=$CCACHE_DIR/a/result$i-4017.o
- if [ -f $file ]; then
- test_failed "File $file not removed when it should"
- fi
- done
+ expect_file_exists $CCACHE_DIR/a/result9-4017.stderr
+ expect_file_missing $CCACHE_DIR/a/result9-4017.o
+
+ expect_stat 'files in cache' 29
+ expect_file_count 29 '*.*' $CCACHE_DIR/a
# -------------------------------------------------------------------------
TEST "No cleanup of new unknown file"
$CCACHE -F 480 -M 0 >/dev/null
$CCACHE -c >/dev/null
- if [ ! -f $CCACHE_DIR/a/abcd.unknown ]; then
- test_failed "$CCACHE_DIR/a/abcd.unknown removed"
- fi
- expect_stat 'files in cache' 28
+ expect_file_exists $CCACHE_DIR/a/abcd.unknown
+ expect_stat 'files in cache' 30
# -------------------------------------------------------------------------
TEST "Cleanup of old unknown file"
expect_stat 'files in cache' 31
$CCACHE -F 480 -M 0 -c >/dev/null
- if [ -f $CCACHE_DIR/a/abcd.unknown ]; then
- test_failed "$CCACHE_DIR/a/abcd.unknown not removed"
- fi
+ expect_file_missing $CCACHE_DIR/a/abcd.unknown
expect_stat 'files in cache' 30
# -------------------------------------------------------------------------
expect_stat 'files in cache' 1
backdate $CCACHE_DIR/a/abcd.tmp.efgh
$CCACHE -c >/dev/null
- if [ -f $CCACHE_DIR/a/abcd.tmp.efgh ]; then
- test_failed "$CCACHE_DIR/a/abcd.tmp.unknown not removed"
- fi
+ expect_file_missing $CCACHE_DIR/a/abcd.tmp.efgh
expect_stat 'files in cache' 0
# -------------------------------------------------------------------------
backdate dir1/include/test.h dir2/include/test.h
}
+objdump_cmd() {
+ if $HOST_OS_APPLE; then
+ xcrun dwarfdump -r0 $1
+ else
+ objdump -g $1
+ fi
+}
+
+grep_cmd() {
+ if $HOST_OS_APPLE; then
+ grep "( \"$1\" )"
+ else
+ grep ": $1[[:space:]]*$"
+ fi
+}
+
SUITE_debug_prefix_map() {
# -------------------------------------------------------------------------
TEST "Mapping of debug info CWD"
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
expect_stat 'files in cache' 2
- if grep -E "[^=]`pwd`[^=]" test.o >/dev/null 2>&1; then
+ if objdump_cmd test.o | grep_cmd "`pwd`" >/dev/null 2>&1; then
test_failed "Source dir (`pwd`) found in test.o"
fi
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
expect_stat 'files in cache' 2
- if grep -E "[^=]`pwd`[^=]" test.o >/dev/null 2>&1; then
+ if objdump_cmd test.o | grep_cmd "`pwd`" >/dev/null 2>&1; then
test_failed "Source dir (`pwd`) found in test.o"
fi
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
expect_stat 'files in cache' 2
- if grep -E "[^=]`pwd`[^=]" test.o >/dev/null 2>&1; then
+ if objdump_cmd test.o | grep_cmd "`pwd`" >/dev/null 2>&1; then
test_failed "Source dir (`pwd`) found in test.o"
fi
- if ! grep "name" test.o >/dev/null 2>&1; then
+ if ! objdump_cmd test.o | grep_cmd "name" >/dev/null 2>&1; then
test_failed "Relocation (name) not found in test.o"
fi
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
expect_stat 'files in cache' 2
- if grep -E "[^=]`pwd`[^=]" test.o >/dev/null 2>&1; then
+ if objdump_cmd test.o | grep_cmd "`pwd`" >/dev/null 2>&1; then
test_failed "Source dir (`pwd`) found in test.o"
fi
}
$CCACHE_COMPILE -MD -c test.c -o test.dir/test$ext
rm -f $dep_file
$CCACHE_COMPILE -MD -c test.c -o test.dir/test$ext
- if [ ! -f $dep_file ]; then
- test_failed "$dep_file missing"
- fi
+ expect_file_exists $dep_file
if ! grep "test$ext:" $dep_file >/dev/null 2>&1; then
test_failed "$dep_file does not contain test$ext"
fi
$CCACHE_COMPILE -MD -MQ $dep_target -c test.c -o test.dir/test$ext
rm -f $dep_target
$CCACHE_COMPILE -MD -MQ $dep_target -c test.c -o test.dir/test$ext
- if [ ! -f $dep_file ]; then
- test_failed "$dep_file missing"
- fi
+ expect_file_exists $dep_file
if ! grep $dep_target $dep_file >/dev/null 2>&1; then
test_failed "$dep_file does not contain $dep_target"
fi
expect_stat 'cache hit (direct)' 0
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- test -r code.gcno || test_failed "code.gcno missing"
+ expect_file_exists code.gcno
rm code.gcno
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- test -r code.gcno || test_failed "code.gcno missing"
+ expect_file_exists code.gcno
# -------------------------------------------------------------------------
TEST "-fstack-usage"
expect_stat 'cache hit (direct)' 0
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- test -r code.su || test_failed "code.su missing"
+ expect_file_exists code.su
rm code.su
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- test -r code.su || test_failed "code.su missing"
+ expect_file_exists code.su
fi
# -------------------------------------------------------------------------
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- if [ ! -f pch.h.gch ]; then
- test_failed "pch.h.gch missing"
- fi
+ expect_file_exists pch.h.gch
# -------------------------------------------------------------------------
TEST "Create .gch, no -c, -o, with opt-in"
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- if [ ! -f pch.gch ]; then
- test_failed "pch.gch missing"
- fi
+ expect_file_exists pch.gch
# -------------------------------------------------------------------------
TEST "Use .gch, no -fpch-preprocess, #include"
expect_stat 'cache hit (direct)' 0
expect_stat 'cache hit (preprocessed)' 1
expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Create and use .gch directory"
+
+ mkdir pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -x c-header -c pch.h -o pch.h.gch/foo
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ rm pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -x c-header -c pch.h -o pch.h.gch/foo
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ expect_file_exists pch.h.gch/foo
+
+ backdate pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ echo "updated" >>pch.h.gch/foo # GCC seems to cope with this...
+ backdate pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 3
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 3
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 3
}
pch_suite_clang() {
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- if [ ! -f pch.h.gch ]; then
- test_failed "pch.h.gch missing"
- fi
+ expect_file_exists pch.h.gch
# -------------------------------------------------------------------------
TEST "Create .gch, no -c, -o, with opt-in"
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- if [ ! -f pch.gch ]; then
- test_failed "pch.gch missing"
- fi
+ expect_file_exists pch.gch
# -------------------------------------------------------------------------
TEST "Create .gch, include file mtime changed"
expect_stat 'cache miss' 2
$REAL_COMPILER $SYSROOT -c -include pch2.h pch2.c
- if [ ! -f pch2.o ]; then
- test_failed "pch.o missing"
- fi
+ expect_file_exists pch2.o
CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch2.h
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (direct)' 1
expect_stat 'cache hit (preprocessed)' 0
expect_stat 'cache miss' 1
- if [ ! -f pch.h.pth ]; then
- test_failed "pch.h.pth missing"
- fi
+ expect_file_exists pch.h.pth
# -------------------------------------------------------------------------
TEST "Use .pth, no -fpch-preprocess, -include, no sloppiness"
--- /dev/null
+SUITE_pch_PROBE() {
+ touch pch.h
+ if ! $REAL_COMPILER $SYSROOT -fpch-preprocess pch.h 2>/dev/null \
+ || [ ! -f pch.h.gch ]; then
+ echo "compiler ($($COMPILER --version | head -1)) doesn't support precompiled headers"
+ fi
+}
+
+SUITE_pch_SETUP() {
+ unset CCACHE_NODIRECT
+
+ cat <<EOF >pch.c
+#include "pch.h"
+int main()
+{
+ void *p = NULL;
+ return 0;
+}
+EOF
+ cat <<EOF >pch.h
+#include <stdlib.h>
+EOF
+ backdate pch.h
+ cat <<EOF >pch2.c
+int main()
+{
+ void *p = NULL;
+ return 0;
+}
+EOF
+}
+
+SUITE_pch() {
+ # Clang and GCC handle precompiled headers similarly, but GCC is much more
+ # forgiving with precompiled headers. Both GCC and Clang keep an absolute
+ # path reference to the original file except that Clang uses that reference
+ # to validate the pch and GCC ignores the reference. Also, Clang has an
+ # additional feature: pre-tokenized headers. For these reasons, Clang
+ # should be tested differently from GCC. Clang can only use pch or pth
+ # headers on the command line and not as an #include statement inside a
+ # source file.
+
+ if $COMPILER_TYPE_CLANG; then
+ pch_suite_clang
+ else
+ pch_suite_gcc
+ fi
+}
+
+pch_suite_gcc() {
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, -c, no -o, without opt-in"
+
+ $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, no -c, -o, without opt-in"
+
+ $CCACHE_COMPILE pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, -c, no -o, with opt-in"
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines" $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ rm pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines" $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.h.gch ]; then
+ test_failed "pch.h.gch missing"
+ fi
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, no -c, -o, with opt-in"
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.gch ]; then
+ test_failed "pch.gch missing"
+ fi
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, no -fpch-preprocess, #include"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ $CCACHE_COMPILE $SYSROOT -c pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ # Preprocessor error because GCC can't find the real include file when
+ # trying to preprocess:
+ expect_stat 'preprocessor error' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, no -fpch-preprocess, -include, no sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ # Must enable sloppy time macros:
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, no -fpch-preprocess, -include, sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, -fpch-preprocess, #include, no sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ # Must enable sloppy time macros:
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, -fpch-preprocess, #include, sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, -fpch-preprocess, #include, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.gch # GCC seems to cope with this...
+ backdate pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, preprocessor mode"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, preprocessor mode, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+ rm pch.h
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.gch # GCC seems to cope with this...
+ backdate pch.h.gch
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Create and use .gch directory"
+
+ mkdir pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -x c-header -c pch.h -o pch.h.gch/foo
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ rm pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -x c-header -c pch.h -o pch.h.gch/foo
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.h.gch/foo ]; then
+ test_failed "pch.h.gch/foo missing"
+ fi
+
+ backdate pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ echo "updated" >>pch.h.gch/foo # GCC seems to cope with this...
+ backdate pch.h.gch/foo
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 3
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 3
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 3
+}
+
+pch_suite_clang() {
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, -c, no -o, without opt-in"
+
+ $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, no -c, -o, without opt-in"
+
+ $CCACHE_COMPILE pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, -c, no -o, with opt-in"
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ rm pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch.h
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.h.gch ]; then
+ test_failed "pch.h.gch missing"
+ fi
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, no -c, -o, with opt-in"
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT pch.h -o pch.gch
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.gch ]; then
+ test_failed "pch.gch missing"
+ fi
+
+ # -------------------------------------------------------------------------
+ TEST "Create .gch, include file mtime changed"
+
+ backdate test.h
+ cat <<EOF >pch2.h
+ #include <stdlib.h>
+ #include "test.h"
+EOF
+
+ # Make sure time_of_compilation is at least one second larger than the ctime
+ # of the test.h include, otherwise we might not cache its ctime/mtime.
+ sleep 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch2.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ touch test.h
+ sleep 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch2.h
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ $REAL_COMPILER $SYSROOT -c -include pch2.h pch2.c
+ if [ ! -f pch2.o ]; then
+ test_failed "pch.o missing"
+ fi
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch2.h
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, no -fpch-preprocess, -include, no sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+
+ $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c 2>/dev/null
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ # Must enable sloppy time macros:
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, no -fpch-preprocess, -include, sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, -fpch-preprocess, -include, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.gch # clang seems to cope with this...
+ backdate pch.h.gch
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, preprocessor mode"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .gch, preprocessor mode, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h
+ backdate pch.h.gch
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.gch # clang seems to cope with this...
+ backdate pch.h.gch
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Create .pth, -c, -o"
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch.h -o pch.h.pth
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ rm -f pch.h.pth
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c pch.h -o pch.h.pth
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ if [ ! -f pch.h.pth ]; then
+ test_failed "pch.h.pth missing"
+ fi
+
+ # -------------------------------------------------------------------------
+ TEST "Use .pth, no -fpch-preprocess, -include, no sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h -o pch.h.pth
+ backdate pch.h.pth
+
+ $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 0
+ # Must enable sloppy time macros:
+ expect_stat "can't use precompiled header" 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .pth, no -fpch-preprocess, -include, sloppiness"
+
+ $REAL_COMPILER $SYSROOT -c pch.h -o pch.h.pth
+ backdate pch.h.pth
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h pch2.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .pth, -fpch-preprocess, -include, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h -o pch.h.pth
+ backdate pch.h.pth
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.pth # clang seems to cope with this...
+ backdate pch.h.pth
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ # -------------------------------------------------------------------------
+ TEST "Use .pth, preprocessor mode"
+
+ $REAL_COMPILER $SYSROOT -c pch.h -o pch.h.pth
+ backdate pch.h.pth
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 1
+
+ # -------------------------------------------------------------------------
+ TEST "Use .pth, preprocessor mode, file changed"
+
+ $REAL_COMPILER $SYSROOT -c pch.h -o pch.h.pth
+ backdate pch.h.pth
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+
+ echo "updated" >>pch.h.pth # clang seems to cope with this...
+ backdate pch.h.pth
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+
+ CCACHE_NODIRECT=1 CCACHE_SLOPPINESS="$DEFAULT_SLOPPINESS pch_defines time_macros" $CCACHE_COMPILE $SYSROOT -c -include pch.h -fpch-preprocess pch.c
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 1
+ expect_stat 'cache miss' 2
+}
if [ $status2 -ne 0 ]; then
test_failed "Failure when compiling test2.c read-only"
fi
- if [ ! -f test.o ]; then
- test_failed "test.o missing"
- fi
- if [ ! -f test2.o ]; then
- test_failed "test2.o missing"
- fi
+ expect_file_exists test.o
+ expect_file_exists test2.o
# -------------------------------------------------------------------------
TEST "Cache miss"
+++ /dev/null
-SUITE(args)
-SUITE(argument_processing)
-SUITE(compopt)
-SUITE(conf)
-SUITE(counters)
-SUITE(hash)
-SUITE(hashutil)
-SUITE(lockfile)
-SUITE(stats)
-SUITE(util)