<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="AsciiDoc 8.6.10">
<title>Format for describing dependencies of source files</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

.monospaced, code, pre {
  font-family: "Courier New", Courier, monospace;
  font-size: inherit;
  color: navy;
  padding: 0;
  margin: 0;
}
pre {
  white-space: pre-wrap;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; vertical-align: text-bottom; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }

div.unbreakable { page-break-inside: avoid; }


/*
 * xhtml11 specific
 *
 * */

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}


</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName.toLowerCase() == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(5);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Format for describing dependencies of source files</h1>
<span id="author">Ben Boeckel, Brad King</span><br>
<span id="email" class="monospaced">&lt;<a href="mailto:ben.boeckel@kitware.com, brad.king@kitware.com">ben.boeckel@kitware.com, brad.king@kitware.com</a>&gt;</span><br>
<span id="revnumber">version P1689R0,</span>
<span id="revdate"></span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="hdlist"><table>
<tr>
<td class="hdlist1">
Document number
<br>
</td>
<td class="hdlist2">
<p style="margin-top: 0;">
ISO/IEC/JTC1/SC22/WG21/P1689R0
</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Date
<br>
</td>
<td class="hdlist2">
<p style="margin-top: 0;">
</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Reply-to
<br>
</td>
<td class="hdlist2">
<p style="margin-top: 0;">
Ben Boeckel, Brad King, <a href="mailto:ben.boeckel@kitware.com">ben.boeckel@kitware.com</a>, <a href="mailto:brad.king@kitware.com">brad.king@kitware.com</a>
</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Audience
<br>
</td>
<td class="hdlist2">
<p style="margin-top: 0;">
EWG (Evolution), SG15 (Tooling)
</p>
</td>
</tr>
</table></div>
</div>
</div>
<div class="sect1">
<h2 id="_abstract">1. Abstract</h2>
<div class="sectionbody">
<div class="paragraph"><p>When building C++ source code, build tools need to discover dependencies of
source files based on their contents. This must be done during the build
because the contents of the files can change without the build tools themselves
rerunning. In addition, generated source files must have their dependencies
discovered during the build as well. With the advent of modules in <a href="#P1103R3">[P1103R3]</a>,
there are now ordering requirements among compilation rules. These also need to
be discovered during the build. This paper specifies a format for communicating
this information to build tools.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_changes">2. Changes</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_r0_initial">2.1. R0 (Initial)</h3>
<div class="paragraph"><p>Description of the format and its semantics.</p></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">3. Introduction</h2>
<div class="sectionbody">
<div class="paragraph"><p>This paper describes a format primarily for use during the build of C++
source code to communicate dependencies of a source file. Other uses may exist,
but its primary use case is for correct compilation of C++ sources. The tool
which generates this format is referred to as a "dependency scanning tool" in
this paper.</p></div>
<div class="paragraph"><p>This information includes:</p></div>
<div class="ulist"><ul>
<li>
<p>
the dependencies of running the dependency scanning tool itself;
</p>
</li>
<li>
<p>
the resources that will be required to exist when the scanned translation
    unit is compiled; and
</p>
</li>
<li>
<p>
the resources that will be provided when the scanned translation unit is
    compiled.
