blob: d4bd4dba52e256734eb9f0726889d8afbdefec78 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" data-content_root="" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Building Arrow C++ &#8212; Apache Arrow v17.0.0.dev52</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "light";
</script>
<!-- Loaded before other Sphinx assets -->
<link href="../../_static/styles/theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/bootstrap.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/styles/pydata-sphinx-theme.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link href="../../_static/vendor/fontawesome/6.5.1/css/all.min.css?digest=8d27b9dea8ad943066ae" rel="stylesheet" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2" />
<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2" />
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/theme_overrides.css" />
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae" />
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae" />
<script src="../../_static/vendor/fontawesome/6.5.1/js/all.min.js?digest=8d27b9dea8ad943066ae"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/design-tabs.js"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'developers/cpp/building';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.15.2';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '/docs/_static/versions.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'dev/';
DOCUMENTATION_OPTIONS.show_version_warning_banner = true;
</script>
<link rel="canonical" href="https://arrow.apache.org/docs/developers/cpp/building.html" />
<link rel="icon" href="../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Development Guidelines" href="development.html" />
<link rel="prev" title="C++ Development" href="index.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '20']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<a id="pst-skip-link" class="skip-link" href="#main-content">Skip to main content</a>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>
Back to top
</button>
<input type="checkbox"
class="sidebar-toggle"
name="__primary"
id="__primary"/>
<label class="overlay overlay-primary" for="__primary"></label>
<input type="checkbox"
class="sidebar-toggle"
name="__secondary"
id="__secondary"/>
<label class="overlay overlay-secondary" for="__secondary"></label>
<div class="search-button__wrapper">
<div class="search-button__overlay"></div>
<div class="search-button__search-container">
<form class="bd-search d-flex align-items-center"
action="../../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
id="search-input"
placeholder="Search the docs ..."
aria-label="Search the docs ..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form></div>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar">
<div class="bd-header__inner bd-page-width">
<label class="sidebar-toggle primary-toggle" for="__primary">
<span class="fa-solid fa-bars"></span>
</label>
<div class="col-lg-3 navbar-header-items__start">
<div class="navbar-item">
<a class="navbar-brand logo" href="../../index.html">
<img src="../../_static/arrow.png" class="logo__image only-light" alt="Apache Arrow v17.0.0.dev52 - Home"/>
<script>document.write(`<img src="../../_static/arrow-dark.png" class="logo__image only-dark" alt="Apache Arrow v17.0.0.dev52 - Home"/>`);</script>
</a></div>
</div>
<div class="col-lg-9 navbar-header-items">
<div class="me-auto navbar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../format/index.html">
Specifications
</a>
</li>
<li class="nav-item current active">
<a class="nav-link nav-internal" href="../index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links">
Implementations
</button>
<ul id="pst-nav-more-links" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../java/index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="navbar-header-items__end">
<div class="navbar-item navbar-persistent--container">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="navbar-persistent--mobile">
<script>
document.write(`
<button class="btn navbar-btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Search</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button>
`);
</script>
</div>
<label class="sidebar-toggle secondary-toggle" for="__secondary" tabindex="0">
<span class="fa-solid fa-outdent"></span>
</label>
</div>
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<div class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
<div class="sidebar-header-items__center">
<div class="navbar-item">
<nav class="navbar-nav">
<ul class="bd-navbar-elements navbar-nav">
<li class="nav-item">
<a class="nav-link nav-internal" href="../../format/index.html">
Specifications
</a>
</li>
<li class="nav-item current active">
<a class="nav-link nav-internal" href="../index.html">
Development
</a>
</li>
<li class="nav-item dropdown">
<button class="btn dropdown-toggle nav-item" type="button" data-bs-toggle="dropdown" aria-expanded="false" aria-controls="pst-nav-more-links-2">
Implementations
</button>
<ul id="pst-nav-more-links-2" class="dropdown-menu">
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../c_glib/index.html">
C/GLib
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../cpp/index.html">
C++
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/csharp/README.md">
C#
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://pkg.go.dev/github.com/apache/arrow/go/v17">
Go
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../java/index.html">
Java
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../js/index.html">
JavaScript
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/julia/">
Julia
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/matlab/README.md">
MATLAB
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/nanoarrow/">
nanoarrow
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../python/index.html">
Python
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../r/index.html">
R
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://github.com/apache/arrow/blob/main/ruby/README.md">
Ruby
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://docs.rs/crate/arrow/">
Rust
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-internal" href="../../status.html">
Implementation Status
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/cpp/">
C++ cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/java/">
Java cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/py/">
Python cookbook
</a>
</li>
<li class="nav-item">
<a class="nav-link dropdown-item nav-external" href="https://arrow.apache.org/cookbook/r/">
R cookbook
</a>
</li>
</ul>
</li>
</ul>
</nav></div>
</div>
<div class="sidebar-header-items__end">
<div class="navbar-item">
<script>
document.write(`
<div class="version-switcher__container dropdown">
<button id="pst-version-switcher-button-3"
type="button"
class="version-switcher__button btn btn-sm navbar-btn dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-3"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-3"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-3">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div>
`);
</script></div>
<div class="navbar-item">
<script>
document.write(`
<button class="btn btn-sm navbar-btn theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="theme-switch nav-link" data-mode="light"><i class="fa-solid fa-sun fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="dark"><i class="fa-solid fa-moon fa-lg"></i></span>
<span class="theme-switch nav-link" data-mode="auto"><i class="fa-solid fa-circle-half-stroke fa-lg"></i></span>
</button>
`);
</script></div>
<div class="navbar-item"><ul class="navbar-icon-links navbar-nav"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://github.com/apache/arrow" title="GitHub" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-github fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">GitHub</span></a>
</li>
<li class="nav-item">
<a href="https://twitter.com/ApacheArrow" title="X" class="nav-link" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><span><i class="fa-brands fa-square-x-twitter fa-lg" aria-hidden="true"></i></span>
<span class="sr-only">X</span></a>
</li>
</ul></div>
</div>
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<nav class="bd-docs-nav bd-links"
aria-label="Section Navigation">
<p class="bd-links__title" role="heading" aria-level="1">Section Navigation</p>
<div class="bd-toc-item navbar-nav"><ul class="current nav bd-sidenav">
<li class="toctree-l1"><a class="reference internal" href="../bug_reports.html">Bug reports and feature requests</a></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../guide/index.html">New Contributor’s Guide</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-1"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../guide/architectural_overview.html">Architectural Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="../guide/communication.html">Communication</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../guide/step_by_step/index.html">Steps in making your first PR</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-2"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/set_up.html">Set up</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/building.html">Building the Arrow libraries 🏋🏿‍♀️</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/finding_issues.html">Finding good first issues 🔎</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/arrow_codebase.html">Working on the Arrow codebase 🧐</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/testing.html">Testing 🧪</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/styling.html">Styling 😎</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/step_by_step/pr_lifecycle.html">Lifecycle of a pull request</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../guide/documentation.html">Helping with documentation</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../guide/tutorials/index.html">Tutorials</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-3"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../guide/tutorials/python_tutorial.html">Python tutorial</a></li>
<li class="toctree-l3"><a class="reference internal" href="../guide/tutorials/r_tutorial.html">R tutorials</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../guide/resources.html">Additional information and resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../overview.html">Contributing Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reviewing.html">Reviewing contributions</a></li>
<li class="toctree-l1 current active has-children"><a class="reference internal" href="index.html">C++ Development</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-4"><i class="fa-solid fa-chevron-down"></i></label><ul class="current">
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Building Arrow C++</a></li>
<li class="toctree-l2"><a class="reference internal" href="development.html">Development Guidelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="windows.html">Developing on Windows</a></li>
<li class="toctree-l2"><a class="reference internal" href="emscripten.html">Cross compiling for WebAssembly with Emscripten</a></li>
<li class="toctree-l2"><a class="reference internal" href="conventions.html">Conventions</a></li>
<li class="toctree-l2"><a class="reference internal" href="fuzzing.html">Fuzzing Arrow C++</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../java/index.html">Java Development</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-5"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../java/building.html">Building Arrow Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../java/development.html">Development Guidelines</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../python.html">Python Development</a></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../continuous_integration/index.html">Continuous Integration</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" type="checkbox"/><label class="toctree-toggle" for="toctree-checkbox-6"><i class="fa-solid fa-chevron-down"></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../continuous_integration/overview.html">Continuous Integration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../continuous_integration/docker.html">Running Docker Builds</a></li>
<li class="toctree-l2"><a class="reference internal" href="../continuous_integration/archery.html">Daily Development using Archery</a></li>
<li class="toctree-l2"><a class="reference internal" href="../continuous_integration/crossbow.html">Packaging and Testing with Crossbow</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../benchmarks.html">Benchmarks</a></li>
<li class="toctree-l1"><a class="reference internal" href="../documentation.html">Building the Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release.html">Release Management Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release_verification.html">Release Verification Process</a></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
</div>
<div id="rtd-footer-container"></div>
</div>
<main id="main-content" class="bd-main">
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item">
<nav aria-label="Breadcrumb">
<ul class="bd-breadcrumbs">
<li class="breadcrumb-item breadcrumb-home">
<a href="../../index.html" class="nav-link" aria-label="Home">
<i class="fa-solid fa-home"></i>
</a>
</li>
<li class="breadcrumb-item"><a href="../index.html" class="nav-link">Development</a></li>
<li class="breadcrumb-item"><a href="index.html" class="nav-link">C++ Development</a></li>
<li class="breadcrumb-item active" aria-current="page">Building Arrow C++</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="building-arrow-c">
<span id="building-arrow-cpp"></span><h1>Building Arrow C++<a class="headerlink" href="#building-arrow-c" title="Permalink to this heading">#</a></h1>
<section id="system-setup">
<h2>System setup<a class="headerlink" href="#system-setup" title="Permalink to this heading">#</a></h2>
<p>Arrow uses CMake as a build configuration system. We recommend building
out-of-source. If you are not familiar with this terminology:</p>
<ul class="simple">
<li><p><strong>In-source build</strong>: <code class="docutils literal notranslate"><span class="pre">cmake</span></code> is invoked directly from the <code class="docutils literal notranslate"><span class="pre">cpp</span></code>
directory. This can be inflexible when you wish to maintain multiple build
environments (e.g. one for debug builds and another for release builds)</p></li>
<li><p><strong>Out-of-source build</strong>: <code class="docutils literal notranslate"><span class="pre">cmake</span></code> is invoked from another directory,
creating an isolated build environment that does not interact with any other
build environment. For example, you could create <code class="docutils literal notranslate"><span class="pre">cpp/build-debug</span></code> and
invoke <code class="docutils literal notranslate"><span class="pre">cmake</span> <span class="pre">$CMAKE_ARGS</span> <span class="pre">..</span></code> from this directory</p></li>
</ul>
<p>Building requires:</p>
<ul class="simple">
<li><p>A C++17-enabled compiler. On Linux, gcc 7.1 and higher should be
sufficient. For Windows, at least Visual Studio VS2017 is required.</p></li>
<li><p>CMake 3.16 or higher</p></li>
<li><p>On Linux and macOS, either <code class="docutils literal notranslate"><span class="pre">make</span></code> or <code class="docutils literal notranslate"><span class="pre">ninja</span></code> build utilities</p></li>
<li><p>At least 1GB of RAM for a minimal build, 4GB for a minimal
debug build with tests and 8GB for a full build using
<a class="reference internal" href="../continuous_integration/docker.html#docker-builds"><span class="std std-ref">docker</span></a>.</p></li>
</ul>
<p>On Ubuntu/Debian you can install the requirements with:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>build-essential<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>ninja-build<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>cmake
</pre></div>
</div>
<p>On Alpine Linux:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>apk<span class="w"> </span>add<span class="w"> </span>autoconf<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>bash<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>cmake<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>g++<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>gcc<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>ninja<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>make
</pre></div>
</div>
<p>On Fedora Linux:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>cmake<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>gcc<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>gcc-c++<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>ninja-build<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>make
</pre></div>
</div>
<p>On Arch Linux:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>sudo<span class="w"> </span>pacman<span class="w"> </span>-S<span class="w"> </span>--needed<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>base-devel<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>ninja<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>cmake
</pre></div>
</div>
<p>On macOS, you can use <a class="reference external" href="https://brew.sh/">Homebrew</a>:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/apache/arrow.git
<span class="nb">cd</span><span class="w"> </span>arrow
brew<span class="w"> </span>update<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>brew<span class="w"> </span>bundle<span class="w"> </span>--file<span class="o">=</span>cpp/Brewfile
</pre></div>
</div>
<p>With <a class="reference external" href="https://github.com/Microsoft/vcpkg">vcpkg</a>:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/apache/arrow.git
<span class="nb">cd</span><span class="w"> </span>arrow
vcpkg<span class="w"> </span>install<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--x-manifest-root<span class="w"> </span>cpp<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--feature-flags<span class="o">=</span>versions<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--clean-after-build
</pre></div>
</div>
<p>On MSYS2:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>pacman<span class="w"> </span>--sync<span class="w"> </span>--refresh<span class="w"> </span>--noconfirm<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>ccache<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>git<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-boost<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-brotli<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-cmake<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-gcc<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-gflags<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-glog<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-gtest<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-lz4<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-protobuf<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-python3-numpy<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-rapidjson<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-snappy<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-thrift<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-zlib<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>mingw-w64-<span class="si">${</span><span class="nv">MSYSTEM_CARCH</span><span class="si">}</span>-zstd
</pre></div>
</div>
</section>
<section id="building">
<span id="cpp-building-building"></span><h2>Building<a class="headerlink" href="#building" title="Permalink to this heading">#</a></h2>
<p>All the instructions below assume that you have cloned the Arrow git
repository and navigated to the <code class="docutils literal notranslate"><span class="pre">cpp</span></code> subdirectory:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/apache/arrow.git
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>arrow/cpp
</pre></div>
</div>
<section id="cmake-presets">
<span id="id1"></span><h3>CMake presets<a class="headerlink" href="#cmake-presets" title="Permalink to this heading">#</a></h3>
<p>Using CMake version 3.21.0 or higher, some presets for various build
configurations are provided. You can get a list of the available presets
using <code class="docutils literal notranslate"><span class="pre">cmake</span> <span class="pre">--list-presets</span></code>:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>cmake<span class="w"> </span>--list-presets<span class="w"> </span><span class="c1"># from inside the `cpp` subdirectory</span>
<span class="go">Available configure presets:</span>
<span class="go"> &quot;ninja-debug-minimal&quot; - Debug build without anything enabled</span>
<span class="go"> &quot;ninja-debug-basic&quot; - Debug build with tests and reduced dependencies</span>
<span class="go"> &quot;ninja-debug&quot; - Debug build with tests and more optional components</span>
<span class="go"> [ etc. ]</span>
</pre></div>
</div>
<p>You can inspect the specific options enabled by a given preset using
<code class="docutils literal notranslate"><span class="pre">cmake</span> <span class="pre">-N</span> <span class="pre">--preset</span> <span class="pre">&lt;preset</span> <span class="pre">name&gt;</span></code>:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>cmake<span class="w"> </span>--preset<span class="w"> </span>-N<span class="w"> </span>ninja-debug-minimal
<span class="go">Preset CMake variables:</span>
<span class="go"> ARROW_BUILD_INTEGRATION=&quot;OFF&quot;</span>
<span class="go"> ARROW_BUILD_STATIC=&quot;OFF&quot;</span>
<span class="go"> ARROW_BUILD_TESTS=&quot;OFF&quot;</span>
<span class="go"> ARROW_EXTRA_ERROR_CONTEXT=&quot;ON&quot;</span>
<span class="go"> ARROW_WITH_RE2=&quot;OFF&quot;</span>
<span class="go"> ARROW_WITH_UTF8PROC=&quot;OFF&quot;</span>
<span class="go"> CMAKE_BUILD_TYPE=&quot;Debug&quot;</span>
</pre></div>
</div>
<p>You can also create a build from a given preset:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>mkdir<span class="w"> </span>build<span class="w"> </span><span class="c1"># from inside the `cpp` subdirectory</span>
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>build
<span class="gp">$ </span>cmake<span class="w"> </span>..<span class="w"> </span>--preset<span class="w"> </span>ninja-debug-minimal
<span class="go"> Preset CMake variables:</span>
<span class="go"> ARROW_BUILD_INTEGRATION=&quot;OFF&quot;</span>
<span class="go"> ARROW_BUILD_STATIC=&quot;OFF&quot;</span>
<span class="go"> ARROW_BUILD_TESTS=&quot;OFF&quot;</span>
<span class="go"> ARROW_EXTRA_ERROR_CONTEXT=&quot;ON&quot;</span>
<span class="go"> ARROW_WITH_RE2=&quot;OFF&quot;</span>
<span class="go"> ARROW_WITH_UTF8PROC=&quot;OFF&quot;</span>
<span class="go"> CMAKE_BUILD_TYPE=&quot;Debug&quot;</span>
<span class="go"> -- Building using CMake version: 3.21.3</span>
<span class="go"> [ etc. ]</span>
</pre></div>
</div>
<p>and then ask to compile the build targets:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>cmake<span class="w"> </span>--build<span class="w"> </span>.
<span class="go">[142/142] Creating library symlink debug/libarrow.so.700 debug/libarrow.so</span>
<span class="gp">$ </span>tree<span class="w"> </span>debug/
<span class="go">debug/</span>
<span class="go">├── libarrow.so -&gt; libarrow.so.700</span>
<span class="go">├── libarrow.so.700 -&gt; libarrow.so.700.0.0</span>
<span class="go">└── libarrow.so.700.0.0</span>
<span class="go">0 directories, 3 files</span>
</pre></div>
</div>
<p>When creating a build, it is possible to pass custom options besides
the preset-defined ones, for example:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>cmake<span class="w"> </span>..<span class="w"> </span>--preset<span class="w"> </span>ninja-debug-minimal<span class="w"> </span>-DCMAKE_INSTALL_PREFIX<span class="o">=</span>/usr/local
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The CMake presets are provided as a help to get started with Arrow
development and understand common build configurations. They are not
guaranteed to be immutable but may change in the future based on
feedback.</p>
<p>Instead of relying on CMake presets, it is <strong>highly recommended</strong> that
automated builds, continuous integration, release scripts, etc. use
manual configuration, as outlined below.</p>
</div>
<div class="admonition seealso">
<p class="admonition-title">See also</p>
<p><a class="reference external" href="https://cmake.org/cmake/help/v3.21/manual/cmake-presets.7.html">Official documentation for CMake presets</a>.</p>
</div>
</section>
<section id="manual-configuration">
<h3>Manual configuration<a class="headerlink" href="#manual-configuration" title="Permalink to this heading">#</a></h3>
<p>The build system uses <code class="docutils literal notranslate"><span class="pre">CMAKE_BUILD_TYPE=release</span></code> by default, so if this
argument is omitted then a release build will be produced.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>You need to set more options to build on Windows. See
<a class="reference internal" href="windows.html#developers-cpp-windows"><span class="std std-ref">Developing on Windows</span></a> for details.</p>
</div>
<p>Several build types are possible:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Debug</span></code>: doesn’t apply any compiler optimizations and adds debugging
information in the binary.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">RelWithDebInfo</span></code>: applies compiler optimizations while adding debug
information in the binary.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Release</span></code>: applies compiler optimizations and removes debug information
from the binary.</p></li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>These build types provide suitable optimization/debug flags by
default but you can change them by specifying
<code class="docutils literal notranslate"><span class="pre">-DARROW_C_FLAGS_${BUILD_TYPE}=...</span></code> and/or
<code class="docutils literal notranslate"><span class="pre">-DARROW_CXX_FLAGS_${BUILD_TYPE}=...</span></code>. <code class="docutils literal notranslate"><span class="pre">${BUILD_TYPE}</span></code> is upper
case of build type. For example, <code class="docutils literal notranslate"><span class="pre">DEBUG</span></code>
(<code class="docutils literal notranslate"><span class="pre">-DARROW_C_FLAGS_DEBUG=...</span></code> / <code class="docutils literal notranslate"><span class="pre">-DARROW_CXX_FLAGS_DEBUG=...</span></code>) for the
<code class="docutils literal notranslate"><span class="pre">Debug</span></code> build type and <code class="docutils literal notranslate"><span class="pre">RELWITHDEBINFO</span></code>
(<code class="docutils literal notranslate"><span class="pre">-DARROW_C_FLAGS_RELWITHDEBINFO=...</span></code> /
<code class="docutils literal notranslate"><span class="pre">-DARROW_CXX_FLAGS_RELWITHDEBINFO=...</span></code>) for the <code class="docutils literal notranslate"><span class="pre">RelWithDebInfo</span></code>
build type.</p>
<p>For example, you can use <code class="docutils literal notranslate"><span class="pre">-O3</span></code> as an optimization flag for the <code class="docutils literal notranslate"><span class="pre">Release</span></code>
build type by passing <code class="docutils literal notranslate"><span class="pre">-DARROW_CXX_FLAGS_RELEASE=-O3</span></code> .
You can use <code class="docutils literal notranslate"><span class="pre">-g3</span></code> as a debug flag for the <code class="docutils literal notranslate"><span class="pre">Debug</span></code> build type
by passing <code class="docutils literal notranslate"><span class="pre">-DARROW_CXX_FLAGS_DEBUG=-g3</span></code> .</p>
<p>You can also use the standard <code class="docutils literal notranslate"><span class="pre">CMAKE_C_FLAGS_${BUILD_TYPE}</span></code>
and <code class="docutils literal notranslate"><span class="pre">CMAKE_CXX_FLAGS_${BUILD_TYPE}</span></code> variables but
the <code class="docutils literal notranslate"><span class="pre">ARROW_C_FLAGS_${BUILD_TYPE}</span></code> and
<code class="docutils literal notranslate"><span class="pre">ARROW_CXX_FLAGS_${BUILD_TYPE}</span></code> variables are
recommended. The <code class="docutils literal notranslate"><span class="pre">CMAKE_C_FLAGS_${BUILD_TYPE}</span></code> and
<code class="docutils literal notranslate"><span class="pre">CMAKE_CXX_FLAGS_${BUILD_TYPE}</span></code> variables replace all default
flags provided by CMake, while <code class="docutils literal notranslate"><span class="pre">ARROW_C_FLAGS_${BUILD_TYPE}</span></code> and
<code class="docutils literal notranslate"><span class="pre">ARROW_CXX_FLAGS_${BUILD_TYPE}</span></code> just append the
flags specified, which allows selectively overriding some of the defaults.</p>
</div>
<p>You can also run default build with flag <code class="docutils literal notranslate"><span class="pre">-DARROW_EXTRA_ERROR_CONTEXT=ON</span></code>, see
<a class="reference internal" href="#cpp-extra-debugging"><span class="std std-ref">Extra debugging help</span></a>.</p>
<p>Minimal release build (1GB of RAM for building or more recommended):</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>mkdir<span class="w"> </span>build-release
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>build-release
<span class="gp">$ </span>cmake<span class="w"> </span>..
<span class="gp">$ </span>make<span class="w"> </span>-j8<span class="w"> </span><span class="c1"># if you have 8 CPU cores, otherwise adjust</span>
</pre></div>
</div>
<p>Minimal debug build with unit tests (4GB of RAM for building or more recommended):</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>git<span class="w"> </span>submodule<span class="w"> </span>update<span class="w"> </span>--init<span class="w"> </span>--recursive
<span class="gp">$ </span><span class="nb">export</span><span class="w"> </span><span class="nv">ARROW_TEST_DATA</span><span class="o">=</span><span class="nv">$PWD</span>/../testing/data
<span class="gp">$ </span>mkdir<span class="w"> </span>build-debug
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>build-debug
<span class="gp">$ </span>cmake<span class="w"> </span>-DCMAKE_BUILD_TYPE<span class="o">=</span>Debug<span class="w"> </span>-DARROW_BUILD_TESTS<span class="o">=</span>ON<span class="w"> </span>..
<span class="gp">$ </span>make<span class="w"> </span>-j8<span class="w"> </span><span class="c1"># if you have 8 CPU cores, otherwise adjust</span>
<span class="gp">$ </span>make<span class="w"> </span>unittest<span class="w"> </span><span class="c1"># to run the tests</span>
</pre></div>
</div>
<p>The unit tests are not built by default. After building, one can also invoke
the unit tests using the <code class="docutils literal notranslate"><span class="pre">ctest</span></code> tool provided by CMake (note that <code class="docutils literal notranslate"><span class="pre">test</span></code>
depends on <code class="docutils literal notranslate"><span class="pre">python</span></code> being available).</p>
<p>On some Linux distributions, running the test suite might require setting an
explicit locale. If you see any locale-related errors, try setting the
environment variable (which requires the <cite>locales</cite> package or equivalent):</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">export</span><span class="w"> </span><span class="nv">LC_ALL</span><span class="o">=</span><span class="s2">&quot;en_US.UTF-8&quot;</span>
</pre></div>
</div>
<section id="faster-builds-with-ninja">
<h4>Faster builds with Ninja<a class="headerlink" href="#faster-builds-with-ninja" title="Permalink to this heading">#</a></h4>
<p>Many contributors use the <a class="reference external" href="https://ninja-build.org/">Ninja build system</a> to
get faster builds. It especially speeds up incremental builds. To use
<code class="docutils literal notranslate"><span class="pre">ninja</span></code>, pass <code class="docutils literal notranslate"><span class="pre">-GNinja</span></code> when calling <code class="docutils literal notranslate"><span class="pre">cmake</span></code> and then use the <code class="docutils literal notranslate"><span class="pre">ninja</span></code>
command instead of <code class="docutils literal notranslate"><span class="pre">make</span></code>.</p>
</section>
<section id="unity-builds">
<h4>Unity builds<a class="headerlink" href="#unity-builds" title="Permalink to this heading">#</a></h4>
<p>The CMake
<a class="reference external" href="https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html">unity builds</a>
option can make full builds significantly faster, but it also increases the
memory requirements. Consider turning it on (using <code class="docutils literal notranslate"><span class="pre">-DCMAKE_UNITY_BUILD=ON</span></code>)
if memory consumption is not an issue.</p>
</section>
<section id="optional-components">
<span id="cpp-build-optional-components"></span><h4>Optional Components<a class="headerlink" href="#optional-components" title="Permalink to this heading">#</a></h4>
<p>By default, the C++ build system creates a fairly minimal build. We have
several optional system components which you can opt into building by passing
boolean flags to <code class="docutils literal notranslate"><span class="pre">cmake</span></code>.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_UTILITIES=ON</span></code> : Build Arrow commandline utilities</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_COMPUTE=ON</span></code>: Build all computational kernel functions</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_CSV=ON</span></code>: CSV reader module</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_CUDA=ON</span></code>: CUDA integration for GPU development. Depends on NVIDIA
CUDA toolkit. The CUDA toolchain used to build the library can be customized
by using the <code class="docutils literal notranslate"><span class="pre">$CUDA_HOME</span></code> environment variable.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_DATASET=ON</span></code>: Dataset API, implies the Filesystem API</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_FILESYSTEM=ON</span></code>: Filesystem API for accessing local and remote
filesystems</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_FLIGHT=ON</span></code>: Arrow Flight RPC system, which depends at least on
gRPC</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_FLIGHT_SQL=ON</span></code>: Arrow Flight SQL</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_GANDIVA=ON</span></code>: Gandiva expression compiler, depends on LLVM,
Protocol Buffers, and re2</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_GANDIVA_JAVA=ON</span></code>: Gandiva JNI bindings for Java</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_GCS=ON</span></code>: Build Arrow with GCS support (requires the GCloud SDK for C++)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_HDFS=ON</span></code>: Arrow integration with libhdfs for accessing the Hadoop
Filesystem</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_JEMALLOC=ON</span></code>: Build the Arrow jemalloc-based allocator, on by default</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_JSON=ON</span></code>: JSON reader module</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_MIMALLOC=ON</span></code>: Build the Arrow mimalloc-based allocator</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_ORC=ON</span></code>: Arrow integration with Apache ORC</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_PARQUET=ON</span></code>: Apache Parquet libraries and Arrow integration</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DPARQUET_REQUIRE_ENCRYPTION=ON</span></code>: Parquet Modular Encryption</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_PYTHON=ON</span></code>: This option is deprecated since 10.0.0. This
will be removed in a future release. Use CMake presets instead. Or
you can enable <code class="docutils literal notranslate"><span class="pre">ARROW_COMPUTE</span></code>, <code class="docutils literal notranslate"><span class="pre">ARROW_CSV</span></code>, <code class="docutils literal notranslate"><span class="pre">ARROW_DATASET</span></code>,
<code class="docutils literal notranslate"><span class="pre">ARROW_FILESYSTEM</span></code>, <code class="docutils literal notranslate"><span class="pre">ARROW_HDFS</span></code>, and <code class="docutils literal notranslate"><span class="pre">ARROW_JSON</span></code> directly
instead.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_S3=ON</span></code>: Support for Amazon S3-compatible filesystems</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_SUBSTRAIT=ON</span></code>: Build with support for Substrait</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_RE2=ON</span></code>: Build with support for regular expressions using the re2
library, on by default and used when <code class="docutils literal notranslate"><span class="pre">ARROW_COMPUTE</span></code> or <code class="docutils literal notranslate"><span class="pre">ARROW_GANDIVA</span></code> is <code class="docutils literal notranslate"><span class="pre">ON</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_UTF8PROC=ON</span></code>: Build with support for Unicode properties using
the utf8proc library, on by default and used when <code class="docutils literal notranslate"><span class="pre">ARROW_COMPUTE</span></code> or <code class="docutils literal notranslate"><span class="pre">ARROW_GANDIVA</span></code>
is <code class="docutils literal notranslate"><span class="pre">ON</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_TENSORFLOW=ON</span></code>: Build Arrow with TensorFlow support enabled</p></li>
</ul>
<p>Compression options available in Arrow are:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_BROTLI=ON</span></code>: Build support for Brotli compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_BZ2=ON</span></code>: Build support for BZ2 compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_LZ4=ON</span></code>: Build support for lz4 compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_SNAPPY=ON</span></code>: Build support for Snappy compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_ZLIB=ON</span></code>: Build support for zlib (gzip) compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_WITH_ZSTD=ON</span></code>: Build support for ZSTD compression</p></li>
</ul>
<p>Some features of the core Arrow shared library can be switched off for improved
build times if they are not required for your application:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_IPC=ON</span></code>: build the IPC extensions</p></li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If your use-case is limited to reading/writing Arrow data then the default
options should be sufficient. However, if you wish to build any tests/benchmarks
then <code class="docutils literal notranslate"><span class="pre">ARROW_JSON</span></code> is also required (it will be enabled automatically).
If extended format support is desired then adding <code class="docutils literal notranslate"><span class="pre">ARROW_PARQUET</span></code>, <code class="docutils literal notranslate"><span class="pre">ARROW_CSV</span></code>,
<code class="docutils literal notranslate"><span class="pre">ARROW_JSON</span></code>, or <code class="docutils literal notranslate"><span class="pre">ARROW_ORC</span></code> shouldn’t enable any additional components.</p>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>In general, it’s a good idea to enable <code class="docutils literal notranslate"><span class="pre">ARROW_COMPUTE</span></code> if you anticipate using
any compute kernels beyond <code class="docutils literal notranslate"><span class="pre">cast</span></code>. While there are (as of 12.0.0) a handful of
additional kernels built in by default, this list may change in the future as it’s
partly based on kernel usage in the current format implementations.</p>
</div>
</section>
<section id="optional-targets">
<h4>Optional Targets<a class="headerlink" href="#optional-targets" title="Permalink to this heading">#</a></h4>
<p>For development builds, you will often want to enable additional targets in
enable to exercise your changes, using the following <code class="docutils literal notranslate"><span class="pre">cmake</span></code> options.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_BENCHMARKS=ON</span></code>: Build executable benchmarks.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_EXAMPLES=ON</span></code>: Build examples of using the Arrow C++ API.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_INTEGRATION=ON</span></code>: Build additional executables that are
used to exercise protocol interoperability between the different Arrow
implementations.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_UTILITIES=ON</span></code>: Build executable utilities.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_TESTS=ON</span></code>: Build executable unit tests.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_ENABLE_TIMING_TESTS=ON</span></code>: If building unit tests, enable those
unit tests that rely on wall-clock timing (this flag is disabled on CI
because it can make test results flaky).</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_FUZZING=ON</span></code>: Build fuzz targets and related executables.</p></li>
</ul>
</section>
<section id="optional-checks">
<h4>Optional Checks<a class="headerlink" href="#optional-checks" title="Permalink to this heading">#</a></h4>
<p>The following special checks are available as well. They instrument the
generated code in various ways so as to detect select classes of problems
at runtime (for example when executing unit tests).</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_USE_ASAN=ON</span></code>: Enable Address Sanitizer to check for memory leaks,
buffer overflows or other kinds of memory management issues.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_USE_TSAN=ON</span></code>: Enable Thread Sanitizer to check for races in
multi-threaded code.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">-DARROW_USE_UBSAN=ON</span></code>: Enable Undefined Behavior Sanitizer to check for
situations which trigger C++ undefined behavior.</p></li>
</ul>
<p>Some of those options are mutually incompatible, so you may have to build
several times with different options if you want to exercise all of them.</p>
</section>
<section id="cmake-version-requirements">
<h4>CMake version requirements<a class="headerlink" href="#cmake-version-requirements" title="Permalink to this heading">#</a></h4>
<p>We support CMake 3.16 and higher.</p>
</section>
<section id="llvm-and-clang-tools">
<h4>LLVM and Clang Tools<a class="headerlink" href="#llvm-and-clang-tools" title="Permalink to this heading">#</a></h4>
<p>We are currently using LLVM for library builds and for other developer tools
such as code formatting with <code class="docutils literal notranslate"><span class="pre">clang-format</span></code>. LLVM can be installed via most
modern package managers (apt, yum, conda, Homebrew, vcpkg, chocolatey).</p>
</section>
</section>
</section>
<section id="build-dependency-management">
<span id="cpp-build-dependency-management"></span><h2>Build Dependency Management<a class="headerlink" href="#build-dependency-management" title="Permalink to this heading">#</a></h2>
<p>The build system supports a number of third-party dependencies</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">AWSSDK</span></code>: for S3 support, requires system cURL and can use the
<code class="docutils literal notranslate"><span class="pre">BUNDLED</span></code> method described below</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">benchmark</span></code>: Google benchmark, for testing</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Boost</span></code>: for cross-platform support</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Brotli</span></code>: for data compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">BZip2</span></code>: for data compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">c-ares</span></code>: a dependency of gRPC</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">gflags</span></code>: for command line utilities (formerly Googleflags)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">GLOG</span></code>: for logging</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">google_cloud_cpp_storage</span></code>: for Google Cloud Storage support, requires
system cURL and can use the <code class="docutils literal notranslate"><span class="pre">BUNDLED</span></code> method described below</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">gRPC</span></code>: for remote procedure calls</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">GTest</span></code>: Googletest, for testing</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">LLVM</span></code>: a dependency of Gandiva</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Lz4</span></code>: for data compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ORC</span></code>: for Apache ORC format support</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">re2</span></code>: for compute kernels and Gandiva, a dependency of gRPC</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Protobuf</span></code>: Google Protocol Buffers, for data serialization</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">RapidJSON</span></code>: for data serialization</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Snappy</span></code>: for data compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Thrift</span></code>: Apache Thrift, for data serialization</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">utf8proc</span></code>: for compute kernels</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ZLIB</span></code>: for data compression</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">zstd</span></code>: for data compression</p></li>
</ul>
</div></blockquote>
<p>The CMake option <code class="docutils literal notranslate"><span class="pre">ARROW_DEPENDENCY_SOURCE</span></code> is a global option that instructs
the build system how to resolve each dependency. There are a few options:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">AUTO</span></code>: Try to find package in the system default locations and build from
source if not found</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">BUNDLED</span></code>: Building the dependency automatically from source</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">SYSTEM</span></code>: Finding the dependency in system paths using CMake’s built-in
<code class="docutils literal notranslate"><span class="pre">find_package</span></code> function, or using <code class="docutils literal notranslate"><span class="pre">pkg-config</span></code> for packages that do not
have this feature</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CONDA</span></code>: Use <code class="docutils literal notranslate"><span class="pre">$CONDA_PREFIX</span></code> as alternative <code class="docutils literal notranslate"><span class="pre">SYSTEM</span></code> PATH</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">VCPKG</span></code>: Find dependencies installed by vcpkg, and if not found, run
<code class="docutils literal notranslate"><span class="pre">vcpkg</span> <span class="pre">install</span></code> to install them</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">BREW</span></code>: Use Homebrew default paths as an alternative <code class="docutils literal notranslate"><span class="pre">SYSTEM</span></code> path</p></li>
</ul>
<p>The default method is <code class="docutils literal notranslate"><span class="pre">AUTO</span></code> unless you are developing within an active conda
environment (detected by presence of the <code class="docutils literal notranslate"><span class="pre">$CONDA_PREFIX</span></code> environment
variable), in which case it is <code class="docutils literal notranslate"><span class="pre">CONDA</span></code>.</p>
<section id="individual-dependency-resolution">
<h3>Individual Dependency Resolution<a class="headerlink" href="#individual-dependency-resolution" title="Permalink to this heading">#</a></h3>
<p>While <code class="docutils literal notranslate"><span class="pre">-DARROW_DEPENDENCY_SOURCE=$SOURCE</span></code> sets a global default for all
packages, the resolution strategy can be overridden for individual packages by
setting <code class="docutils literal notranslate"><span class="pre">-D$PACKAGE_NAME_SOURCE=..</span></code>. For example, to build Protocol Buffers
from source, set</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>-DProtobuf_SOURCE<span class="o">=</span>BUNDLED
</pre></div>
</div>
<p>This variable is unfortunately case-sensitive; the name used for each package
is listed above, but the most up-to-date listing can be found in
<a class="reference external" href="https://github.com/apache/arrow/blob/main/cpp/cmake_modules/ThirdpartyToolchain.cmake">cpp/cmake_modules/ThirdpartyToolchain.cmake</a>.</p>
</section>
<section id="bundled-dependency-versions">
<h3>Bundled Dependency Versions<a class="headerlink" href="#bundled-dependency-versions" title="Permalink to this heading">#</a></h3>
<p>When using the <code class="docutils literal notranslate"><span class="pre">BUNDLED</span></code> method to build a dependency from source, the
version number from <code class="docutils literal notranslate"><span class="pre">cpp/thirdparty/versions.txt</span></code> is used. There is also a
dependency source downloader script (see below), which can be used to set up
offline builds.</p>
<p>When using <code class="docutils literal notranslate"><span class="pre">BUNDLED</span></code> for dependency resolution (and if you use either the
jemalloc or mimalloc allocators, which are recommended), statically linking the
Arrow libraries in a third party project is more complex. See below for
instructions about how to configure your build system in this case.</p>
</section>
<section id="boost-related-options">
<h3>Boost-related Options<a class="headerlink" href="#boost-related-options" title="Permalink to this heading">#</a></h3>
<p>We depend on some Boost C++ libraries for cross-platform support. In most cases,
the Boost version available in your package manager may be new enough, and the
build system will find it automatically. If you have Boost installed in a
non-standard location, you can specify it by passing
<code class="docutils literal notranslate"><span class="pre">-DBOOST_ROOT=$MY_BOOST_ROOT</span></code> or setting the <code class="docutils literal notranslate"><span class="pre">BOOST_ROOT</span></code> environment
variable.</p>
</section>
<section id="offline-builds">
<h3>Offline Builds<a class="headerlink" href="#offline-builds" title="Permalink to this heading">#</a></h3>
<p>If you do not use the above variables to direct the Arrow build system to
preinstalled dependencies, they will be built automatically by the Arrow build
system. The source archive for each dependency will be downloaded via the
internet, which can cause issues in environments with limited access to the
internet.</p>
<p>To enable offline builds, you can download the source artifacts yourself and
use environment variables of the form <code class="docutils literal notranslate"><span class="pre">ARROW_$LIBRARY_URL</span></code> to direct the
build system to read from a local file rather than accessing the internet.</p>
<p>To make this easier for you, we have prepared a script
<code class="docutils literal notranslate"><span class="pre">thirdparty/download_dependencies.sh</span></code> which will download the correct version
of each dependency to a directory of your choosing. It will print a list of
bash-style environment variable statements at the end to use for your build
script.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp"># </span>Download<span class="w"> </span>tarballs<span class="w"> </span>into<span class="w"> </span><span class="nv">$HOME</span>/arrow-thirdparty
<span class="gp">$ </span>./thirdparty/download_dependencies.sh<span class="w"> </span><span class="nv">$HOME</span>/arrow-thirdparty
</pre></div>
</div>
<p>You can then invoke CMake to create the build directory and it will use the
declared environment variable pointing to downloaded archives instead of
downloading them (one for each build dir!).</p>
</section>
<section id="statically-linking">
<h3>Statically Linking<a class="headerlink" href="#statically-linking" title="Permalink to this heading">#</a></h3>
<p>When <code class="docutils literal notranslate"><span class="pre">-DARROW_BUILD_STATIC=ON</span></code>, all build dependencies built as static
libraries by the Arrow build system will be merged together to create a static
library <code class="docutils literal notranslate"><span class="pre">arrow_bundled_dependencies</span></code>. In UNIX-like environments (Linux, macOS,
MinGW), this is called <code class="docutils literal notranslate"><span class="pre">libarrow_bundled_dependencies.a</span></code> and on Windows with
Visual Studio <code class="docutils literal notranslate"><span class="pre">arrow_bundled_dependencies.lib</span></code>. This “dependency bundle”
library is installed in the same place as the other Arrow static libraries.</p>
<p>If you are using CMake, the bundled dependencies will automatically be included
when linking if you use the <code class="docutils literal notranslate"><span class="pre">arrow_static</span></code> CMake target. In other build
systems, you may need to explicitly link to the dependency bundle. We created
an <a class="reference external" href="https://github.com/apache/arrow/tree/main/cpp/examples/minimal_build">example CMake-based build configuration</a> to
show you a working example.</p>
<p>On Linux and macOS, if your application does not link to the <code class="docutils literal notranslate"><span class="pre">pthread</span></code>
library already, you must include <code class="docutils literal notranslate"><span class="pre">-pthread</span></code> in your linker setup. In CMake
this can be accomplished with the <code class="docutils literal notranslate"><span class="pre">Threads</span></code> built-in package:</p>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="nb">set</span><span class="p">(</span><span class="s">THREADS_PREFER_PTHREAD_FLAG</span><span class="w"> </span><span class="s">ON</span><span class="p">)</span>
<span class="nb">find_package</span><span class="p">(</span><span class="s">Threads</span><span class="w"> </span><span class="s">REQUIRED</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="s">my_target</span><span class="w"> </span><span class="s">PRIVATE</span><span class="w"> </span><span class="s">Threads::Threads</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="extra-debugging-help">
<span id="cpp-extra-debugging"></span><h3>Extra debugging help<a class="headerlink" href="#extra-debugging-help" title="Permalink to this heading">#</a></h3>
<p>If you use the CMake option <code class="docutils literal notranslate"><span class="pre">-DARROW_EXTRA_ERROR_CONTEXT=ON</span></code> it will compile
the libraries with extra debugging information on error checks inside the
<code class="docutils literal notranslate"><span class="pre">RETURN_NOT_OK</span></code> macro. In unit tests with <code class="docutils literal notranslate"><span class="pre">ASSERT_OK</span></code>, this will yield error
outputs like:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>../src/arrow/ipc/ipc-read-write-test.cc:609:<span class="w"> </span>Failure
Failed
../src/arrow/ipc/metadata-internal.cc:508<span class="w"> </span>code:<span class="w"> </span>TypeToFlatbuffer<span class="o">(</span>fbb,<span class="w"> </span>*field.type<span class="o">()</span>,<span class="w"> </span><span class="p">&amp;</span>children,<span class="w"> </span><span class="p">&amp;</span>layout,<span class="w"> </span><span class="p">&amp;</span>type_enum,<span class="w"> </span>dictionary_memo,<span class="w"> </span><span class="p">&amp;</span>type_offset<span class="o">)</span>
../src/arrow/ipc/metadata-internal.cc:598<span class="w"> </span>code:<span class="w"> </span>FieldToFlatbuffer<span class="o">(</span>fbb,<span class="w"> </span>*schema.field<span class="o">(</span>i<span class="o">)</span>,<span class="w"> </span>dictionary_memo,<span class="w"> </span><span class="p">&amp;</span>offset<span class="o">)</span>
../src/arrow/ipc/metadata-internal.cc:651<span class="w"> </span>code:<span class="w"> </span>SchemaToFlatbuffer<span class="o">(</span>fbb,<span class="w"> </span>schema,<span class="w"> </span>dictionary_memo,<span class="w"> </span><span class="p">&amp;</span>fb_schema<span class="o">)</span>
../src/arrow/ipc/writer.cc:697<span class="w"> </span>code:<span class="w"> </span>WriteSchemaMessage<span class="o">(</span>schema_,<span class="w"> </span>dictionary_memo_,<span class="w"> </span><span class="p">&amp;</span>schema_fb<span class="o">)</span>
../src/arrow/ipc/writer.cc:730<span class="w"> </span>code:<span class="w"> </span>WriteSchema<span class="o">()</span>
../src/arrow/ipc/writer.cc:755<span class="w"> </span>code:<span class="w"> </span>schema_writer.Write<span class="o">(</span><span class="p">&amp;</span>dictionaries_<span class="o">)</span>
../src/arrow/ipc/writer.cc:778<span class="w"> </span>code:<span class="w"> </span>CheckStarted<span class="o">()</span>
../src/arrow/ipc/ipc-read-write-test.cc:574<span class="w"> </span>code:<span class="w"> </span>writer-&gt;WriteRecordBatch<span class="o">(</span>batch<span class="o">)</span>
NotImplemented:<span class="w"> </span>Unable<span class="w"> </span>to<span class="w"> </span>convert<span class="w"> </span>type:<span class="w"> </span>decimal<span class="o">(</span><span class="m">19</span>,<span class="w"> </span><span class="m">4</span><span class="o">)</span>
</pre></div>
</div>
</section>
<section id="deprecations-and-api-changes">
<h3>Deprecations and API Changes<a class="headerlink" href="#deprecations-and-api-changes" title="Permalink to this heading">#</a></h3>
<p>We use the compiler definition <code class="docutils literal notranslate"><span class="pre">ARROW_NO_DEPRECATED_API</span></code> to disable APIs that
have been deprecated. It is a good practice to compile third party applications
with this flag to proactively catch and account for API changes.</p>
</section>
<section id="modular-build-targets">
<h3>Modular Build Targets<a class="headerlink" href="#modular-build-targets" title="Permalink to this heading">#</a></h3>
<p>Since there are several major parts of the C++ project, we have provided
modular CMake targets for building each library component, group of unit tests
and benchmarks, and their dependencies:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">arrow</span></code> for Arrow core libraries</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">parquet</span></code> for Parquet libraries</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">gandiva</span></code> for Gandiva (LLVM expression compiler) libraries</p></li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If you have selected Ninja as CMake generator, replace <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">arrow</span></code> with
<code class="docutils literal notranslate"><span class="pre">ninja</span> <span class="pre">arrow</span></code>, and so on.</p>
</div>
<p>To build the unit tests or benchmarks, add <code class="docutils literal notranslate"><span class="pre">-tests</span></code> or <code class="docutils literal notranslate"><span class="pre">-benchmarks</span></code>
to the target name. So <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">arrow-tests</span></code> will build the Arrow core unit
tests. Using the <code class="docutils literal notranslate"><span class="pre">-all</span></code> target, e.g. <code class="docutils literal notranslate"><span class="pre">parquet-all</span></code>, will build everything.</p>
<p>If you wish to only build and install one or more project subcomponents, we
have provided the CMake option <code class="docutils literal notranslate"><span class="pre">ARROW_OPTIONAL_INSTALL</span></code> to only install
targets that have been built. For example, if you only wish to build the
Parquet libraries, its tests, and its dependencies, you can run:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>cmake<span class="w"> </span>..<span class="w"> </span>-DARROW_PARQUET<span class="o">=</span>ON<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-DARROW_OPTIONAL_INSTALL<span class="o">=</span>ON<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-DARROW_BUILD_TESTS<span class="o">=</span>ON
make<span class="w"> </span>parquet
make<span class="w"> </span>install
</pre></div>
</div>
<p>If you omit an explicit target when invoking <code class="docutils literal notranslate"><span class="pre">make</span></code>, all targets will be
built.</p>
</section>
<section id="debugging-with-xcode-on-macos">
<h3>Debugging with Xcode on macOS<a class="headerlink" href="#debugging-with-xcode-on-macos" title="Permalink to this heading">#</a></h3>
<p>Xcode is the IDE provided with macOS and can be use to develop and debug Arrow
by generating an Xcode project:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span><span class="nb">cd</span><span class="w"> </span>cpp
mkdir<span class="w"> </span>xcode-build
<span class="nb">cd</span><span class="w"> </span>xcode-build
cmake<span class="w"> </span>..<span class="w"> </span>-G<span class="w"> </span>Xcode<span class="w"> </span>-DARROW_BUILD_TESTS<span class="o">=</span>ON<span class="w"> </span>-DCMAKE_BUILD_TYPE<span class="o">=</span>DEBUG
open<span class="w"> </span>arrow.xcodeproj
</pre></div>
</div>
<p>This will generate a project and open it in the Xcode app. As an alternative,
the command <code class="docutils literal notranslate"><span class="pre">xcodebuild</span></code> will perform a command-line build using the
generated project. It is recommended to use the “Automatically Create Schemes”
option when first launching the project. Selecting an auto-generated scheme
will allow you to build and run a unittest with breakpoints enabled.</p>
</section>
</section>
</section>
</article>
<footer class="prev-next-footer">
<div class="prev-next-area">
<a class="left-prev"
href="index.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
<p class="prev-next-title">C++ Development</p>
</div>
</a>
<a class="right-next"
href="development.html"
title="next page">
<div class="prev-next-info">
<p class="prev-next-subtitle">next</p>
<p class="prev-next-title">Development Guidelines</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item">
<div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> On this page
</div>
<nav class="bd-toc-nav page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#system-setup">System setup</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#building">Building</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#cmake-presets">CMake presets</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#manual-configuration">Manual configuration</a><ul class="nav section-nav flex-column">
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#faster-builds-with-ninja">Faster builds with Ninja</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#unity-builds">Unity builds</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#optional-components">Optional Components</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#optional-targets">Optional Targets</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#optional-checks">Optional Checks</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#cmake-version-requirements">CMake version requirements</a></li>
<li class="toc-h4 nav-item toc-entry"><a class="reference internal nav-link" href="#llvm-and-clang-tools">LLVM and Clang Tools</a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#build-dependency-management">Build Dependency Management</a><ul class="visible nav section-nav flex-column">
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#individual-dependency-resolution">Individual Dependency Resolution</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#bundled-dependency-versions">Bundled Dependency Versions</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#boost-related-options">Boost-related Options</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#offline-builds">Offline Builds</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#statically-linking">Statically Linking</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#extra-debugging-help">Extra debugging help</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#deprecations-and-api-changes">Deprecations and API Changes</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#modular-build-targets">Modular Build Targets</a></li>
<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#debugging-with-xcode-on-macos">Debugging with Xcode on macOS</a></li>
</ul>
</li>
</ul>
</nav></div>
<div class="sidebar-secondary-item">
<div class="tocsection editthispage">
<a href="https://github.com/apache/arrow/edit/main/docs/source/developers/cpp/building.rst">
<i class="fa-solid fa-pencil"></i>
Edit on GitHub
</a>
</div>
</div>
</div></div>
</div>
<footer class="bd-footer-content">
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script src="../../_static/scripts/bootstrap.js?digest=8d27b9dea8ad943066ae"></script>
<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=8d27b9dea8ad943066ae"></script>
<footer class="bd-footer">
<div class="bd-footer__inner bd-page-width">
<div class="footer-items__start">
<div class="footer-item">
<p class="copyright">
© Copyright 2016-2024 Apache Software Foundation.
Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.
<br/>
</p>
</div>
<div class="footer-item">
<p class="sphinx-version">
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 6.2.0.
<br/>
</p>
</div>
</div>
<div class="footer-items__end">
<div class="footer-item">
<p class="theme-version">
Built with the <a href="https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html">PyData Sphinx Theme</a> 0.15.2.
</p></div>
</div>
</div>
</footer>
</body>
</html>