<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.20">
<meta name="author" content="René Ferdinand Rivera Morell">
<meta name="copyright" content="Copyright 2023 René Ferdinand Rivera Morell">
<title>Structured Response Files</title>
<style>
@import url(https://fonts.googleapis.com/css?family=Varela+Round|Open+Sans:400italic,600italic,400,600|Ubuntu+Mono:400);
/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
/* ========================================================================== HTML5 display definitions ========================================================================== */
/** Correct `block` display not defined in IE 8/9. */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }

/** Correct `inline-block` display not defined in IE 8/9. */
audio, canvas, video { display: inline-block; }

/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
audio:not([controls]) { display: none; height: 0; }

/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
[hidden], template { display: none; }

script { display: none !important; }

/* ========================================================================== Base ========================================================================== */
/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }

/** Remove default margin. */
body { margin: 0; }

/* ========================================================================== Links ========================================================================== */
/** Remove the gray background color from active links in IE 10. */
a { background: transparent; }

/** Address `outline` inconsistency between Chrome and other browsers. */
a:focus { outline: thin dotted; }

/** Improve readability when focused and also mouse hovered in all browsers. */
a:active, a:hover { outline: 0; }

/* ========================================================================== Typography ========================================================================== */
/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
h1 { font-size: 2em; margin: 0.67em 0; }

/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
abbr[title] { border-bottom: 1px dotted; }

/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
b, strong { font-weight: bold; }

/** Address styling not present in Safari 5 and Chrome. */
dfn { font-style: italic; }

/** Address differences between Firefox and other browsers. */
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }

/** Address styling not present in IE 8/9. */
mark { background: #ff0; color: #000; }

/** Correct font family set oddly in Safari 5 and Chrome. */
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }

/** Improve readability of pre-formatted text in all browsers. */
pre { white-space: pre-wrap; }

/** Set consistent quote types. */
q { quotes: "\201C" "\201D" "\2018" "\2019"; }

/** Address inconsistent and variable font size in all browsers. */
small { font-size: 80%; }

/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }

sup { top: -0.5em; }

sub { bottom: -0.25em; }

/* ========================================================================== Embedded content ========================================================================== */
/** Remove border when inside `a` element in IE 8/9. */
img { border: 0; }

/** Correct overflow displayed oddly in IE 9. */
svg:not(:root) { overflow: hidden; }

/* ========================================================================== Figures ========================================================================== */
/** Address margin not present in IE 8/9 and Safari 5. */
figure { margin: 0; }

/* ========================================================================== Forms ========================================================================== */
/** Define consistent border, margin, and padding. */
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }

/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
legend { border: 0; /* 1 */ padding: 0; /* 2 */ }

/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }

/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
button, input { line-height: normal; }

/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
button, select { text-transform: none; }

/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }

/** Re-set default cursor for disabled elements. */
button[disabled], html input[disabled] { cursor: default; }

/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }

/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }

/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }

/** Remove inner padding and border in Firefox 4+. */
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }

/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }

/* ========================================================================== Tables ========================================================================== */
/** Remove most spacing between table cells. */
table { border-collapse: collapse; border-spacing: 0; }

meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; }

meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; }

meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; }

*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }

html, body { font-size: 100%; }

body { background: #fefdfd; color: rgba(0, 0, 0, 0.8); padding: 0; margin: 0; font-family: "Open Sans", sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }

a:hover { cursor: pointer; }

img, object, embed { max-width: 100%; height: auto; }

object, embed { height: 100%; }

img { -ms-interpolation-mode: bicubic; }

#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }

.left { float: left !important; }

.right { float: right !important; }

.text-left { text-align: left !important; }

.text-right { text-align: right !important; }

.text-center { text-align: center !important; }

.text-justify { text-align: justify !important; }

.hide { display: none; }

.antialiased { -webkit-font-smoothing: antialiased; }

img { display: inline-block; vertical-align: middle; }

textarea { height: auto; min-height: 50px; }

select { width: 100%; }

p.lead { font-size: 1.21875em; line-height: 1.6; }

.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.25; color: #002c5e; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }

/* Typography resets */
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }

/* Default Link Styles */
a { color: #005580; text-decoration: underline; line-height: inherit; }
a:hover, a:focus { color: #078d71; }
a img { border: none; }

/* Default paragraph styles */
p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }

/* Default header styles */
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Varela Round", sans-serif; font-weight: 400; font-style: normal; color: #00326b; text-rendering: optimizeLegibility; margin-top: 0.8em; margin-bottom: 0.5em; line-height: 1.0625em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #057aff; line-height: 0; }

h1 { font-size: 2.125em; }

h2 { font-size: 1.6875em; }

h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }

h4 { font-size: 1.125em; }

h5 { font-size: 1.125em; }

h6 { font-size: 1em; }

hr { border: solid rgba(145, 135, 84, 0.15); border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }

/* Helpful Typography Defaults */
em, i { font-style: italic; line-height: inherit; }

strong, b { font-weight: bold; line-height: inherit; }

small { font-size: 60%; line-height: inherit; }

code { font-family: "Ubuntu Mono", "Inconsolata", monospace; font-weight: 400; color: #331d00; }

/* Lists */
ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; }

ul, ol { margin-left: 1.5em; }
ul.no-bullet, ol.no-bullet { margin-left: 1.5em; }

/* Unordered Lists */
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }

/* Ordered Lists */
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }

/* Definition Lists */
dl dt { margin-bottom: 0.3125em; font-weight: bold; }
dl dd { margin-bottom: 1.25em; }

/* Abbreviations */
abbr, acronym { text-transform: uppercase; font-size: 90%; color: rgba(0, 0, 0, 0.8); border-bottom: 1px dotted #ddd; cursor: help; }

abbr { text-transform: none; }

/* Blockquotes */
blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #ddd; }
blockquote cite { display: block; font-size: 0.8125em; color: #666; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #666; }

blockquote, blockquote p { line-height: 1.5; color: #999; }

/* Microformats */
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #ddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }

.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }

@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }
  h1 { font-size: 2.75em; }
  h2 { font-size: 2.3125em; }
  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
  h4 { font-size: 1.4375em; } }
/* Tables */
table { background: #fff; margin-bottom: 1.25em; border: solid 1px rgba(145, 135, 84, 0.15); }
table thead, table tfoot { background: rgba(119, 84, 22, 0.1); font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: rgba(119, 84, 22, 0.025); }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.5; }

body { tab-size: 4; word-wrap: anywhere; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; }

table { word-wrap: normal; }

h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.25; }

object, svg { display: inline-block; vertical-align: middle; }

.center { margin-left: auto; margin-right: auto; }

.stretch { width: 100%; }

.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }

:not(pre).nobreak { word-wrap: normal; }
:not(pre).nowrap { white-space: nowrap; }
:not(pre).pre-wrap { white-space: pre-wrap; }

:not(pre):not([class^=L]) > code { font-size: 1.0625em; font-style: normal !important; letter-spacing: 0; padding: 0; line-height: 1.25; }

pre { color: inherit; font-family: "Liberation Mono", "Consolas", monospace; line-height: 1.4; }
pre code, pre pre { color: inherit; font-size: inherit; line-height: inherit; }
pre > code { display: block; }

pre.nowrap, pre.nowrap pre { white-space: pre; word-wrap: normal; }

em em { font-style: normal; }

strong strong { font-weight: normal; }

.keyseq { color: rgba(51, 51, 51, 0.8); }

kbd { font-family: "Ubuntu Mono", "Inconsolata", monospace; display: inline-block; color: rgba(0, 0, 0, 0.8); font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; }