</p>
</li>
</ul></div>
<div class="paragraph"><p>This information is sufficient to allow a build tool to order compilation rules
to get a valid build in the presence of C++ modules.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_format">4. Format</h2>
<div class="sectionbody">
<div class="paragraph"><p>The format uses JSON <a href="#ECMA-404">[ECMA-404]</a> as a base for encoding its information.
This is suitable because it is structured (versus a plain-text format),
parsers for JSON are readily available (versus candidates with a custom
structural format), and the format is simple to implement (versus
candidates such as YAML or TOML).</p></div>
<div class="paragraph"><p>JSON specifies that documents are Unicode.  However, due to the way
filepaths are represented in this format, it is further constrained to
be a valid UTF-8 sequence.</p></div>
<div class="sect2">
<h3 id="_schema">4.1. Schema</h3>
<div class="paragraph"><p>For the information provided by the format, the following JSON Schema
<a href="#JSON-Schema">[JSON-Schema]</a> may be used.</p></div>
<div class="paragraph"><p> <details><summary> 
JSON Schema for the format
 </summary><div> </p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "$schema": ""<span style="color: #990000">,</span>
  "$id": "<span style="color: #FF0000">http://example.com/root.json</span>"<span style="color: #990000">,</span>
  "type": "<span style="color: #FF0000">object</span>"<span style="color: #990000">,</span>
  "title": "<span style="color: #FF0000">SG15 TR depformat</span>"<span style="color: #990000">,</span>
  "definitions": <span style="color: #990000">{</span>
    "datablock": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#datablock</span>"<span style="color: #990000">,</span>
      "type": <span style="color: #990000">[</span>
        "object"<span style="color: #990000">,</span>
        "string"
      <span style="color: #990000">],</span>
      "description": "<span style="color: #FF0000">A binary sequence. See associated prose for interpretation</span>"<span style="color: #990000">,</span>
      "minLength": <span style="color: #993399">1</span><span style="color: #990000">,</span>
      "required": <span style="color: #990000">[</span>
        "format"<span style="color: #990000">,</span>
        "data"
      <span style="color: #990000">],</span>
      "properties": <span style="color: #990000">{</span>
        "format": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#format</span>"<span style="color: #990000">,</span>
          "enum": <span style="color: #990000">[</span>"raw8"<span style="color: #990000">,</span> "raw16"<span style="color: #990000">],</span>
          "description": "<span style="color: #FF0000">Storage size of data's integers</span>"
        <span style="color: #990000">},</span>
        "data": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#data</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Integer representation of binary values</span>"<span style="color: #990000">,</span>
          "minItems": <span style="color: #993399">1</span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "type": "<span style="color: #FF0000">integer</span>"<span style="color: #990000">,</span>
            "minimum": <span style="color: #993399">1</span>
          <span style="color: #990000">}</span>
        <span style="color: #990000">},</span>
        "readable": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#readable</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">string</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Readable version of the sequence (purely for human consumption; no semantic meaning)</span>"<span style="color: #990000">,</span>
          "minLength": <span style="color: #993399">1</span>
        <span style="color: #990000">}</span>
      <span style="color: #990000">}</span>
    <span style="color: #990000">},</span>
    "depinfo": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#depinfo</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">object</span>"<span style="color: #990000">,</span>
      "description": "<span style="color: #FF0000">Dependency information for a source file</span>"<span style="color: #990000">,</span>
      "required": <span style="color: #990000">[</span>
        "input"
      <span style="color: #990000">],</span>
      "properties": <span style="color: #990000">{</span>
        "input": <span style="color: #990000">{</span>
          "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
        <span style="color: #990000">},</span>
        "outputs": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#outputs</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Files that will be output by this execution</span>"<span style="color: #990000">,</span>
          "uniqueItems": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
          <span style="color: #990000">}</span>
        <span style="color: #990000">},</span>
        "depends": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#depends</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Paths read during this execution</span>"<span style="color: #990000">,</span>
          "uniqueItems": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
          <span style="color: #990000">}</span>
        <span style="color: #990000">},</span>
        "future-compile": <span style="color: #990000">{</span>
          "$ref": "<span style="color: #FF0000">#/definitions/future-depinfo</span>"
        <span style="color: #990000">},</span>
        "future-link": <span style="color: #990000">{</span>
          "$ref": "<span style="color: #FF0000">#/definitions/future-depinfo</span>"
        <span style="color: #990000">},</span>
        "extensions": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#extensions</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Extra non-semantic information</span>"
        <span style="color: #990000">}</span>
      <span style="color: #990000">}</span>
    <span style="color: #990000">},</span>
    "future-depinfo": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#future-depinfo</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">object</span>"<span style="color: #990000">,</span>
      "properties": <span style="color: #990000">{</span>
        "outputs": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#outputs</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Files output by a future rule for this source using the same flags</span>"<span style="color: #990000">,</span>
          "uniqueItems": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
          <span style="color: #990000">}</span>
        <span style="color: #990000">},</span>
        "provides": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#provides</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Modules provided by a future compile rule for this source using the same flags</span>"<span style="color: #990000">,</span>
          "uniqueItems": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "$ref": "<span style="color: #FF0000">#/definitions/module-desc</span>"
          <span style="color: #990000">}</span>
        <span style="color: #990000">},</span>
        "requires": <span style="color: #990000">{</span>
          "$id": "<span style="color: #FF0000">#requires</span>"<span style="color: #990000">,</span>
          "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
          "description": "<span style="color: #FF0000">Modules required by a future compile rule for this source using the same flags</span>"<span style="color: #990000">,</span>
          "uniqueItems": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
          "items": <span style="color: #990000">{</span>
            "$ref": "<span style="color: #FF0000">#/definitions/module-desc</span>"
          <span style="color: #990000">}</span>
        <span style="color: #990000">}</span>
      <span style="color: #990000">}</span>
    <span style="color: #990000">},</span>
    "module-desc": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#module-desc</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">object</span>"<span style="color: #990000">,</span>
      "required": <span style="color: #990000">[</span>
        "logical"
      <span style="color: #990000">],</span>
      "properties": <span style="color: #990000">{</span>
        "filepath": <span style="color: #990000">{</span>
          "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
        <span style="color: #990000">},</span>
        "logical": <span style="color: #990000">{</span>
          "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
        <span style="color: #990000">}</span>
      <span style="color: #990000">}</span>
    <span style="color: #990000">}</span>
  <span style="color: #990000">},</span>
  "required": <span style="color: #990000">[</span>
    "version"<span style="color: #990000">,</span>
    "work-directory"<span style="color: #990000">,</span>
    "sources"
  <span style="color: #990000">],</span>
  "properties": <span style="color: #990000">{</span>
    "version": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#version</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">integer</span>"<span style="color: #990000">,</span>
      "description": "<span style="color: #FF0000">The version of the output specification</span>"
    <span style="color: #990000">},</span>
    "revision": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#revision</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">integer</span>"<span style="color: #990000">,</span>
      "description": "<span style="color: #FF0000">The revision of the output specification</span>"<span style="color: #990000">,</span>
      "default": <span style="color: #993399">0</span>
    <span style="color: #990000">},</span>
    "work-directory": <span style="color: #990000">{</span>
      "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"
    <span style="color: #990000">},</span>
    "sources": <span style="color: #990000">{</span>
      "$id": "<span style="color: #FF0000">#sources</span>"<span style="color: #990000">,</span>
      "type": "<span style="color: #FF0000">array</span>"<span style="color: #990000">,</span>
      "title": "<span style="color: #FF0000">sources</span>"<span style="color: #990000">,</span>
      "minItems": <span style="color: #993399">1</span><span style="color: #990000">,</span>
      "items": <span style="color: #990000">{</span>
        "$ref": "<span style="color: #FF0000">#/definitions/depinfo</span>"
      <span style="color: #990000">}</span>
    <span style="color: #990000">}</span>
  <span style="color: #990000">}</span>
