blob: 517acc476e23785e88a92846fdf356b20c940d27 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Boards Support &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></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/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="CMake Support" href="cmake.html" />
<link rel="prev" title="Architecture-Specific Code" href="arch/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../latest" selected="selected">latest</option>
<option value="../../10.0.0" >10.0.0</option>
<option value="../../10.0.1" >10.0.1</option>
<option value="../../10.1.0" >10.1.0</option>
<option value="../../10.2.0" >10.2.0</option>
<option value="../../10.3.0" >10.3.0</option>
<option value="../../11.0.0" >11.0.0</option>
<option value="../../12.0.0" >12.0.0</option>
<option value="../../12.1.0" >12.1.0</option>
<option value="../../12.2.0" >12.2.0</option>
<option value="../../12.2.1" >12.2.1</option>
<option value="../../12.3.0" >12.3.0</option>
<option value="../../12.4.0" >12.4.0</option>
<option value="../../12.5.0" >12.5.0</option>
<option value="../../12.5.1" >12.5.1</option>
<option value="../../12.6.0" >12.6.0</option>
<option value="../../12.7.0" >12.7.0</option>
<option value="../../12.8.0" >12.8.0</option>
<option value="../../12.9.0" >12.9.0</option>
<option value="../../12.10.0" >12.10.0</option>
<option value="../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="filesystem/index.html">NuttX File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Boards Support</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#board-specific-configurations">Board-Specific Configurations</a></li>
<li class="toctree-l3"><a class="reference internal" href="#boards-directory-structure"><code class="docutils literal notranslate"><span class="pre">boards/</span></code> Directory Structure</a></li>
<li class="toctree-l3"><a class="reference internal" href="#summary-of-files">Summary of Files</a></li>
<li class="toctree-l3"><a class="reference internal" href="#configuration-variables">Configuration Variables</a></li>
<li class="toctree-l3"><a class="reference internal" href="#supported-boards">Supported Boards</a></li>
<li class="toctree-l3"><a class="reference internal" href="#configuring-nuttx">Configuring NuttX</a></li>
<li class="toctree-l3"><a class="reference internal" href="#adding-a-new-board-configuration">Adding a New Board Configuration</a></li>
<li class="toctree-l3"><a class="reference internal" href="#building-symbol-tables">Building Symbol Tables</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logos/index.html">NuttX Logos</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">OS Components</a></li>
<li class="breadcrumb-item active">Boards Support</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/components/boards.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="boards-support">
<h1>Boards Support<a class="headerlink" href="#boards-support" title="Permalink to this heading"></a></h1>
<p>This page discusses the board support logic for NuttX.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">nuttx/boards</span></code> directory is a part of the internal OS. It should contain
only OS bring-up logic and driver initialization logic.</p>
<p><strong>THERE SHOULD BE NO APPLICATION CALLABLE LOGIC IN THIS DIRECTORY.</strong></p>
<p>If you have board-specific, application callable logic, that logic should not
go here. Please consider using a sub-directory under <code class="docutils literal notranslate"><span class="pre">apps/platform</span></code> instead.</p>
<section id="board-specific-configurations">
<h2>Board-Specific Configurations<a class="headerlink" href="#board-specific-configurations" title="Permalink to this heading"></a></h2>
<p>The NuttX configuration consists of:</p>
<ul>
<li><p>Processor architecture specific files. These are the files contained
in the <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/</span></code> directory.</p></li>
<li><p>Chip/SoC specific files. Each processor architecture is embedded
in a chip or System-on-a-Chip (SoC) architecture. The full chip
architecture includes the processor architecture plus chip-specific
interrupt logic, general purpose I/O (GIO) logic, and specialized,
internal peripherals (such as UARTs, USB, etc.).</p>
<p>These chip-specific files are contained within chip-specific
sub-directories in the <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/</span></code> directory and are selected
via the <code class="docutils literal notranslate"><span class="pre">CONFIG_ARCH_name</span></code> selection</p>
</li>
<li><p>Board specific files. In order to be usable, the chip must be
contained in a board environment. The board configuration defines
additional properties of the board including such things as
peripheral LEDs, external peripherals (such as network, USB, etc.).</p>
<p>These board-specific configuration files can be found in the
<code class="docutils literal notranslate"><span class="pre">boards/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;/</span></code> sub-directories.
Additional configuration information may be available in board-specific documentation pages
at <code class="docutils literal notranslate"><span class="pre">Documentation/platforms/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;</span></code>.</p>
</li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">boards/</span></code> subdirectory contains configuration data for each board. These
board-specific configurations plus the architecture-specific configurations in
the <code class="docutils literal notranslate"><span class="pre">arch/</span></code> subdirectory completely define a customized port of NuttX.</p>
</section>
<section id="boards-directory-structure">
<h2><code class="docutils literal notranslate"><span class="pre">boards/</span></code> Directory Structure<a class="headerlink" href="#boards-directory-structure" title="Permalink to this heading"></a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">boards/</span></code> directory contains board specific configuration logic. Each
board must provide a subdirectory <code class="docutils literal notranslate"><span class="pre">&lt;board&gt;</span></code> under <code class="docutils literal notranslate"><span class="pre">boards/</span></code> with the
following characteristics:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&lt;board&gt;
|-- include/
| `-- (board-specific header files)
|-- src/
| |-- Makefile
| `-- (board-specific source files)
|-- &lt;config1-dir&gt;
| |-- Make.defs
| `-- defconfig
|-- &lt;config2-dir&gt;
| |-- Make.defs
| `-- defconfig
...
</pre></div>
</div>
</section>
<section id="summary-of-files">
<h2>Summary of Files<a class="headerlink" href="#summary-of-files" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">include/</span></code> – This directory contains board specific header files. This
directory will be linked as include/arch/board at configuration time and
can be included via #include &lt;arch/board/header.h&gt;``. These header file
can only be included by files in <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;include/</span></code> and
<code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/src</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">src/</span></code> – This directory contains board specific drivers. This
directory will be linked as <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/src/board</span></code> at configuration
time and will be integrated into the build system.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">src/Makefile</span></code> – This makefile will be invoked to build the board specific
drivers. It must support the following targets: <code class="docutils literal notranslate"><span class="pre">libext$(LIBEXT)</span></code>, <code class="docutils literal notranslate"><span class="pre">clean</span></code>,
and <code class="docutils literal notranslate"><span class="pre">distclean</span></code>.</p></li>
</ul>
<p>A board may have various different configurations using these common source
files. Each board configuration is described by two files: Make.defs and
defconfig. Typically, each set of configuration files is retained in a
separate configuration sub-directory (<code class="docutils literal notranslate"><span class="pre">&lt;config1-dir&gt;</span></code>, <code class="docutils literal notranslate"><span class="pre">&lt;config2-dir&gt;</span></code>, ..
in the above diagram).</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">Make.defs</span></code> – This makefile fragment provides architecture and
tool-specific build options. It will be included by all other
makefiles in the build (once it is installed). This make fragment
should define:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Tools: CC, LD, AR, NM, OBJCOPY, OBJDUMP
Tool options: CFLAGS, LDFLAGS
</pre></div>
</div>
<p>When this makefile fragment runs, it will be passed TOPDIR which
is the path to the root directory of the build. This makefile
fragment should include:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>$(TOPDIR)/.config : NuttX configuration
$(TOPDIR)/tools/Config.mk : Common definitions
</pre></div>
</div>
<p>Definitions in the <code class="docutils literal notranslate"><span class="pre">Make.defs</span></code> file probably depend on some of the
settings in the <code class="docutils literal notranslate"><span class="pre">.config</span></code> file. For example, the <code class="docutils literal notranslate"><span class="pre">CFLAGS</span></code> will most likely be
different if <code class="docutils literal notranslate"><span class="pre">CONFIG_DEBUG_FEATURES=y</span></code>.</p>
<p>The included <code class="docutils literal notranslate"><span class="pre">tools/Config.mk</span></code> file contains additional definitions that may
be overridden in the architecture-specific <code class="docutils literal notranslate"><span class="pre">Make.defs</span></code> file as necessary:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>COMPILE, ASSEMBLE, ARCHIVE, CLEAN, and MKDEP macros
</pre></div>
</div>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">defconfig</span></code> – This is a configuration file similar to the Linux
configuration file. In contains variable/value pairs like:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>CONFIG_VARIABLE=value
</pre></div>
</div>
<p>This configuration file will be used at build time:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>as a makefile fragment included in other makefiles, and</p></li>
<li><p>to generate include/nuttx/config.h which is included by
most C files in the system.</p></li>
</ol>
</div></blockquote>
</li>
</ul>
</section>
<section id="configuration-variables">
<h2>Configuration Variables<a class="headerlink" href="#configuration-variables" title="Permalink to this heading"></a></h2>
<p>At one time, this section provided a list of all NuttX configuration
variables. However, NuttX has since converted to use the kconfig-frontends
tools (See <a class="reference external" href="https://bitbucket.org/nuttx/tools/src/master/kconfig-frontends/">https://bitbucket.org/nuttx/tools/src/master/kconfig-frontends/</a>.)
Now, the NuttX configuration is determined by a self-documenting set of
Kconfig files.</p>
<p>The current NuttX configuration variables are also documented in separate,
auto-generated configuration variable document. That configuration variable
document is generated using the kconfig2html tool that can be found in the
nuttx/tools directory. That tool analyzes the NuttX Kconfig files and
generates an excruciatingly boring HTML document.</p>
<p>The latest boring configuration variable documentation can be regenerated at
any time using that tool or, more appropriately, the wrapper script at
nuttx/tools/mkconfigvars.sh. That script will generate the file
nuttx/Documentation/NuttXConfigVariables.html.</p>
</section>
<section id="supported-boards">
<h2>Supported Boards<a class="headerlink" href="#supported-boards" title="Permalink to this heading"></a></h2>
<p>The list of supported boards can be found in <a class="reference internal" href="../platforms/index.html#platforms"><span class="std std-ref">Supported Platforms</span></a>.</p>
</section>
<section id="configuring-nuttx">
<h2>Configuring NuttX<a class="headerlink" href="#configuring-nuttx" title="Permalink to this heading"></a></h2>
<p>Configuring NuttX requires only copying:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>boards/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;/&lt;config-dir&gt;/Make.def to ${TOPDIR}/Make.defs
boards/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;/&lt;config-dir&gt;/defconfig to ${TOPDIR}/.config
</pre></div>
</div>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">tools/configure.sh</span></code></p>
<p>There is a script that automates these steps. The following steps will
accomplish the same configuration:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>tools/configure.sh &lt;board&gt;:&lt;config-dir&gt;
</pre></div>
</div>
<p>There is an alternative Windows batch file that can be used in the
windows native environment like:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>tools\configure.bat &lt;board&gt;:&lt;config-dir&gt;
</pre></div>
</div>
<p>See <a class="reference internal" href="tools/index.html"><span class="doc">/tools Host Tools</span></a> for more information about these scripts.</p>
<p>And if your application directory is not in the standard location (<code class="docutils literal notranslate"><span class="pre">../apps</span></code>
or <code class="docutils literal notranslate"><span class="pre">../apps-&lt;version&gt;</span></code>), then you should also specify the location of the
application directory on the command line like:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>cd tools
./configure.sh -a &lt;app-dir&gt; &lt;board&gt;:&lt;config-dir&gt;
</pre></div>
</div>
</li>
</ul>
</section>
<section id="adding-a-new-board-configuration">
<h2>Adding a New Board Configuration<a class="headerlink" href="#adding-a-new-board-configuration" title="Permalink to this heading"></a></h2>
<p>Okay, so you have created a new board configuration directory.
Now, how do you hook this board into the configuration system so
that you can select with <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">menuconfig</span></code>?</p>
<p>You will need modify the file <code class="docutils literal notranslate"><span class="pre">boards/Kconfig</span></code>. Let’s look at
the STM32F4-Discovery configuration in the <code class="docutils literal notranslate"><span class="pre">Kconfig</span></code> file and
see how we would add a new board directory to the configuration.
For this configuration let’s say that you new board resides in the
directory <code class="docutils literal notranslate"><span class="pre">boards/myarch/mychip/myboard</span></code>; It uses an MCU
selected with <code class="docutils literal notranslate"><span class="pre">CONFIG_ARCH_CHIP_MYMCU</span></code>; and you want the board
to be selected with <code class="docutils literal notranslate"><span class="pre">CONFIG_ARCH_BOARD_MYBOARD</span></code>. Then here is
how you can clone the STM32F4-Discovery configuration in
<code class="docutils literal notranslate"><span class="pre">boards/Kconfig</span></code> to support your new board configuration.</p>
<p>In <code class="docutils literal notranslate"><span class="pre">boards/Kconfig</span></code> for the stm32f4-discovery, you will see a
configuration definition like this:</p>
<p>The above selects the STM32F4-Discovery board. The <code class="docutils literal notranslate"><span class="pre">select</span></code>
lines say that the board has both LEDs and buttons and that the
board can generate interrupts from the button presses. You can
just copy the above configuration definition to a new location
(notice that they the configurations are in alphabetical order).
Then you should edit the configuration to support your board. The
final configuration definition might look something like:</p>
<p>Later in the <code class="docutils literal notranslate"><span class="pre">boards/Kconfig</span></code> file, you will see a long, long
string configuration with lots of defaults like this:</p>
<p>This logic will assign string value to a configuration variable
called <code class="docutils literal notranslate"><span class="pre">CONFIG_ARCH_BOARD</span></code> that will name the directory where
the board-specific files reside. In our case, these files reside
in <code class="docutils literal notranslate"><span class="pre">boards/myarch/mychip/myboard</span></code> and we add the following to
the long list of defaults (again in alphabetical order):</p>
<p>Now the build system knows where to find your board configuration!</p>
<p>And finally, add something like this near the bottom of
<code class="docutils literal notranslate"><span class="pre">boards/myarch/mychip/myboard</span></code>:</p>
<p>This includes additional, board-specific configuration variable
definitions in <code class="docutils literal notranslate"><span class="pre">boards/myarch/mychip/myboard/Kconfig</span></code>.</p>
</section>
<section id="building-symbol-tables">
<h2>Building Symbol Tables<a class="headerlink" href="#building-symbol-tables" title="Permalink to this heading"></a></h2>
<p>Symbol tables are needed at several of the binfmt interfaces in order to bind
a module to the base code. These symbol tables can be tricky to create and
will probably have to be tailored for any specific application, balancing
the number of symbols and the size of the symbol table against the symbols
required by the applications.</p>
<p>The top-level System.map file is one good source of symbol information
(which, or course, was just generated from the top-level nuttx file
using the GNU ‘nm’ tool).</p>
<p>There are also common-separated value (CSV) values in the source try that
provide information about symbols. In particular:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>nuttx/syscall/syscall.csv - Describes the NuttX RTOS interface, and
nuttx/lib/libc.csv - Describes the NuttX C library interface.
</pre></div>
</div>
<p>There is a tool at nuttx/tools/mksymtab that will use these CSV files as
input to generate a generic symbol table. See <code class="docutils literal notranslate"><span class="pre">nuttx/tools/README.txt</span></code> for
more information about using the mksymtab tool.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="arch/index.html" class="btn btn-neutral float-left" title="Architecture-Specific Code" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="cmake.html" class="btn btn-neutral float-right" title="CMake Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>