.keyseq kbd:first-child { margin-left: 0; }

.keyseq kbd:last-child { margin-right: 0; }

.menuseq, .menuref { color: #000; }

.menuseq b:not(.caret), .menuref { font-weight: inherit; }

.menuseq { word-spacing: -0.02em; }
.menuseq b.caret { font-size: 1.25em; line-height: 0.8; }
.menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; }

b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; }

b.button:before { content: "["; padding: 0 3px 0 2px; }

b.button:after { content: "]"; padding: 0 2px 0 3px; }

p a > code:hover { color: #1a0f00; }

#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }

#content { margin-top: 1.25em; }

#content:before { content: none; }

#header > h1:first-child { color: #703f1c; margin-top: 2.25rem; margin-bottom: 0; }
#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid rgba(145, 135, 84, 0.15); }
#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; }
#header .details { border-bottom: 1px solid rgba(145, 135, 84, 0.15); line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #666; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; }
#header .details span:first-child { margin-left: -0.125em; }
#header .details span.email a { color: #999; }
#header .details br { display: none; }
#header .details br + span:before { content: "\00a0\2013\00a0"; }
#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #999; }
#header .details br + span#revremark:before { content: "\00a0|\00a0"; }
#header #revnumber { text-transform: capitalize; }
#header #revnumber:after { content: "\00a0"; }

#content > h1:first-child:not([class]) { color: #703f1c; border-bottom: 1px solid rgba(145, 135, 84, 0.15); padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; }

#toc { border-bottom: 0px solid #ddd; padding-bottom: 0.5em; }
#toc > ul { margin-left: 0.125em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; }
#toc ul { font-family: "Varela Round", sans-serif; list-style-type: none; }
#toc li { line-height: 1.3334; margin-top: 0.3334em; }
#toc a { text-decoration: none; }
#toc a:active { text-decoration: underline; }

#toctitle { color: #002c5e; font-size: 1.2em; }

@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; }
  body.toc2 { padding-left: 15em; padding-right: 0; }
  #toc.toc2 { margin-top: 0 !important; background: #f2f2f4; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #ddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; }
  #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; }
  #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; }
  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
  body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #ddd; left: auto; right: 0; } }
@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; }
  #toc.toc2 { width: 20em; }
  #toc.toc2 #toctitle { font-size: 1.375em; }
  #toc.toc2 > ul { font-size: 0.95em; }
  #toc.toc2 ul ul { padding-left: 1.25em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #d6d6dd; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f4; -webkit-border-radius: 6px; border-radius: 6px; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }

#footer { max-width: none; background: #0b445a; padding: 1.25em; }

#footer-text { color: #fefdfd; line-height: 1.35; }

#content { margin-bottom: 0.625em; }

.sect1 { padding-bottom: 0.625em; }

@media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; }
  .sect1 { padding-bottom: 1.25em; } }
.sect1:last-child { padding-bottom: 0; }

.sect1 + .sect1 { border-top: 0px solid #ddd; }

#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #00326b; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #002652; }

details, .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; }

details > summary:first-of-type { cursor: pointer; display: list-item; outline: none; margin-bottom: 0.75em; }

.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; }

table.tableblock.fit-content > caption.title { white-space: nowrap; width: 0; }

.paragraph.lead > p, #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: 1.21875em; line-height: 1.6; color: #703f1c; }

table.tableblock #preamble > .sectionbody > [class="paragraph"]:first-of-type p { font-size: inherit; }

.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: none; }
.admonitionblock > table td.icon .title { font-weight: bold; font-family: "Varela Round", sans-serif; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid rgba(145, 135, 84, 0.15); color: #666; word-wrap: anywhere; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }

.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #eddbdb; margin-bottom: 1.25em; padding: 1.25em; background: #fefdfd; -webkit-border-radius: 6px; border-radius: 6px; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }

.sidebarblock { border-style: solid; border-width: 1px; border-color: #d1d1d8; margin-bottom: 1.25em; padding: 1.25em; background: #ececef; -webkit-border-radius: 6px; border-radius: 6px; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock > .content > .title { color: #002c5e; margin-top: 0; }

.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }

.literalblock pre, .listingblock > .content > pre { border: 1px solid rgba(16, 195, 196, 0.125); -webkit-border-radius: 6px; border-radius: 6px; overflow-x: auto; padding: 1em; font-size: 0.8125em; }
@media only screen and (min-width: 768px) { .literalblock pre, .listingblock > .content > pre { font-size: 0.90625em; } }
@media only screen and (min-width: 1280px) { .literalblock pre, .listingblock > .content > pre { font-size: 1em; } }

.literalblock pre, .listingblock > .content > pre:not(.highlight), .listingblock > .content > pre[class="highlight"], .listingblock > .content > pre[class^="highlight "] { background: rgba(16, 195, 196, 0.05); }

.literalblock.output pre { color: rgba(16, 195, 196, 0.05); background-color: inherit; }

.listingblock > .content { position: relative; }

.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: inherit; opacity: 0.5; }

.listingblock:hover code[data-lang]:before { display: block; }

.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: inherit; opacity: 0.5; }

.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; }

.listingblock pre.highlightjs { padding: 0; }
.listingblock pre.highlightjs > code { padding: 1em; -webkit-border-radius: 6px; border-radius: 6px; }

.prettyprint { background: rgba(16, 195, 196, 0.05); }

pre.prettyprint .linenums { line-height: 1.4; margin-left: 2em; }

pre.prettyprint li { background: none; list-style-type: inherit; padding-left: 0; }

pre.prettyprint li code[data-lang]:before { opacity: 1; }

pre.prettyprint li:not(:first-child) code[data-lang]:before { display: none; }

table.linenotable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; }
table.linenotable td[class] { color: inherit; vertical-align: top; padding: 0; line-height: inherit; white-space: normal; }
table.linenotable td.code { padding-left: 0.75em; }
table.linenotable td.linenos { border-right: 1px solid currentColor; opacity: 0.35; padding-right: 0.5em; }

pre.pygments .lineno { border-right: 1px solid currentColor; opacity: 0.35; display: inline-block; margin-right: 0.75em; }
pre.pygments .lineno:before { content: ""; margin-right: -0.125em; }

.quoteblock { margin: 0 1em 1.25em 1.5em; display: table; }
.quoteblock:not(.excerpt) > .title { margin-left: -1.5em; margin-bottom: 0.75em; }
.quoteblock blockquote, .quoteblock p { color: #999; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; }
.quoteblock blockquote { margin: 0; padding: 0; border: 0; }
.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: #002c5e; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: 0.75em; margin-right: 0.5ex; text-align: right; }

.verseblock { margin: 0 1em 1.25em 1em; }
.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #999; font-weight: 300; text-rendering: optimizeLegibility; }
.verseblock pre strong { font-weight: 400; }
.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; }

.quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; }
.quoteblock .attribution br, .verseblock .attribution br { display: none; }
.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #666; }

.quoteblock.abstract blockquote:before, .quoteblock.excerpt blockquote:before, .quoteblock .quoteblock blockquote:before { display: none; }
.quoteblock.abstract blockquote, .quoteblock.abstract p, .quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { line-height: 1.6; word-spacing: 0; }
.quoteblock.abstract { margin: 0 1em 1.25em 1em; display: block; }
.quoteblock.abstract > .title { margin: 0 0 0.375em 0; font-size: 1.15em; text-align: center; }
.quoteblock.excerpt > blockquote, .quoteblock .quoteblock { padding: 0 0 0.25em 1em; border-left: 0.25em solid rgba(145, 135, 84, 0.15); }
.quoteblock.excerpt, .quoteblock .quoteblock { margin-left: 0; }
.quoteblock.excerpt blockquote, .quoteblock.excerpt p, .quoteblock .quoteblock blockquote, .quoteblock .quoteblock p { color: inherit; font-size: 1.0625rem; }
.quoteblock.excerpt .attribution, .quoteblock .quoteblock .attribution { color: inherit; text-align: left; margin-right: 0; }