<span style="color: #990000">}</span></tt></pre></div></div>
<div class="paragraph"><p> </div></details> </p></div>
</div>
<div class="sect2">
<h3 id="_storing_binary_data">4.2. Storing binary data</h3>
<div class="paragraph"><p>This format uses UTF-8 as a communication channel between a dependency scanning
tool and a build tool, but filepath encodings are specific to the platform in
use. Therefore, considerations for paths containing non-UTF-8 sequences must be
made. However, the most common uses of paths and filenames are either valid
UTF-8 sequences or may be unambiguously represented using UTF-8 (e.g., a
platform using UTF-16 for its path APIs has a valid UTF-8 encoding), so
requiring excessive obfuscation in all cases is unnecessary.</p></div>
<div class="paragraph"><p>In order to store a non-UTF-8 sequence losslessly, there must be a way to
encode the non-UTF-8 sequence into this format. There have been multiple ways
utilized in the past for storing binary data into JSON including Base64 (as
well as other related encodings such as Base85 or Base91), integer arrays, and
going so far as to convert the entire file format over to binary (e.g.,
<a href="#BSON">[BSON]</a>, <a href="#UBJSON">[UBJSON]</a>, etc.). These encodings do not handle sequences of 16-bit
data well either since endianness information is not stored in them. These
solutions are over-pessimistic about the common case of valid UTF-8 paths used
in this format so this encoding scheme uses UTF-8 wherever possible while
dropping down to a less efficient encoding only when necessary.</p></div>
<div class="paragraph"><p>The most general format for storing data is to use an array of integers tagged
with the size of the values in memory. This is done by using an object with two
required keys: <span class="monospaced">data</span> storing the integers representing the raw data and
<span class="monospaced">format</span> describing the size of the integers in memory. Supported formats are
<span class="monospaced">raw8</span> and <span class="monospaced">raw16</span>. Other formats are ill-formed. There is an optional
<span class="monospaced">readable</span> key which contains a string for communicating the contents in a
human-readable format using UTF-8. The value of the <span class="monospaced">readable</span> key is purely
information and does not have any normative meaning to the interpretation of
the format.</p></div>
<div class="ulist"><ul>
<li>
<p>
<span class="monospaced">raw8</span> indicates that the integers of the <span class="monospaced">data</span> array are 8-bit unsigned
  integers. All values of the <span class="monospaced">data</span> array are required to be integers in the
  range of 1 to 255, inclusive.
