<!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.22">
<meta name="author" content="René Ferdinand Rivera Morell">
<meta name="copyright" content="Copyright 2024 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"> P3051R1,</span>
<span id="revdate">2024-05-20</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_1_may_2024">2.1. Revision 1 (May 2024)</a></li>
<li><a href="#_revision_0_december_2023">2.2. 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="#_polls">8. Polls</a>
<ul class="sectlevel2">
<li><a href="#_sg15_p3051r0_2024_03_19">8.1. SG15: P3051R0 (2024-03-19)</a></li>
</ul>
</li>
<li><a href="#_wording">9. Wording</a>
<ul class="sectlevel2">
<li><a href="#_specification_structured_options">9.1. Specification: Structured Options</a></li>
<li><a href="#_json_schema">9.2. JSON Schema</a></li>
</ul>
</li>
<li><a href="#_license">10. License</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/P3051R1</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Date: 
</td>
<td class="hdlist2">
<p>2024-05-20</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 2024 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_1_may_2024"><a class="anchor" href="#_revision_1_may_2024"></a>2.1. Revision 1 (May 2024)</h3>
<div class="paragraph">
<p>Specify that <code>options</code> use abstract features instead of literal arguments, per
SG15 feedback. Addition of wording.</p>
</div>
</div>
<div class="sect2">
<h3 id="_revision_0_december_2023"><a class="anchor" href="#_revision_0_december_2023"></a>2.2. 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="opt"># 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="opt">-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="opt"># 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="opt"># 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="opt">-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="opt">"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 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 tools. 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>
<div class="paragraph">
<p><strong>Simple Arguments:</strong></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">"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 class="paragraph">
<p><strong>Structured Options:</strong></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">"options"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"position-independent-code"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"optimization"</span><span class="p">,</span><span class="w"> </span><span class="nl">"level"</span><span class="p">:</span><span class="w"> </span><span class="s2">"off"</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"no-inline"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"warnings"</span><span class="p">,</span><span class="w"> </span><span class="nl">"level"</span><span class="p">:</span><span class="w"> </span><span class="s2">"all"</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="s2">"warnings-as-errors"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"debug-symbols"</span><span class="p">,</span><span class="w"> </span><span class="nl">"value"</span><span class="p">:</span><span class="w"> </span><span class="s2">"on"</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"include"</span><span class="p">,</span><span class="w"> </span><span class="nl">"dirs"</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">"compile"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">ℹ</div>
</td>
<td class="content">
The names and values in the <code>options</code> example is for exposition only. It
may not reflect the actual names and values as proposed, now or in the future.
</td>
</tr>
</table>
</div>
<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
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 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 not indicate a particular option prefix (i.e. <code>-</code>, <code>--</code>,
<code>/</code>, etc) making it possible to use tool agnostic common names.</p>
</li>
<li>
<p>The ability to use arrays, or possibly objects, for the option values allows
for logical groupings avoiding extra tracking of such as is present in
command line parsing of options.</p>
</li>
<li>
<p>The names can be more descriptive, and hence easier for people to understand.</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>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 a single 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 will follow an option specific schema.</p>
</li>
<li>
<p>The <em>arguments</em> are not specified, and as such are implementation defined.</p>
</li>
<li>
<p>The <em>options</em> are specified with both a schema and semantics for each.</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-opt=<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-opt:<em>file</em></code></p>
</div>
</div>
</div>
<div class="paragraph">
<p>The <code>std-opt</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_opt-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-opt=<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_opt-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_opt-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-opt=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> are inserted in the arguments
array at the location of the <code>--std-opt=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 any value that follows the schema for the collection of
specified options.</p>
</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>
</ul>
</div>
<div class="paragraph">
<p>Like the <code>arguments</code> field, additional response files can be inserted at the
indicated location by specifying a <code>{ "std.opt": "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 class="paragraph">
<p>The discussions in WG21/SG15 concluded that it&#8217;s preferable to use "names" for
the keys. This allows, as outlined in previous sections, a dual operation. The
"arguments" for some form of backward compatibility. And the "options" for
the modern structure tool invocation.</p>
</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-opt=<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="_polls"><a class="anchor" href="#_polls"></a>8. Polls</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_sg15_p3051r0_2024_03_19"><a class="anchor" href="#_sg15_p3051r0_2024_03_19"></a>8.1. SG15: P3051R0 (2024-03-19)</h3>
<div class="paragraph">
<p>SG15 wants to pursue defining a common response file format starting with
supporting utf8 simple command lines, accepting the limitations for
non-unicode arguments for the first version.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Result: Consensus</p>
</div>
<div class="paragraph">
<p>SG15 wants to persue defining common structured tool configuration arguments as
part of the response file format.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">SF</th>
<th class="tableblock halign-center valign-top">F</th>
<th class="tableblock halign-center valign-top">N</th>
<th class="tableblock halign-center valign-top">A</th>
<th class="tableblock halign-center valign-top">SA</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-top"><p class="tableblock">6</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">3</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">3</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Result: Consensus</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wording"><a class="anchor" href="#_wording"></a>9. Wording</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Wording is relative to
<a href="https://github.com/cplusplus/ecosystem-is/tree/56aeadb86d52a15aa4ec948a1eb8f247a8b703d8">ecosystem-is/56aeadb</a>.
<sup class="footnote">[<a id="_footnoteref_13" class="footnote" href="#_footnotedef_13" title="View footnote.">13</a>]</sup></p>
</div>
<div class="sect2">
<h3 id="_specification_structured_options"><a class="anchor" href="#_specification_structured_options"></a>9.1. Specification: Structured Options</h3>
<div class="paragraph">
<p>Insert clause after <em>Introspection</em> [intspct].</p>
</div>
<div class="sect3 ins text-justify">
<h4 id="strctopt"><a class="anchor" href="#strctopt"></a>9.1.1. Structured Options <span class="right">[<a href="#strctopt">strctopt</a>]</span></h4>
<div class="sect4">
<h5 id="strctopt-pre"><a class="anchor" href="#strctopt-pre"></a>9.1.1.1. Preamble <span class="right">[<a href="#strctopt-pre">strctopt.pre</a>]</span></h5>
<div class="paragraph">
<p>This clause describes options, output, and formats that control the behavior
of applications through the specification of arguments and options from
<em>structured options</em>.</p>
</div>
<div class="paragraph">
<p>This clause specifies the <code>std.strctopt</code> capability ([intspct.cap]) version
<code>1.0.0</code>.</p>
</div>
<div class="paragraph">
<p>An application can implement this capability.</p>
</div>
<div class="paragraph">
<p>An application that implements the <code>std.strctopt</code> capability shall include the
<code>std.strctopt</code> field and version value in the introspection JSON text output
([intspct.schema.cap]).</p>
</div>
</div>
</div>
<div class="sect3 ins text-justify">
<h4 id="strctopt-overview"><a class="anchor" href="#strctopt-overview"></a>9.1.2. Overview <span class="right">[<a href="#strctopt-overview">strctopt.overview</a>]</span></h4>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p><code><em>application</em> [ <em>std-strctopt-input-opt</em> <em>file</em> ]</code></p>
</div>
</div>
</div>
<div class="sect4">
<h5 id="strctopt-input"><a class="anchor" href="#strctopt-input"></a>9.1.2.1. Input Option <span class="right">[<a href="#strctopt-input">strctopt.input</a>]</span></h5>
<div class="dlist">
<dl>
<dt class="hdlist1"><code><em>std-strctopt-input-opt</em></code></dt>
<dd>
<p>The pathname of a file to read the <em>structured options</em> from.
The option is specified as <code>--std-opt=<em>file</em></code> or <code>-std-opt:<em>file</em></code>.
If <em>file</em> is &#8216;-&#8217;, the standard input shall be used.</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="strctopt-file"><a class="anchor" href="#strctopt-file"></a>9.1.2.2. Files <span class="right">[<a href="#strctopt-file">strctopt.file</a>]</span></h5>
<div class="paragraph">
<p>An application shall read a valid JSON text file that conforms to the
<em>structured options</em> schema (<a href="#strctopt-schema">strctopt.schema</a>).</p>
</div>
<div class="paragraph">
<p>An application shall interpret the information in the file as if the options
and arguments in the file occur in the same position as the
<code><em>std-strctopt-input-opt</em></code> argument of the list of arguments given to the
application. Given either directly as part of the application command line or
as part of the arguments field (<a href="#strctopt-field-args">strctopt.schema.args</a>).</p>
</div>
</div>
<div class="sect4">
<h5 id="strctopt-schema"><a class="anchor" href="#strctopt-schema"></a>9.1.2.3. Schema <span class="right">[<a href="#strctopt-schema">strctopt.schema</a>]</span></h5>
<div class="paragraph">
<p>A <em>structured options</em> JSON text file shall contain one <em>structured options</em>
JSON object (<a href="#strctopt-schema-obj">strctopt.schema.obj</a>).</p>
</div>
<div class="sect5">
<h6 id="strctopt-schema-obj"><a class="anchor" href="#strctopt-schema-obj"></a>9.1.2.3.1. Structured Options Object <span class="right">[<a href="#strctopt-schema-obj">strctopt.schema.obj</a>]</span></h6>
<div class="paragraph">
<p>The <em>structured options object</em> is the root JSON object of the structured
options JSON text.</p>
</div>
<div class="paragraph">
<p>A <em>structure options object</em> can have the following fields.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-field-schema"><a class="anchor" href="#strctopt-field-schema"></a>9.1.2.3.2. JSON Schema Field <span class="right">[<a href="#strctopt-field-schema">strctopt.schema.schema</a>]</span></h6>
<div class="paragraph">
<p><em>Name</em>: <code>$schema</code><br>
<em>Type</em>: <code>string</code><br>
<em>Value</em>:
  The value shall be a reference to a JSON Schema specification.<br>
<em>Description</em>:
  A <em>structure options object</em> can contain this field.
  If a <em>structure options object</em> does not contain this field the value shall
  be a reference to the JSON Schema corresponding to the current edition of this
  standard (<a href="#strctopt-json-schema">strctoptjschm</a>).</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-field-ver"><a class="anchor" href="#strctopt-field-ver"></a>9.1.2.3.3. Version Field <span class="right">[<a href="#strctopt-field-ver">strctopt.schema.ver</a>]</span></h6>
<div class="paragraph">
<p><em>Name</em>: <code>version</code><br>
<em>Type</em>: <code>string</code><br>
<em>Value</em>: <code>1</code> or <code>1.0</code> or <code>1.0.0</code><br>
<em>Description</em>:
  The version field indicates the version of the <em>structured options</em>
  represented in the contents of the JSON text.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-field-args"><a class="anchor" href="#strctopt-field-args"></a>9.1.2.3.4. Arguments Field <span class="right">[<a href="#strctopt-field-args">strctopt.schema.args</a>]</span></h6>
<div class="paragraph">
<p><em>Name</em>: <code>arguments</code><br>
<em>Type</em>: <code>array</code><br>
<em>Value</em>:
  The value shall be a JSON <code>array</code>. The items in the <code>array</code> shall be of JSON
  <code>string</code> types.<br>
<em>Description</em>:
  The arguments field specifies items to be interpreted directly as if they
  occur in the command line of the program.</p>
</div>
<div class="paragraph">
<p>The application shall process the items as if they replace the
<code><em>std-strctopt-input-opt</em></code> argument.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-field-opts"><a class="anchor" href="#strctopt-field-opts"></a>9.1.2.3.5. Options Field <span class="right">[<a href="#strctopt-field-opts">strctopt.schema.opts</a>]</span></h6>
<div class="paragraph">
<p><em>Name</em>: <code>options</code><br>
<em>Type</em>: <code>array</code><br>
<em>Value</em>:
  The value shall be a JSON <code>array</code>. The items in the <code>array</code> shall be of either
  JSON <code>string</code> or <code>object</code> types.<br>
<em>Items</em>: (for <code>string</code>) The item shall be a single <em>flag option</em>.<br>
<em>Items</em>: (for <code>object</code>) The item shall be a valid <em>structured option</em>.<br>
<em>Description</em>:
  A <em>structured options object</em> can contain this field.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-names"><a class="anchor" href="#strctopt-names"></a>9.1.2.3.6. Names <span class="right">[<a href="#strctopt-strctopt-names">[strctopt-strctopt-names]</a>]</span></h6>
<div class="dlist">
<dl>
<dt class="hdlist1"><em>name</em>: </dt>
<dd>
<p>one or more of:<br>
U+0061 .. U+007A LATIN SMALL LETTER A .. Z<br>
U+0030 .. u+0039 DIGIT ZERO .. NINE<br>
U+005F LOW LINE U+002D HYPHEN-MINUS</p>
</dd>
<dt class="hdlist1"><em>scope</em>: </dt>
<dd>
<p><em>name</em> <em>scope-designator</em> <em>scope</em><sub>opt</sub></p>
</dd>
<dt class="hdlist1"><em>scope-designator</em>: </dt>
<dd>
<p>U+002E FULL STOP</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>The <em>name</em> <code>std</code> is reserved for <em>flag options</em> and <em>structured options</em>
defined in this standard.</p>
</div>
<div class="paragraph">
<p>Applications can specify vendor designated <em>name</em> parts outside of this
standard.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-flag-opt"><a class="anchor" href="#strctopt-flag-opt"></a>9.1.2.3.7. Flag Option <span class="right">[<a href="#strctopt-flag-opt">strctopt.schema.flag</a>]</span></h6>
<div class="dlist">
<dl>
<dt class="hdlist1"><em>flag-option</em>: </dt>
<dd>
<p>one of: <em>yes-flag</em> <em>no-flag</em></p>
</dd>
<dt class="hdlist1"><em>yes-flag</em>: </dt>
<dd>
<p>one of: <em>yes-flag-name</em> <em>scoped-yes-flag-name</em></p>
</dd>
<dt class="hdlist1"><em>yes-flag-name</em>: </dt>
<dd>
<p><em>name</em></p>
</dd>
<dt class="hdlist1"><em>scoped-yes-flag-name</em>: </dt>
<dd>
<p><em>scope</em><sub>opt</sub> <em>name</em></p>
</dd>
<dt class="hdlist1"><em>no-flag</em>: </dt>
<dd>
<p>one of: <em>no-flag-name</em> <em>scoped-no-flag-name</em></p>
</dd>
<dt class="hdlist1"><em>no-flag-name</em>: </dt>
<dd>
<p><em>no-flag-prefix</em> <em>name</em></p>
</dd>
<dt class="hdlist1"><em>scoped-no-flag-name</em>: </dt>
<dd>
<p><em>scope</em><sub>opt</sub> <em>no-flag-name</em></p>
</dd>
<dt class="hdlist1"><em>no-flag-prefix</em>: </dt>
<dd>
<p>U+006E LATIN SMALL LETTER N U+006F LATIN SMALL LETTER O<br>
U+002D HYPHEN-MINUS</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>A <em>flag option</em> is an option that allows or prevents the specified semantics
of the option.</p>
</div>
<div class="paragraph">
<p>A <em>flag option</em> shall be either a <em>yes-flag</em> or <em>no-flag</em>.</p>
</div>
<div class="paragraph">
<p>A <em>yes-flag</em> allows the semantics in the application as specified by effects of
that behavior.</p>
</div>
<div class="paragraph">
<p>A <em>no-flag</em> prevents the semantics in the application as specified by effects
of that behavior.</p>
</div>
<div class="paragraph">
<p>A flag option without a <em>scope</em> shall be equivalent the same flag option with a
<code>std.</code> scope.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-struct-opt"><a class="anchor" href="#strctopt-struct-opt"></a>9.1.2.3.8. Structured Option <span class="right">[<a href="#strctopt-struct-opt">strctopt.schema.struct</a>]</span></h6>
<div class="paragraph">
<p>A structured option JSON object shall contain a <em>structured-option-name</em>
field.</p>
</div>
<div class="paragraph">
<p>A structured option JSON object can contain additional fields as specified by
the option specification.</p>
</div>
<div class="paragraph">
<p><em>Name</em>: <code>name</code><br>
<em>Type</em>: <code>string</code><br>
<em>Value</em>: A valid <em>structured-option-name</em>.<br>
<em>Description</em>: The name of the structured option.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><em>structured-option-name</em>: </dt>
<dd>
<p><em>scope</em><sub>opt</sub> <em>name</em></p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>A  structured option without a <em>scope</em> shall be equivalent to the same
structured option with a <code>std.</code> <em>scope</em>.</p>
</div>
</div>
<div class="sect5">
<h6 id="strctopt-opt-opt"><a class="anchor" href="#strctopt-opt-opt"></a>9.1.2.3.9. Option <code>std.opt</code> <span class="right">[<a href="#strctopt-opt-opt">strctopt.schema.opt.opt</a>]</span></h6>
<div class="paragraph">
<p>The <code>std.opt</code> option defines an option to refer to additional structured
options (<a href="#strctopt">strctopt</a>) to process.</p>
</div>
<div class="paragraph">
<p>An application shall implement this option.</p>
</div>
<div class="paragraph">
<p>The <code>std.opt</code> option shall have the following fields.</p>
</div>
<div class="paragraph">
<p><em>Name</em>: <code>name</code><br>
<em>Type</em>: <code>string</code><br>
<em>Value</em>: <code>std.opt</code><br>
<em>Description</em>: The name of the option.</p>
</div>
<div class="paragraph">
<p><em>Name</em>: <code>files</code><br>
<em>Type</em>: <code>string</code> or <code>array</code><br>
<em>Value</em>:
  (for <code>string</code>) A pathname to a file containing structured options
  (<a href="#strctopt">strctopt</a>).<br>
<em>Value</em>:
  (for <code>array</code>) A list of pathname <code>string</code> items to files containing structured
  options (<a href="#strctopt">strctopt</a>)<br>
<em>Description</em>:
  One or more references to files that include additional structured options
  (<a href="#strctopt">strctopt</a>) that are processed as if they occur at the location of the
  <code>std.opt</code> option.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_json_schema"><a class="anchor" href="#_json_schema"></a>9.2. JSON Schema</h3>
<div class="paragraph">
<p>Insert clause after <em>Annex A</em>.</p>
</div>
<div class="sect3 ins text-justify">
<h4 id="strctopt-json-schema"><a class="anchor" href="#strctopt-json-schema"></a>9.2.1. Annex B (informative) Structured Options <em>JSON Schema</em> <span class="right">[<a href="#strctopt-json-schema">strctoptjschm</a>]</span></h4>
<div class="sect4">
<h5 id="strctopt-json-schema-general"><a class="anchor" href="#strctopt-json-schema-general"></a>9.2.1.1. General <span class="right">[<a href="#strctopt-json-schema-general">strctoptjschm.general</a>]</span></h5>
<div class="paragraph">
<p>This Annex defines the structured options capability schema
(<a href="#strctopt-schema">strctopt.schema</a>) in terms of a <em>JSON Schema</em>. A <em>JSON Schema</em> refers to the
IETF RFC draft "JSON Schema: A Media Type for Describing JSON Documents" as
specified in <a href="https://json-schema.org/draft/2020-12/json-schema-core.html" class="bare">https://json-schema.org/draft/2020-12/json-schema-core.html</a>.</p>
</div>
<div class="paragraph">
<p>This JSON Schema can be referenced as the <code>$schema</code> field with URI value of
<code>"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_opt-1.0.0.json"</code>.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctopt-json-schema-spec"><a class="anchor" href="#strctopt-json-schema-spec"></a>9.2.1.2. JSON Schema Specification <span class="right">[<a href="#strctopt-json-schema-spec">strctoptjschm.spec</a>]</span></h5>
<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://json-schema.org/draft/2020-12/schema"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"$id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://raw.githubusercontent.com/cplusplus/ecosystem-is/release/schema/std_opt-1.0.0.json"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Structured Options Version 1.0.0 JSON Schema"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"$defs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"Version"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^[0-9]+([.][0-9]+){0,2}$"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"Name"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^[a-z0-9_</span><span class="se">\\</span><span class="s2">-.]*[a-z0-9_-]+$"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"StringOrArray"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"array"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"items"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"$schema"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"JSON Schema URI for the version of the structured options format."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"uri"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"The Structured Options format version."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/Version"</span><span class="w">
    </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="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Application direct arguments."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"array"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"items"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"string"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </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="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Application structured options."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"array"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"items"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"oneOf"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="p">{</span><span class="w">
            </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$opts/Std.Opt"</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="p">{</span><span class="w">
            </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$opts/Any"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"$opts"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"Std.Opt"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Recursive reference to one or more structured option files."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"enum"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"std.opt"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"opt"</span><span class="w">
          </span><span class="p">]</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"files"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/StringOrArray"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="s2">"name"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"files"</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"additionalProperties"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"Any"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Any other structured option."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"oneOf"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"properties"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/Name"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
              </span><span class="s2">"name"</span><span class="w">
            </span><span class="p">]</span><span class="w">
          </span><span class="p">},</span><span class="w">
          </span><span class="nl">"additionalProperties"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"$ref"</span><span class="p">:</span><span class="w"> </span><span class="s2">"#/$defs/Name"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_license"><a class="anchor" href="#_license"></a>10. License</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This work is licensed under the Creative Commons Attribution 4.0 International
License. To view a copy of this license, visit
<a href="http://creativecommons.org/licenses/by/4.0/" class="bare">http://creativecommons.org/licenses/by/4.0/</a> or send a letter to Creative
Commons, PO Box 1866, Mountain View, CA 94042, USA.</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 class="footnote" id="_footnotedef_13">
<a href="#_footnoteref_13">13</a>. Working Draft, C&#43;&#43; Ecosystem International Standard 2023-11-10 (<a href="https://github.com/cplusplus/ecosystem-is/tree/56aeadb86d52a15aa4ec948a1eb8f247a8b703d8" class="bare">https://github.com/cplusplus/ecosystem-is/tree/56aeadb86d52a15aa4ec948a1eb8f247a8b703d8</a>)
</div>
</div>
</body>
</html>