| <!-- |
| 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>Compiling with CMake — 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="Running" href="running.html" /> |
| <link rel="prev" title="Compiling with Make" href="compiling_make.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 current"><a class="reference internal" href="index.html">Getting Started</a><ul class="current"> |
| <li class="toctree-l2"><a class="reference internal" href="install.html">Installing</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="compiling_make.html">Compiling with Make</a></li> |
| <li class="toctree-l2 current"><a class="current reference internal" href="#">Compiling with CMake</a><ul> |
| <li class="toctree-l3"><a class="reference internal" href="#initialize-configuration-with-cmake">Initialize Configuration with CMake</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#build-nuttx-with-cmake">Build NuttX with CMake</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#out-of-tree-building">Out-of-tree building</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#building-kernel-configs">Building KERNEL configs</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l2"><a class="reference internal" href="running.html">Running</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="configuring.html">Configuring</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="debugging.html">Debugging</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="organization.html">Directory Structure</a></li> |
| </ul> |
| </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"><a class="reference internal" href="../components/index.html">OS Components</a></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">Getting Started</a></li> |
| <li class="breadcrumb-item active">Compiling with CMake</li> |
| <li class="wy-breadcrumbs-aside"> |
| <a href="../_sources/quickstart/compiling_cmake.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="compiling-with-cmake"> |
| <h1>Compiling with CMake<a class="headerlink" href="#compiling-with-cmake" title="Permalink to this heading"></a></h1> |
| <section id="initialize-configuration-with-cmake"> |
| <h2>Initialize Configuration with CMake<a class="headerlink" href="#initialize-configuration-with-cmake" title="Permalink to this heading"></a></h2> |
| <p>The first step is to initialize NuttX configuration for a given board, based on |
| a pre-existing configuration. To list all supported configurations you can do:</p> |
| <blockquote> |
| <div><div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>nuttx |
| <span class="gp">$ </span>./tools/configure.sh<span class="w"> </span>-L<span class="w"> </span><span class="p">|</span><span class="w"> </span>less |
| </pre></div> |
| </div> |
| </div></blockquote> |
| <p>The output is in the format <code class="docutils literal notranslate"><span class="pre"><board</span> <span class="pre">name>:<board</span> <span class="pre">configuration></span></code>. You will see that |
| generally all boards support the <code class="docutils literal notranslate"><span class="pre">nsh</span></code> configuration which is a good starting point |
| since it enables booting into the interactive command line |
| <a class="reference internal" href="../applications/nsh/index.html"><span class="doc">NuttShell (NSH)</span></a>.</p> |
| <p>To choose a configuration you pass the <code class="docutils literal notranslate"><span class="pre"><board</span> <span class="pre">name>:<board</span> <span class="pre">configuration></span></code> such as:</p> |
| <blockquote> |
| <div><div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>nuttx |
| <span class="gp">$ </span>cmake<span class="w"> </span>-B<span class="w"> </span>build<span class="w"> </span>-DBOARD_CONFIG<span class="o">=</span>stm32f4discovery:nsh<span class="w"> </span>-GNinja |
| </pre></div> |
| </div> |
| </div></blockquote> |
| <p>The <code class="docutils literal notranslate"><span class="pre">-B</span> <span class="pre">build</span></code> tells what is the build directory.</p> |
| <p>You can then customize this configuration by using the menu based |
| configuration system with:</p> |
| <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>nuttx |
| <span class="gp">$ </span>cmake<span class="w"> </span>--build<span class="w"> </span>build<span class="w"> </span>-t<span class="w"> </span>menuconfig |
| </pre></div> |
| </div> |
| <p>Modifying the configuration is covered in <a class="reference internal" href="configuring.html"><span class="doc">Configuring</span></a>.</p> |
| </section> |
| <section id="build-nuttx-with-cmake"> |
| <h2>Build NuttX with CMake<a class="headerlink" href="#build-nuttx-with-cmake" title="Permalink to this heading"></a></h2> |
| <p>We can now build NuttX. To do so, you can simply run:</p> |
| <blockquote> |
| <div><div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>nuttx |
| <span class="gp">$ </span>cmake<span class="w"> </span>--build<span class="w"> </span>build |
| </pre></div> |
| </div> |
| </div></blockquote> |
| <p>The build will complete by generating the binary outputs |
| inside <code class="docutils literal notranslate"><span class="pre">build/</span></code> directory. Typically this includes the <code class="docutils literal notranslate"><span class="pre">nuttx</span></code> |
| ELF file (suitable for debugging using <code class="docutils literal notranslate"><span class="pre">gdb</span></code>) and a <code class="docutils literal notranslate"><span class="pre">nuttx.bin</span></code> |
| file that can be flashed to the board.</p> |
| <p>To clean the build, you can do:</p> |
| <blockquote> |
| <div><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>build<span class="w"> </span>-t<span class="w"> </span>clean |
| </pre></div> |
| </div> |
| </div></blockquote> |
| </section> |
| <section id="out-of-tree-building"> |
| <h2>Out-of-tree building<a class="headerlink" href="#out-of-tree-building" title="Permalink to this heading"></a></h2> |
| <p>Key benefit of CMake is the out-of-tree building, which allows one to have different build folders for different configs, very proper if one need check multiple configs for the same codebase. Out-of-tree means above <code class="docutils literal notranslate"><span class="pre">build</span></code> folders can be out of Nuttx source tree.</p> |
| <p>Suppose <code class="docutils literal notranslate"><span class="pre">$NUTTX_DIR</span></code> is the nuttx source tree, we can use temporary folder for a particular target config as shown below.</p> |
| <blockquote> |
| <div><div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">echo</span><span class="w"> </span><span class="nv">$NUTTX_DIR</span> |
| <span class="go">/home/user/Projects/Nuttx/nuttx</span> |
| <span class="gp">$ </span>mkdir<span class="w"> </span>-p<span class="w"> </span>~/tmp/rv32/nsh |
| <span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>~/tmp/rv32/nsh |
| <span class="gp"># </span>Make<span class="w"> </span>sure<span class="w"> </span>a<span class="w"> </span>proper<span class="w"> </span>toolchain<span class="w"> </span>is<span class="w"> </span><span class="k">in</span><span class="w"> </span>your<span class="w"> </span><span class="nv">$PATH</span> |
| <span class="gp">$ </span>riscv64-unknown-elf-gcc<span class="w"> </span>-v |
| <span class="gp">$ </span>cmake<span class="w"> </span><span class="nv">$NUTTX_DIR</span><span class="w"> </span>-DBOARD_CONFIG<span class="o">=</span>rv-virt:nsh<span class="w"> </span>-GNinja |
| <span class="go">-- Initializing NuttX</span> |
| <span class="go">-- Board: rv-virt</span> |
| <span class="go">-- Config: nsh</span> |
| <span class="go">-- Appdir: /home/yf/Projects/Nuttx/apps</span> |
| <span class="go">-- The C compiler identification is GNU 10.2.0</span> |
| <span class="go">-- The CXX compiler identification is GNU 10.2.0</span> |
| <span class="go">-- The ASM compiler identification is GNU</span> |
| <span class="go">-- Found assembler: /usr/bin/riscv64-unknown-elf-gcc</span> |
| <span class="go">-- Configuring done</span> |
| <span class="go">-- Generating done</span> |
| <span class="go">-- Build files have been written to: /home/yf/tmp/rv32/nsh</span> |
| <span class="gp">$ </span>ninja |
| <span class="gp">$ </span>size<span class="w"> </span>nuttx |
| <span class="go"> text data bss dec hex filename</span> |
| <span class="go"> 167411 365 11568 179344 2bc90 nuttx</span> |
| </pre></div> |
| </div> |
| </div></blockquote> |
| <p>This approach works for FLAT configs now and PROTECTED configs soon if needed CMake scripts are available already.</p> |
| </section> |
| <section id="building-kernel-configs"> |
| <h2>Building KERNEL configs<a class="headerlink" href="#building-kernel-configs" title="Permalink to this heading"></a></h2> |
| <p>We can use CMake to build the kernel image for KERNEL configs now, assuming apps ROMFS is prepared using the makefile system. If the development focus is kernel side and apps don’t change often, then CMake can help us achieve out-of-tree build if your device’s CMake scripts are ready. Let’s take <code class="docutils literal notranslate"><span class="pre">canm230</span></code> device as an example:</p> |
| <blockquote> |
| <div><div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">echo</span><span class="w"> </span><span class="nv">$NUTTX_DIR</span> |
| <span class="go">/home/user/Projects/Nuttx/nuttx</span> |
| <span class="gp">$ </span>mkdir<span class="w"> </span>-p<span class="w"> </span>~/tmp/k230/nsbi |
| <span class="gp"># </span>copy<span class="w"> </span>the<span class="w"> </span>romfs_boot.c<span class="w"> </span>to<span class="w"> </span>build<span class="w"> </span>folder |
| <span class="gp">$ </span>cp<span class="w"> </span>romfs_boot.c<span class="w"> </span>~/tmp/k230/nsbi |
| <span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>~/tmp/k230/nsbi |
| <span class="gp">$ </span>ls<span class="w"> </span>-l |
| <span class="go">total 976</span> |
| <span class="go">-rw-rw-r-- 1 yf yf 997843 Jul 15 06:23 romfs_boot.c</span> |
| <span class="gp">$ </span>cmake<span class="w"> </span><span class="nv">$NUTTX_DIR</span><span class="w"> </span>-DBOARD_CONFIG<span class="o">=</span>canmv230:nsbi<span class="w"> </span>-GNinja |
| <span class="go">-- Initializing NuttX</span> |
| <span class="go">-- Board: canmv230</span> |
| <span class="go">-- Config: nsbi</span> |
| <span class="go">-- Appdir: /home/yf/Projects/Nuttx/apps</span> |
| <span class="go">-- The C compiler identification is GNU 10.2.0</span> |
| <span class="go">-- The CXX compiler identification is GNU 10.2.0</span> |
| <span class="go">-- The ASM compiler identification is GNU</span> |
| <span class="go">-- Found assembler: /usr/bin/riscv64-unknown-elf-gcc</span> |
| <span class="go">-- Configuring done</span> |
| <span class="go">-- Generating done</span> |
| <span class="go">-- Build files have been written to: /home/yf/tmp/k230/nsbi</span> |
| <span class="gp">$ </span>ninja |
| <span class="gp">$ </span>size<span class="w"> </span>nuttx |
| <span class="go"> text data bss dec hex filename</span> |
| <span class="go">281671 609 37496 319776 4e120 nuttx</span> |
| </pre></div> |
| </div> |
| </div></blockquote> |
| <p>Note that for QEMU targets, we can directly use the apps binary on host folder via <code class="docutils literal notranslate"><span class="pre">hostfs</span></code> in QEMU.</p> |
| <p>So even apps side CMake support is not ready, we still can enjoy CMake for kernel build with KERNEL configs.</p> |
| </section> |
| </section> |
| |
| |
| </div> |
| </div> |
| <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> |
| <a href="compiling_make.html" class="btn btn-neutral float-left" title="Compiling with Make" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> |
| <a href="running.html" class="btn btn-neutral float-right" title="Running" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> |
| </div> |
| |
| <hr/> |
| |
| <div role="contentinfo"> |
| <p>© Copyright 2023, The Apache Software Foundation.</p> |
| </div> |
| |
| |
| |
| </footer> |
| </div> |
| </div> |
| </section> |
| </div> |
| <script> |
| jQuery(function () { |
| SphinxRtdTheme.Navigation.enable(true); |
| }); |
| </script> |
| |
| </body> |
| </html> |