</p>
</li>
</ul></div>
<div class="listingblock">
<div class="title">Example <span class="monospaced">raw8</span>-encoded filepath</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "format": "<span style="color: #FF0000">raw8</span>"<span style="color: #990000">,</span>
  "data": <span style="color: #990000">[</span><span style="color: #993399">112</span><span style="color: #990000">,</span> <span style="color: #993399">97</span><span style="color: #990000">,</span> <span style="color: #993399">197</span><span style="color: #990000">,</span> <span style="color: #993399">163</span><span style="color: #990000">,</span> <span style="color: #993399">104</span><span style="color: #990000">,</span> <span style="color: #993399">45</span><span style="color: #990000">,</span> <span style="color: #993399">116</span><span style="color: #990000">,</span> <span style="color: #993399">111</span><span style="color: #990000">,</span> <span style="color: #993399">45</span><span style="color: #990000">,</span> <span style="color: #993399">102</span><span style="color: #990000">,</span> <span style="color: #993399">105</span><span style="color: #990000">,</span> <span style="color: #993399">108</span><span style="color: #990000">,</span> <span style="color: #993399">195</span><span style="color: #990000">,</span> <span style="color: #993399">171</span><span style="color: #990000">],</span>
  "readable": "<span style="color: #FF0000">paţh-to-filë</span>"
<span style="color: #990000">}</span></tt></pre></div></div>
<div class="ulist"><ul>
<li>
<p>
<span class="monospaced">raw16</span> indicates that the integers of the <span class="monospaced">data</span> array are 16-bit unsigned
  integers. All values of the <span class="monospaced">data</span> array are required to be integers in the
  range of 1 to 65535, inclusive.
