<!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.23">
<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"> P3051R2,</span>
<span id="revdate">2024-06-29</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_2_june_2024">2.1. Revision 2 (June 2024)</a></li>
<li><a href="#_revision_1_may_2024">2.2. Revision 1 (May 2024)</a></li>
<li><a href="#_revision_0_december_2023">2.3. 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="#_considerations">7. Considerations</a></li>
<li><a href="#_polls">8. Polls</a>
<ul class="sectlevel2">
<li><a href="#_sg15_p3051r1_2024_06_23">8.1. SG15: P3051R1 (2024-06-23)</a></li>
<li><a href="#_sg15_p3051r0_2024_03_19">8.2. SG15: P3051R0 (2024-03-19)</a></li>
</ul>
</li>
<li><a href="#_wording">9. Wording</a>
<ul class="sectlevel2">
<li><a href="#_specification_structured_parameters">9.1. Specification: Structured Parameters</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;
}

/* SVG needs to be relative sized so that it doesn´t look too small or too large.
*/
.imageblock svg {
	width: 100% !important;
}
</style>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Document #: 
</td>
<td class="hdlist2">
<p>ISO/IEC/JTC1/SC22/WG21/P3051R2</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Date: 
</td>
<td class="hdlist2">
<p>2024-06-29</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Audience: 
</td>
<td class="hdlist2">
<p>EWG, LEWG</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_2_june_2024"><a class="anchor" href="#_revision_2_june_2024"></a>2.1. Revision 2 (June 2024)</h3>
<div class="ulist">
<ul>
<li>
<p>Only allow one of <code>arguments</code> or <code>options</code> fields at a time.</p>
</li>
<li>
<p>Define the concept of "processing" arguments and options.</p>
</li>
<li>
<p>Rename the wording section from "Structured Options" to
"Structured Parameters" to avoid conflagration withe options.</p>
</li>
<li>
<p>Change <code>options</code> to a a JSON <code>object</code> moving to a unique structured option
model.</p>
</li>
<li>
<p>Add design considerations section to track design choice rationale.</p>
</li>
<li>
<p>Remove <em>flag options</em> as they are not needed as they can be expressed more
naturally as a boolean value.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_revision_1_may_2024"><a class="anchor" href="#_revision_1_may_2024"></a>2.2. 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.3. 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="param"># 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="param">-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="param"># 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="param"># 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="param">-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="param">"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="nl">"position-independent-code"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
    </span><span class="nl">"optimization"</span><span class="p">:</span><span class="w"> </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="nl">"inline"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
    </span><span class="nl">"warnings"</span><span class="p">:</span><span class="w"> </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="p">,</span><span class="w"> </span><span class="nl">"as-errors"</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="nl">"debug-symbols"</span><span class="p">:</span><span class="w"> </span><span class="s2">"on"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"include"</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="nl">"action"</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