p.tableblock:last-child { margin-bottom: 0; }

td.tableblock > .content { margin-bottom: 1.25em; word-wrap: anywhere; }
td.tableblock > .content > :last-child { margin-bottom: -1.25em; }

table.tableblock, th.tableblock, td.tableblock { border: 0 solid rgba(145, 135, 84, 0.15); }

table.grid-all > * > tr > * { border-width: 1px; }

table.grid-cols > * > tr > * { border-width: 0 1px; }

table.grid-rows > * > tr > * { border-width: 1px 0; }

table.frame-all { border-width: 1px; }

table.frame-ends { border-width: 1px 0; }

table.frame-sides { border-width: 0 1px; }

table.frame-none > colgroup + * > :first-child > *, table.frame-sides > colgroup + * > :first-child > * { border-top-width: 0; }

table.frame-none > :last-child > :last-child > *, table.frame-sides > :last-child > :last-child > * { border-bottom-width: 0; }

table.frame-none > * > tr > :first-child, table.frame-ends > * > tr > :first-child { border-left-width: 0; }

table.frame-none > * > tr > :last-child, table.frame-ends > * > tr > :last-child { border-right-width: 0; }

table.stripes-all tr, table.stripes-odd tr:nth-of-type(odd), table.stripes-even tr:nth-of-type(even), table.stripes-hover tr:hover { background: rgba(119, 84, 22, 0.025); }

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

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

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

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

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

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

table thead th, table tfoot th { font-weight: bold; }

tbody tr th { display: table-cell; line-height: 1.5; background: rgba(119, 84, 22, 0.1); }

tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: rgba(0, 0, 0, 0.8); font-weight: bold; }

p.tableblock > code:only-child { background: none; padding: 0; }

p.tableblock { font-size: 1em; }

ol { margin-left: 1.75em; }

ul li ol { margin-left: 1.5em; }

dl dd { margin-left: 1.125em; }

dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }

ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; }

ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; }

ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; }

ul.unstyled, ol.unstyled { margin-left: 0; }

ul.checklist { margin-left: 0.625em; }

ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; }

ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }

ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.625em -1.25em; }

ul.inline > li { margin-left: 1.25em; }

.unstyled dl dt { font-weight: normal; font-style: normal; }

ol.arabic { list-style-type: decimal; }

ol.decimal { list-style-type: decimal-leading-zero; }

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; }

ol.lowergreek { list-style-type: lower-greek; }

.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }

td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; }

td.hdlist1 { font-weight: bold; padding-bottom: 1.25em; }

td.hdlist2 { word-wrap: anywhere; }

.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }

.colist td:not([class]):first-child { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; }
.colist td:not([class]):first-child img { max-width: none; }
.colist td:not([class]):last-child { padding: 0.25em 0; }

.thumb, .th { line-height: 0; display: inline-block; border: solid 4px #fff; -webkit-box-shadow: 0 0 0 1px #ddd; box-shadow: 0 0 0 1px #ddd; }

.imageblock.left { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }

.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }

a.image { text-decoration: none; display: inline-block; }
a.image object { pointer-events: none; }

sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; }
sup.footnote a, sup.footnoteref a { text-decoration: none; }
sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; }

#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }
#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }

.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }

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

.big { font-size: larger; }

.small { font-size: smaller; }

.underline { text-decoration: underline; }

.overline { text-decoration: overline; }

.line-through { text-decoration: line-through; }