</p>
</li>
</ul></div>
<div class="listingblock">
<div class="title">Example <span class="monospaced">raw16</span>-encoded filepath</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "format": "<span style="color: #FF0000">raw16</span>"<span style="color: #990000">,</span>
  "data": <span style="color: #990000">[</span><span style="color: #993399">112</span><span style="color: #990000">,</span> <span style="color: #993399">97</span><span style="color: #990000">,</span> <span style="color: #993399">355</span><span style="color: #990000">,</span> <span style="color: #993399">104</span><span style="color: #990000">,</span> <span style="color: #993399">45</span><span style="color: #990000">,</span> <span style="color: #993399">116</span><span style="color: #990000">,</span> <span style="color: #993399">111</span><span style="color: #990000">,</span> <span style="color: #993399">45</span><span style="color: #990000">,</span> <span style="color: #993399">102</span><span style="color: #990000">,</span> <span style="color: #993399">105</span><span style="color: #990000">,</span> <span style="color: #993399">108</span><span style="color: #990000">,</span> <span style="color: #993399">235</span><span style="color: #990000">],</span>
  "readable": "<span style="color: #FF0000">paţh-to-filë</span>"
<span style="color: #990000">}</span></tt></pre></div></div>
<div class="paragraph"><p>Requirements for passing data to the platform&#8217;s APIs such as a terminating
ASCII <span class="monospaced">NUL</span> byte or endianness are not included in the format. Using integer
values outside of the range specified for the format is ill-formed.</p></div>
<div class="paragraph"><p>If data are mostly UTF-8, to avoid encoding the entire path with the integer
array, the percent encoding specified in <a href="#RFC3986">[RFC3986]</a>§2.1 may be used for these
bytes to avoid encoding the entire path as an integer array. For example, a
filepath with the <span class="monospaced">0xf5</span> byte in it may be encoded as
<span class="monospaced">"file/path/with/raw-%f5-byte"</span>. Due to this support, any literal <span class="monospaced">%</span> (ASCII
<span class="monospaced">0x25</span>) bytes must be encoded using percent encoding as well (<span class="monospaced">%25</span>).</p></div>
<div class="listingblock">
<div class="title">Example filepaths represented as UTF-8 strings</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">[</span>
  "paţh-to-filë"<span style="color: #990000">,</span>
  "path-to-file-ascii"<span style="color: #990000">,</span>
  "file/path/with/raw-%f5-byte"<span style="color: #990000">,</span>
  "file/path/with/escaped-%25-percent"<span style="color: #990000">,</span>
<span style="color: #990000">]</span></tt></pre></div></div>
<div class="paragraph"><p>When a path can be communicated as a series of UTF-8 codepoints, it should be
done, but it is not required. That is, all fields which may contain binary data
in the format are allowed to be unconditionally encoded using the most general
format.</p></div>
</div>
<div class="sect2">
<h3 id="_filepaths">4.3. Filepaths</h3>
<div class="paragraph"><p>Filepaths may either be relative or absolute. It is preferred to use relative
paths because the compilation may occur in a different working directory than
the scanning tool uses. However, any paths which are not dependent on the
working directory of the tool must be output using an absolute path. To this
end, the dependency scanning tool must output its working directory in the
<span class="monospaced">work-directory</span> key at the root of the document. The build tool may then
construct the absolute paths as necessary.</p></div>
<div class="paragraph"><p>For concrete examples where absolute paths may not be suitable:</p></div>
<div class="ulist"><ul>
<li>
<p>
A distributed build may perform the compilation in a different directory on
    another machine than the host machine is using.
