<!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 P1689R1,</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/P1689R1

</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="_r1_post_cologne">2.1. R1 (post-Cologne)</h3>

<div class="paragraph"><p>The following changes have been made in response to feedback in SG15:</p></div>

<div class="ulist"><ul>

<li>

<p>

rename keys to be more "noun-like" or for clarity including:

</p>

</li>

<li>

<p>

<span class="monospaced">readable</span> → <span class="monospaced">readable-name</span>

</p>

</li>

<li>

<p>

<span class="monospaced">logical</span> → <span class="monospaced">logical-name</span>

</p>

</li>

<li>

<p>

<span class="monospaced">filepath</span> → <span class="monospaced">compiled-module-path</span>

</p>

</li>

<li>

<p>

remove <span class="monospaced">future-link</span> (no known use case)

</p>

</li>

<li>

<p>

remove <span class="monospaced">%</span>-encoding for filepaths

</p>

</li>

<li>

<p>

remove top-level <span class="monospaced">extensions</span> key (still possible, just use <span class="monospaced">_</span> keys)

</p>

</li>

<li>

<p>

require vendor prefixes for extensions

</p>

</li>

<li>

<p>

add an optional <span class="monospaced">source-path</span> key to <span class="monospaced">depinfo</span> objects

</p>

</li>

</ul></div>

<div class="paragraph"><p>The following changes have been made in response to feedback in SG16:</p></div>

<div class="ulist"><ul>

<li>

<p>

change the name of the "data" key to "code-units"

</p>

</li>

<li>

<p>

mention normalization for JSON encoders and decoders

</p>

</li>

</ul></div>

</div>

<div class="sect2">

<h3 id="_r0_initial">2.2. 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>

        "code-units"

      <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 code-units' integers</span>"

        <span style="color: #990000">},</span>

        "code-units": <span style="color: #990000">{</span>

          "$id": "<span style="color: #FF0000">#code-units</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-name": <span style="color: #990000">{</span>

          "$id": "<span style="color: #FF0000">#readable-name</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>

      <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-name"

      <span style="color: #990000">],</span>

      "properties": <span style="color: #990000">{</span>

        "source-path": <span style="color: #990000">{</span>

          "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"

        <span style="color: #990000">},</span>

        "compiled-module-path": <span style="color: #990000">{</span>

          "$ref": "<span style="color: #FF0000">#/definitions/datablock</span>"

        <span style="color: #990000">},</span>

        "logical-name": <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>Note that some JSON encoders and decoders will normalize Unicode sequences. Due

to the presence of platforms where non-normalized sequences are valid paths,

any such normalization logic should be disabled when interacting with this

format.</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">code-units</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-name</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-name</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">code-units</span> array are 8-bit

  unsigned integers. All values of the <span class="monospaced">code-units</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>

  "code-units": <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-name": "<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">code-units</span> array are 16-bit

  unsigned integers. All values of the <span class="monospaced">code-units</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>

  "code-units": <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-name": "<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="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>

<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> key 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-name</span>, and two optional keys:

<span class="monospaced">compiled-module-path</span> and <span class="monospaced">source-path</span>. All of these key&#8217;s values are

filepaths. The <span class="monospaced">logical-name</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) as included in the

source. The <span class="monospaced">compiled-module-path</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. The <span class="monospaced">source-path</span> is the path to the main source of

the module. This is intended to be used to communicate the on-disk header for a

header-unit import when it is known.</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>

        "compiled-module-path": "<span style="color: #FF0000">exported.bmi</span>"<span style="color: #990000">,</span>

        "logical-name": "<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-name": "<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>) followed by a vendor-specific string followed by another underscore. None

of these may be used to store semantically relevant information required to

execute a correct build. Essentially, consumers of the format may ignore all

<span class="monospaced">_</span>-prefixed keys 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>

  "_VENDOR_extension": <span style="font-weight: bold"><span style="color: #0000FF">true</span></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="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 P1689R1<br>

Last updated

 2019-08-05 11:06:48 EDT

</div>

</div>

</body>

</html>

