<!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 Core Options</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 Core Options</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"> P3335R0,</span>
<span id="revdate">2024-07-11</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_abstract">1. Abstract</a></li>
<li><a href="#_revision_history">2. Revision History</a>
<ul class="sectlevel2">
<li><a href="#_revision_0_july_2024">2.1. Revision 0 (July 2024)</a></li>
</ul>
</li>
<li><a href="#_motivation">3. Motivation</a></li>
<li><a href="#_scope">4. Scope</a></li>
<li><a href="#_design">5. Design</a>
<ul class="sectlevel2">
<li><a href="#_file_references">5.1. File References</a></li>
<li><a href="#_lists">5.2. Lists</a></li>
<li><a href="#_examples">5.3. Examples</a>
<ul class="sectlevel3">
<li><a href="#_hello_world">5.3.1. Hello World</a></li>
<li><a href="#_compile_and_link">5.3.2. Compile And Link</a></li>
<li><a href="#_many_sources">5.3.3. Many Sources</a></li>
</ul>
</li>
<li><a href="#_options">5.4. Options</a>
<ul class="sectlevel3">
<li><a href="#_source">5.4.1. Source</a></li>
<li><a href="#_output">5.4.2. Output</a></li>
<li><a href="#_include_directories">5.4.3. Include Directories</a></li>
<li><a href="#_library_directories">5.4.4. Library Directories</a></li>
<li><a href="#_define_preprocessor_symbols">5.4.5. Define Preprocessor Symbols</a></li>
<li><a href="#_undefine_preprocessor_symbols">5.4.6. Undefine Preprocessor Symbols</a></li>
<li><a href="#_language">5.4.7. Language</a></li>
<li><a href="#_optimization">5.4.8. Optimization</a></li>
<li><a href="#_debug">5.4.9. Debug</a></li>
<li><a href="#_vendor">5.4.10. Vendor</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_license">6. 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/P3335R0</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Date: 
</td>
<td class="hdlist2">
<p>2024-07-11</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Audience: 
</td>
<td class="hdlist2">
<p>SG15</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Authors: 
</td>
<td class="hdlist2">
<p>René Ferdinand Rivera Morell</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Reply-to: 
</td>
<td class="hdlist2">
<p><a href="mailto:grafikrobot@gmail.com">grafikrobot@gmail.com</a></p>
</td>
</tr>
<tr>
<td class="hdlist1">
Copyright: 
</td>
<td class="hdlist2">
<p>Copyright 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>Specify a minimal set of core structured options
<sup class="footnote" id="_footnote_P3051">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup>
for C&#43;&#43; compiler front ends.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_revision_history"><a class="anchor" href="#_revision_history"></a>2. Revision History</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_revision_0_july_2024"><a class="anchor" href="#_revision_0_july_2024"></a>2.1. Revision 0 (July 2024)</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>Tools in the C&#43;&#43; ecosystem have dealt with using a myriad of different options
to invoke C&#43;&#43; compiler front ends for decades. Although we have found ways to
manage the variety it is advantageous to agree on a common language to reduce
the growing complexities that the variety creates.</p>
</div>
<div class="paragraph">
<p>Having a standard common set of structured options allows for:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Reuse of implementation by tools that interface with compiler front ends.</p>
</li>
<li>
<p>Wider adoption of tools that use, as consumers or producers, the common
options.</p>
</li>
<li>
<p>Lowers the barriers for unexperienced users as they have less to learn.</p>
</li>
<li>
<p>Can be a basis for other standards to form a common configuration vocabulary.</p>
</li>
</ul>
</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 set of C&#43;&#43; compiler frontend <em>structured
options</em> <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup> sufficient to build common C&#43;&#43; use cases. This
includes specifying both the names and semantics of the structured options.</p>
</div>
<div class="paragraph">
<p>This <strong>does not</strong> aim to standardize compiler frontend command line arguments.
Although vendors are free to adopt the names and semantics specified if they
wish. And we encourage such adoption.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_design"><a class="anchor" href="#_design"></a>5. Design</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The approach for the names and semantics of the options follows these goals:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Prefer widely used terms in current tools, not just C&#43;&#43; compiler front ends.</p>
</li>
<li>
<p>Use widely understood semantics.</p>
</li>
<li>
<p>Improve the structure of the data.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_file_references"><a class="anchor" href="#_file_references"></a>5.1. File References</h3>
<div class="paragraph">
<p>In various places the options need to refer to file names and paths. And in
some of those instances it&#8217;s also possible to want to specify one or more
attributes to the file. For example when indicating the language for a source
file. We looked at various ways to achieve an arrangement to make that
specification both optional and future proof. The schema we ended up with is
multi-stage:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Solitary String</dt>
<dd>
<p>A <code>"file.ext"</code> can be given such that it is up to the tool to determine any
other file attributes as it can. Many times this means that the tool will use
the extension to determine things like source language or output format.</p>
</dd>
<dt class="hdlist1">Object With String Key+Value</dt>
<dd>
<p>A <code>{ "file.ext": "value" }</code> specifies the <code>file.ext</code> will set a default
attribute of <code>value</code>. What the default attribute depends on the option we are
specifying. For example, for a source it would indicate the source language.</p>
</dd>
<dt class="hdlist1">Object With Object Value</dt>
<dd>
<p>A <code>{ "file.ext": { "a": <em>value</em>, &#8230;&#8203; }}</code> would indicate specific attributes for
the "file.ext".</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>This staged schema allows a minimal syntax for the common use cases. And
incrementally specifying more information as needed.</p>
</div>
</div>
<div class="sect2">
<h3 id="_lists"><a class="anchor" href="#_lists"></a>5.2. Lists</h3>
<div class="paragraph">
<p>We need to support specifying lists of homogeneous values, like files, while
also minimizing the amount of syntax for common cases. In the case of
indicating a list of values the approach we take is to allow for a single
value to be equivalent to a single element array (without adding array markers).
For example: <code>"file.ext"</code> &#8594; <code>[ "file.ext" ]</code>, or <code>{ "file.ext": "value" }</code>
&#8594; <code>[ { "file.ext": "value" } ]</code></p>
</div>
</div>
<div class="sect2">
<h3 id="_examples"><a class="anchor" href="#_examples"></a>5.3. Examples</h3>
<div class="paragraph">
<p>Below are some examples that show a traditional command line invocation and
the corresponding structured options specification. The examples are meant to
be informational only to illustrate how the structured options <em>could</em> work.
As such they may include options that are <em>not</em> proposed in this document.
The example command line invocations may also contain some options that are not
present in the structured options. I.e. they are not meant to be a one-to-one
correspondence. Generally the examples where generated by running a <strong>real</strong>
build system and collecting the command lines it invokes.</p>
</div>
<div class="sect3">
<h4 id="_hello_world"><a class="anchor" href="#_hello_world"></a>5.3.1. Hello World</h4>
<div class="paragraph">
<p>This is the classic simplest C&#43;&#43; program with the twist that we want to
allow full debugging when running it.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="s2">"g++"</span> <span class="nt">-O0</span> <span class="nt">-fno-inline</span> <span class="nt">-Wall</span> <span class="nt">-g</span> <span class="nt">-static</span> <span class="s2">"hello.cpp"</span> <span class="nt">-o</span> <span class="s2">"hello"</span></code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="s2">"cl"</span> <span class="s2">"hello.cpp"</span> /Fehello <span class="nt">-TP</span> /EHs /GR /Z7 /Od /Ob0 /W3 /Op /MLd /DEBUG
  /subsystem:console</code></pre>
</div>
</div>
<div class="paragraph">
<p>Those invocations can be represented as a somewhat more meaningful structured
options. This specification is formulated to be a single cross-vendor object
by using a <code>vendor</code> specific section to represent options that only <code>msvc</code>
understands. And that other tools could ignore.</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">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello.cpp"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"hello"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exec"</span><span class="w">
  </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">"compile"</span><span class="p">:</span><span class="w"> </span><span class="s2">"off"</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="w">
  </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">"enable"</span><span class="p">:</span><span class="w"> </span><span class="s2">"all"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"debug"</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">"runtime"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"multithread"</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">"debug"</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">"static"</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">"vendor"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"msvc"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"subsystem"</span><span class="p">:</span><span class="w"> </span><span class="s2">"console"</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 class="sect3">
<h4 id="_compile_and_link"><a class="anchor" href="#_compile_and_link"></a>5.3.2. Compile And Link</h4>
<div class="paragraph">
<p>A single invocation that does everything is not particularly common, except as
basic textbook examples. Here we see the more common case of compiling to
produce an object file for the TU. Then linking to get the final executable.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="s2">"g++"</span> <span class="nt">--fPIC</span> <span class="nt">-O0</span> <span class="nt">-fno-inline</span> <span class="nt">-Wall</span> <span class="nt">-g</span> <span class="nt">-c</span> <span class="nt">-o</span> <span class="s2">"hello.o"</span> <span class="s2">"hello.cpp"</span>
<span class="s2">"g++"</span> <span class="nt">-g</span> <span class="s2">"hello.o"</span> <span class="nt">-o</span> <span class="s2">"hello"</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The compile only equivalent structured options:</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">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello.cpp"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"hello.o"</span><span class="p">:</span><span class="w"> </span><span class="s2">"object"</span><span class="w">
  </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">"compile"</span><span class="p">:</span><span class="w"> </span><span class="s2">"off"</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="w">
  </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">"enable"</span><span class="p">:</span><span class="w"> </span><span class="s2">"all"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"debug"</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">"runtime"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"multithread"</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">"debug"</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">"static"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Followed by the structured options to accomplish the link:</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">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello.o"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"hello"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exec"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"debug"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_many_sources"><a class="anchor" href="#_many_sources"></a>5.3.3. Many Sources</h4>
<div class="paragraph">
<p>This is a single command B2 uses to bootstrap its engine on Linux with GCC, and
Windows with MSVC. This is a variation on a simple basic invocation that builds
many files with some extra options.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell">g++ <span class="nt">-x</span> c++ <span class="nt">-std</span><span class="o">=</span>c++11 <span class="nt">-pthread</span> <span class="nt">-O2</span> <span class="nt">-s</span> <span class="nt">-DNDEBUG</span> bindjam.cpp builtins.cpp
  class.cpp command.cpp compile.cpp constants.cpp cwd.cpp debug.cpp
  debugger.cpp events.cpp execcmd.cpp execnt.cpp execunix.cpp filent.cpp
  filesys.cpp fileunix.cpp frames.cpp <span class="k">function</span>.cpp glob.cpp hash.cpp
  hcache.cpp hdrmacro.cpp headers.cpp jam_strings.cpp jam.cpp jamgram.cpp
  lists.cpp make.cpp make1.cpp md5.cpp mem.cpp modules.cpp native.cpp
  option.cpp output.cpp parse.cpp pathnt.cpp pathsys.cpp pathunix.cpp
  regexp.cpp rules.cpp scan.cpp search.cpp startup.cpp tasks.cpp
  timestamp.cpp value.cpp variable.cpp w32_getreg.cpp mod_command_db.cpp
  mod_db.cpp mod_jam_builtin.cpp mod_jam_class.cpp mod_jam_errors.cpp
  mod_jam_modules.cpp mod_order.cpp mod_path.cpp mod_property_set.cpp
  mod_regex.cpp mod_sequence.cpp mod_set.cpp mod_string.cpp mod_summary.cpp
  mod_sysinfo.cpp mod_version.cpp <span class="nt">-o</span> b2</code></pre>
</div>
</div>
<div class="paragraph">
<p>Other than many more files this example doesn&#8217;t differ much from the
<a href="#_hello_world">Hello World</a> example.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"bindjam.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"builtins.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"class.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"command.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"compile.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"constants.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"cwd.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"debug.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"debugger.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"events.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execcmd.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execnt.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"filent.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"filesys.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"fileunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"frames.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"function.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"glob.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hash.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hcache.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hdrmacro.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"headers.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jam_strings.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jam.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jamgram.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"lists.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"make.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"make1.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"md5.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mem.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"modules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"native.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"option.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"output.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"parse.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathnt.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathsys.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"regexp.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"rules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"scan.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"search.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"startup.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"tasks.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"timestamp.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"value.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"variable.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"w32_getreg.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_command_db.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_db.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_builtin.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_class.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_errors.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_modules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_order.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_path.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_property_set.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_regex.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_sequence.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_set.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_string.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_summary.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_sysinfo.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_version.cpp"</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"b2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exec"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"define"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"NDEBUG"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"language"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"c++"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"standard"</span><span class="p">:</span><span class="w"> </span><span class="s2">"11"</span><span class="w">
  </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">"compile"</span><span class="p">:</span><span class="w"> </span><span class="s2">"safe"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"link"</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">"msvc.global_data"</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">"runtime"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"multithread"</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">"debug"</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">"static"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="shell"><span class="s2">"cl"</span> /nologo /MP /MT /TP /Feb2 /wd4996 /wd4675 /O2 /GL /EHsc /Zc:wchar_t /Gw
  <span class="nt">-DNDEBUG</span>  bindjam.cpp builtins.cpp class.cpp command.cpp compile.cpp
  constants.cpp cwd.cpp debug.cpp debugger.cpp events.cpp execcmd.cpp
  execnt.cpp execunix.cpp filent.cpp filesys.cpp fileunix.cpp frames.cpp
  <span class="k">function</span>.cpp glob.cpp hash.cpp hcache.cpp hdrmacro.cpp headers.cpp jam.cpp
  jamgram.cpp lists.cpp make.cpp make1.cpp md5.cpp mem.cpp modules.cpp
  native.cpp option.cpp output.cpp parse.cpp pathnt.cpp pathsys.cpp
  pathunix.cpp regexp.cpp rules.cpp scan.cpp search.cpp jam_strings.cpp
  startup.cpp tasks.cpp timestamp.cpp value.cpp variable.cpp w32_getreg.cpp
  mod_command_db.cpp mod_db.cpp mod_jam_builtin.cpp mod_jam_class.cpp
  mod_jam_errors.cpp mod_jam_modules.cpp mod_order.cpp mod_path.cpp
  mod_property_set.cpp mod_regex.cpp mod_sequence.cpp mod_set.cpp
  mod_string.cpp mod_summary.cpp mod_sysinfo.cpp mod_version.cpp
  /link kernel32.lib advapi32.lib user32.lib
  /MANIFEST:EMBED /MANIFESTINPUT:b2.exe.manifest</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>msvc</code> equivalent has the addition of listing some system libraries and
the special Windows embedded manifest for the executable.</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">"source"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"bindjam.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"builtins.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"class.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"command.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"compile.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"constants.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"cwd.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"debug.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"debugger.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"events.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execcmd.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execnt.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"execunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"filent.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"filesys.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"fileunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"frames.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"function.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"glob.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hash.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hcache.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"hdrmacro.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"headers.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jam_strings.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jam.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"jamgram.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"lists.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"make.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"make1.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"md5.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mem.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"modules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"native.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"option.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"output.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"parse.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathnt.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathsys.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"pathunix.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"regexp.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"rules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"scan.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"search.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"startup.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"tasks.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"timestamp.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"value.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"variable.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"w32_getreg.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_command_db.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_db.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_builtin.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_class.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_errors.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_jam_modules.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_order.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_path.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_property_set.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_regex.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_sequence.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_set.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_string.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_summary.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_sysinfo.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"mod_version.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"kernel32.lib"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"advapi32.lib"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"user32.lib"</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"b2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exec"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"define"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"NDEBUG"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"language"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"c++"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"standard"</span><span class="p">:</span><span class="w"> </span><span class="s2">"11"</span><span class="w">
  </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">"compile"</span><span class="p">:</span><span class="w"> </span><span class="s2">"safe"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"link"</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">"msvc.global_data"</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">"runtime"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"multithread"</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">"debug"</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">"static"</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">"vendor"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"msvc"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"manifest"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"b2.exe.manifest"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"embed"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_options"><a class="anchor" href="#_options"></a>5.4. Options</h3>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">ℹ</div>
</td>
<td class="content">
In the tables below compiler drivers or front ends we list the
un-prefixed option name. And for build systems we list any abstraction for the
option. But importantly, we don&#8217;t list if the build system only allows for
specifying the raw option. As it doesn&#8217;t add any more information than what is
given for the compiler driver information.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The options specified below show first how the concept is specified in two kinds
of tools, compiler driver/front-ends and build systems. This is a small, but
hopefully representative, sampling of syntax and semantics. The tools
considered are:
MSVC,
<sup class="footnote">[<a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup>
GCC,
<sup class="footnote">[<a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote.">3</a>]</sup>
CMake,
<sup class="footnote">[<a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup>
B2
<sup class="footnote">[<a id="_footnoteref_5" class="footnote" href="#_footnotedef_5" title="View footnote.">5</a>]</sup></p>
</div>
<div class="paragraph">
<p>And subsequently show the chosen key, value, and semantics of the option. The
schema for the value is explained in the value if it&#8217;s brief. But otherwise
defined in the semantics of each. As mentioned previously there can be multiple
value types for an option. Each of those is outlined to the extent that the
specific option allows (currently). The explanations of the options are not
exhaustively precise. That is left for future wording.</p>
</div>
<div class="sect3">
<h4 id="_source"><a class="anchor" href="#_source"></a>5.4.1. Source</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><em>file</em></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A file specified as a regular argument is added as a source to process.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><em>file</em></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A file specified as a regular argument is added as a source to process.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><em>file</em></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A file specified as an argument to a target is added as a source to process.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code><em>file</em></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A file specified as an argument to a target is added as a source to process.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.source</code> or shortened <code>source</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>Can be a single <code>string</code>, an <code>object</code>, or an <code>array</code> (with strings or objects).</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>Adds the sources given to the set of files to process. Depending on the value
the semantics can be adjusted:</p>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>string</code></dt>
<dd>
<p>The single file is added to the set. The type of file is determined by the file
extension.<br></p>
<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">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"main.cpp"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</dd>
<dt class="hdlist1"><code>object</code></dt>
<dd>
<p>Specifying an <code>object</code> defines additional properties for the source.<br></p>
<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">"source"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"main.cpp"</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>
</dd>
<dt class="hdlist1"><code>array</code></dt>
<dd>
<p>An array can contain either <code>string</code> or <code>object</code> values for the source. Each
source in the array is added in order.<br></p>
<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">"source"</span><span class="p">:</span><span class="w"> </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">"utils.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"algo.cpp"</span><span class="p">,</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"api.i"</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><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
</dd>
</dl>
</div>
</dd>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The sources in this specification are appended to any existing sources.</p>
</dd>
</dl>
</div>
<div class="sect4">
<h5 id="_source_object"><a class="anchor" href="#_source_object"></a>5.4.1.1. Source Object</h5>
<div class="paragraph">
<p>When a source is specified as an <code>object</code> it consist of a single key and value
item. Where the key is the filename of the source. And the value is the
kind of file it is. The minimal set of file types that a tool should support
are:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>c++</code></dt>
<dd>
<p>A file to interpreted as containing C&#43;&#43; source code to process.</p>
</dd>
<dt class="hdlist1"><code>object</code></dt>
<dd>
<p>A compiled TU binary object to process, usually to link.</p>
</dd>
<dt class="hdlist1"><code>dynamic_lib</code></dt>
<dd>
<p>A collection of compiled TUs to process, usually to resolve at load time.</p>
</dd>
<dt class="hdlist1"><code>archive_lib</code></dt>
<dd>
<p>A collection of compiled TUs to process, usually to resolve at link link.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Source types to match the <code>output</code> and <code>language</code> options should be
supported in addition to those above.</p>
</div>
<div class="paragraph">
<p>The choice of using an <code>object</code> with the single filename+type is to allow
an abbreviated method to override the default file type determination.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_output"><a class="anchor" href="#_output"></a>5.4.2. Output</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>FA</code>, <code>Fa</code>, <code>Fd</code>, <code>Fe</code>, <code>Fi</code>, <code>Fm</code>, <code>Fo</code>, <code>Fp</code>, <code>FR</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Set the name of the generated output. The option specifies the kind of
    output generated as: <code>FA</code>, <code>Fa</code> (assembly); <code>Fd</code> (debug); <code>Fe</code> (executable);
    <code>Fi</code> (preprocessed); <code>Fm</code> (mapfile); <code>Fo</code> (object); <code>Fp</code> (pch);
    <code>FR</code> (browser)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>o</code>, along with <code>c</code>, <code>S</code>, and <code>E</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Sets the file to output with (<code>o</code>). And with the related options controls
    the kind of output to generate: <code>c</code> (compile &#8594; object),
    <code>S</code> (compile &#8594; assembly), <code>E</code> (preprocessed).</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>add_executable</code>, <code>add_library</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a target for an executable or library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>exe</code>, <code>obj</code>, <code>lib</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a target of the given type: <code>exe</code> (executable), <code>obj</code> (object),
    <code>lib</code> (static or dynamic library).</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.output</code> or shortened <code>output</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>Is an <code>object</code> with single entry.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>Specifies the output file, and kind of output, to generate when processing the
sources.</p>
</dd>
</dl>
</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">"output"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"a.out"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exec"</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 key in the entry specifies the filename of the output. And the value in the
entry specifies the kind of output. The kind of output also indicates the
type of operation the tool will do. Possible kinds of outputs:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>exec</code></dt>
<dd>
<p>Links the compiled sources into an executable file.</p>
</dd>
<dt class="hdlist1"><code>object</code></dt>
<dd>
<p>Compiles the sources into a linkable object file.</p>
</dd>
<dt class="hdlist1"><code>dynamic_lib</code></dt>
<dd>
<p>Links the compiled sources into a dynamically loadable library.</p>
</dd>
<dt class="hdlist1"><code>archive_lib</code></dt>
<dd>
<p>Collects the compiled sources into an archive library of object
files.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_include_directories"><a class="anchor" href="#_include_directories"></a>5.4.3. Include Directories</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I</code>, <code>INCLUDE</code> env var</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds the directory to the include search list.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds the directory to the include search list.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>include_directories()</code> or <code>INCLUDE_DIRECTORIES</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds the directories to the include search list.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>include</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds the directory, order unspecified, to the include search list.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.include_dirs</code> or shortened <code>include_dirs</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option would be either a single <code>string</code> or an <code>array</code> of <code>string</code>-s. Each
<code>string</code> is a pathname of which interpretation is up to the application.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>Adds the listed pathnames to the end of the include directories of the
application. It is up to the application to interpret how the composed list of
directories is used. But it commonly interpreted as <code>#include</code> preprocessor
directives to look for files in the order of the include directories list.</p>
</dd>
</dl>
</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">"include_dirs"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/opt/boost_config/include"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</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">"include_dirs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"/opt/boost_config/include"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"/opt/openssl/include"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The directories in this specification are appended to any existing directories.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_library_directories"><a class="anchor" href="#_library_directories"></a>5.4.4. Library Directories</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>/link /LIBPATH:<em>dir</em></code> or <code>LIB</code> env var</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds to the list of directories to search for link libs. The <code>LIBPATH</code>
    paths are searched before the <code>LIB</code> paths.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>L</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>link_directories(AFTER/BEFORE &#8230;&#8203;)</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds to the list of directories which will be used by the linker to search
    for libraries. Specifying <code>AFTER</code> or <code>BEFORE</code> will append or prepend the
    given directories to the existing list of directories.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>library-path</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Adds to the list of directories which will be used by the linker to search
    for libraries.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.library_dirs</code> or shortened <code>library_dirs</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option would be either a single <code>string</code> or an <code>array</code> of <code>string</code>-s. Each
<code>string</code> is a pathname of which interpretation is up to the application.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>Adds the listed pathnames to the end of the library search directories of the
application. It is up to the application to interpret how the composed list of
directories is used.</p>
</dd>
</dl>
</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">"library_dirs"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/opt/boost_config/lib"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</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">"library_dirs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"/opt/boost_config/lib"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"/opt/openssl/lib"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The directories in this specification are appended to any existing directories.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_define_preprocessor_symbols"><a class="anchor" href="#_define_preprocessor_symbols"></a>5.4.5. Define Preprocessor Symbols</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>D</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a preprocessor symbol to a value overriding any previous definition.
  If no value is given <code>1</code> is used as the value.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>D</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a preprocessor symbol to a value overriding any previous definition.
  If no value is given <code>1</code> is used as the value.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>add_compile_definitions</code>, <code>target_compile_definitions</code>, <code>COMPILE_DEFINITIONS</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a preprocessor symbol to a value overriding any previous definition.
  If no value is given no value is used and the value is up to the compiler.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>define</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a preprocessor symbol to a value overriding any previous definition.
  If no value is given no value is used and the value is up to the compiler.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.define</code> or shortened <code>define</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option will be a dictionary where the keys are the preprocessor symbol to
define and the values are mapped from JSON to corresponding preprocessor
values.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>For each symbol (the key name) the C&#43;&#43; preprocessor will define the symbol to
the value. The value will be converted from JSON values as:</p>
<div class="ulist">
<ul>
<li>
<p>JSON <code>number</code> is converted to a string and pasted.</p>
</li>
<li>
<p>JSON <code>string</code> is used directly.</p>
</li>
<li>
<p>JSON <code>boolean</code> is converted as <code>true</code> &#8658; <code>1</code> and <code>false</code> &#8658; <code>0</code>.</p>
</li>
<li>
<p>JSON <code>null</code> converts to nothing, and hence the default implementation value
should be used.</p>
</li>
</ul>
</div>
</dd>
</dl>
</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">"define"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"BOOST_ALL_NO_LIB"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"_WIN32_WINNT"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0x0600"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"_GNU_SOURCE"</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">"U_USING_ICU_NAMESPACE"</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">"NOMINMAX"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The definitions in this specification either: add to existing set of definitions
when the symbol doesn&#8217;t exist, or replace the definitions when the symbol
already exists.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_undefine_preprocessor_symbols"><a class="anchor" href="#_undefine_preprocessor_symbols"></a>5.4.6. Undefine Preprocessor Symbols</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>U</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Undefines the given preprocessor symbol.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>U</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Undefines the given preprocessor symbol.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">N/A</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>undef</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Undefines the given preprocessor symbol.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.undef</code> or shortened <code>undef</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option would be either a single <code>string</code> or an <code>array</code> of <code>string</code>-s. Each
<code>string</code> is a symbol to undefine.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>For each <code>string</code> in the value "undefines" the preprocessor symbol. The option
is evaluated after the <code>define</code> option.</p>
</dd>
</dl>
</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">"undef"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"NDEBUG"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The undefs in this specification either: add to existing set of undefs
when the symbol doesn&#8217;t exist, or replace the undefs when the symbol
already exists.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_language"><a class="anchor" href="#_language"></a>5.4.7. Language</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Tc</code>, <code>TC</code>, <code>Tp</code>, <code>TP</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specified a source file is a C (<code>Tc</code> or <code>TC</code>) or C&#43;&#43; (<code>Tp</code> or <code>TP</code>) file.
  Otherwise the file extension is used.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x <em>language</em></code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specified source files are the given language. Otherwise the file extension
  is used.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>set_property(SOURCE <em>language</em> &#8230;&#8203;)</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specified source files are the given language. Otherwise the file extension
  is used.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>[ cast _ <em>language</em> : &#8230;&#8203; ]</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specified source files are the given language. Otherwise the file extension
  is used.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.language</code> or shortened <code>language</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option value is a single <code>string</code> indicating the name of a language.
The set of values is open. But at minimum <code>c++</code> and <code>c</code> must be recognized.
Other values could be: <code>assembly</code>, <code>objective-c</code>, <code>objective-c++</code>, <code>fortran</code>,
<code>go</code>, <code>d</code>, <code>ada</code>.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>The given language sets the one to use for sources that do not otherwise
specify one. The tool should indicate an error for languages it doesn&#8217;t
recognize.</p>
</dd>
</dl>
</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">"language"</span><span class="p">:</span><span class="w"> </span><span class="s2">"c++"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The language in this specification replaces an existing language specification.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_optimization"><a class="anchor" href="#_optimization"></a>5.4.8. Optimization</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Od</code>, <code>O1</code>, <code>O2</code>, <code>Os</code>, <code>Ot</code>, <code>Ox</code>, and more</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Disables (<code>Od</code>) or enables (the rest) code generation optimizations.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>O0</code>, <code>O1</code>, <code>O2</code>, <code>O3</code>, <code>Os</code>, <code>Og</code>, <code>Oz</code>, and more</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Disables (<code>O0</code>) or enables (the rest) code generation optimizations.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DCMAKE_BUILD_TYPE=Release</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Generates build description that may enable optimizations.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;optimization&gt;off</code>, <code>&lt;optimization&gt;minimal</code>, <code>&lt;optimization&gt;speed</code>,
    <code>&lt;optimization&gt;space</code>, <code>&lt;optimization&gt;debug</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Disables (<code>off</code>) or enables (the rest) code generation optimizations for
    the targets it&#8217;s applied to.</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.optimization</code> or shortened <code>optimization</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>When the value is a <code>string</code> it indicates the level of optimization.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>The level of optimization is applied to all the sources being processed.
The set of values for <code>optimization</code> is fixed, but tools are free to ignore
or use equivalent for the various values. Which optimizations the tool performs
for each value is up to the tool. The only required semantic is for <code>off</code> that
must disable all optimizations. Possible values:</p>
<div class="ulist">
<ul>
<li>
<p><code>off</code> - Disable optimizations.</p>
</li>
<li>
<p><code>minimal</code> - Optimizations that may improve speed and space.</p>
</li>
<li>
<p><code>safe</code> - More optimizations that need more work.</p>
</li>
<li>
<p><code>speed</code> - Prefer speed over space optimizations.</p>
</li>
<li>
<p><code>space</code> - Prefer smaller binaries over speed optimizations.</p>
</li>
<li>
<p><code>debug</code> - Optimize such that debugging capabilities are preserved.</p>
</li>
</ul>
</div>
</dd>
</dl>
</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">"optimization"</span><span class="p">:</span><span class="w"> </span><span class="s2">"minimal"</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If the value is an <code>object</code> it can have the following fields, and semantics:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>compile</code></dt>
<dd>
<p>Same effect and values as above when the value is a <code>string</code>.</p>
</dd>
<dt class="hdlist1"><code>link</code></dt>
<dd>
<p>A <code>boolean</code> value that when <code>true</code> enables link time (whole program)
optimizations. When <code>false</code>, or not present, disables link time optimizations.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>An optimization value of a <code>string</code> is equivalent to the following <code>object</code>
specifications:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>off</code> - <code>{ "compile": "off", "link": false }</code></p>
</li>
<li>
<p><code>minimal</code> - <code>{ "compile": "minimal" }</code></p>
</li>
<li>
<p><code>safe</code> - <code>{ "compile": "safe" }</code></p>
</li>
<li>
<p><code>speed</code> - <code>{ "compile": "speed" }</code></p>
</li>
<li>
<p><code>space</code> - <code>{ "compile": "space" }</code></p>
</li>
<li>
<p><code>debug</code> - <code>{ "compile": "debug" }</code></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The fields in the <code>object</code> value replace existing optimization fields. For
a single <code>string</code> value the equivalent <code>object</code> for that value is merged.</p>
</dd>
</dl>
</div>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_debug"><a class="anchor" href="#_debug"></a>5.4.9. Debug</h4>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 28.5714%;">
<col style="width: 57.1429%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Tool</th>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Semantics</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MSVC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Z7</code>, <code>Zi</code>, <code>ZI</code>, <code>/link /DEBUG</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the type of debugging information to generate.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">GCC</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>g</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Produce debugging information.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CMake</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>DCMAKE_BUILD_TYPE=Debug</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Generates build descriptions with debug building.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">B2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>debug-symbols</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Enable (<code>on</code> value) or disable (<code>off</code> value)</p></td>
</tr>
</tbody>
</table>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.debug</code> or shortened <code>debug</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option is a single <code>boolean</code> or an <code>object</code>.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>When the value is <code>true</code>, enables generation of debug information. When the
value is <code>false</code>, disables generation of debug information.</p>
</dd>
</dl>
</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">"debug"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span></code></pre>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The debug value in this specification replaces an existing debug value.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_vendor"><a class="anchor" href="#_vendor"></a>5.4.10. Vendor</h4>
<div class="paragraph">
<p>We recognize that <code>std</code> options will never be sufficient, or practical, to
delineate all possible functionality. To accommodate the flexibility needed
over time to support all build capabilities we need to allow for tools to
define their own options outside of the standard. While it is possible for tools
to use scoped keys to specify their own options, that method may be harder to
manage for some environments. To allow for easier destructuring we introduce
a <code>vendor</code> option.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Key</dt>
<dd>
<p>Use <code>std.vendor</code> or shortened <code>vendor</code>.</p>
</dd>
<dt class="hdlist1">Value</dt>
<dd>
<p>The option contains a single <code>object</code> with tool defined keys and values. The
names of the keys, or the type of the values, or the semantics are not
specified here. And it is up to the tool creators to coordinate on unique
keys.</p>
</dd>
<dt class="hdlist1">Semantics</dt>
<dd>
<p>The value in the vendor specific fields is interpreted per the tool
requirements. Any number of vendor keys+values is allowed. Tools are not
restricted in what they support. Either of their own keys+values. Or the
Keys+values of other vendor tools. This allows from some level of interchange
for tools that need to support some understanding of what other tools specify.
For example static analyzers that often need to digest sources across different
vendors.</p>
</dd>
</dl>
</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">"debug"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"enable"</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">"vendor"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"gcc"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"compressed"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="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">"compile"</span><span class="p">:</span><span class="w"> </span><span class="s2">"safe"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"link"</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">"vendor"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"msvc"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"global_data"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"vendor"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"msvc"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"manifest"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"b2.exe.manifest"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"embed"</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">"subsystem"</span><span class="p">:</span><span class="w"> </span><span class="s2">"console"</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 class="dlist">
<dl>
<dt class="hdlist1">Merge Semantics</dt>
<dd>
<p>The semantics are up to the vendor to specify for the individual options they
define. Above that, if a vendor key in this specification is not present in the
existing specification it is added. Otherwise, for a key in the vendor <code>object</code>
in this specification is not present in the existing specification it is added.</p>
</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_license"><a class="anchor" href="#_license"></a>6. 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>. P3051; Structured Response Files(<a href="https://wg21.link/P3051" class="bare">https://wg21.link/P3051</a>)
</div>
<div class="footnote" id="_footnotedef_2">
<a href="#_footnoteref_2">2</a>. MSVC, Compiler options listed by category (<a href="https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category" class="bare">https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category</a>)
</div>
<div class="footnote" id="_footnotedef_3">
<a href="#_footnoteref_3">3</a>. GCC Command Options (<a href="https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gcc/Invoking-GCC.html" class="bare">https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gcc/Invoking-GCC.html</a>)
</div>
<div class="footnote" id="_footnotedef_4">
<a href="#_footnoteref_4">4</a>. CMake Reference Documentation (<a href="https://cmake.org/cmake/help/latest/index.html" class="bare">https://cmake.org/cmake/help/latest/index.html</a>)
</div>
<div class="footnote" id="_footnotedef_5">
<a href="#_footnoteref_5">5</a>. B2 User Manual (<a href="https://www.bfgroup.xyz/b2/manual/release/index.html" class="bare">https://www.bfgroup.xyz/b2/manual/release/index.html</a>)
</div>
</div>
</body>
</html>