</p>
</li>
<li>
<p>
A build tool may use a chroot for each command it
    invokes.<span class="footnote"><br>[Concretely, the Tup build tool can execute
    compile rules inside of individual FUSE chroots where absolute paths are
    meaningless outside of that context.]<br></span>
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_source_items">4.4. Source items</h3>
<div class="paragraph"><p>The <span class="monospaced">sources</span> array allows for the dependency information of multiple files to
be specified in a single file. The only restriction placed on this is that the
<span class="monospaced">input</span> field across all <span class="monospaced">sources</span> entries be unique after decoding it as a
filepath.</p></div>
</div>
<div class="sect2">
<h3 id="_dependency_information">4.5. Dependency information</h3>
<div class="paragraph"><p>Each source represented in the <span class="monospaced">sources</span> array is a JSON object which only
requires a single key, <span class="monospaced">input</span>. Its value is a <span class="monospaced">datablock</span> representing a
filepath. Two optional keys exist to indicate the dependencies of the execution
of the dependency scanning tool: the <span class="monospaced">outputs</span> array and the <span class="monospaced">depends</span> array.
The <span class="monospaced">outputs</span> array in which each element is a filepath for files written by
the dependency scanning tool due to the specified <span class="monospaced">input</span> file. The <span class="monospaced">depends</span>
array in which each element is a filepath for files which affect the results of
the run. For C++, this will generally paths be due to <span class="monospaced">#include</span>, but other
mechanisms may be in effect.</p></div>
</div>
<div class="sect2">
<h3 id="_future_dependency_information">4.6. Future dependency information</h3>
<div class="paragraph"><p>The core of this specification is the <span class="monospaced">future-compile</span> and <span class="monospaced">future-link</span> keys on a
<span class="monospaced">sources</span> object. They both use the same specification for their values, but
contain the information for different phases of source compilation. These JSON
objects have three optional keys, <span class="monospaced">outputs</span>, <span class="monospaced">provides</span>, and <span class="monospaced">requires</span>.</p></div>
<div class="paragraph"><p>The <span class="monospaced">outputs</span> array contains filepaths which will be written to when the source
is compiled. Only filepaths which are known to the dependency scanning tool
that will be created at compile time should be included here.</p></div>
<div class="paragraph"><p>The <span class="monospaced">provides</span> and <span class="monospaced">requires</span> arrays contain descriptions of modules that will
be provided or required at compile time. Each item of these arrays is a JSON
object with one required key, <span class="monospaced">logical</span>, and one optional key, <span class="monospaced">filepath</span>. Both
of these key&#8217;s values are filepaths. The <span class="monospaced">logical</span> value is what build tools
should use to discover the ordering among translation unit compilations. In
C++, this will generally be the name of the module (including its partition,
if any). The <span class="monospaced">filepath</span> should be provided only if the location of the module&#8217;s
future on-disk representation is known when the dependency information is
discovered.</p></div>
<div class="listingblock">
<div class="title">Example source entry with <span class="monospaced">future-compile</span> information</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "input": "<span style="color: #FF0000">path/to/input.cxx</span>"<span style="color: #990000">,</span>
  "future-compile": <span style="color: #990000">[</span>
    "outputs": <span style="color: #990000">[</span>
      "path/to/output.o"
    <span style="color: #990000">],</span>
    "provides": <span style="color: #990000">[</span>
      <span style="color: #990000">{</span>
        "filepath": "<span style="color: #FF0000">exported.bmi</span>"<span style="color: #990000">,</span>
        "logical": "<span style="color: #FF0000">exported</span>"
      <span style="color: #990000">}</span>
    <span style="color: #990000">],</span>
    "requires": <span style="color: #990000">[</span>
      <span style="color: #990000">{</span>
        "logical": "<span style="color: #FF0000">imported</span>"
      <span style="color: #990000">}</span>
    <span style="color: #990000">]</span>
  <span style="color: #990000">]</span>
<span style="color: #990000">}</span></tt></pre></div></div>
</div>
<div class="sect2">
<h3 id="_extensions">4.7. Extensions</h3>
<div class="paragraph"><p>Extensions may be added to the format using keys prefixed with an underscore
(<span class="monospaced">_</span>). In addition, each source entry has an <span class="monospaced">extensions</span> key. Neither of these
may be used to store semantically relevant information required to execute a
correct build. Essentially, consumers of the format may ignore both
<span class="monospaced">_</span>-prefixed keys and the <span class="monospaced">extensions</span> field and not suffer any loss of
essential functionality.</p></div>
<div class="listingblock">
<div class="title">Example source entry with extended information</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "input": "<span style="color: #FF0000">path/to/input</span>"<span style="color: #990000">,</span>
  "_also_an_extension": <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">,</span>
  "extensions": <span style="color: #990000">{</span>
    "timestamp": "<span style="color: #FF0000">Wed Jun 12 13:52:35 EDT 2019</span>"<span style="color: #990000">,</span>
    "host": "<span style="color: #FF0000">myhost</span>"
  <span style="color: #990000">}</span>
