Panel/Agent-Windows/OGP64/usr/share/doc/git/html/technical/build-systems.html
2026-06-06 18:46:40 -04:00

1365 lines
28 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 10.2.0" />
<title>Build Systems</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
/* Default font. */
body {
font-family: Georgia,serif;
}
/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
font-family: Arial,Helvetica,sans-serif;
}
body {
margin: 1em 5% 1em 5%;
}
a {
color: blue;
text-decoration: underline;
}
a:visited {
color: fuchsia;
}
em {
font-style: italic;
color: navy;
}
strong {
font-weight: bold;
color: #083194;
}
h1, h2, h3, h4, h5, h6 {
color: #527bbd;
margin-top: 1.2em;
margin-bottom: 0.5em;
line-height: 1.3;
}
h1, h2, h3 {
border-bottom: 2px solid silver;
}
h2 {
padding-top: 0.5em;
}
h3 {
float: left;
}
h3 + * {
clear: left;
}
h5 {
font-size: 1.0em;
}
div.sectionbody {
margin-left: 0;
}
hr {
border: 1px solid silver;
}
p {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
ul, ol, li > p {
margin-top: 0;
}
ul > li { color: #aaa; }
ul > li > * { color: black; }
.monospaced, code, pre {
font-family: "Courier New", Courier, monospace;
font-size: inherit;
color: navy;
padding: 0;
margin: 0;
}
pre {
white-space: pre-wrap;
}
#author {
color: #527bbd;
font-weight: bold;
font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}
#footer {
font-size: small;
border-top: 2px solid silver;
padding-top: 0.5em;
margin-top: 4.0em;
}
#footer-text {
float: left;
padding-bottom: 0.5em;
}
#footer-badges {
float: right;
padding-bottom: 0.5em;
}
#preamble {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.admonitionblock {
margin-top: 2.0em;
margin-bottom: 2.0em;
margin-right: 10%;
color: #606060;
}
div.content { /* Block element content. */
padding: 0;
}
/* Block element titles. */
div.title, caption.title {
color: #527bbd;
font-weight: bold;
text-align: left;
margin-top: 1.0em;
margin-bottom: 0.5em;
}
div.title + * {
margin-top: 0;
}
td div.title:first-child {
margin-top: 0.0em;
}
div.content div.title:first-child {
margin-top: 0.0em;
}
div.content + div.title {
margin-top: 0.0em;
}
div.sidebarblock > div.content {
background: #ffffee;
border: 1px solid #dddddd;
border-left: 4px solid #f0f0f0;
padding: 0.5em;
}
div.listingblock > div.content {
border: 1px solid #dddddd;
border-left: 5px solid #f0f0f0;
background: #f8f8f8;
padding: 0.5em;
}
div.quoteblock, div.verseblock {
padding-left: 1.0em;
margin-left: 1.0em;
margin-right: 10%;
border-left: 5px solid #f0f0f0;
color: #888;
}
div.quoteblock > div.attribution {
padding-top: 0.5em;
text-align: right;
}
div.verseblock > pre.content {
font-family: inherit;
font-size: inherit;
}
div.verseblock > div.attribution {
padding-top: 0.75em;
text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
text-align: left;
}
div.admonitionblock .icon {
vertical-align: top;
font-size: 1.1em;
font-weight: bold;
text-decoration: underline;
color: #527bbd;
padding-right: 0.5em;
}
div.admonitionblock td.content {
padding-left: 0.5em;
border-left: 3px solid #dddddd;
}
div.exampleblock > div.content {
border-left: 3px solid #dddddd;
padding-left: 0.5em;
}
div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; vertical-align: text-bottom; }
a.image:visited { color: white; }
dl {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
dt {
margin-top: 0.5em;
margin-bottom: 0;
font-style: normal;
color: navy;
}
dd > *:first-child {
margin-top: 0.1em;
}
ul, ol {
list-style-position: outside;
}
ol.arabic {
list-style-type: decimal;
}
ol.loweralpha {
list-style-type: lower-alpha;
}
ol.upperalpha {
list-style-type: upper-alpha;
}
ol.lowerroman {
list-style-type: lower-roman;
}
ol.upperroman {
list-style-type: upper-roman;
}
div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
margin-top: 0.1em;
margin-bottom: 0.1em;
}
tfoot {
font-weight: bold;
}
td > div.verse {
white-space: pre;
}
div.hdlist {
margin-top: 0.8em;
margin-bottom: 0.8em;
}
div.hdlist tr {
padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
font-weight: bold;
}
td.hdlist1 {
vertical-align: top;
font-style: normal;
padding-right: 0.8em;
color: navy;
}
td.hdlist2 {
vertical-align: top;
}
div.hdlist.compact tr {
margin: 0;
padding-bottom: 0;
}
.comment {
background: yellow;
}
.footnote, .footnoteref {
font-size: 0.8em;
}
span.footnote, span.footnoteref {
vertical-align: super;
}
#footnotes {
margin: 20px 0 20px 0;
padding: 7px 0 0 0;
}
#footnotes div.footnote {
margin: 0 0 5px 0;
}
#footnotes hr {
border: none;
border-top: 1px solid silver;
height: 1px;
text-align: left;
margin-left: 0;
width: 20%;
min-width: 100px;
}
div.colist td {
padding-right: 0.5em;
padding-bottom: 0.3em;
vertical-align: top;
}
div.colist td img {
margin-top: 0.3em;
}
@media print {
#footer-badges { display: none; }
}
#toc {
margin-bottom: 2.5em;
}
#toctitle {
color: #527bbd;
font-size: 1.1em;
font-weight: bold;
margin-top: 1.0em;
margin-bottom: 0.1em;
}
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
margin-top: 0;
margin-bottom: 0;
}
div.toclevel2 {
margin-left: 2em;
font-size: 0.9em;
}
div.toclevel3 {
margin-left: 4em;
font-size: 0.9em;
}
div.toclevel4 {
margin-left: 6em;
font-size: 0.9em;
}
span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }
span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }
span.big { font-size: 2em; }
span.small { font-size: 0.6em; }
span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }
div.unbreakable { page-break-inside: avoid; }
/*
* xhtml11 specific
*
* */
div.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
div.tableblock > table {
border: 3px solid #527bbd;
}
thead, p.table.header {
font-weight: bold;
color: #527bbd;
}
p.table {
margin-top: 0;
}
/* Because the table frame attribute is overridden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
border-style: none;
}
div.tableblock > table[frame="hsides"] {
border-left-style: none;
border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
border-top-style: none;
border-bottom-style: none;
}
/*
* html5 specific
*
* */
table.tableblock {
margin-top: 1.0em;
margin-bottom: 1.5em;
}
thead, p.tableblock.header {
font-weight: bold;
color: #527bbd;
}
p.tableblock {
margin-top: 0;
}
table.tableblock {
border-width: 3px;
border-spacing: 0px;
border-style: solid;
border-color: #527bbd;
border-collapse: collapse;
}
th.tableblock, td.tableblock {
border-width: 1px;
padding: 4px;
border-style: solid;
border-color: #527bbd;
}
table.tableblock.frame-topbot {
border-left-style: hidden;
border-right-style: hidden;
}
table.tableblock.frame-sides {
border-top-style: hidden;
border-bottom-style: hidden;
}
table.tableblock.frame-none {
border-style: hidden;
}
th.tableblock.halign-left, td.tableblock.halign-left {
text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
text-align: right;
}
th.tableblock.valign-top, td.tableblock.valign-top {
vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
vertical-align: bottom;
}
/*
* manpage specific
*
* */
body.manpage h1 {
padding-top: 0.5em;
padding-bottom: 0.5em;
border-top: 2px solid silver;
border-bottom: 2px solid silver;
}
body.manpage h2 {
border-style: none;
}
body.manpage div.sectionbody {
margin-left: 3em;
}
@media print {
body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Table Of Content generator
* Version: 0.4
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
/* modified by Troy D. Hanson, September 2006. License: GPL */
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
// toclevels = 1..4.
toc: function (toclevels) {
function getText(el) {
var text = "";
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
text += i.data;
else if (i.firstChild != null)
text += getText(i);
}
return text;
}
function TocEntry(el, text, toclevel) {
this.element = el;
this.text = text;
this.toclevel = toclevel;
}
function tocEntries(el, toclevels) {
var result = new Array;
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
// Function that scans the DOM tree for header elements (the DOM2
// nodeIterator API would be a better technique but not supported by all
// browsers).
var iterate = function (el) {
for (var i = el.firstChild; i != null; i = i.nextSibling) {
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
var mo = re.exec(i.tagName);
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
}
iterate(i);
}
}
}
iterate(el);
return result;
}
var toc = document.getElementById("toc");
if (!toc) {
return;
}
// Delete existing TOC entries in case we're reloading the TOC.
var tocEntriesToRemove = [];
var i;
for (i = 0; i < toc.childNodes.length; i++) {
var entry = toc.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div'
&& entry.getAttribute("class")
&& entry.getAttribute("class").match(/^toclevel/))
tocEntriesToRemove.push(entry);
}
for (i = 0; i < tocEntriesToRemove.length; i++) {
toc.removeChild(tocEntriesToRemove[i]);
}
// Rebuild TOC entries.
var entries = tocEntries(document.getElementById("content"), toclevels);
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (entry.element.id == "")
entry.element.id = "_toc_" + i;
var a = document.createElement("a");
a.href = "#" + entry.element.id;
a.appendChild(document.createTextNode(entry.text));
var div = document.createElement("div");
div.appendChild(a);
div.className = "toclevel" + entry.toclevel;
toc.appendChild(div);
}
if (entries.length == 0)
toc.parentNode.removeChild(toc);
},
/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////
/* Based on footnote generation code from:
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
*/
footnotes: function () {
// Delete existing footnote entries in case we're reloading the footnodes.
var i;
var noteholder = document.getElementById("footnotes");
if (!noteholder) {
return;
}
var entriesToRemove = [];
for (i = 0; i < noteholder.childNodes.length; i++) {
var entry = noteholder.childNodes[i];
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
entriesToRemove.push(entry);
}
for (i = 0; i < entriesToRemove.length; i++) {
noteholder.removeChild(entriesToRemove[i]);
}
// Rebuild footnote entries.
var cont = document.getElementById("content");
var spans = cont.getElementsByTagName("span");
var refs = {};
var n = 0;
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnote") {
n++;
var note = spans[i].getAttribute("data-note");
if (!note) {
// Use [\s\S] in place of . so multi-line matches work.
// Because JavaScript has no s (dotall) regex flag.
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
spans[i].innerHTML =
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
spans[i].setAttribute("data-note", note);
}
noteholder.innerHTML +=
"<div class='footnote' id='_footnote_" + n + "'>" +
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
n + "</a>. " + note + "</div>";
var id =spans[i].getAttribute("id");
if (id != null) refs["#"+id] = n;
}
}
if (n == 0)
noteholder.parentNode.removeChild(noteholder);
else {
// Process footnoterefs.
for (i=0; i<spans.length; i++) {
if (spans[i].className == "footnoteref") {
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
href = href.match(/#.*/)[0]; // Because IE return full URL.
n = refs[href];
spans[i].innerHTML =
"[<a href='#_footnote_" + n +
"' title='View footnote' class='footnote'>" + n + "</a>]";
}
}
}
},
install: function(toclevels) {
var timerId;
function reinstall() {
asciidoc.footnotes();
if (toclevels) {
asciidoc.toc(toclevels);
}
}
function reinstallAndRemoveTimer() {
clearInterval(timerId);
reinstall();
}
timerId = setInterval(reinstall, 500);
if (document.addEventListener)
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
else
window.onload = reinstallAndRemoveTimer;
}
}
asciidoc.install();
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Build Systems</h1>
<span id="revdate"></span>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>The build system is the primary way for both developers and system integrators
to interact with the Git project. As such, being easy to use and extend for
those who are not directly developing Git itself is just as important as other
requirements we have on any potential build system.</p></div>
<div class="paragraph"><p>This document outlines the different requirements that we have for the build
system and then compares available build systems using these criteria.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_requirements">Requirements</h2>
<div class="sectionbody">
<div class="paragraph"><p>The following subsections present a list of requirements that we have for any
potential build system. Sections are sorted by decreasing priority.</p></div>
<div class="sect2">
<h3 id="_platform_support">Platform support</h3>
<div class="paragraph"><p>The build system must have support for all of our platforms that we continually
test against as outlined by our platform support policy. These platforms are:</p></div>
<div class="ulist"><ul>
<li>
<p>
Linux
</p>
</li>
<li>
<p>
Windows
</p>
</li>
<li>
<p>
macOS
</p>
</li>
</ul></div>
<div class="paragraph"><p>Furthermore, the build system should have support for the following platforms
that generally have somebody running test pipelines against regularly:</p></div>
<div class="ulist"><ul>
<li>
<p>
AIX
</p>
</li>
<li>
<p>
FreeBSD
</p>
</li>
<li>
<p>
NetBSD
</p>
</li>
<li>
<p>
NonStop
</p>
</li>
<li>
<p>
OpenBSD
</p>
</li>
</ul></div>
<div class="paragraph"><p>The platforms which must be supported by the tool should be aligned with our
platform support policy (see platform-support.adoc).</p></div>
</div>
<div class="sect2">
<h3 id="_auto_detection_of_supported_features">Auto-detection of supported features</h3>
<div class="paragraph"><p>The build system must support auto-detection of features which are or aren&#8217;t
available on the current platform. Platform maintainers should not be required
to manually configure the complete build.</p></div>
<div class="paragraph"><p>Auto-detection of the following items is considered to be important:</p></div>
<div class="ulist"><ul>
<li>
<p>
Check for the existence of headers.
</p>
</li>
<li>
<p>
Check for the existence of libraries.
</p>
</li>
<li>
<p>
Check for the existence of exectuables.
</p>
</li>
<li>
<p>
Check for the runtime behavior of specific functions.
</p>
</li>
<li>
<p>
Check for specific link order requirements when multiple libraries are
involved.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_ease_of_use">Ease of use</h3>
<div class="paragraph"><p>The build system should be both easy to use and easy to extend. While this is
naturally a subjective metric it is likely not controversial to say that some
build systems are considerably harder to use than others.</p></div>
</div>
<div class="sect2">
<h3 id="_ide_support">IDE support</h3>
<div class="paragraph"><p>The build system should integrate with well-known IDEs. Well-known IDEs include:</p></div>
<div class="ulist"><ul>
<li>
<p>
Microsoft Visual Studio
</p>
</li>
<li>
<p>
Visual Studio Code
</p>
</li>
<li>
<p>
Xcode
</p>
</li>
</ul></div>
<div class="paragraph"><p>There are four levels of support:</p></div>
<div class="ulist"><ul>
<li>
<p>
Native integration into the IDE.
</p>
</li>
<li>
<p>
Integration into the IDE via a plugin.
</p>
</li>
<li>
<p>
Integration into the IDE via generating a project description with the build
system.
</p>
</li>
<li>
<p>
No integration.
</p>
</li>
</ul></div>
<div class="paragraph"><p>Native integration is preferable, but integration via either a plugin or by
generating a project description via the build system are considered feasible
alternatives.</p></div>
<div class="paragraph"><p>Another important distinction is the level of integration. There are two
features that one generally wants to have:</p></div>
<div class="ulist"><ul>
<li>
<p>
Integration of build targets.
</p>
</li>
<li>
<p>
Automatic setup of features like code completion with detected build
dependencies.
</p>
</li>
</ul></div>
<div class="paragraph"><p>The first bullet point is the bare minimum, but is not sufficient to be
considered proper integration.</p></div>
</div>
<div class="sect2">
<h3 id="_out_of_tree_builds">Out-of-tree builds</h3>
<div class="paragraph"><p>The build system should support out-of-tree builds. Out-of-tree builds allow a
developer to configure multiple different build directories with different
configuration, e.g. one "debug" build and one "release" build.</p></div>
</div>
<div class="sect2">
<h3 id="_cross_platform_builds">Cross-platform builds</h3>
<div class="paragraph"><p>The build system should support cross-platform builds, e.g. building for arm on
an x86-64 host.</p></div>
</div>
<div class="sect2">
<h3 id="_language_support">Language support</h3>
<div class="paragraph"><p>The following languages and toolchains are of relevance and should be supported
by the build system:</p></div>
<div class="ulist"><ul>
<li>
<p>
C: the primary compiled language used by Git, must be supported. Relevant
toolchains are GCC, Clang and MSVC.
</p>
</li>
<li>
<p>
Rust: candidate as a second compiled lanugage, should be supported. Relevant
toolchains is the LLVM-based rustc.
</p>
</li>
</ul></div>
<div class="paragraph"><p>Built-in support for the respective languages is preferred over support that
needs to be wired up manually to avoid unnecessary complexity. Native support
includes the following features:</p></div>
<div class="ulist"><ul>
<li>
<p>
Compiling objects.
</p>
</li>
<li>
<p>
Dependency tracking.
</p>
</li>
<li>
<p>
Detection of available features.
</p>
</li>
<li>
<p>
Discovery of relevant toolchains.
</p>
</li>
<li>
<p>
Linking libraries and executables.
</p>
</li>
<li>
<p>
Templating placeholders in scripts.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_test_integration">Test integration</h3>
<div class="paragraph"><p>It should be possible to integrate tests into the build system such that it is
possible to build and test Git within the build system. Features which are nice
to have:</p></div>
<div class="ulist"><ul>
<li>
<p>
Track build-time dependencies for respective tests. Unit tests have
different requirements than integration tests.
</p>
</li>
<li>
<p>
Allow filtering of which tests to run.
</p>
</li>
<li>
<p>
Allow running tests such that utilities like <code>test_pause</code> or <code>debug</code> work.
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_comparison">Comparison</h2>
<div class="sectionbody">
<div class="paragraph"><p>The following list of build systems are considered:</p></div>
<div class="ulist"><ul>
<li>
<p>
GNU Make
</p>
</li>
<li>
<p>
autoconf
</p>
</li>
<li>
<p>
CMake
</p>
</li>
<li>
<p>
Meson
</p>
</li>
</ul></div>
<div class="sect2">
<h3 id="_gnu_make">GNU Make</h3>
<div class="ulist"><ul>
<li>
<p>
Platform support: ubitquitous on all platforms, but not well-integrated into Windows.
</p>
</li>
<li>
<p>
Auto-detection: no built-in support for auto-detection of features.
</p>
</li>
<li>
<p>
Ease of use: easy to use, but discovering available options is hard. Makefile
rules can quickly get out of hand once reaching a certain scope.
</p>
</li>
<li>
<p>
IDE support: execution of Makefile targets is supported by many IDEs
</p>
</li>
<li>
<p>
Out-of-tree builds: supported in theory, not wired up in practice.
</p>
</li>
<li>
<p>
Cross-platform builds: supported in theory, not wired up in practice.
</p>
</li>
<li>
<p>
Language support:
</p>
</li>
<li>
<p>
C: Limited built-in support, many parts need to be wired up manually.
</p>
</li>
<li>
<p>
Rust: No built-in support, needs to be wired up manually.
</p>
</li>
<li>
<p>
Test integration: partially supported, many parts need to be wired up
manually.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_autoconf">autoconf</h3>
<div class="ulist"><ul>
<li>
<p>
Platform support: ubiquitous on all platforms, but not well-integrated into Windows.
</p>
</li>
<li>
<p>
Auto-detection: supported.
</p>
</li>
<li>
<p>
Ease of use: easy to use, discovering available options is comparatively
easy. The autoconf syntax is prohibitively hard to extend though due to its
complex set of interacting files and the hard-to-understand M4 language.
</p>
</li>
<li>
<p>
IDE support: no integration into IDEs at generation time. The generated
Makefiles have the same level of support as GNU Make.
</p>
</li>
<li>
<p>
Out-of-tree builds: supported in theory, not wired up in practice.
</p>
</li>
<li>
<p>
Cross-platform builds: supported.
</p>
</li>
<li>
<p>
Language support:
</p>
</li>
<li>
<p>
C: Limited built-in support, many parts need to be wired up manually.
</p>
</li>
<li>
<p>
Rust: No built-in support, needs to be wired up manually.
</p>
</li>
<li>
<p>
Test integration: partially supported, many parts need to be wired up
manually.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_cmake">CMake</h3>
<div class="ulist"><ul>
<li>
<p>
Platform support: not as extensive as GNU Make or autoconf, but all major
platforms are supported.
</p>
</li>
<li>
<p>
AIX
</p>
</li>
<li>
<p>
Cygwin
</p>
</li>
<li>
<p>
FreeBSD
</p>
</li>
<li>
<p>
Linux
</p>
</li>
<li>
<p>
OpenBSD
</p>
</li>
<li>
<p>
Solaris
</p>
</li>
<li>
<p>
Windows
</p>
</li>
<li>
<p>
macOS
</p>
</li>
<li>
<p>
Ease of use: easy to use, discovering available options is not always
trivial. The scripting language used by CMake is somewhat cumbersome to use,
but extending CMake build instructions is doable.
</p>
</li>
<li>
<p>
IDE support: natively integrated into Microsoft Visual Studio. Can generate
project descriptions for Xcode. An extension is available for Visual Studio
Code. Many other IDEs have plugins for CMake.
</p>
</li>
<li>
<p>
Out-of-tree builds: supported.
</p>
</li>
<li>
<p>
Cross-platform builds: supported.
</p>
</li>
<li>
<p>
Language support:
</p>
</li>
<li>
<p>
C: Supported for GCC, Clang, MSVC and other toolchains.
</p>
</li>
<li>
<p>
Rust: No built-in support, needs to be wired up manually.
</p>
</li>
<li>
<p>
Test integration: supported, even though test dependencies are a bit
cumbersome to use via "test fixtures". Interactive test runs are not
supported.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_meson">Meson</h3>
<div class="ulist"><ul>
<li>
<p>
Platform: not as extensive as GNU Make or autoconf, but all major platforms
and some smaller ones are supported.
</p>
</li>
<li>
<p>
AIX
</p>
</li>
<li>
<p>
Cygwin
</p>
</li>
<li>
<p>
DragonflyBSD
</p>
</li>
<li>
<p>
FreeBSD
</p>
</li>
<li>
<p>
Haiku
</p>
</li>
<li>
<p>
Linux
</p>
</li>
<li>
<p>
NetBSD
</p>
</li>
<li>
<p>
OpenBSD
</p>
</li>
<li>
<p>
Solaris
</p>
</li>
<li>
<p>
Windows
</p>
</li>
<li>
<p>
macOS
</p>
</li>
<li>
<p>
Ease of use: easy to use, discovering available options is easy. The
scripting language is straight-forward to use.
</p>
</li>
<li>
<p>
IDE support: Supports generating build instructions for Xcode and Microsoft
Visual Studio, a plugin exists for Visual Studio Code.
</p>
</li>
<li>
<p>
Out-of-tree builds: supported.
</p>
</li>
<li>
<p>
Cross-platform builds: supported.
</p>
</li>
<li>
<p>
Language support:
</p>
</li>
<li>
<p>
C: Supported for GCC, Clang, MSVC and other toolchains.
</p>
</li>
<li>
<p>
Rust: Supported for rustc.
</p>
</li>
<li>
<p>
Test integration: supported. Interactive tests are supported starting with
Meson 1.5.0 via the <code>--interactive</code> flag.
</p>
</li>
</ul></div>
</div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Last updated
2025-08-18 02:18:23 CEST
</div>
</div>
</body>
</html>