.aqua { color: #00bfbf; }

.aqua-background { background-color: #00fafa; }

.black { color: black; }

.black-background { background-color: black; }

.blue { color: #0000bf; }

.blue-background { background-color: #0000fa; }

.fuchsia { color: #bf00bf; }

.fuchsia-background { background-color: #fa00fa; }

.gray { color: #606060; }

.gray-background { background-color: #7d7d7d; }

.green { color: #006000; }

.green-background { background-color: #007d00; }

.lime { color: #00bf00; }

.lime-background { background-color: #00fa00; }

.maroon { color: #600000; }

.maroon-background { background-color: #7d0000; }

.navy { color: #000060; }

.navy-background { background-color: #00007d; }

.olive { color: #606000; }

.olive-background { background-color: #7d7d00; }

.purple { color: #600060; }

.purple-background { background-color: #7d007d; }

.red { color: #bf0000; }

.red-background { background-color: #fa0000; }

.silver { color: #909090; }

.silver-background { background-color: #bcbcbc; }

.teal { color: #006060; }

.teal-background { background-color: #007d7d; }

.white { color: #bfbfbf; }

.white-background { background-color: #fafafa; }

.yellow { color: #bfbf00; }

.yellow-background { background-color: #fafa00; }

span.icon > .fa { cursor: default; }
a span.icon > .fa { cursor: inherit; }

.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #004060; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }

.conum[data-value] { display: inline-block; color: #fff !important; background-color: rgba(0, 0, 0, 0.8); -webkit-border-radius: 50%; border-radius: 50%; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; }
.conum[data-value] * { color: #fff !important; }
.conum[data-value] + b { display: none; }
.conum[data-value]:after { content: attr(data-value); }
pre .conum[data-value] { position: relative; top: -0.125em; }

b.conum * { color: inherit !important; }

.conum:not([data-value]):empty { display: none; }

#toc.toc2 ul ul { list-style-type: circle; padding-left: 2em; }

.sect1 { padding-bottom: 0 !important; margin-bottom: 2.5em; }

#header h1 { font-weight: bold; position: relative; left: -0.0625em; }

#content h2, #content h3, #content #toctitle, #content .sidebarblock > .content > .title, #content h4, #content h5, #content #toctitle { position: relative; left: -0.0625em; }
#content h2 { font-weight: bold; }

.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; }

pre.pygments.highlight { background-color: rgba(16, 195, 196, 0.05); }

.pygments .tok-err { border: none !important; color: #800000 !important; }

.pygments .tok-c { color: #999 !important; }

</style>
<style>
pre.rouge table td { padding: 5px; }
pre.rouge table pre { margin: 0; }
pre.rouge, pre.rouge .w {
  color: #586e75;
}
pre.rouge .err {
  color: #002b36;
  background-color: #dc322f;
}
pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cm, pre.rouge .cpf, pre.rouge .c1, pre.rouge .cs {
  color: #657b83;
}
pre.rouge .cp {
  color: #b58900;
}
pre.rouge .nt {
  color: #b58900;
}
pre.rouge .o, pre.rouge .ow {
  color: #93a1a1;
}
pre.rouge .p, pre.rouge .pi {
  color: #93a1a1;
}
pre.rouge .gi {
  color: #859900;
}
pre.rouge .gd {
  color: #dc322f;
}
pre.rouge .gh {
  color: #268bd2;
  background-color: #002b36;
  font-weight: bold;
}
pre.rouge .k, pre.rouge .kn, pre.rouge .kp, pre.rouge .kr, pre.rouge .kv {
  color: #6c71c4;
}
pre.rouge .kc {
  color: #cb4b16;
}
pre.rouge .kt {
  color: #cb4b16;
}
pre.rouge .kd {
  color: #cb4b16;
}
pre.rouge .s, pre.rouge .sb, pre.rouge .sc, pre.rouge .dl, pre.rouge .sd, pre.rouge .s2, pre.rouge .sh, pre.rouge .sx, pre.rouge .s1 {
  color: #859900;
}
pre.rouge .sa {
  color: #6c71c4;
}
pre.rouge .sr {
  color: #2aa198;
}
pre.rouge .si {
  color: #d33682;
}
pre.rouge .se {
  color: #d33682;
}
pre.rouge .nn {
  color: #b58900;
}
pre.rouge .nc {
  color: #b58900;
}
pre.rouge .no {
  color: #b58900;
}
pre.rouge .na {
  color: #268bd2;
}
pre.rouge .m, pre.rouge .mb, pre.rouge .mf, pre.rouge .mh, pre.rouge .mi, pre.rouge .il, pre.rouge .mo, pre.rouge .mx {
  color: #859900;
}
pre.rouge .ss {
  color: #859900;
}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Structured Response Files</h1>
<div class="details">
<span id="author" class="author">René Ferdinand Rivera Morell</span><br>
<span id="email" class="email"><a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></span><br>
<span id="revnumber"> P3051R0,</span>
<span id="revdate">2023-12-11</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_abstract">1. Abstract</a></li>
<li><a href="#_revision_history">2. Revision History</a>
<ul class="sectlevel2">
<li><a href="#_revision_0_december_2023">2.1. Revision 0 (December 2023)</a></li>
</ul>
</li>
<li><a href="#_motivation">3. Motivation</a></li>
<li><a href="#_scope">4. Scope</a></li>
<li><a href="#_current_response_files">5. Current Response Files</a>
<ul class="sectlevel2">
<li><a href="#_clang">5.1. Clang</a></li>
<li><a href="#_intel_oneapi_dpcc">5.2. Intel&#174; oneAPI DPC&#43;&#43;/C&#43;&#43;</a></li>
<li><a href="#_nvidia_cuda_compiler_driver_nvcc">5.3. NVIDIA CUDA Compiler Driver NVCC</a></li>
<li><a href="#_microsoft_visual_c">5.4. Microsoft Visual C&#43;&#43;</a></li>
<li><a href="#_other">5.5. Other</a></li>
</ul>
</li>
<li><a href="#_design">6. Design</a>
<ul class="sectlevel2">
<li><a href="#_command_line">6.1. Command Line</a></li>
<li><a href="#_file_format">6.2. File Format</a></li>
<li><a href="#_flags_or_names">6.3. Flags or Names</a></li>
</ul>
</li>
<li><a href="#_questions">7. Questions</a></li>
<li><a href="#_implementation_experience">8. Implementation Experience</a></li>
<li><a href="#_polls">9. Polls</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<style>
/* Insertions: Marked by green underlined text. */

.sectionbody>div>.ins {
	text-decoration: underline solid green;
	text-underline-offset: 0.3em;
}

span.ins {
	text-decoration: underline solid green;
	text-underline-offset: 0.3em;
}

/* Deletions: Marked by red strikeout text. */

.sectionbody>div>.del {
	text-decoration: line-through solid red;
}

span.del {
	text-decoration: line-through solid red;
}

/* Rev-to-rev Change: Marked by blue sidebar, or squiggle text. */

.sectionbody div.chg {
	border-left: solid 0.2em blue;
	padding-left: 0.3em;
	margin-left: -0.5em;
}

span.chg {
	text-decoration: underline wavy blue;
}

/* Information Preamble: Table like indented. */

#preamble div.hdlist {
	margin-left: 40%;
}

#preamble div.hdlist td.hdlist1 {
	width: 8em;
	padding: 0;
}

#preamble div.hdlist td.hdlist2 p {
	margin-bottom: 0.25em;
}

/* Admonition Icons: Use simple, large, colored, glyphs for icons. Requires
specifying the caption symbol properties:

:caution-caption: ⚑
:important-caption: ‼
:note-caption: ℹ
:tip-caption: ☀
:warning-caption: ⚠
*/

.admonitionblock .icon .title {
	font-size: 2.5em;
	text-shadow: 1px 1px 2px rgba(0, 0, 0, .5);
}

.caution .icon .title {
	color: rgba(192, 51, 0, 1);
}

.important .icon .title {
	color: rgba(192, 0, 0, 1);
}

.note .icon .title {
	color: rgba(26, 64, 128, 1);
}

.tip .icon .title {
	color: rgba(255, 192, 0, 1);
}

.warning .icon .title {
	color: rgba(192, 102, 0, 1);
}

/* ??? */

.def>.content :first-child {
	margin-left: 0;
}

.def>.content>* {
	margin-left: 3em;
}
</style>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Document #: 
</td>
<td class="hdlist2">
<p>ISO/IEC/JTC1/SC22/WG21/P3051R0</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Date: 
</td>
<td class="hdlist2">
<p>2023-12-11</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Audience: 
</td>
<td class="hdlist2">
<p>SG15</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Authors: 
</td>
<td class="hdlist2">
<p>René Ferdinand Rivera Morell</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Reply-to: 
</td>
<td class="hdlist2">
<p><a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Copyright: 
</td>
<td class="hdlist2">
<p>Copyright 2023 René Ferdinand Rivera Morell, Creative Commons Attribution 4.0 International License (CC BY 4.0)</p>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_abstract"><a class="anchor" href="#_abstract"></a>1. Abstract</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This aims to define a standard structured response file format that can become
the best way to communicate compiling C&#43;&#43;.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_revision_history"><a class="anchor" href="#_revision_history"></a>2. Revision History</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_revision_0_december_2023"><a class="anchor" href="#_revision_0_december_2023"></a>2.1. Revision 0 (December 2023)</h3>
<div class="paragraph">
<p>Initial text.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_motivation"><a class="anchor" href="#_motivation"></a>3. Motivation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A key aspect of inter-operation between tools in the ecosystem is having a
common language to express tool commands, i.e. in compiler drivers, that can
be understood and/or translated between different tools and platforms.</p>
</div>
<div class="paragraph">
<p>Currently tools use differing, but related, ways for users (and other tools) to
specify the set of options to "toolsets" (compiler drivers, linkers, etc).
While there are some commonalities in how those options are specified as
"configuration response files" containing bare options, there are sufficient
differences to hinder general inter-operation.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_scope"><a class="anchor" href="#_scope"></a>4. Scope</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This proposal aims to specify a method for tools to specify arguments to other
tools in a consistent and flexible manner. As such what it does and doesn&#8217;t
aim to accomplish:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>It <em>does not</em> aim to remove current arguments handling. It <em>does</em> allow for
incrementally adoption of an alternative that facilitates common tool
arguments.</p>
</li>
<li>
<p>It <em>does not</em> specify any particular options to replace existing options
(except the ones to indicate the new response file). It <em>does</em> aim to
specify an additional alternative option style that reduces the parsing
complexity, and perhaps ambiguities, in tools.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_current_response_files"><a class="anchor" href="#_current_response_files"></a>5. Current Response Files</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Current response files commonly contain "unstructured" sequence of command line
arguments. Some also allow recursive inclusion and expansion of additional
response files. Below are a summary of the syntax, capabilities, and
restrictions of some of the compiler drivers.</p>
</div>
<div class="sect2">
<h3 id="_clang"><a class="anchor" href="#_clang"></a>5.1. Clang</h3>
<div class="ulist">
<ul>
<li>
<p>Use of <code>@<em>filename</em></code> argument.</p>
</li>
<li>
<p>Use of <code>--config=<em>filename</em></code> argument.</p>
</li>
<li>
<p>References to other response files allowed.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Example response file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp"># Several options on line
-c --target=x86_64-unknown-linux-gnu

# Long option split between lines
-I/usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/C++/5.4.0

# other config files may be included
@linux.options</code></pre>
</div>
</div>
<div class="paragraph">
<p>Source: Clang Compiler User’s Manual
<sup class="footnote" id="_footnote_Clang">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup></p>
</div>
<div class="sect3">
<h4 id="_gnu_compiler_collection_gcc"><a class="anchor" href="#_gnu_compiler_collection_gcc"></a>5.1.1. GNU Compiler Collection, GCC</h4>
<div class="ulist">
<ul>
<li>
<p>Use of <code>@<em>filename</em></code> argument.</p>
</li>
<li>
<p>References to other response files allowed.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Example response file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp">-o "hello" -Wl,--start-group "bin/hello.o" -Wl,-Bstatic -Wl,-Bdynamic -Wl,--end-group -fPIC -g</code></pre>
</div>
</div>
<div class="paragraph">
<p>Source: GCC Documentation
<sup class="footnote" id="_footnote_GCC">[<a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup></p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_intel_oneapi_dpcc"><a class="anchor" href="#_intel_oneapi_dpcc"></a>5.2. Intel&#174; oneAPI DPC&#43;&#43;/C&#43;&#43;</h3>
<div class="ulist">
<ul>
<li>
<p>Use of <code>@<em>filename</em></code> argument.</p>
</li>
<li>
<p>References to other response files disallowed.</p>
</li>
<li>
<p>Platform specific option syntax.</p>
</li>
<li>
<p><code>#</code> prefixed line comments.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Example response file for "Linux":</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp"># compile with these options
  -O0
# end of response file</code></pre>
</div>
</div>
<div class="paragraph">
<p>Example response file for "Windows":</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp"># compile with these options
  /0d
# end of response file</code></pre>
</div>
</div>
<div class="paragraph">
<p>Source: Intel&#174; oneAPI DPC&#43;&#43;/C&#43;&#43; Compiler Developer Guide and Reference
<sup class="footnote" id="_footnote_ICC">[<a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote.">3</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_nvidia_cuda_compiler_driver_nvcc"><a class="anchor" href="#_nvidia_cuda_compiler_driver_nvcc"></a>5.3. NVIDIA CUDA Compiler Driver NVCC</h3>
<div class="ulist">
<ul>
<li>
<p>Use of <code>--options-file <em>filename</em>,&#8230;&#8203;</code>, or <code>-optf <em>filename</em>,&#8230;&#8203;</code>.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp">-O0</code></pre>
</div>
</div>
<div class="paragraph">
<p>Source: NVIDIA CUDA Compiler Driver NVCC Documentation
<sup class="footnote" id="_footnote_NVCC">[<a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_microsoft_visual_c"><a class="anchor" href="#_microsoft_visual_c"></a>5.4. Microsoft Visual C&#43;&#43;</h3>
<div class="ulist">
<ul>
<li>
<p>Use of <code>@<em>filename</em></code> argument.</p>
</li>
<li>
<p>References to other response files disallowed.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Example response file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="rsp">"hello.cpp" -c -Fo"bin\hello.obj" -TP /wd4675 /EHs /GR /Zc:throwingNew /Z7 /Od /Ob0 /W3 /MDd /Zc:forScope /Zc:wchar_t /Zc:inline /favor:blend</code></pre>
</div>
</div>
<div class="paragraph">
<p>Source: Microsoft C&#43;&#43;, C, and Assembler documentation
<sup class="footnote" id="_footnote_MSVC">[<a id="_footnoteref_5" class="footnote" href="#_footnotedef_5" title="View footnote.">5</a>]</sup></p>
</div>
</div>
<div class="sect2">
<h3 id="_other"><a class="anchor" href="#_other"></a>5.5. Other</h3>
<div class="dlist">
<dl>
<dt class="hdlist1">Edison Design Group C&#43;&#43; Front End (<code>edgcpfe</code>)</dt>
<dd>
<p>Does not support response configuration files.
<sup class="footnote">[<a id="_footnoteref_6" class="footnote" href="#_footnotedef_6" title="View footnote.">6</a>]</sup></p>
</dd>
<dt class="hdlist1">Embarcadero C&#43;&#43; Builder</dt>
<dd>
<p>Supports at least <code>@<em>filename</em></code> option, with bare arguments syntax.
<sup class="footnote">[<a id="_footnoteref_7" class="footnote" href="#_footnotedef_7" title="View footnote.">7</a>]</sup></p>
</dd>
<dt class="hdlist1">IBM Open XL C/C&#43;&#43; for AIX 17.1.0</dt>
<dd>
<p>Supports the Clang <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> <code>--config</code> option.</p>
</dd>
<dt class="hdlist1">IBM Open XL C/C&#43;&#43; for Linux on Power 17.1.1</dt>
<dd>
<p>Has migrated to using the Clang <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> toolchain and supports the
same options.</p>
</dd>
<dt class="hdlist1">IBM Open XL C/C&#43;&#43; and XL C/C&#43;&#43; for z/OS</dt>
<dd>
<p>Supports the Clang <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> <code>--config</code> option.</p>
</dd>
<dt class="hdlist1">HPE Cray Programming Environment (CPE)</dt>
<dd>
<p>Support depends on the platform complier environment.</p>
</dd>
<dt class="hdlist1">NVIDIA HPC C&#43;&#43; (NVC&#43;&#43;)</dt>
<dd>
<p>Does not support response configuration files.
<sup class="footnote">[<a id="_footnoteref_8" class="footnote" href="#_footnotedef_8" title="View footnote.">8</a>]</sup></p>
</dd>
<dt class="hdlist1">Oracle® Developer Studio 12.6</dt>
<dd>
<p>Supports a single global options configuration file, with bare arguments
syntax.</p>
</dd>
<dt class="hdlist1">Python <code>argparse</code> module</dt>
<dd>
<p>Supports arbitrarily character prefixed response files. Where the files, by
default, contain an argument per line.
<sup class="footnote">[<a id="_footnoteref_9" class="footnote" href="#_footnotedef_9" title="View footnote.">9</a>]</sup></p>
</dd>
</dl>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_design"><a class="anchor" href="#_design"></a>6. Design</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Abstractly <em>response files</em> are files in the operating system storage that
contain arguments and options in addition to the ones given directly in the
tool invocation. For this design we are going to refer to two different types
of ways to give pass the information to the tools:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Arguments</dt>
<dd>
<p>Arguments use the syntax that one would specify directly in the command line as
a user. This would be things like the <code>-O1</code> optimization flag argument.</p>
</dd>
<dt class="hdlist1">Options</dt>
<dd>
<p>Options are the conceptual flag option that the tool understands that does not
necessarily follow the same syntax as the flags specify in command line
<em>arguments</em>.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Using those two distinct definitions allows us to specify them differently in
the response file. Using <em>arguments</em> we will follow the same existing command
line syntax. Keeping a form of compatibility with existing. But we would then
be restricted to that syntax. Using <em>options</em> we can use a definition that
fits best with a structured data definition.</p>
</div>
<div class="paragraph">
<p>Last consideration is the choice of structured data format we will have in the
response files. Keeping with previous work and practice we will use JSON text
as that format.
<sup class="footnote" id="_footnote_EcoISIntropection">[<a id="_footnoteref_10" class="footnote" href="#_footnotedef_10" title="View footnote.">10</a>]</sup>
<sup class="footnote" id="_footnote_JSONCompileDb">[<a id="_footnoteref_11" class="footnote" href="#_footnotedef_11" title="View footnote.">11</a>]</sup></p>
</div>
<div class="paragraph">
<p>With that context, here are two example structured response files:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Simple Arguments</th>
<th class="tableblock halign-left valign-top">Structured Options</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"-fPIC"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-O0"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-fno-inline"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-Wall"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-Werror"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-g"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-I</span><span class="se">\"</span><span class="s2">util/include</span><span class="se">\"</span><span class="s2">"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"-c"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"options"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"fPIC"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"O"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0"</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"fno-inline"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"W"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"all"</span><span class="p">,</span><span class="w"> </span><span class="s2">"error"</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"g"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"I"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"util/include"</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"c"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div></div></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The <em>simple arguments</em> example shows specifying an "<em>arguments</em>" key with an
array of values corresponding to the regular command line arguments. This
mirrors what one would see in a JSON compilation database <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_11" title="View footnote.">11</a>]</sup>.
This style has some advantages:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>There is a direct correlation with the JSON compilation database format which
some tools support. Which would mean that they already have code to deal with
at the JSON loading and understanding of it.</p>
</li>
<li>
<p>There&#8217;s a direct mapping for regular command line arguments. Hence it will be
less effort to support this style for tools.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>And there are some disadvantages:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The parsing of the arguments still has to happen to get the at the option and
value.</p>
</li>
<li>
<p>It is subject to the same limitations of regular command line arguments. Like
complexity and ambiguities of command line syntax.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The <em>structured options</em> example shows specifying an "<em>options</em>" key with
an array of option names or option objects. Where the option objects contain an
option name and structured value. Some advantages of this style of structured
data are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The option names do indicate a particular option prefix (i.e. <code>-</code>, <code>--</code>,
<code>/</code>, etc) making it possible to use tools agnostic common names.</p>
</li>
<li>
<p>The ability to use arrays, or possibly objects, for the option values allows
for logical groupings and avoid extra tracking of such as is present in
command line parsing of options.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Some possible disadvantages:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Tools will need an alternative path to understand the new options. Although
hopefully this is balanced by the more direct availability of the values.</p>
</li>
<li>
<p>If this style is also to be supported in the JSON compile database format it
means more work to accomplish that. But again, the hope is that there is an
easier mapping from internal structures to this format.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>One additional aspect of how the <em>arguments</em> and <em>options</em> are specified is that
they allow for a simple transformation between them if that is needed. Although
the <em>options</em> to <em>arguments</em> transformation is an easier one than the converse.</p>
</div>
<div class="paragraph">
<p>The design we are proposing has the following key points:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The format of the file is well formed JSON text.</p>
</li>
<li>
<p>The top level of that is a JSON object with one, of or both, <em>arguments</em>
and <em>options</em> fields.</p>
</li>
<li>
<p>The addition of one command line option to specify the structured response
file.</p>
</li>
<li>
<p>The <em>arguments</em> field has an array value with string values.</p>
</li>
<li>
<p>The <em>arguments</em> values are single strings containing the same options as would
be specified in the command line.</p>
</li>
<li>
<p>The <em>arguments</em> values can contain the option for other structure response
files. Which will be recursively inserted at the location of the option.</p>
</li>
<li>
<p>The <em>options</em> field has an array of values for structured options.</p>
</li>
<li>
<p>The <em>options</em> values can be either a single option name (for flag options) or
an object.</p>
</li>
<li>
<p>The <em>options</em> values that are an object contain a single field with the base
option name (i.e. with an option prefix).</p>
</li>
<li>
<p>The <em>options</em> value that is an object the field value in the object can be
either a single value or an array of values.</p>
</li>
<li>
<p>The arguments and option names are not specified, and as such are
implementation defined.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_command_line"><a class="anchor" href="#_command_line"></a>6.1. Command Line</h3>
<div class="paragraph">
<p>We propose to add a single new command line option as a requirement to
implementing this capability:</p>
</div>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p><code>$ tool --std-rsp=<em>file</em></code></p>
</div>
</div>
</div>
<div class="paragraph">
<p>Or:</p>
</div>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p><code>$ tool -std-rsp:<em>file</em></code></p>
</div>
</div>
</div>
<div class="paragraph">
<p>The <code>std-rsp</code> command line option, which can be repeated, will read the
indicated file and parse the JSON text contents to configure the tool as needed.</p>
</div>
</div>
<div class="sect2">
<h3 id="_file_format"><a class="anchor" href="#_file_format"></a>6.2. File Format</h3>
<div class="paragraph">
<p>The response file is a valid JSON text file with a single JSON object as the
root object. There are two mutually exclusive fields to specify the command
information: <code>arguments</code> or <code>options</code>.</p>
</div>
<div class="paragraph">
<p>There are two additional, optional, fields: <code>$schema</code> and <code>version</code>. The
<code>$schema</code> field points at the released JSON Schema.
<sup class="footnote" id="_footnote_jschema">[<a id="_footnoteref_12" class="footnote" href="#_footnotedef_12" title="View footnote.">12</a>]</sup>
The <code>version</code> field indicated the response format of the file. The version number follows those specified in the capability introspection version
numbering and semantics.</p>
</div>
<div class="paragraph">
<p>The <code>arguments</code> field specifies a <strong>single</strong> array value of strings. Each string
array entry is a command line argument to be used directly by the tool. The
specific syntax of the arguments is up to the specific tool. For example a
compile invocation for GCC, and compatible compiler front-ends, would look like:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_rsp-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"-fPIC"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-O0"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-fno-inline"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-Wall"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-Werror"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-g"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-I</span><span class="se">\"</span><span class="s2">util/include</span><span class="se">\"</span><span class="s2">"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-c"</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>You can also include <code>--std_rsp=<em>file</em></code> options in the list of arguments to
include the arguments that are referenced in another response file, and so on.
For example, given a <code>common.json</code> response file as such:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_rsp-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"-fPIC"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-O0"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-fno-inline"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-Wall"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-Werror"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-g"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-I</span><span class="se">\"</span><span class="s2">util/include</span><span class="se">\"</span><span class="s2">"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-c"</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>One can refer to it in a main response file that compiles a C&#43;&#43; source file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_rsp-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"--std_rsp=common.json"</span><span class="p">,</span><span class="w"> </span><span class="s2">"main.cpp"</span><span class="p">,</span><span class="w"> </span><span class="s2">"-o"</span><span class="p">,</span><span class="w"> </span><span class="s2">"main.o"</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The effect is that the options in <code>common.json</code> ar inserted in the arguments
array at the location of the <code>--std_rsp=common.json</code> argument.</p>
</div>
<div class="paragraph">
<p>The <code>options</code> field specifies a <strong>single</strong> array value of options values. An
option value can be either a single string or a JSON object (option object).
The option object contains fields for each option to be used with each having
a value that is a single string or an array of strings. For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_rsp-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"options"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"fPIC"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"O"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"W"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"all"</span><span class="p">,</span><span class="w"> </span><span class="s2">"error"</span><span class="w"> </span><span class="p">],</span><span class="w">
      </span><span class="nl">"I"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"util/include"</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"fno-inline"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"g"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"c"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>When compared to having the <code>arguments</code> field there are more constraints to the
syntax of the options:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The option names do not contain prefix characters (i.e. the <code>--</code>, <code>-</code>, <code>/</code>,
etc) and without the value separator (i.e. <code>=</code>, <code>:</code>, etc).</p>
</li>
<li>
<p>Flags, i.e. options without a value, must be specified as the single string
in the options array.</p>
</li>
<li>
<p>Options, i.e. when there is a value (i.e. <code>--opt=value</code> command line argument)
must be specified as part of an option object. I.e. as <code>{ "opt": "value" }</code>.</p>
</li>
<li>
<p>Options that can be specified multiple times they can be specified as multiple
separate entries in the <code>options</code> array. Or can specified once, and the
multiple values specified as an array in the value. I.e. as
<code>{ "opt": [ "value0", "value1" ] }</code>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>But like the <code>arguments</code> field, additional response files can be inserted at the
indicated location by specifying a <code>{ "std_rsp": "file.json" }</code> option.</p>
</div>
<div class="paragraph">
<p>Do note though that even though the option names have a specific naming format
they are still defined by the tool. The goal of having the restrictions on the
option names is to make it possible in the future to specify tool agnostic
options to facilitate general interop. But that is a subject for future
proposals.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">‼</div>
</td>
<td class="content">
Tools need to support being able to either refer to an <code>options</code>
style response file from an <code>arguments</code> style response file, and conversely.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_flags_or_names"><a class="anchor" href="#_flags_or_names"></a>6.3. Flags or Names</h3>
<div class="paragraph">
<p>There is a question as to wether it&#8217;s better to use command line flags (for
example <code>W</code>, <code>o</code>, <code>I</code>, etc) or non-command line names (for example
<code>warning</code>, <code>output</code>, <code>include</code>, etc) in the <code>options</code> field. We will call the
former the "Flags" choice, and the latter the "Names" choice. Each would mean:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Flags</dt>
<dd>
<p>The keys would be direct correlation to the specific tool, i.e. compiler,
command line options. For example a <code>I</code> field name would match the <code>-I</code>.</p>
</dd>
<dt class="hdlist1">Names</dt>
<dd>
<p>The keys would be symbolic names correlating to a concept that may map to
one or more current command line options. For example an <code>include</code> field
name would map to one or more <code>-I</code> command line options. But it would also
map to one or more new <code>--include</code> command line options.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Given those definitions we can consider the pros and cons of each method.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 0.99%;">
<col style="width: 49.5049%;">
<col style="width: 49.5051%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"></th>
<th class="tableblock halign-center valign-top">Flags</th>
<th class="tableblock halign-center valign-top">Names</th>
</tr>
</thead>
<tbody>
<tr>
<th class="tableblock halign-center valign-middle"><p class="tableblock">Pros</p></th>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>Small effort for compilers to implement.</p>
</li>
<li>
<p>No additional CLI parsing to implement.</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>Common names and meanings across different tools.</p>
</li>
<li>
<p>Names could be used in other formats, like CPS.</p>
</li>
</ul>
</div></div></td>
</tr>
<tr>
<th class="tableblock halign-center valign-middle"><p class="tableblock">Cons</p></th>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>Continues the increased implementation burden on build systems, etc, to manage
different options per compiler, etc.</p>
</li>
</ul>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="ulist">
<ul>
<li>
<p>Possibly complex implementation to map from names to internal data.</p>
</li>
</ul>
</div></div></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">ℹ</div>
</td>
<td class="content">
One key consideration is that this proposal does not prevent choosing
either flags or names as the <code>options</code> fields. Specifying the fields can be
accomplished in a further proposal that specifies either flags or names as
common specified syntax.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>There are a set of possible design questions for this proposal that come to
mind:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Specify <code>options</code> fields as "Flags" or "Names"?</p>
</li>
<li>
<p>Specify the <code>options</code> in this proposal or a separate proposal?</p>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_questions"><a class="anchor" href="#_questions"></a>7. Questions</h2>
<div class="sectionbody">
<div class="dlist">
<dl>
<dt class="hdlist1">Why use a new option (<code>--std_rsp=<em>file</em></code>) instead of existing response file methods like <code>@<em>file</em></code>?</dt>
<dd>
<p>Implementing support in tools for using the same response file options would:</p>
<div class="ulist">
<ul>
<li>
<p>Mean that the option to add the structured response files would vary from
tool to tool as some use different styles for specifying the file.</p>
</li>
<li>
<p>It would be harder to implement as it would require inspecting the file
content to determine the parsing method needed.</p>
</li>
</ul>
</div>
</dd>
<dt class="hdlist1">Why have an <code>arguments</code> field instead of just using the <code>options</code> field?</dt>
<dd>
<p>Having an <code>arguments</code> field has a couple of benefits:</p>
<div class="ulist">
<ul>
<li>
<p>It makes it easier for tools to immediately support use of this format as they
can directly inject the arguments into their existing command line argument
parsing.</p>
</li>
<li>
<p>Makes it easier for tools that already support <code>compile_commands.json</code> to
produce or consume structured response files as they are the same format for
the <code>arguments</code> field in both.</p>
</li>
</ul>
</div>
</dd>
</dl>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_implementation_experience"><a class="anchor" href="#_implementation_experience"></a>8. Implementation Experience</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Here is a simple implementation, as a Python 3 script, that can accept any
number of arguments will translate any referenced structured response files to
use and return a list of arguments to pass to <code>g++`</code>. Note, it&#8217;s not very
smart, as it makes various generalizations about option syntax for GCC. But it
does show the simplicity of a possible minimal integration:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="python"><span class="c1">#!/usr/bin/env python3
</span>
<span class="kn">import</span> <span class="n">collections.abc</span>
<span class="kn">import</span> <span class="n">glob</span>
<span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">os</span>
<span class="kn">import</span> <span class="n">re</span>
<span class="kn">import</span> <span class="n">sys</span>

<span class="n">out_args</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">def</span> <span class="nf">add_rsp</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
	<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
		<span class="n">rsp</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
		<span class="k">if</span> <span class="sh">'</span><span class="s">arguments</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">rsp</span><span class="p">:</span>
			<span class="nf">add_rsp_args</span><span class="p">(</span><span class="n">rsp</span><span class="p">)</span>
		<span class="k">elif</span> <span class="sh">'</span><span class="s">options</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">rsp</span><span class="p">:</span>
			<span class="nf">add_rsp_opts</span><span class="p">(</span><span class="n">rsp</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">add_rsp_args</span><span class="p">(</span><span class="n">rsp</span><span class="p">):</span>
	<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">rsp</span><span class="p">[</span><span class="sh">'</span><span class="s">arguments</span><span class="sh">'</span><span class="p">]:</span>
		<span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">match</span><span class="p">(</span><span class="sa">r</span><span class="sh">'</span><span class="s">^--std_rsp=(.*)$</span><span class="sh">'</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
		<span class="k">if</span> <span class="n">m</span><span class="p">:</span>
			<span class="nf">add_rsp</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="nf">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
		<span class="k">else</span><span class="p">:</span>
			<span class="n">out_args</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">add_rsp_opts</span><span class="p">(</span><span class="n">rsp</span><span class="p">):</span>
	<span class="k">for</span> <span class="n">opt</span> <span class="ow">in</span> <span class="n">rsp</span><span class="p">[</span><span class="sh">'</span><span class="s">options</span><span class="sh">'</span><span class="p">]:</span>
		<span class="k">if</span> <span class="nf">isinstance</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
			<span class="nf">add_rsp_opt</span><span class="p">(</span><span class="n">opt</span><span class="p">)</span>
		<span class="k">else</span><span class="p">:</span>
			<span class="nf">for </span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="ow">in</span> <span class="n">opt</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
				<span class="nf">add_rsp_opt</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">add_rsp_opt</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
	<span class="k">if</span> <span class="n">value</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nf">isinstance</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="n">collections</span><span class="p">.</span><span class="n">abc</span><span class="p">.</span><span class="n">Sequence</span><span class="p">):</span>
		<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
	<span class="k">if</span> <span class="n">opt</span> <span class="o">==</span> <span class="sh">"</span><span class="s">std_rsp</span><span class="sh">"</span><span class="p">:</span>
		<span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
			<span class="nf">add_rsp</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
	<span class="k">elif</span> <span class="n">value</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
		<span class="n">out_args</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">opt_as_arg</span><span class="p">(</span><span class="n">opt</span><span class="p">))</span>
	<span class="k">else</span><span class="p">:</span>
		<span class="n">arg_name</span> <span class="o">=</span> <span class="nf">opt_as_arg</span><span class="p">(</span><span class="n">opt</span><span class="p">)</span>
		<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">"</span><span class="s">D</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">I</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">O</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">W</span><span class="sh">"</span><span class="p">]:</span>
			<span class="n">out_args</span><span class="p">.</span><span class="nf">extend</span><span class="p">(</span><span class="nf">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">arg_name</span><span class="o">+</span><span class="n">v</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
		<span class="k">else</span><span class="p">:</span>
			<span class="n">out_args</span><span class="p">.</span><span class="nf">extend</span><span class="p">(</span><span class="nf">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">v</span><span class="p">:</span> <span class="n">arg_name</span><span class="o">+</span><span class="sh">"</span><span class="s">=</span><span class="sh">"</span><span class="o">+</span><span class="n">v</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">opt_as_arg</span><span class="p">(</span><span class="n">opt</span><span class="p">):</span>
	<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">"</span><span class="s">help</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">target-help</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">version</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">coverage</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">entry</span><span class="sh">"</span><span class="p">,</span> \
		<span class="sh">"</span><span class="s">no-sysroot-suffix</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">sysroot</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">param</span><span class="sh">"</span><span class="p">]:</span>
		<span class="k">return</span> <span class="sh">"</span><span class="s">--</span><span class="sh">"</span><span class="o">+</span><span class="n">opt</span>
	<span class="k">else</span><span class="p">:</span>
		<span class="k">return</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="o">+</span><span class="n">opt</span>

<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
	<span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">match</span><span class="p">(</span><span class="sa">r</span><span class="sh">'</span><span class="s">^--std_rsp=(.*)$</span><span class="sh">'</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">m</span><span class="p">:</span>
		<span class="nf">add_rsp</span><span class="p">(</span><span class="n">m</span><span class="p">.</span><span class="nf">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
	<span class="k">else</span><span class="p">:</span>
		<span class="n">out_args</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>

<span class="n">out_args</span> <span class="o">=</span> <span class="nf">map</span><span class="p">(</span><span class="n">glob</span><span class="p">.</span><span class="n">escape</span><span class="p">,</span> <span class="n">out_args</span><span class="p">)</span>
<span class="n">out_args</span> <span class="o">=</span> <span class="nf">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">\ </span><span class="sh">'</span><span class="p">),</span> <span class="n">out_args</span><span class="p">)</span>
<span class="n">out_args</span> <span class="o">=</span> <span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">out_args</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">out_args</span><span class="p">)</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Usage:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="nv">$ </span>stdrsp.py <span class="nt">--std_rsp</span><span class="o">=</span>example-02.json
<span class="nt">-fPIC</span> <span class="nt">-O0</span> <span class="nt">-fno-inline</span> <span class="nt">-Wall</span> <span class="nt">-Werror</span> <span class="nt">-g</span> <span class="nt">-I</span><span class="s2">"util/include"</span> <span class="nt">-c</span>
<span class="nv">$ </span>g++ <span class="sb">`</span>stdrsp.py <span class="nt">--std_rsp</span><span class="o">=</span>example-02.json<span class="sb">`</span> main.cpp
<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-1</span> main.o
main.o</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_polls"><a class="anchor" href="#_polls"></a>9. Polls</h2>
<div class="sectionbody">
<div class="paragraph">
<p>None yet.</p>
</div>
</div>
</div>
</div>
<div id="footnotes">
<hr>
<div class="footnote" id="_footnotedef_1">
<a href="#_footnoteref_1">1</a>. Clang Compiler User’s Manual (<a href="https://clang.llvm.org/docs/UsersManual.html#configuration-files" class="bare">https://clang.llvm.org/docs/UsersManual.html#configuration-files</a>)
</div>
<div class="footnote" id="_footnotedef_2">
<a href="#_footnoteref_2">2</a>. GCC Documentation (<a href="https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/Overall-Options.html" class="bare">https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/Overall-Options.html</a>)
</div>
<div class="footnote" id="_footnotedef_3">
<a href="#_footnoteref_3">3</a>. Intel&#174; oneAPI DPC&#43;&#43;/C&#43;&#43; Compiler Developer Guide and Reference (<a href="https://www.intel.com/content/dam/develop/external/us/en/documents/oneapi_dpcpp_cpp_compiler_2022.pdf" class="bare">https://www.intel.com/content/dam/develop/external/us/en/documents/oneapi_dpcpp_cpp_compiler_2022.pdf</a>)
</div>
<div class="footnote" id="_footnotedef_4">
<a href="#_footnoteref_4">4</a>. NVIDIA CUDA Compiler Driver NVCC Documentation (<a href="https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html" class="bare">https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html</a>)
</div>
<div class="footnote" id="_footnotedef_5">
<a href="#_footnoteref_5">5</a>. Microsoft C&#43;&#43;, C, and Assembler documentation (<a href="https://learn.microsoft.com/en-us/cpp/build/reference/at-specify-a-compiler-response-file" class="bare">https://learn.microsoft.com/en-us/cpp/build/reference/at-specify-a-compiler-response-file</a>)
</div>
<div class="footnote" id="_footnotedef_6">
<a href="#_footnoteref_6">6</a>. Edison Design Group C&#43;&#43; documentation. <a href="https://www.edg.com/docs/edg_cpp.pdf" class="bare">https://www.edg.com/docs/edg_cpp.pdf</a>
</div>
<div class="footnote" id="_footnotedef_7">
<a href="#_footnoteref_7">7</a>. B2 Embarcadero C&#43;&#43; Builder <code>@</code> file implementation. (<a href="https://github.com/bfgroup/b2/blob/4.10.1/src/tools/borland.jam#L282" class="bare">https://github.com/bfgroup/b2/blob/4.10.1/src/tools/borland.jam#L282</a>)
</div>
<div class="footnote" id="_footnotedef_8">
<a href="#_footnoteref_8">8</a>. NVIDIA HPC C&#43;&#43; Reference (<a href="https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-ref-guide/index.html" class="bare">https://docs.nvidia.com/hpc-sdk/compilers/hpc-compilers-ref-guide/index.html</a>)
</div>
<div class="footnote" id="_footnotedef_9">
<a href="#_footnoteref_9">9</a>. Python <code>argparse</code> module (<a href="https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars" class="bare">https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars</a>)
</div>
<div class="footnote" id="_footnotedef_10">
<a href="#_footnoteref_10">10</a>. P2717 Tool Introspection (<a href="https://wg21.link/P2717" class="bare">https://wg21.link/P2717</a>)
</div>
<div class="footnote" id="_footnotedef_11">
<a href="#_footnoteref_11">11</a>. JSON Compilation Database Format Specification (<a href="https://clang.llvm.org/docs/JSONCompilationDatabase.html" class="bare">https://clang.llvm.org/docs/JSONCompilationDatabase.html</a>)
</div>
<div class="footnote" id="_footnotedef_12">
<a href="#_footnoteref_12">12</a>. JSON Schema: A Media Type for Describing JSON Documents (<a href="http://json-schema.org/latest/json-schema-core.html" class="bare">http://json-schema.org/latest/json-schema-core.html</a>)
</div>
</div>
</body>
</html>