<span style="color: #990000">}</span></tt></pre></div></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_versioning">5. Versioning</h2>
<div class="sectionbody">
<div class="paragraph"><p>There are two keys with integer values in the top-level JSON object of the
format: <span class="monospaced">version</span> and <span class="monospaced">revision</span>. The <span class="monospaced">version</span> key is required and if
<span class="monospaced">revision</span> is not provided, it can be assumed to be <span class="monospaced">0</span>. These indicate the
version of the information available in the format itself and what features may
be used. Tools creating this format should have a way to create older versions
and revisions of the format to support consumers that do not support the newer
versions.</p></div>
<div class="paragraph"><p>The <span class="monospaced">version</span> integer is incremented when semantic information is different
than a previous version. This is information that is required for a build to be
correct. When the <span class="monospaced">version</span> is incremented, the <span class="monospaced">revision</span> integer is reset to
<span class="monospaced">0</span>.</p></div>
<div class="paragraph"><p>The <span class="monospaced">revision</span> integer is incremented when the semantic information of the
format is the same as previous revisions of the same version, but it may
include additionally specified information or use an additionally specified
format for the same information. For example, adding a <span class="monospaced">format</span> type would
cause an increment of the <span class="monospaced">revision</span>.</p></div>
<div class="paragraph"><p>The version specified in this document is:</p></div>
<div class="listingblock">
<div class="title">Version fields for this specification</div>
<div class="content"><!-- Generator: GNU source-highlight
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="color: #990000">{</span>
  "version": <span style="color: #993399">1</span><span style="color: #990000">,</span>
  "revision": <span style="color: #993399">0</span>
<span style="color: #990000">}</span></tt></pre></div></div>
</div>
</div>
<div class="sect1">
<h2 id="_references">6. References</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
<a id="BSON"></a>[BSON] BSON (Binary JSON) Serialization.
  <a href="http://bsonspec.org/">http://bsonspec.org/</a>.
</p>
</li>
<li>
<p>
<a id="ECMA-404"></a>[ECMA-404] The JSON Data Interchange Syntax.
  <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf">http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf</a>.
</p>
</li>
<li>
<p>
<a id="JSON-Schema"></a>[JSON-Schema] Austin Wright and Henry Andrews. JSON Schema: A Media Type
  for Describing JSON Documents.
  <a href="https://tools.ietf.org/html/draft-handrews-json-schema-01">https://tools.ietf.org/html/draft-handrews-json-schema-01</a>.
</p>
</li>
<li>
<p>
<a id="P1103R3"></a>[P1103R3] Richard Smith. Merging Modules.
  <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1103r3.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1103r3.pdf</a>.
</p>
</li>
<li>
<p>
<a id="RFC3629"></a>[RFC3629] Francois Yergeau. UTF-8, a transformation format of ISO 10646.
  <a href="https://tools.ietf.org/html/rfc3629">https://tools.ietf.org/html/rfc3629</a>.
</p>
</li>
<li>
<p>
<a id="RFC3986"></a>[RFC3986] Tim Berners-Lee. Uniform Resource Identifier (URI): Generic Syntax.
  <a href="https://tools.ietf.org/html/rfc3986">https://tools.ietf.org/html/rfc3986</a>.
</p>
</li>
<li>
<p>
<a id="Unicode-12"></a>[Unicode-12] Unicode Consortium. Unicode 12.0.0.
  <a href="https://www.unicode.org/versions/Unicode12.0.0/">https://www.unicode.org/versions/Unicode12.0.0/</a>.
</p>
</li>
<li>
<p>
<a id="UBJSON"></a>[UBJSON] Universal Binary JSON.
  <a href="http://ubjson.org/">http://ubjson.org/</a>.
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr></div>
<div id="footer">
<div id="footer-text">
Version P1689R0<br>
Last updated
 2019-06-17 09:27:09 EDT
</div>
</div>
</body>
</html>