a dictionary of option names and option values. 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 <em>arguments</em> or <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 a dictionaty of kesy and 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-param=<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-param:<em>file</em></code></p>
</div>
</div>
</div>
<div class="paragraph">
<p>The <code>std-param</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://isocpp.org/release/schema/std_param-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-param=<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://isocpp.org/release/schema/std_param-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://isocpp.org/release/schema/std_param-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-param=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-param=common.json</code> argument.</p>
</div>
<div class="paragraph">
<p>The <code>options</code> field specifies a dictionary value of option keys and 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>Additional response files can be inherited by specifying a
<code>{ "std.param": { "pre": [ "file.json" ] } }</code> option. Or they can be appended by
specifying a <code>{ "std.param": { "post": [ "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>
</div>
</div>
<div class="sect1">
<h2 id="_considerations"><a class="anchor" href="#_considerations"></a>7. Considerations</h2>
<div class="sectionbody">
<div class="dlist">
<dl>
<dt class="hdlist1">Specify <code>options</code> fields as "Flags" or "Names"?</dt>
<dd>
<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>
</dd>
<dt class="hdlist1">Specify the <code>options</code> in this proposal or a separate proposal?</dt>
<dd>
<p>We decided early on that it would be best to separate out specifying additional
options in further proposals. A key advantage of the separation is that groups
of such option definitions can indicate a capability. And hence other tools can
introspect which option groups are supported.</p>
</dd>
<dt class="hdlist1">Structured options as an array.</dt>
<dd>
<p>In previous revisions of this feature we used a <code>JSON</code> array for the <code>options</code>.
While that approach facilitated translation ability to traditional command
parameters it did it at the expense of increased complexity for the handling
of the ordinality of the structured options.</p>
</dd>
<dt class="hdlist1">Structured options need merge rules.</dt>
<dd>
<p>We recognize that having structured options as a dictionary means that when
multiple structured arguments files are present we need to define how multiple
specifications for the options need to operate. But we also recognize that
such rules can´t be defined in a vacuum. Future papers that define options
will define such rules as they are needed. And while categories of such rules
will be shared across different specific options the effect they have will be
option specific.</p>
</dd>
<dt class="hdlist1">Why use a new option (<code>--std-param=<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_p3051r1_2024_06_23"><a class="anchor" href="#_sg15_p3051r1_2024_06_23"></a>8.1. SG15: P3051R1 (2024-06-23)</h3>
<div class="paragraph">
<p><em>Structured options should be an unordered dictionary instead of an ordered
list.</em></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">3</p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock">5</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><code>std.param</code> <em>should look like:</em> <code>"param": {"pre": [], "post": []}</code></p>
</div>
<div class="paragraph">
<p>Unanimous Consent</p>
</div>
<div class="paragraph">
<p><em>Forward the initial set of Ecosystem IS papers (P2656, P3342, P3051, and
P2717), with the agreed changes, to EWG with the request to create a work item.</em></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">8</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>
<td class="tableblock halign-center valign-top"><p class="tableblock">0</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_sg15_p3051r0_2024_03_19"><a class="anchor" href="#_sg15_p3051r0_2024_03_19"></a>8.2. SG15: P3051R0 (2024-03-19)</h3>
<div class="paragraph">
<p><em>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.</em></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><em>SG15 wants to persue defining common structured tool configuration arguments as
part of the response file format.</em></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_parameters"><a class="anchor" href="#_specification_structured_parameters"></a>9.1. Specification: Structured Parameters</h3>
<div class="paragraph">
<p>Insert clause after <em>Introspection</em> [intspct].</p>
</div>
<div class="sect3 ins text-justify">
<h4 id="strctparam"><a class="anchor" href="#strctparam"></a>9.1.1. Structured Parameters <span class="right">[<a href="#strctparam">strctparam</a>]</span></h4>
<div class="sect4">
<h5 id="strctparam-pre"><a class="anchor" href="#strctparam-pre"></a>9.1.1.1. Preamble <span class="right">[<a href="#strctparam-pre">strctparam.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 parameters</em>.</p>
</div>
<div class="paragraph">
<p>This clause specifies the <code>std.strctparam</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.strctparam</code> capability shall include the
<code>std.strctparam</code> field and version value in the introspection JSON text output
([intspct.schema.cap]).</p>
</div>
</div>
<div class="sect4 ins text-justify">
<h5 id="strctparam-overview"><a class="anchor" href="#strctparam-overview"></a>9.1.1.2. Overview <span class="right">[<a href="#strctparam-overview">strctparam.overview</a>]</span></h5>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p><code><em>application</em> [ <em>std-strctparam-input</em> <em>file</em> ]</code></p>
</div>
</div>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-input"><a class="anchor" href="#strctparam-input"></a>9.1.1.3. Input Option <span class="right">[<a href="#strctparam-input">strctparam.input</a>]</span></h5>
<div class="dlist">
<dl>
<dt class="hdlist1"><code><em>std-strctparam-input</em></code></dt>
<dd>
<p>The pathname of a file to read the <em>structured parameters</em> from.
The option is specified as <code>--std-param=<em>file</em></code> or <code>-std-param:<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="strctparam-file"><a class="anchor" href="#strctparam-file"></a>9.1.1.4. Files <span class="right">[<a href="#strctparam-file">strctparam.file</a>]</span></h5>
<div class="paragraph">
<p>An application shall read a valid JSON text file that conforms to the
<em>structured parameters</em> schema (<a href="#strctparam-schema">strctparam.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-strctparam-input</em></code> parameter of the list of
parameters given to the application. Given either directly as part of
the application command line or as part of the arguments field
(<a href="#strctparam-field-args">strctparam.schema.args</a>).</p>
</div>
<div class="paragraph">
<p>An application <em>processes</em> arguments and options by applying the semantics of
the arguments and options to change the state of the application that is
relevant to the arguments and options.</p>
</div>
<div class="paragraph">
<p>An application shall process arguments in the file in the order that they
appear.</p>
</div>
<div class="paragraph">
<p>An application shall <em>process</em> options in the file as if the a new modified
state replaces the current state.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-schema"><a class="anchor" href="#strctparam-schema"></a>9.1.1.5. Schema <span class="right">[<a href="#strctparam-schema">strctparam.schema</a>]</span></h5>
<div class="paragraph">
<p>A <em>structured parameters</em> JSON text file shall contain one
<em>structured parameters</em> JSON object (<a href="#strctparam-schema-param">strctparam.schema.param</a>).</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-schema-param"><a class="anchor" href="#strctparam-schema-param"></a>9.1.1.6. Structured Parameters Object <span class="right">[<a href="#strctparam-schema-param">strctparam.schema.param</a>]</span></h5>
<div class="paragraph">
<p>The <em>structured parameters object</em> is the root JSON object of the
structured parameters JSON text.</p>
</div>
<div class="paragraph">
<p>A <em>structured parameters object</em> can have the following fields.</p>
</div>
<div class="paragraph">
<p>A <em>structured parameters object</em> shall have only one of <code>arguments</code> and
<code>options</code> fields.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-field-schema"><a class="anchor" href="#strctparam-field-schema"></a>9.1.1.7. JSON Schema Field <span class="right">[<a href="#strctparam-field-schema">strctparam.schema.schema</a>]</span></h5>
<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>structured parameters object</em> can contain this field.
  If a <em>structured parameters 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="#strctparam-json-schema">strctparamjschm</a>).</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-field-ver"><a class="anchor" href="#strctparam-field-ver"></a>9.1.1.8. Version Field <span class="right">[<a href="#strctparam-field-ver">strctparam.schema.ver</a>]</span></h5>
<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 parameters</em>
  represented in the contents of the JSON text.
  If a <em>structured parameters object</em> does not contain this field the
  value shall be '1.0.0'.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-field-args"><a class="anchor" href="#strctparam-field-args"></a>9.1.1.9. Arguments Field <span class="right">[<a href="#strctparam-field-args">strctparam.schema.args</a>]</span></h5>
<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-strctparam-input</em></code> argument.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-field-opts"><a class="anchor" href="#strctparam-field-opts"></a>9.1.1.10. Options Field <span class="right">[<a href="#strctparam-field-opts">strctparam.schema.opts</a>]</span></h5>
<div class="paragraph">
<p><em>Name</em>: <code>options</code><br>
<em>Type</em>: <code>object</code><br>
<em>Value</em>: The value shall be a JSON <code>object</code>.<br>
<em>Description</em>:
  A <em>structured parameters object</em> can contain this <em>structured options</em> field.
  The keys of items shall be <em>name</em> (<a href="#strctparam-names">strctparam.schema.names</a>) values.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-names"><a class="anchor" href="#strctparam-names"></a>9.1.1.11. Names <span class="right">[<a href="#strctparam-names">strctparam.schema.names</a>]</span></h5>
<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>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="sect4">
<h5 id="strctparam-opt-param"><a class="anchor" href="#strctparam-opt-param"></a>9.1.1.12. Structured Option <code>std.param</code> <span class="right">[<a href="#strctparam-opt-param">strctparam.schema.opt.param</a>]</span></h5>
<div class="paragraph">
<p>The <code>std.param</code> <em>structured option</em> defines an option to refer to additional
<em>structured parameters</em> (<a href="#strctparam">strctparam</a>) to process.</p>
</div>
<div class="paragraph">
<p>An application shall implement this option.</p>
</div>
<div class="paragraph">
<p>The <code>std.param</code> option shall have the following fields.</p>
</div>
<div class="paragraph">
<p><em>Name</em>: <code>pre</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 <em>structured parameters</em>
  (<a href="#strctparam">strctparam</a>).<br>
<em>Value</em>:
  (for <code>array</code>) A list of pathname <code>string</code> items to files containing
  <em>structured parameters</em> (<a href="#strctparam">strctparam</a>)<br>
<em>Description</em>:
  One or more references to files that include additional <em>structured
  parameters</em> (<a href="#strctparam">strctparam</a>).</p>
</div>
<div class="paragraph">
<p><em>Name</em>: <code>post</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 <em>structured parameters</em>
  (<a href="#strctparam">strctparam</a>).<br>
<em>Value</em>:
  (for <code>array</code>) A list of pathname <code>string</code> items to files containing
  <em>structured parameters</em> (<a href="#strctparam">strctparam</a>)<br>
<em>Description</em>:
  One or more references to files that include additional <em>structured
  parameters</em> (<a href="#strctparam">strctparam</a>).</p>
</div>
<div class="paragraph">
<p>A <code>string</code> value in the <code>pre</code> or <code>post</code> field shall be as if the value was given
as an <code>array</code> with the <code>string</code> value as the only value in the <code>array</code>.</p>
</div>
<div class="paragraph">
<p>An application shall process the <em>structured parameters</em> in the <code>pre</code> field
before processing the <em>structured options</em> where the <code>std.param</code> option is
specified.</p>
</div>
<div class="paragraph">
<p>An application shall process the <em>structured parameters</em> in the <code>post</code> field
after processing the <em>structured options</em> where the <code>std.param</code> option is
specified.</p>
</div>
<div class="paragraph">
<p>An application shall process the <em>structured parameters</em> in the <code>pre</code> and <code>post</code>
field in the order given in the value applying semantics as specified in the
parameters or options of the <em>structured parameters</em>.</p>
</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="strctparam-json-schema"><a class="anchor" href="#strctparam-json-schema"></a>9.2.1. Annex B (informative) Structured Parameters <em>JSON Schema</em> <span class="right">[<a href="#strctparam-json-schema">strctparamjschm</a>]</span></h4>
<div class="sect4">
<h5 id="strctparam-json-schema-general"><a class="anchor" href="#strctparam-json-schema-general"></a>9.2.1.1. General <span class="right">[<a href="#strctparam-json-schema-general">strctparamjschm.general</a>]</span></h5>
<div class="paragraph">
<p>This Annex defines the structured parameters capability schema
(<a href="#strctparam-schema">strctparam.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://isocpp.org/release/schema/std_param-1.0.0.json"</code>.</p>
</div>
</div>
<div class="sect4">
<h5 id="strctparam-json-schema-spec"><a class="anchor" href="#strctparam-json-schema-spec"></a>9.2.1.2. JSON Schema Specification <span class="right">[<a href="#strctparam-json-schema-spec">strctparamjschm.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://isocpp.org/release/schema/std_param-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 Parameters Version 1.0.0 JSON Schema"</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 parameters 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 Parameters 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">"object"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"allOf"</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">"#/$opt/Std.Param"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"propertyName"</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="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">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"arguments"</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">"required"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"options"</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">"$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_-]+[.])*([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">"$opt"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"Std.Param"</span><span class="p">:</span><span class="w"> </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">"std.param"</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 parameters 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">"pre"</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">"post"</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="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="p">},</span><span class="w">
      </span><span class="nl">"param"</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">"#/$opt/Std.Param/properties/std.param"</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>