]> granicus.if.org Git - esp-idf/blob - docs/en/api-guides/build-system.rst
8a28a1e16382385315e6f0937a3793b43be66697
[esp-idf] / docs / en / api-guides / build-system.rst
1 Build System
2 ************
3
4 :link_to_translation:`zh_CN:[中文]`
5
6 This document explains the implementation of the ESP-IDF build system and the concept of "components". Read this document if you want to know how to organise and build a new ESP-IDF project or component.
7
8 .. note:: This document describes the CMake-based build system, which is the default since ESP-IDF V4.0. ESP-IDF also supports a :doc:`legacy build system based on GNU Make <build-system-legacy>`, which was the default before ESP-IDF V4.0.
9
10
11 Overview
12 ========
13
14 An ESP-IDF project can be seen as an amalgamation of a number of components.
15 For example, for a webserver that shows the current humidity, there could be:
16
17 - The ESP32 base libraries (libc, ROM bindings, etc)
18 - The WiFi drivers
19 - A TCP/IP stack
20 - The FreeRTOS operating system
21 - A webserver
22 - A driver for the humidity sensor
23 - Main code tying it all together
24
25 ESP-IDF makes these components explicit and configurable. To do that,
26 when a project is compiled, the build system will look up all the
27 components in the ESP-IDF directories, the project directories and
28 (optionally) in additional custom component directories. It then
29 allows the user to configure the ESP-IDF project using a a text-based
30 menu system to customize each component. After the components in the
31 project are configured, the build system will compile the project.
32
33 Concepts
34 --------
35
36 - A "project" is a directory that contains all the files and configuration to build a single "app" (executable), as well as additional supporting elements such as a partition table, data/filesystem partitions, and a bootloader.
37
38 - "Project configuration" is held in a single file called ``sdkconfig`` in the root directory of the project. This configuration file is modified via ``idf.py menuconfig`` to customise the configuration of the project. A single project contains exactly one project configuration.
39
40 - An "app" is an executable which is built by ESP-IDF. A single project will usually build two apps - a "project app" (the main executable, ie your custom firmware) and a "bootloader app" (the initial bootloader program which launches the project app).
41
42 - "components" are modular pieces of standalone code which are compiled into static libraries (.a files) and linked into an app. Some are provided by ESP-IDF itself, others may be sourced from other places.
43
44 - "Target" is the hardware for which an application is built. At the moment, ESP-IDF supports only one target, ``esp32``.
45
46 Some things are not part of the project:
47
48 - "ESP-IDF" is not part of the project. Instead it is standalone, and linked to the project via the ``IDF_PATH`` environment variable which holds the path of the ``esp-idf`` directory. This allows the IDF framework to be decoupled from your project.
49
50 - The toolchain for compilation is not part of the project. The toolchain should be installed in the system command line PATH.
51
52 Using the Build System
53 ======================
54
55 .. _idf.py:
56
57 idf.py
58 ------
59
60 The ``idf.py`` command line tool provides a front-end for easily managing your project builds. It manages the following tools:
61
62 - CMake_, which configures the project to be built
63 - A command line build tool (either Ninja_ build or `GNU Make`)
64 - `esptool.py`_ for flashing ESP32.
65
66 The :ref:`getting started guide <get-started-configure>` contains a brief introduction to how to set up ``idf.py`` to configure, build, and flash projects.
67
68 ``idf.py`` should be run in an ESP-IDF "project" directory, ie one containing a ``CMakeLists.txt`` file. Older style projects with a Makefile will not work with ``idf.py``.
69
70 Type ``idf.py --help`` for a full list of commands. Here are a summary of the most useful ones:
71
72 - ``idf.py menuconfig`` runs the "menuconfig" tool to configure the project.
73 - ``idf.py build`` will build the project found in the current directory. This can involve multiple steps:
74
75   - Create the build directory if needed. The sub-directory ``build`` is used to hold build output, although this can be changed with the ``-B`` option.
76   - Run CMake_ as necessary to configure the project and generate build files for the main build tool.
77   - Run the main build tool (Ninja_ or `GNU Make`). By default, the build tool is automatically detected but it can be explicitly set by passing the ``-G`` option to ``idf.py``.
78
79   Building is incremental so if no source files or configuration has changed since the last build, nothing will be done.
80 - ``idf.py clean`` will "clean" the project by deleting build output files from the build directory, forcing a "full rebuild" the next time the project is built. Cleaning doesn't delete CMake configuration output and some other files.
81 - ``idf.py fullclean`` will delete the entire "build" directory contents. This includes all CMake configuration output. The next time the project is built, CMake will configure it from scratch. Note that this option recursively deletes *all* files in the build directory, so use with care. Project configuration is not deleted.
82 - ``idf.py flash`` will automatically build the project if necessary, and then flash it to an ESP32. The ``-p`` and ``-b`` options can be used to set serial port name and flasher baud rate, respectively.
83 - ``idf.py monitor`` will display serial output from the ESP32. The ``-p`` option can be used to set the serial port name. Type ``Ctrl-]`` to exit the monitor. See :doc:`tools/idf-monitor` for more details about using the monitor.
84
85 Multiple ``idf.py`` commands can be combined into one. For example, ``idf.py -p COM4 clean flash monitor`` will clean the source tree, then build the project and flash it to the ESP32 before running the serial monitor.
86
87 .. note:: The environment variables ``ESPPORT`` and ``ESPBAUD`` can be used to set default values for the ``-p`` and ``-b`` options, respectively. Providing these options on the command line overrides the default.
88
89 .. _idf.py-size:
90
91 Advanced Commands
92 ^^^^^^^^^^^^^^^^^
93
94 - ``idf.py app``, ``idf.py bootloader``, ``idf.py partition_table`` can be used to build only the app, bootloader, or partition table from the project as applicable.
95 - There are matching commands ``idf.py app-flash``, etc. to flash only that single part of the project to the ESP32.
96 - ``idf.py -p PORT erase_flash`` will use esptool.py to erase the ESP32's entire flash chip.
97 - ``idf.py size`` prints some size information about the app. ``size-components`` and ``size-files`` are similar commands which print more detailed per-component or per-source-file information, respectively. If you define variable ``-DOUTPUT_JSON=1`` when running CMake (or ``idf.py``), the output will be formatted as JSON not as human readable text.
98 - ``idf.py reconfigure`` re-runs CMake_ even if it doesn't seem to need re-running. This isn't necessary during normal usage, but can be useful after adding/removing files from the source tree, or when modifying CMake cache variables. For example, ``idf.py -DNAME='VALUE' reconfigure`` can be used to set variable ``NAME`` in CMake cache to value ``VALUE``.
99
100 The order of multiple ``idf.py`` commands on the same invocation is not important, they will automatically be executed in the correct order for everything to take effect (ie building before flashing, erasing before flashing, etc.).
101
102 Using CMake Directly
103 --------------------
104
105 :ref:`idf.py` is a wrapper around CMake_ for convenience. However, you can also invoke CMake directly if you prefer.
106
107 .. highlight:: bash
108
109 When ``idf.py`` does something, it prints each command that it runs for easy reference. For example, the ``idf.py build`` command is the same as running these commands in a bash shell (or similar commands for Windows Command Prompt)::
110
111   mkdir -p build
112   cd build
113   cmake .. -G Ninja   # or 'Unix Makefiles'
114   ninja
115
116 In the above list, the ``cmake`` command configures the project and generates build files for use with the final build tool. In this case the final build tool is Ninja_: running ``ninja`` actually builds the project.
117
118 It's not necessary to run ``cmake`` more than once. After the first build, you only need to run ``ninja`` each time. ``ninja`` will automatically re-invoke ``cmake`` if the project needs reconfiguration.
119
120 If using CMake with ``ninja`` or ``make``, there are also targets for more of the ``idf.py`` sub-commands - for example running ``make menuconfig`` or ``ninja menuconfig`` in the build directory will work the same as ``idf.py menuconfig``.
121
122 .. note::
123    If you're already familiar with CMake_, you may find the ESP-IDF CMake-based build system unusual because it wraps a lot of CMake's functionality to reduce boilerplate. See `writing pure CMake components`_ for some information about writing more "CMake style" components.
124
125 .. _flash-with-ninja-or-make:
126
127 Flashing with ninja or make
128 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
129
130 It's possible to build and flash directly from ninja or make by running a target like::
131
132   ninja flash
133
134 Or::
135
136   make app-flash
137
138 Available targets are: ``flash``, ``app-flash`` (app only), ``bootloader-flash`` (bootloader only).
139
140 When flashing this way, optionally set the ``ESPPORT`` and ``ESPBAUD`` environment variables to specify the serial port and baud rate. You can set environment variables in your operating system or IDE project. Alternatively, set them directly on the command line::
141
142   ESPPORT=/dev/ttyUSB0 ninja flash
143
144 .. note:: Providing environment variables at the start of the command like this is Bash shell Syntax. It will work on Linux and macOS. It won't work when using Windows Command Prompt, but it will work when using Bash-like shells on Windows.
145
146 Or::
147
148   make -j3 app-flash ESPPORT=COM4 ESPBAUD=2000000
149
150 .. note:: Providing variables at the end of the command line is ``make`` syntax, and works for ``make`` on all platforms.
151
152
153 Using CMake in an IDE
154 ---------------------
155
156 You can also use an IDE with CMake integration. The IDE will want to know the path to the project's ``CMakeLists.txt`` file. IDEs with CMake integration often provide their own build tools (CMake calls these "generators") to build the source files as part of the IDE.
157
158 When adding custom non-build steps like "flash" to the IDE, it is recommended to execute ``idf.py`` for these "special" commands.
159
160 For more detailed information about integrating ESP-IDF with CMake into an IDE, see `Build System Metadata`_.
161
162 .. _setting-python-interpreter:
163
164 Setting the Python Interpreter
165 ------------------------------
166
167 Currently, ESP-IDF only works with Python 2.7. If you have a system where the default ``python`` interpreter is Python 3.x, this can lead to problems.
168
169 If using ``idf.py``, running ``idf.py`` as ``python2 $IDF_PATH/tools/idf.py ...`` will work around this issue (``idf.py`` will tell other Python processes to use the same Python interpreter). You can set up a shell alias or another script to simplify the command.
170
171 If using CMake directly, running ``cmake -D PYTHON=python2 ...`` will cause CMake to override the default Python interpreter.
172
173 If using an IDE with CMake, setting the ``PYTHON`` value as a CMake cache override in the IDE UI will override the default Python interpreter.
174
175 To manage the Python version more generally via the command line, check out the tools pyenv_ or virtualenv_. These let you change the default python version.
176
177 .. _example-project-structure:
178
179 Example Project
180 ===============
181
182 .. highlight:: none
183
184 An example project directory tree might look like this::
185
186     - myProject/
187                  - CMakeLists.txt
188                  - sdkconfig
189                  - components/ - component1/ - CMakeLists.txt
190                                              - Kconfig
191                                              - src1.c
192                                - component2/ - CMakeLists.txt
193                                              - Kconfig
194                                              - src1.c
195                                              - include/ - component2.h
196                  - main/       - src1.c
197                                - src2.c
198
199                  - build/
200
201 This example "myProject" contains the following elements:
202
203 - A top-level project CMakeLists.txt file. This is the primary file which CMake uses to learn how to build the project; and may set project-wide CMake variables. It includes the file :idf_file:`/tools/cmake/project.cmake` which
204   implements the rest of the build system. Finally, it sets the project name and defines the project.
205
206 - "sdkconfig" project configuration file. This file is created/updated when ``idf.py menuconfig`` runs, and holds configuration for all of the components in the project (including ESP-IDF itself). The "sdkconfig" file may or may not be added to the source control system of the project.
207
208 - Optional "components" directory contains components that are part of the project. A project does not have to contain custom components of this kind, but it can be useful for structuring reusable code or including third party components that aren't part of ESP-IDF.
209
210 - "main" directory is a special "pseudo-component" that contains source code for the project itself. "main" is a default name, the CMake variable ``COMPONENT_DIRS`` includes this component but you can modify this variable. Alternatively, ``EXTRA_COMPONENT_DIRS`` can be set in the top-level CMakeLists.txt to look for components in other places. See the :ref:`renaming main <rename-main>` section for more info. If you have a lot of source files in your project, we recommend grouping most into components instead of putting them all in "main".
211
212 - "build" directory is where build output is created. This directory is created by ``idf.py`` if it doesn't already exist. CMake configures the project and generates interim build files in this directory. Then, after the main build process is run, this directory will also contain interim object files and libraries as well as final binary output files. This directory is usually not added to source control or distributed with the project source code.
213
214 Component directories each contain a component ``CMakeLists.txt`` file. This file contains variable definitions
215 to control the build process of the component, and its integration into the overall project. See `Component CMakeLists Files`_ for more details.
216
217 Each component may also include a ``Kconfig`` file defining the `component configuration`_ options that can be set via ``menuconfig``. Some components may also include ``Kconfig.projbuild`` and ``project_include.cmake`` files, which are special files for `overriding parts of the project`_.
218
219 Project CMakeLists File
220 =======================
221
222 Each project has a single top-level ``CMakeLists.txt`` file that contains build settings for the entire project. By default, the project CMakeLists can be quite minimal.
223
224 Minimal Example CMakeLists
225 --------------------------
226
227 .. highlight:: cmake
228
229 Minimal project::
230
231       cmake_minimum_required(VERSION 3.5)
232       include($ENV{IDF_PATH}/tools/cmake/project.cmake)
233       project(myProject)
234
235
236 .. _project-mandatory-parts:
237
238 Mandatory Parts
239 ---------------
240
241 The inclusion of these three lines, in the order shown above, is necessary for every project:
242
243 - ``cmake_minimum_required(VERSION 3.5)`` tells CMake the minimum version that is required to build the project. ESP-IDF is designed to work with CMake 3.5 or newer. This line must be the first line in the CMakeLists.txt file.
244 - ``include($ENV{IDF_PATH}/tools/cmake/project.cmake)`` pulls in the rest of the CMake functionality to configure the project, discover all the components, etc.
245 - ``project(myProject)`` creates the project itself, and specifies the project name. The project name is used for the final binary output files of the app - ie ``myProject.elf``, ``myProject.bin``. Only one project can be defined per CMakeLists file.
246
247
248 Optional Project Variables
249 --------------------------
250
251 These variables all have default values that can be overridden for custom behaviour. Look in :idf_file:`/tools/cmake/project.cmake` for all of the implementation details.
252
253 - ``COMPONENT_DIRS``,``COMPONENTS_DIRS``: Directories to search for components. Defaults to `IDF_PATH/components`, `PROJECT_DIR/components`, and ``EXTRA_COMPONENT_DIRS``. Override this variable if you don't want to search for components in these places.
254 - ``EXTRA_COMPONENT_DIRS``, ``EXTRA_COMPONENTS_DIRS``: Optional list of additional directories to search for components. Paths can be relative to the project directory, or absolute.
255 - ``COMPONENTS``: A list of component names to build into the project. Defaults to all components found in the ``COMPONENT_DIRS`` directories. Use this variable to "trim down" the project for faster build times. Note that any component which "requires" another component via the REQUIRES or PRIV_REQUIRES arguments on component registration will automatically have it added to this list, so the ``COMPONENTS`` list can be very short.
256
257 Any paths in these variables can be absolute paths, or set relative to the project directory.
258
259 To set these variables, use the `cmake set command <cmake set_>`_ ie ``set(VARIABLE "VALUE")``. The ``set()`` commands should be placed after the ``cmake_minimum(...)`` line but before the ``include(...)`` line.
260
261 .. _rename-main:
262
263 Renaming ``main`` component
264 ----------------------------
265
266 The build system provides special treatment to the ``main`` component. It is a component that gets automatically added to the build provided
267 that it is in the expected location, PROJECT_DIR/main. All other components in the build are also added as its dependencies,
268 saving the user from hunting down dependencies and providing a build that works right out of the box. Renaming the ``main`` component
269 causes the loss of these behind-the-scences heavy lifting, requiring the user to specify the location of the newly renamed component
270 and manually specifying its dependencies. Specifically, the steps to renaming ``main`` are as follows:
271
272 1. Rename ``main`` directory.
273 2. Set ``EXTRA_COMPONENT_DIRS`` in the project CMakeLists.txt to include the renamed ``main`` directory.
274 3. Specify the dependencies in the renamed component's CMakeLists.txt file via REQUIRES or PRIV_REQUIRES arguments :ref:`on component registration<cmake_minimal_component_cmakelists>`.
275
276 .. _component-directories:
277
278 Component CMakeLists Files
279 ==========================
280
281 Each project contains one or more components. Components can be part of ESP-IDF, part of the project's own components directory, or added from custom component directories (:ref:`see above <component-directories>`).
282
283 A component is any directory in the ``COMPONENT_DIRS`` list which contains a ``CMakeLists.txt`` file.
284
285 Searching for Components
286 ------------------------
287
288 The list of directories in ``COMPONENT_DIRS`` is searched for the project's components. Directories in this list can either be components themselves (ie they contain a `CMakeLists.txt` file), or they can be top-level directories whose sub-directories are components.
289
290 When CMake runs to configure the project, it logs the components included in the build. This list can be useful for debugging the inclusion/exclusion of certain components.
291
292 Multiple components with the same name
293 --------------------------------------
294
295 When ESP-IDF is collecting all the components to compile, it will do this in the order specified by ``COMPONENT_DIRS``; by default, this means ESP-IDF's internal components first, then the project's components, and finally any components set in ``EXTRA_COMPONENT_DIRS``. If two or more of these directories
296 contain component sub-directories with the same name, the component in the last place searched is used. This allows, for example, overriding ESP-IDF components
297 with a modified version by copying that component from the ESP-IDF components directory to the project components directory and then modifying it there.
298 If used in this way, the ESP-IDF directory itself can remain untouched.
299
300 .. _cmake_minimal_component_cmakelists:
301
302 Minimal Component CMakeLists
303 ----------------------------
304
305 .. highlight:: cmake
306
307 The minimal component ``CMakeLists.txt`` file simply registers the component to the build system using ``idf_component_register``::
308
309   idf_component_register(SRCS "foo.c" "bar.c"
310                          INCLUDE_DIRS "include")
311
312 - ``SRCS`` is a list of source files (``*.c``, ``*.cpp``, ``*.cc``, ``*.S``). These source files will be compiled into the component library.
313 - ``INCLUDE_DIRS`` is a list of directories to add to the global include search path for any component which requires this component, and also the main source files.
314
315 A library with the name of the component will be built and linked into the final app. 
316 Directories are usually specified relative to the ``CMakeLists.txt`` file itself, although they can be absolute.
317
318 There are other arguments that can be passed to ``idf_component_register``. These arguments 
319 are discussed :ref:`here<cmake-component-register>`.
320
321 See `example component CMakeLists`_ for more complete component ``CMakeLists.txt`` examples.
322
323 .. _component variables:
324
325 Preset Component Variables
326 --------------------------
327
328 The following component-specific variables are available for use inside component CMakeLists, but should not be modified:
329
330 - ``COMPONENT_DIR``: The component directory. Evaluates to the absolute path of the directory containing ``CMakeLists.txt``. The component path cannot contain spaces. This is the same as the ``CMAKE_CURRENT_SOURCE_DIR`` variable.
331 - ``COMPONENT_NAME``: Name of the component. Same as the name of the component directory.
332 - ``COMPONENT_ALIAS``: Alias of the library created internally by the build system for the component.
333 - ``COMPONENT_LIB``: Name of the library created internally by the build system for the component. 
334
335 The following variables are set at the project level, but available for use in component CMakeLists:
336
337 - ``CONFIG_*``: Each value in the project configuration has a corresponding variable available in cmake. All names begin with ``CONFIG_``. :doc:`More information here </api-reference/kconfig>`.
338 - ``ESP_PLATFORM``: Set to 1 when the CMake file is processed within ESP-IDF build system.
339
340 Build/Project Variables
341 ------------------------
342
343 The following are some project/build variables that are available as build properties and whose values can be queried using ``idf_build_get_property``
344 from the component CMakeLists.txt:
345
346 - ``PROJECT_NAME``: Name of the project, as set in project CMakeLists.txt file.
347 - ``PROJECT_DIR``: Absolute path of the project directory containing the project CMakeLists. Same as the ``CMAKE_SOURCE_DIR`` variable.
348 - ``COMPONENTS``: Names of all components that are included in this build, formatted as a semicolon-delimited CMake list.
349 - ``IDF_VER``: Git version of ESP-IDF (produced by ``git describe``)
350 - ``IDF_VERSION_MAJOR``, ``IDF_VERSION_MINOR``, ``IDF_VERSION_PATCH``: Components of ESP-IDF version, to be used in conditional expressions. Note that this information is less precise than that provided by ``IDF_VER`` variable. ``v4.0-dev-*``, ``v4.0-beta1``, ``v4.0-rc1`` and ``v4.0`` will all have the same values of ``IDF_VERSION_*`` variables, but different ``IDF_VER`` values.
351 - ``IDF_TARGET``: Name of the target for which the project is being built.
352 - ``PROJECT_VER``: Project version.
353
354   * If ``PROJECT_VER`` variable is set in project CMakeLists.txt file, its value will be used.
355   * Else, if the ``PROJECT_DIR/version.txt`` exists, its contents will be used as ``PROJECT_VER``.
356   * Else, if the project is located inside a Git repository, the output of git describe will be used.
357   * Otherwise, ``PROJECT_VER`` will be "1".
358
359 Other build properties are listed :ref:`here<cmake-build-properties>`.
360
361 Controlling Component Compilation
362 ---------------------------------
363
364 .. highlight:: cmake
365
366 To pass compiler options when compiling source files belonging to a particular component, use the ``target_compile_options`` function::
367
368   target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-variable)
369
370 To apply the compilation flags to a single source file, use the CMake `set_source_files_properties`_ command::
371
372     set_source_files_properties(mysrc.c
373         PROPERTIES COMPILE_FLAGS
374         -Wno-unused-variable
375     )
376
377 This can be useful if there is upstream code that emits warnings.
378
379 When using these commands, place them after the call to ``idf_component_register`` in the component CMakeLists file.
380
381 .. _component-configuration:
382
383 Component Configuration
384 =======================
385
386 Each component can also have a ``Kconfig`` file, alongside ``CMakeLists.txt``. This contains
387 configuration settings to add to the configuration menu for this component.
388
389 These settings are found under the "Component Settings" menu when menuconfig is run.
390
391 To create a component Kconfig file, it is easiest to start with one of the Kconfig files distributed with ESP-IDF.
392
393 For an example, see `Adding conditional configuration`_.
394
395 Preprocessor Definitions
396 ========================
397
398 The ESP-IDF build system adds the following C preprocessor definitions on the command line:
399
400 - ``ESP_PLATFORM`` : Can be used to detect that build happens within ESP-IDF.
401 - ``IDF_VER`` : Defined to a git version string.  E.g. ``v2.0`` for a tagged release or ``v1.0-275-g0efaa4f`` for an arbitrary commit.
402
403 Component Requirements
404 ======================
405
406 When compiling each component, the ESP-IDF build system recursively evaluates its components.
407
408 Each component's source file is compiled with these include path directories, as specified in the passed arguments
409 to ``idf_component_register``:
410
411 - The current component's ``INCLUDE_DIRS`` and ``PRIV_INCLUDE_DIRS``.
412 - The ``INCLUDE_DIRS`` set by all components in the current component's ``REQUIRES`` and ``PRIV_REQUIRES`` variables (ie all the current component's public and private dependencies).
413 - All of the ``REQUIRES`` of those components, evaluated recursively (ie all public dependencies of this component's dependencies, recursively expanded).
414
415 When writing a component
416 ------------------------
417
418 - ``REQUIRES`` should be set to all components whose header files are #included from the *public* header files of this component.
419 - ``PRIV_REQUIRES`` should be set to all components whose header files are #included from *any source files* of this component, unless already listed in ``COMPONENT_REQUIRES``. Or any component which is required to be linked in order for this component to function correctly.
420 - ``REQUIRES`` and/or ``PRIV_REQUIRES`` should be set before calling ``idf_component_register()``.
421 - The values of ``REQUIRES`` and ``PRIV_REQUIRES`` should not depend on any configuration choices (``CONFIG_xxx`` macros). This is because requirements are expanded before configuration is loaded. Other component variables (like include paths or source files) can depend on configuration choices.
422 - Not setting either or both ``REQUIRES`` variables is fine. If the component has no requirements except for the "common" components needed for RTOS, libc, etc (``COMPONENT_REQUIRES_COMMON``) then both variables can be empty or unset.
423
424 Components which support only some targets (values of ``IDF_TARGET``) may specify ``REQUIRED_IDF_TARGETS`` in the ``idf_component_register`` call to express these requirements. In this case the build system will generate an error if the component is included into the build, but does not support selected target.
425
426 When creating a project
427 -----------------------
428
429 - By default, every component is included in the build.
430 - If you set the ``COMPONENTS`` variable to a minimal list of components used directly by your project, then the build will include:
431
432   - Components mentioned explicitly in ``COMPONENTS``.
433   - Those components' requirements (evaluated recursively).
434   - The "common" components that every component depends on.
435 - Setting ``COMPONENTS`` to the minimal list of required components can significantly reduce compile times.
436
437 .. _component-requirements-implementation:
438
439 Requirements in the build system implementation
440 -----------------------------------------------
441
442 - Very early in the CMake configuration process, the script ``expand_requirements.cmake`` is run. This script does a partial evaluation of all component CMakeLists.txt files and builds a graph of component requirements (this graph may have cycles). The graph is used to generate a file ``component_depends.cmake`` in the build directory.
443 - The main CMake process then includes this file and uses it to determine the list of components to include in the build (internal ``BUILD_COMPONENTS`` variable). The ``BUILD_COMPONENTS`` variable is sorted so dependencies are listed first, however as the component dependency graph has cycles this cannot be guaranteed for all components. The order should be deterministic given the same set of components and component dependencies.
444 - The value of ``BUILD_COMPONENTS`` is logged by CMake as "Component names: "
445 - Configuration is then evaluated for the components included in the build.
446 - Each component is included in the build normally and the CMakeLists.txt file is evaluated again to add the component libraries to the build.
447
448 Component Dependency Order
449 ^^^^^^^^^^^^^^^^^^^^^^^^^^
450
451 The order of components in the ``BUILD_COMPONENTS`` variable determines other orderings during the build:
452
453 - Order that :ref:`project_include.cmake` files are included into the project.
454 - Order that the list of header paths is generated for compilation (via ``-I`` argument). (Note that for a given component's source files, only that component's dependency's header paths are passed to the compiler.)
455
456 Build Process Internals
457 =======================
458
459 For full details about CMake_ and CMake commands, see the `CMake v3.5 documentation`_.
460
461 project.cmake contents
462 ----------------------
463
464 When included from a project CMakeLists file, the ``project.cmake`` file defines some utility modules and global variables and then sets ``IDF_PATH`` if it was not set in the system environment.
465
466 It also defines an overridden custom version of the built-in CMake_ ``project`` function. This function is overridden to add all of the ESP-IDF specific project functionality.
467
468 project function
469 ----------------
470
471 The custom ``project()`` function performs the following steps:
472
473 - Determines the target (set by ``IDF_TARGET`` environment variable) and saves the target in CMake cache. If the target set in the environment does not match the one in cache, exits with an error.
474 - Evaluates component dependencies and builds the ``BUILD_COMPONENTS`` list of components to include in the build (see :ref:`above<component-requirements-implementation>`).
475 - Finds all components in the project (searching ``COMPONENT_DIRS`` and filtering by ``COMPONENTS`` if this is set).
476 - Loads the project configuration from the ``sdkconfig`` file and generates a ``sdkconfig.cmake`` file and a ``sdkconfig.h`` header. These define configuration values in CMake and C/C++, respectively. If the project configuration changes, cmake will automatically be re-run to re-generate these files and re-configure the project.
477 - Sets the `CMAKE_TOOLCHAIN_FILE`_ variable to the correct toolchain file, depending on the target.
478 - Declares the actual cmake-level project by calling the `CMake project function <cmake project_>`_.
479 - Loads the git version. This includes some magic which will automatically re-run CMake if a new revision is checked out in git. See `File Globbing & Incremental Builds`_.
480 - Includes :ref:`project_include.cmake` files from any components which have them.
481 - Adds each component to the build. Each component CMakeLists file calls ``idf_component_register``, calls the CMake `add_library <cmake add_library_>`_ function to add a library and then adds source files, compile options, etc.
482 - Adds the final app executable to the build.
483 - Goes back and adds inter-component dependencies between components (ie adding the public header directories of each component to each other component).
484
485 Browse the :idf_file:`/tools/cmake/project.cmake` file and supporting functions in :idf_file:`/tools/cmake/idf_functions.cmake` for more details.
486
487 Debugging CMake
488 ---------------
489
490 Some tips for debugging the ESP-IDF CMake-based build system:
491
492 - When CMake runs, it prints quite a lot of diagnostic information including lists of components and component paths.
493 - Running ``cmake -DDEBUG=1`` will produce more verbose diagnostic output from the IDF build system.
494 - Running ``cmake`` with the ``--trace`` or ``--trace-expand`` options will give a lot of information about control flow. See the `cmake command line documentation`_.
495
496 When included from a project CMakeLists file, the ``project.cmake`` file defines some utility modules and global variables and then sets ``IDF_PATH`` if it was not set in the system environment.
497
498 It also defines an overridden custom version of the built-in CMake_ ``project`` function. This function is overridden to add all of the ESP-IDF specific project functionality.
499
500 .. _warn-undefined-variables:
501
502 Warning On Undefined Variables
503 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
504
505 By default, ``idf.py`` passes the ``--warn-uninitialized`` flag to CMake_ so it will print a warning if an undefined variable is referenced in the build. This can be very useful to find buggy CMake files.
506
507 If you don't want this behaviour, it can be disabled by passing ``--no-warnings`` to ``idf.py``.
508
509 Browse the :idf_file:`/tools/cmake/project.cmake` file and supporting functions in :idf_file:`/tools/cmake/idf_functions.cmake` for more details.
510
511 Overriding Parts of the Project
512 -------------------------------
513
514 .. _project_include.cmake:
515
516 project_include.cmake
517 ^^^^^^^^^^^^^^^^^^^^^
518
519 For components that have build requirements which must be evaluated before any component CMakeLists
520 files are evaluated, you can create a file called ``project_include.cmake`` in the
521 component directory. This CMake file is included when ``project.cmake`` is evaluating the entire project.
522
523 ``project_include.cmake`` files are used inside ESP-IDF, for defining project-wide build features such as ``esptool.py`` command line arguments and the ``bootloader`` "special app".
524
525 Unlike component ``CMakeLists.txt`` files, when including a ``project_include.cmake`` file the current source directory (``CMAKE_CURRENT_SOURCE_DIR`` and working directory) is the project directory. Use the variable ``COMPONENT_DIR`` for the absolute directory of the component.
526
527 Note that ``project_include.cmake`` isn't necessary for the most common component uses - such as adding include directories to the project, or ``LDFLAGS`` to the final linking step. These values can be customised via the ``CMakeLists.txt`` file itself. See `Optional Project Variables`_ for details.
528
529 ``project_include.cmake`` files are included in the order given in ``BUILD_COMPONENTS`` variable (as logged by CMake). This means that a component's ``project_include.cmake`` file will be included after it's all dependencies' ``project_include.cmake`` files, unless both components are part of a dependency cycle. This is important if a ``project_include.cmake`` file relies on variables set by another component. See also :ref:`above<component-requirements-implementation>`.
530
531 Take great care when setting variables or targets in a ``project_include.cmake`` file. As the values are included into the top-level project CMake pass, they can influence or break functionality across all components!
532
533 KConfig.projbuild
534 ^^^^^^^^^^^^^^^^^
535
536 This is an equivalent to ``project_include.cmake`` for :ref:`component-configuration` KConfig files. If you want to include
537 configuration options at the top-level of menuconfig, rather than inside the "Component Configuration" sub-menu, then these can be defined in the KConfig.projbuild file alongside the ``CMakeLists.txt`` file.
538
539 Take care when adding configuration values in this file, as they will be included across the entire project configuration. Where possible, it's generally better to create a KConfig file for :ref:`component-configuration`.
540
541 ``project_include.cmake`` files are used inside ESP-IDF, for defining project-wide build features such as ``esptool.py`` command line arguments and the ``bootloader`` "special app".
542
543 Configuration-Only Components
544 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
545
546 Special components which contain no source files, only ``Kconfig.projbuild`` and ``KConfig``, can have a one-line ``CMakeLists.txt`` file which calls the function ``idf_component_register()`` with no 
547 arguments specified. This function will include the component in the project build, but no library will be built *and* no header files will be added to any include paths.
548
549 Example Component CMakeLists
550 ============================
551
552 Because the build environment tries to set reasonable defaults that will work most
553 of the time, component ``CMakeLists.txt`` can be very small or even empty (see `Minimal Component CMakeLists`_). However, overriding `component variables`_ is usually required for some functionality.
554
555 Here are some more advanced examples of component CMakeLists files.
556
557 Adding conditional configuration
558 --------------------------------
559
560 The configuration system can be used to conditionally compile some files
561 depending on the options selected in the project configuration.
562
563 .. highlight:: none
564
565 ``Kconfig``::
566
567     config FOO_ENABLE_BAR
568         bool "Enable the BAR feature."
569         help
570             This enables the BAR feature of the FOO component.
571
572 ``CMakeLists.txt``::
573
574     set(COMPONENT_SRCS "foo.c" "more_foo.c")
575
576     if(CONFIG_FOO_ENABLE_BAR)
577         list(APPEND COMPONENT_SRCS "bar.c")
578     endif()
579
580 This example makes use of the CMake `if <cmake if_>`_ function and `list APPEND <cmake list_>`_ function.
581
582 This can also be used to select or stub out an implementation, as such:
583
584 ``Kconfig``::
585
586     config ENABLE_LCD_OUTPUT
587         bool "Enable LCD output."
588         help
589             Select this if your board has a LCD.
590
591     config ENABLE_LCD_CONSOLE
592         bool "Output console text to LCD"
593         depends on ENABLE_LCD_OUTPUT
594         help
595             Select this to output debugging output to the lcd
596
597     config ENABLE_LCD_PLOT
598         bool "Output temperature plots to LCD"
599         depends on ENABLE_LCD_OUTPUT
600         help
601             Select this to output temperature plots
602
603 .. highlight:: cmake
604
605 ``CMakeLists.txt``::
606
607     if(CONFIG_ENABLE_LCD_OUTPUT)
608        set(COMPONENT_SRCS lcd-real.c lcd-spi.c)
609     else()
610        set(COMPONENT_SRCS lcd-dummy.c)
611     endif()
612
613     # We need font if either console or plot is enabled
614     if(CONFIG_ENABLE_LCD_CONSOLE OR CONFIG_ENABLE_LCD_PLOT)
615       list(APPEND COMPONENT_SRCS "font.c")
616     endif()
617
618
619 Conditions which depend on the target
620 -------------------------------------
621
622 The current target is available to CMake files via ``IDF_TARGET`` variable.
623
624 In addition to that, if target ``xyz`` is used (``IDF_TARGET=xyz``), then Kconfig variable ``CONFIG_IDF_TARGET_XYZ`` will be set.
625
626 Note that component dependencies may depend on ``IDF_TARGET`` variable, but not on Kconfig variables. Also one can not use Kconfig variables in ``include`` statements in CMake files, but ``IDF_TARGET`` can be used in such context.
627
628
629 Source Code Generation
630 ----------------------
631
632 Some components will have a situation where a source file isn't
633 supplied with the component itself but has to be generated from
634 another file. Say our component has a header file that consists of the
635 converted binary data of a BMP file, converted using a hypothetical
636 tool called bmp2h. The header file is then included in as C source
637 file called graphics_lib.c::
638
639     add_custom_command(OUTPUT logo.h
640          COMMAND bmp2h -i ${COMPONENT_DIR}/logo.bmp -o log.h
641          DEPENDS ${COMPONENT_DIR}/logo.bmp
642          VERBATIM)
643
644     add_custom_target(logo DEPENDS logo.h)
645     add_dependencies(${COMPONENT_LIB} logo)
646
647     set_property(DIRECTORY "${COMPONENT_DIR}" APPEND PROPERTY
648          ADDITIONAL_MAKE_CLEAN_FILES logo.h)
649
650 This answer is adapted from the `CMake FAQ entry <cmake faq generated files_>`_, which contains some other examples that will also work with ESP-IDF builds.
651
652 In this example, logo.h will be generated in the
653 current directory (the build directory) while logo.bmp comes with the
654 component and resides under the component path. Because logo.h is a
655 generated file, it should be cleaned when the project is cleaned. For this reason
656 it is added to the `ADDITIONAL_MAKE_CLEAN_FILES`_ property.
657
658 .. note::
659
660    If generating files as part of the project CMakeLists.txt file, not a component CMakeLists.txt, then use build property ``PROJECT_DIR`` instead of ``${COMPONENT_DIR}`` and ``${PROJECT_NAME}.elf`` instead of ``${COMPONENT_LIB}``.)
661
662 If a a source file from another component included ``logo.h``, then ``add_dependencies`` would need to be called to add a dependency between
663 the two components, to ensure that the component source files were always compiled in the correct order.
664
665 .. _cmake_embed_data:
666
667 Embedding Binary Data
668 ---------------------
669
670 Sometimes you have a file with some binary or text data that you'd like to make available to your component - but you don't want to reformat the file as C source.
671
672 You can specify argument ``COMPONENT_EMBED_FILES`` in the component registration, giving space-delimited names of the files to embed::
673
674   idf_component_register(...
675                          EMBED_FILES server_root_cert.der)
676
677
678 Or if the file is a string, you can use the variable ``COMPONENT_EMBED_TXTFILES``. This will embed the contents of the text file as a null-terminated string::
679
680   idf_component_register(...
681                          EMBED_TXTFILES server_root_cert.pem)
682
683 .. highlight:: c
684
685 The file's contents will be added to the .rodata section in flash, and are available via symbol names as follows::
686
687   extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start");
688   extern const uint8_t server_root_cert_pem_end[]   asm("_binary_server_root_cert_pem_end");
689
690 The names are generated from the full name of the file, as given in ``COMPONENT_EMBED_FILES``. Characters /, ., etc. are replaced with underscores. The _binary prefix in the symbol name is added by objcopy and is the same for both text and binary files.
691
692 .. highlight:: cmake
693
694 To embed a file into a project, rather than a component, you can call the function ``target_add_binary_data`` like this::
695
696   target_add_binary_data(myproject.elf "main/data.bin" TEXT)
697
698 Place this line after the ``project()`` line in your project CMakeLists.txt file. Replace ``myproject.elf`` with your project name. The final argument can be ``TEXT`` to embed a null-terminated string, or ``BINARY`` to embed the content as-is.
699
700 For an example of using this technique, see :example:`protocols/https_request` - the certificate file contents are loaded from the text .pem file at compile time.
701
702 Code and Data Placements
703 ------------------------
704
705 ESP-IDF has a feature called linker script generation that enables components to define where its code and data will be placed in memory through
706 linker fragment files. These files are processed by the build system, and is used to augment the linker script used for linking
707 app binary. See :doc:`Linker Script Generation <linker-script-generation>` for a quick start guide as well as a detailed discussion
708 of the mechanism.
709
710 .. _component-build-full-override:
711
712 Fully Overriding The Component Build Process
713 --------------------------------------------
714
715 .. highlight:: cmake
716
717 Obviously, there are cases where all these recipes are insufficient for a
718 certain component, for example when the component is basically a wrapper
719 around another third-party component not originally intended to be
720 compiled under this build system. In that case, it's possible to forego
721 the ESP-IDF build system entirely by using a CMake feature called ExternalProject_. Example component CMakeLists::
722
723   # External build process for quirc, runs in source dir and
724   # produces libquirc.a
725   externalproject_add(quirc_build
726       PREFIX ${COMPONENT_DIR}
727       SOURCE_DIR ${COMPONENT_DIR}/quirc
728       CONFIGURE_COMMAND ""
729       BUILD_IN_SOURCE 1
730       BUILD_COMMAND make CC=${CMAKE_C_COMPILER} libquirc.a
731       INSTALL_COMMAND ""
732       )
733
734    # Add libquirc.a to the build process
735    #
736    add_library(quirc STATIC IMPORTED GLOBAL)
737    add_dependencies(quirc quirc_build)
738
739    set_target_properties(quirc PROPERTIES IMPORTED_LOCATION
740         ${COMPONENT_DIR}/quirc/libquirc.a)
741    set_target_properties(quirc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
742         ${COMPONENT_DIR}/quirc/lib)
743
744    set_directory_properties( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
745         "${COMPONENT_DIR}/quirc/libquirc.a")
746
747 (The above CMakeLists.txt can be used to create a component named ``quirc`` that builds the quirc_ project using its own Makefile.)
748
749 - ``externalproject_add`` defines an external build system.
750
751   - ``SOURCE_DIR``, ``CONFIGURE_COMMAND``, ``BUILD_COMMAND`` and ``INSTALL_COMMAND`` should always be set. ``CONFIGURE_COMMAND`` can be set to an empty string if the build system has no "configure" step. ``INSTALL_COMMAND`` will generally be empty for ESP-IDF builds.
752   - Setting ``BUILD_IN_SOURCE`` means the build directory is the same as the source directory. Otherwise you can set ``BUILD_DIR``.
753   - Consult the ExternalProject_ documentation for more details about ``externalproject_add()``
754
755 - The second set of commands adds a library target, which points to the "imported" library file built by the external system. Some properties need to be set in order to add include directories and tell CMake where this file is.
756 - Finally, the generated library is added to `ADDITIONAL_MAKE_CLEAN_FILES`_. This means ``make clean`` will delete this library. (Note that the other object files from the build won't be deleted.)
757
758 .. note:: When using an external build process with PSRAM, remember to add ``-mfix-esp32-psram-cache-issue`` to the C compiler arguments. See :ref:`CONFIG_SPIRAM_CACHE_WORKAROUND` for details of this flag.
759
760 .. _ADDITIONAL_MAKE_CLEAN_FILES_note:
761
762 ExternalProject dependencies, clean builds
763 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
764
765 CMake has some unusual behaviour around external project builds:
766
767 - `ADDITIONAL_MAKE_CLEAN_FILES`_ only works when "make" is used as the build system. If Ninja_ or an IDE build system is used, it won't delete these files when cleaning.
768 - However, the ExternalProject_ configure & build commands will *always* be re-run after a clean is run.
769 - Therefore, there are two alternative recommended ways to configure the external build command:
770
771     1. Have the external ``BUILD_COMMAND`` run a full clean compile of all sources. The build command will be run if any of the dependencies passed to ``externalproject_add`` with ``DEPENDS`` have changed, or if this is a clean build (ie any of ``idf.py clean``, ``ninja clean``, or ``make clean`` was run.)
772     2. Have the external ``BUILD_COMMAND`` be an incremental build command. Pass the parameter ``BUILD_ALWAYS 1`` to ``externalproject_add``. This means the external project will be built each time a build is run, regardless of dependencies. This is only recommended if the external project has correct incremental build behaviour, and doesn't take too long to run.
773
774 The best of these approaches for building an external project will depend on the project itself, its build system, and whether you anticipate needing to frequently recompile the project.
775
776 .. _custom-sdkconfig-defaults:
777
778 Custom sdkconfig defaults
779 =========================
780
781 For example projects or other projects where you don't want to specify a full sdkconfig configuration, but you do want to override some key values from the ESP-IDF defaults, it is possible to create a file ``sdkconfig.defaults`` in the project directory. This file will be used when creating a new config from scratch, or when any new config value hasn't yet been set in the ``sdkconfig`` file.
782
783 To override the name of this file, set the ``SDKCONFIG_DEFAULTS`` environment variable.
784
785 Target-dependent sdkconfig defaults
786 -----------------------------------
787
788 In addition to ``sdkconfig.defaults`` file, build system will also load defaults from ``sdkconfig.defaults.TARGET_NAME`` file, where ``TARGET_NAME`` is the value of ``IDF_TARGET``. For example, for ``esp32`` target, default settings will be taken from ``sdkconfig.defaults`` first, and then from ``sdkconfig.defaults.esp32``.
789
790 If ``SDKCONFIG_DEFAULTS`` is used to override the name of defaults file, the name of target-specific defaults file will be derived from ``SDKCONFIG_DEFAULTS`` value.
791
792
793 Flash arguments
794 ===============
795
796 There are some scenarios that we want to flash the target board without IDF. For this case we want to save the built binaries, esptool.py and esptool write_flash arguments. It's simple to write a script to save binaries and esptool.py.
797
798 After running a project build, the build directory contains binary output files (``.bin`` files) for the project and also the following flashing data files:
799
800 - ``flash_project_args`` contains arguments to flash the entire project (app, bootloader, partition table, PHY data if this is configured).
801 - ``flash_app_args`` contains arguments to flash only the app.
802 - ``flash_bootloader_args`` contains arguments to flash only the bootloader.
803
804 .. highlight:: bash
805
806 You can pass any of these flasher argument files to ``esptool.py`` as follows::
807
808   python esptool.py --chip esp32 write_flash @build/flash_project_args
809
810 Alternatively, it is possible to manually copy the parameters from the argument file and pass them on the command line.
811
812 The build directory also contains a generated file ``flasher_args.json`` which contains project flash information, in JSON format. This file is used by ``idf.py`` and can also be used by other tools which need information about the project build.
813
814 Building the Bootloader
815 =======================
816
817 The bootloader is built by default as part of ``idf.py build``, or can be built standalone via ``idf.py bootloader``.
818
819 The bootloader is a special "subproject" inside :idf:`/components/bootloader/subproject`. It has its own project CMakeLists.txt file and builds separate .ELF and .BIN files to the main project. However it shares its configuration and build directory with the main project.
820
821 The subproject is inserted as an external project from the top-level project, by the file :idf_file:`/components/bootloader/project_include.cmake`. The main build process runs CMake for the subproject, which includes discovering components (a subset of the main components) and generating a bootloader-specific config (derived from the main ``sdkconfig``).
822
823 Selecting the Target
824 ====================
825
826 Currently ESP-IDF supports one target, ``esp32``. It is used by default by the build system. Developers working on adding multiple target support can change the target as follows::
827
828   rm sdkconfig
829   idf.py -DIDF_TARGET=new_target reconfigure
830
831
832 Writing Pure CMake Components
833 =============================
834
835 The ESP-IDF build system "wraps" CMake with the concept of "components", and helper functions to automatically integrate these components into a project build.
836
837 However, underneath the concept of "components" is a full CMake build system. It is also possible to make a component which is pure CMake.
838
839 .. highlight:: cmake
840
841 Here is an example minimal "pure CMake" component CMakeLists file for a component named ``json``::
842
843   add_library(json STATIC
844   cJSON/cJSON.c
845   cJSON/cJSON_Utils.c)
846
847   target_include_directories(json PUBLIC cJSON)
848
849 - This is actually an equivalent declaration to the IDF ``json`` component :idf_file:`/components/json/CMakeLists.txt`.
850 - This file is quite simple as there are not a lot of source files. For components with a large number of files, the globbing behaviour of ESP-IDF's component logic can make the component CMakeLists style simpler.)
851 - Any time a component adds a library target with the component name, the ESP-IDF build system will automatically add this to the build, expose public include directories, etc. If a component wants to add a library target with a different name, dependencies will need to be added manually via CMake commands.
852
853
854 Using Third-Party CMake Projects with Components
855 ================================================
856
857 CMake is used for a lot of open-source C and C++ projects — code that users can tap into for their applications. One of the benefits of having a CMake build system
858 is the ability to import these third-party projects, sometimes even without modification! This allows for users to be able to get functionality that may
859 not yet be provided by a component, or use another library for the same functionality.
860
861 .. highlight:: cmake
862
863 Importing a library might look like this for a hypothetical library ``foo`` to be used in the ``main`` component::
864
865   # Register the component
866   idf_component_register()
867
868   # Set values of hypothetical variables that control the build of `foo`
869   set(FOO_BUILD_STATIC OFF)
870   set(FOO_BUILD_TESTS OFF)
871
872   # Create and import the library targets
873   add_subdirectory(foo)
874
875   # Link `foo` to `main` component
876   target_link_libraries(main foo)
877
878 For an actual example, take a look at :example:`build_system/cmake/import_lib`. Take note that what needs to be done in order to import
879 the library may vary. It is recommended to read up on the library's documentation for instructions on how to
880 import it from other projects. Studying the library's CMakeLists.txt and build structure can also be helpful.
881
882 It is also possible to wrap a third-party library to be used as a component in this manner. For example, the :component:`mbedtls` component is a wrapper for
883 Espressif's fork of `mbedtls <https://github.com/ARMmbed/mbedtls>`_. See its :component_file:`component CMakeLists.txt <mbedtls/CMakeLists.txt>`.
884
885 The CMake variable ``ESP_PLATFORM`` is set to 1 whenever the ESP-IDF build system is being used. Tests such as ``if (ESP_PLATFORM)`` can be used in generic CMake code if special IDF-specific logic is required.
886
887
888 Using ESP-IDF in Custom CMake Projects
889 ======================================
890
891 ESP-IDF provides a template CMake project for easily creating an application. However, in some instances the user might already
892 have an existing CMake project or may want to create a custom one. In these cases it is desirable to be able to consume IDF components
893 as libraries to be linked to the user's targets (libraries/ executables).
894
895 It is possible to do so by using the :ref:`build system APIs provided<cmake_buildsystem_api>` by :idf_file:`tools/cmake/idf.cmake`. For example:
896
897 .. code-block:: cmake
898
899   cmake_minimum_required(VERSION 3.5)
900   project(my_custom_app C)
901
902   # Include CMake file that provides ESP-IDF CMake build system APIs.
903   include($ENV{IDF_PATH}/tools/cmake/idf.cmake)
904
905   # Include ESP-IDF components in the build, may be thought as an equivalent of 
906   # add_subdirectory() but with some additional procesing and magic for ESP-IDF build
907   # specific build processes.
908   idf_build_process(esp32)
909   
910   # Create the project executable and plainly link the newlib component to it using 
911   # its alias, idf::newlib.
912   add_executable(${CMAKE_PROJECT_NAME}.elf main.c)
913   target_link_libraries(${CMAKE_PROJECT_NAME}.elf idf::newlib)
914
915   # Let the build system know what the project executable is to attach more targets, dependencies, etc.
916   idf_build_executable(${CMAKE_PROJECT_NAME}.elf)
917
918 The example in :example:`build_system/cmake/idf_as_lib` demonstrates the creation of an application equivalent to :example:`hello world application <get-started/hello_world>`
919 using a custom CMake project.
920
921 .. note:: The IDF build system can only set compiler flags for source files that it builds. When an external CMakeLists.txt file is used and PSRAM is enabled, remember to add ``-mfix-esp32-psram-cache-issue`` to the C compiler arguments. See :ref:`CONFIG_SPIRAM_CACHE_WORKAROUND` for details of this flag.
922 .. _cmake_buildsystem_api:
923
924 ESP-IDF CMake Build System API
925 ==============================
926
927 idf-build-commands
928 ------------------
929
930 .. code-block:: none
931
932   idf_build_get_property(var property [GENERATOR_EXPRESSION])
933
934 Retrieve a :ref:`build property<cmake-build-properties>` *property* and store it in *var* accessible from the current scope. Specifying
935 *GENERATOR_EXPRESSION* will retrieve the generator expression string for that property, instead of the actual value, which
936 can be used with CMake commands that support generator expressions.
937
938 .. code-block:: none
939
940   idf_build_set_property(property val [APPEND])
941
942 Set a :ref:`build property<cmake-build-properties>` *property* with value *val*. Specifying *APPEND* will append the specified value to the current
943 value of the property. If the property does not previously exist or it is currently empty, the specified value becomes 
944 the first element/member instead. 
945
946 .. code-block:: none
947
948   idf_build_component(component_dir)
949
950 Present a directory *component_dir* that contains a component to the build system. Relative paths are converted to absolute paths with respect to current directory.
951 All calls to this command must be performed before `idf_build_process`. 
952
953 This command does not guarantee that the component will be processed during build (see the `COMPONENTS` argument description for `idf_build_process`)
954
955 .. code-block:: none
956
957   idf_build_process(target 
958                     [PROJECT_DIR project_dir]
959                     [PROJECT_VER project_ver]
960                     [PROJECT_NAME project_name]
961                     [SDKCONFIG sdkconfig]
962                     [SDKCONFIG_DEFAULTS sdkconfig_defaults]
963                     [BUILD_DIR build_dir]
964                     [COMPONENTS component1 component2 ...])
965
966 Performs the bulk of the behind-the-scenes magic for including ESP-IDF components such as component configuration, libraries creation, 
967 dependency expansion and resolution. Among these functions, perhaps the most important 
968 from a user's perspective is the libraries creation by calling each component's ``idf_component_register``. This command creates the libraries for each component, which are accessible using aliases in the form
969 idf::*component_name*. These aliases can be used to link the components to the user's own targets, either libraries
970 or executables. 
971
972 The call requires the target chip to be specified with *target* argument. Optional arguments for the call include:
973
974 - PROJECT_DIR - directory of the project; defaults to CMAKE_SOURCE_DIR
975 - PROJECT_NAME - name of the project; defaults to CMAKE_PROJECT_NAME
976 - PROJECT_VER - version/revision of the project; defaults to "0.0.0"
977 - SDKCONFIG - output path of generated sdkconfig file; defaults to PROJECT_DIR/sdkconfig or CMAKE_SOURCE_DIR/sdkconfig depending if PROJECT_DIR is set
978 - SDKCONFIG_DEFAULTS - defaults file to use for the build; defaults to empty
979 - BUILD_DIR - directory to place ESP-IDF build-related artifacts, such as generated binaries, text files, components; defaults to CMAKE_BINARY_DIR
980 - COMPONENTS - select components to process among the components known by the build system (added via `idf_build_component`). This argument is used to trim the build. 
981   Other components are automatically added if they are required in the dependency chain, i.e. 
982   the public and private requirements of the components in this list are automatically added, and in turn the public and private requirements of those requirements, 
983   so on and so forth. If not specified, all components known to the build system are processed.
984
985 .. code-block:: none
986
987   idf_build_executable(executable)
988
989 Specify the executable *executable* for ESP-IDF build. This attaches additional targets such as dependencies related to
990 flashing, generating additional binary files, etc. Should be called after ``idf_build_process``.
991
992 .. code-block:: none
993
994   idf_build_get_config(var config [GENERATOR_EXPRESSION])
995
996 Get the value of the specified config. Much like build properties, specifying
997 *GENERATOR_EXPRESSION* will retrieve the generator expression string for that config, instead of the actual value, which
998 can be used with CMake commands that support generator expressions. Actual config values are only known after call to `idf_build_process`, however.
999
1000 .. _cmake-build-properties:
1001
1002 idf-build-properties
1003 --------------------
1004
1005 These are properties that describe the build. Values of build properties can be retrieved by using the build command ``idf_build_get_property``.
1006 For example, to get the Python interpreter used for the build:
1007
1008 .. code-block: cmake
1009
1010   idf_build_get_property(python PYTHON)
1011   message(STATUS "The Python intepreter is: ${python}")
1012
1013   - BUILD_DIR - build directory; set from ``idf_build_process`` BUILD_DIR argument
1014   - BUILD_COMPONENTS - list of components (more specifically, component aliases) included in the build; set by ``idf_build_process``
1015   - C_COMPILE_OPTIONS - compile options applied to all components' C source files
1016   - COMPILE_OPTIONS - compile options applied to all components' source files, regardless of it being C or C++
1017   - COMPILE_DEFINITIONS - compile definitions applied to all component source files
1018   - CXX_COMPILE_OPTIONS - compile options applied to all components' C++ source files
1019   - EXECUTABLE - project executable; set by call to ``idf_build_executable``
1020   - EXECUTABLE_NAME - name of project executable without extension; set by call to ``idf_build_executable``
1021   - IDF_PATH - ESP-IDF path; set from IDF_PATH environment variable, if not, inferred from the location of ``idf.cmake``
1022   - IDF_TARGET - target chip for the build; set from the required target argument for ``idf_build_process``
1023   - IDF_VER - ESP-IDF version; set from either a version file or the Git revision of the IDF_PATH repository
1024   - INCLUDE_DIRECTORIES - include directories for all component source files
1025   - KCONFIGS - list of Kconfig files found in components in build; set by ``idf_build_process``
1026   - KCONFIG_PROJBUILDS - list of Kconfig.projbuild diles found in components in build; set by ``idf_build_process``
1027   - PROJECT_NAME - name of the project; set from ``idf_build_process`` PROJECT_NAME argument
1028   - PROJECT_DIR - directory of the project; set from ``idf_build_process`` PROJECT_DIR argument
1029   - PROJECT_VER - version of the project; set from ``idf_build_process`` PROJECT_VER argument
1030   - PYTHON - Python interpreter used for the build; set from PYTHON environment variable if available, if not "python" is used
1031   - SDKCONFIG - full path to output config file; set from ``idf_build_process`` SDKCONFIG argument
1032   - SDKCONFIG_DEFAULTS - full path to config defaults file; set from ``idf_build_process`` SDKCONFIG_DEFAULTS argument
1033   - SDKCONFIG_HEADER - full path to C/C++ header file containing component configuration; set by ``idf_build_process``
1034   - SDKCONFIG_CMAKE - full path to CMake file containing component configuration; set by ``idf_build_process``
1035   - SDKCONFIG_JSON - full path to JSON file containing component configuration; set by ``idf_build_process``
1036   - SDKCONFIG_JSON_MENUS - full path to JSON file containing config menus; set by ``idf_build_process``
1037
1038 idf-component-commands
1039 ----------------------
1040
1041 .. code-block:: none
1042
1043   idf_component_get_property(var component property [GENERATOR_EXPRESSION])
1044
1045 Retrieve a specified *component*'s :ref:`component property<cmake-component-properties>`, *property* and store it in *var* accessible from the current scope. Specifying
1046 *GENERATOR_EXPRESSION* will retrieve the generator expression string for that property, instead of the actual value, which
1047 can be used with CMake commands that support generator expressions.
1048
1049 .. code-block:: none
1050
1051   idf_component_set_property(property val [APPEND])
1052
1053 Set a specified *component*'s :ref:`component property<cmake-component-properties>`, *property* with value *val*. Specifying *APPEND* will append the specified value to the current
1054 value of the property. If the property does not previously exist or it is currently empty, the specified value becomes 
1055 the first element/member instead. 
1056
1057 .. _cmake-component-register:
1058
1059 .. code-block:: none
1060
1061   idf_component_register([[SRCS src1 src2 ...] | [[SRC_DIRS dir1 dir2 ...] [EXCLUDE_SRCS src1 src2 ...]]
1062                          [INCLUDE_DIRS dir1 dir2 ...]
1063                          [PRIV_INCLUDE_DIRS dir1 dir2 ...]
1064                          [REQUIRES component1 component2 ...]
1065                          [PRIV_REQUIRES component1 component2 ...]
1066                          [LDFRAGMENTS ldfragment1 ldfragment2 ...]
1067                          [REQUIRED_IDF_TARGETS target1 target2 ...]
1068                          [EMBED_FILES file1 file2 ...]
1069                          [EMBED_TXTFILES file1 file2 ...])
1070
1071 Register a component to the build system. Much like the ``project()`` CMake command, this should be called from the component's 
1072 CMakeLists.txt directly (not through a function or macro) and is recommended to be called before any other command. Here are some
1073 guidelines on what commands can **not** be called before ``idf_component_register``:
1074   
1075   - commands that are not valid in CMake script mode
1076   - custom commands defined in project_include.cmake
1077   - build system API commands except ``idf_build_get_property``; although consider whether the property may not have been set yet
1078
1079 Commands that set and operate on variables are generally okay to call before ``idf_component_register``.
1080
1081 The arguments for ``idf_component_register`` include:
1082
1083   - SRCS - component source files used for creating a static library for the component; if not specified, component is a treated as a 
1084     config-only component and an interface library is created instead.
1085   - SRC_DIRS, EXCLUDE_SRCS - used to glob source files (.c, .cpp, .S) by specifying directories, instead of specifying source files manually via SRCS. Note that this is subject to the :ref:`limitations of globbing in CMake<cmake-file-globbing>`. Source files specified in EXCLUDE_SRCS are removed from the globbed files.
1086   - INCLUDE_DIRS - paths, relative to the component directory, which will be added to the include search path for all other components which require the current component
1087   - PRIV_INCLUDE_DIRS - directory paths, must be relative to the component directory, which will be added to the include search path for this component's source files only
1088   - REQUIRES - public component requirements for the component
1089   - PRIV_REQUIRES - private component requirements for the component; ignored on config-only components
1090   - LDFRAGMENTS - component linker fragment files
1091   - REQUIRED_IDF_TARGETS - specify the only target the component supports
1092
1093 The following are used for :ref:`embedding data into the component<cmake_embed_data>`, and is considered as source files
1094 when determining if a component is config-only. This means that even if the component does not specify source files, a static library is still
1095 created internally for the component if it specifies either:
1096
1097   - EMBED_FILES - binary files to be embedded in the component
1098   - EMBED_TXTFILES - text files to be embedded in the component
1099   
1100 .. _cmake-component-properties:
1101
1102 idf-component-properties
1103 ------------------------
1104
1105 These are properties that describe a component. Values of component properties can be retrieved by using the build command ``idf_component_get_property``.
1106 For example, to get the directory of the ``freertos`` component:
1107
1108 .. code-block: cmake
1109
1110   idf_component_get_property(dir freertos COMPONENT_DIR)
1111   message(STATUS "The 'freertos' component directory is: ${dir}")
1112
1113 - COMPONENT_ALIAS - alias for COMPONENT_LIB used for linking the component to external targets; set by ``idf_build_component`` and alias library itself
1114   is created by ``idf_component_register``
1115 - COMPONENT_DIR - component directory; set by ``idf_build_component``
1116 - COMPONENT_LIB - name for created component static/interface library; set by ``idf_build_component`` and library itself
1117   is created by ``idf_component_register``
1118 - COMPONENT_NAME - name of the component; set by ``idf_build_component`` based on the component directory name
1119 - COMPONENT_TYPE - type of the component, whether LIBRARY or CONFIG_ONLY. A component is of type LIBRARY if it specifies
1120   source files or embeds a file
1121 - EMBED_FILES - list of files to embed in component; set from ``idf_component_register`` EMBED_FILES argument
1122 - EMBED_TXTFILES - list of text files to embed in component; set from ``idf_component_register`` EMBED_TXTFILES argument
1123 - INCLUDE_DIRS - list of component include directories; set from ``idf_component_register`` INCLUDE_DIRS argument
1124 - KCONFIG - component Kconfig file; set by ``idf_build_component``
1125 - KCONFIG_PROJBUILD - component Kconfig.projbuild; set by ``idf_build_component``
1126 - LDFRAGMENTS - list of component linker fragment files; set from ``idf_component_register`` LDFRAGMENTS argument
1127 - PRIV_INCLUDE_DIRS - list of component private include directories; set from ``idf_component_register`` PRIV_INCLUDE_DIRS on components of type LIBRARY
1128 - PRIV_REQUIRES - list of private component dependentices; set from ``idf_component_register`` PRIV_REQUIRES argument
1129 - REQUIRED_IDF_TARGETS - list of targets the component supports; set from ``idf_component_register`` EMBED_TXTFILES argument
1130 - REQUIRES - list of public component dependencies; set from ``idf_component_register`` REQUIRES argument
1131 - SRCS - list of component source files; set from SRCS or SRC_DIRS/EXCLUDE_SRCS argument of ``idf_component_register``
1132
1133 .. _cmake-file-globbing:
1134
1135 File Globbing & Incremental Builds
1136 ==================================
1137
1138 .. highlight:: cmake
1139
1140 The preferred way to include source files in an ESP-IDF component is to list them manually via SRCS argument to ``idf_component_register``::
1141
1142   idf_component_register(SRCS library/a.c library/b.c platform/platform.c
1143                          ...)
1144
1145 This preference reflects the `CMake best practice <https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1/>`_ of manually listing source files. This could, however, be inconvenient when there are lots of source files to add to the build. The ESP-IDF build system provides an alternative way for specifying source files using ``SRC_DIRS``::
1146
1147   idf_component_register(SRC_DIRS library platform
1148                          ...)
1149
1150 This uses globbing behind the scenes to find source files in the specified directories. Be aware, however, that if a new source file is added and this method is used, then CMake won't know to automatically re-run and this file won't be added to the build.
1151
1152 The trade-off is acceptable when you're adding the file yourself, because you can trigger a clean build or run ``idf.py reconfigure`` to manually re-run CMake_. However, the problem gets harder when you share your project with others who may check out a new version using a source control tool like Git...
1153
1154 For components which are part of ESP-IDF, we use a third party Git CMake integration module (:idf_file:`/tools/cmake/third_party/GetGitRevisionDescription.cmake`) which automatically re-runs CMake any time the repository commit changes. This means if you check out a new ESP-IDF version, CMake will automatically rerun.
1155
1156 For project components (not part of ESP-IDF), there are a few different options:
1157
1158 - If keeping your project file in Git, ESP-IDF will automatically track the Git revision and re-run CMake if the revision changes.
1159 - If some components are kept in a third git repository (not the project repository or ESP-IDF repository), you can add a call to the ``git_describe`` function in a component CMakeLists file in order to automatically trigger re-runs of CMake when the Git revision changes.
1160 - If not using Git, remember to manually run ``idf.py reconfigure`` whenever a source file may change.
1161 - To avoid this problem entirely, use ``COMPONENT_SRCS`` to list all source files in project components.
1162
1163 The best option will depend on your particular project and its users.
1164
1165 Build System Metadata
1166 =====================
1167
1168 For integration into IDEs and other build systems, when CMake runs the build process generates a number of metadata files in the ``build/`` directory. To regenerate these files, run ``cmake`` or ``idf.py reconfigure`` (or any other ``idf.py`` build command).
1169
1170 - ``compile_commands.json`` is a standard format JSON file which describes every source file which is compiled in the project. A CMake feature generates this file, and many IDEs know how to parse it.
1171 - ``project_description.json`` contains some general information about the ESP-IDF project, configured paths, etc.
1172 - ``flasher_args.json`` contains esptool.py arguments to flash the project's binary files. There are also ``flash_*_args`` files which can be used directly with esptool.py. See `Flash arguments`_.
1173 - ``CMakeCache.txt`` is the CMake cache file which contains other information about the CMake process, toolchain, etc.
1174 - ``config/sdkconfig.json`` is a JSON-formatted version of the project configuration values.
1175 - ``config/kconfig_menus.json`` is a JSON-formatted version of the menus shown in menuconfig, for use in external IDE UIs.
1176
1177 JSON Configuration Server
1178 -------------------------
1179
1180 .. highlight :: json
1181
1182 A tool called ``confserver.py`` is provided to allow IDEs to easily integrate with the configuration system logic. ``confserver.py`` is designed to run in the background and interact with a calling process by reading and writing JSON over process stdin & stdout.
1183
1184 You can run ``confserver.py`` from a project via ``idf.py confserver`` or ``ninja confserver``, or a similar target triggered from a different build generator.
1185
1186 The config server outputs human-readable errors and warnings on stderr and JSON on stdout. On startup, it will output the full values of each configuration item in the system as a JSON dictionary, and the available ranges for values which are range constrained. The same information is contained in ``sdkconfig.json``::
1187
1188   {"version": 1, "values": { "ITEM": "value", "ITEM_2": 1024, "ITEM_3": false }, "ranges" : { "ITEM_2" : [ 0, 32768 ] } }
1189
1190 Only visible configuration items are sent. Invisible/disabled items can be parsed from the static ``kconfig_menus.json`` file which also contains the menu structure and other metadata (descriptions, types, ranges, etc.)
1191
1192 The Configuration Server will then wait for input from the client. The client passes a request to change one or more values, as a JSON object followed by a newline::
1193
1194    {"version": "1", "set": {"SOME_NAME": false, "OTHER_NAME": true } }
1195
1196 The Configuration Server will parse this request, update the project ``sdkconfig`` file, and return a full list of changes::
1197
1198    {"version": 1, "values": {"SOME_NAME": false, "OTHER_NAME": true , "DEPENDS_ON_SOME_NAME": null}}
1199
1200 Items which are now invisible/disabled will return value ``null``. Any item which is newly visible will return its newly visible current value.
1201
1202 If the range of a config item changes, due to conditional range depending on another value, then this is also sent::
1203
1204    {"version": 1, "values": {"OTHER_NAME": true }, "ranges" : { "HAS_RANGE" : [ 3, 4 ] } }
1205
1206 If invalid data is passed, an "error" field is present on the object::
1207
1208     {"version": 1, "values": {}, "error": ["The following config symbol(s) were not visible so were not updated: NOT_VISIBLE_ITEM"]}
1209
1210 By default, no config changes are written to the sdkconfig file. Changes are held in memory until a "save" command is sent::
1211
1212     {"version": 1, "save": null }
1213
1214 To reload the config values from a saved file, discarding any changes in memory, a "load" command can be sent::
1215
1216     {"version": 1, "load": null }
1217
1218 The value for both "load" and "save" can be a new pathname, or "null" to load/save the previous pathname.
1219
1220 The response to a "load" command is always the full set of config values and ranges, the same as when the server is initially started.
1221
1222 Any combination of "load", "set", and "save" can be sent in a single command and commands are executed in that order. Therefore it's possible to load config from a file, set some config item values and then save to a file in a single command.
1223
1224 .. note:: The configuration server does not automatically load any changes which are applied externally to the ``sdkconfig`` file. Send a "load" command or restart the server if the file is externally edited.
1225
1226 .. note:: The configuration server does not re-run CMake to regenerate other build files or metadata files after ``sdkconfig`` is updated. This will happen automatically the next time ``CMake`` or ``idf.py`` is run.
1227
1228 .. _gnu-make-to-cmake:
1229
1230 Migrating from ESP-IDF GNU Make System
1231 ======================================
1232
1233 Some aspects of the CMake-based ESP-IDF build system are very similar to the older GNU Make-based system. For example, to adapt a ``component.mk`` file to ``CMakeLists.txt`` variables like ``COMPONENT_ADD_INCLUDEDIRS`` and ``COMPONENT_SRCDIRS`` can stay the same and the syntax only needs changing to CMake syntax.
1234
1235 Automatic Conversion Tool
1236 -------------------------
1237
1238 .. highlight:: bash
1239
1240 An automatic project conversion tool is available in :idf_file:`/tools/cmake/convert_to_cmake.py`. Run this command line tool with the path to a project like this::
1241
1242     $IDF_PATH/tools/cmake/convert_to_cmake.py /path/to/project_dir
1243
1244 The project directory must contain a Makefile, and GNU Make (``make``) must be installed and available on the PATH.
1245
1246 The tool will convert the project Makefile and any component ``component.mk`` files to their equivalent ``CMakeLists.txt`` files.
1247
1248 It does so by running ``make`` to expand the ESP-IDF build system variables which are set by the build, and then producing equivalent CMakelists files to set the same variables.
1249
1250 The conversion tool is not capable of dealing with complex Makefile logic or unusual targets. These will need to be converted by hand.
1251
1252 No Longer Available in CMake
1253 ----------------------------
1254
1255 Some features are significantly different or removed in the CMake-based system. The following variables no longer exist in the CMake-based build system:
1256
1257 - ``COMPONENT_BUILD_DIR``: Use ``CMAKE_CURRENT_BINARY_DIR`` instead.
1258 - ``COMPONENT_LIBRARY``: Defaulted to ``$(COMPONENT_NAME).a``, but the library name could be overriden by the component. The name of the component library can no longer be overriden by the component.
1259 - ``CC``, ``LD``, ``AR``, ``OBJCOPY``: Full paths to each tool from the gcc xtensa cross-toolchain. Use ``CMAKE_C_COMPILER``, ``CMAKE_C_LINK_EXECUTABLE``, ``CMAKE_OBJCOPY``, etc instead. `Full list here <cmake language variables_>`_.
1260 - ``HOSTCC``, ``HOSTLD``, ``HOSTAR``: Full names of each tool from the host native toolchain. These are no longer provided, external projects should detect any required host toolchain manually.
1261 - ``COMPONENT_ADD_LDFLAGS``: Used to override linker flags. Use the CMake `target_link_libraries`_ command instead.
1262 - ``COMPONENT_ADD_LINKER_DEPS``: List of files that linking should depend on. `target_link_libraries`_ will usually infer these dependencies automatically. For linker scripts, use the provided custom CMake function ``target_linker_scripts``.
1263 - ``COMPONENT_SUBMODULES``: No longer used, the build system will automatically enumerate all submodules in the ESP-IDF repository.
1264 - ``COMPONENT_EXTRA_INCLUDES``: Used to be an alternative to ``COMPONENT_PRIV_INCLUDEDIRS`` for absolute paths. Use ``COMPONENT_PRIV_INCLUDEDIRS`` for all cases now (can be relative or absolute).
1265 - ``COMPONENT_OBJS``: Previously, component sources could be specified as a list of object files. Now they can be specified as an list of source files via ``COMPONENT_SRCS``.
1266 - ``COMPONENT_OBJEXCLUDE``: Has been replaced with ``COMPONENT_SRCEXCLUDE``. Specify source files (as absolute paths or relative to component directory), instead.
1267 - ``COMPONENT_EXTRA_CLEAN``: Set property ``ADDITIONAL_MAKE_CLEAN_FILES`` instead but note :ref:`CMake has some restrictions around this functionality <ADDITIONAL_MAKE_CLEAN_FILES_note>`.
1268 - ``COMPONENT_OWNBUILDTARGET`` & ``COMPONENT_OWNCLEANTARGET``: Use CMake `ExternalProject`_ instead. See :ref:`component-build-full-override` for full details.
1269 - ``COMPONENT_CONFIG_ONLY``: Call ``register_config_only_component()`` instead. See `Configuration-Only Components`_.
1270 - ``CFLAGS``, ``CPPFLAGS``, ``CXXFLAGS``: Use equivalent CMake commands instead. See `Controlling Component Compilation`_.
1271
1272
1273 No Default Values
1274 -----------------
1275
1276 The following variables no longer have default values:
1277
1278 - ``COMPONENT_SRCDIRS``
1279 - ``COMPONENT_ADD_INCLUDEDIRS``
1280
1281 No Longer Necessary
1282 -------------------
1283
1284 It is no longer necessary to set ``COMPONENT_SRCDIRS`` if setting ``COMPONENT_SRCS`` (in fact, in the CMake-based system ``COMPONENT_SRCS`` is ignored if ``COMPONENT_SRCDIRS`` is set).
1285
1286 Flashing from make
1287 ------------------
1288
1289 ``make flash`` and similar targets still work to build and flash. However, project ``sdkconfig`` no longer specifies serial port and baud rate. Environment variables can be used to override these. See :ref:`flash-with-ninja-or-make` for more details.
1290
1291 .. _esp-idf-template: https://github.com/espressif/esp-idf-template
1292 .. _cmake: https://cmake.org
1293 .. _ninja: https://ninja-build.org
1294 .. _esptool.py: https://github.com/espressif/esptool/#readme
1295 .. _CMake v3.5 documentation: https://cmake.org/cmake/help/v3.5/index.html
1296 .. _cmake command line documentation: https://cmake.org/cmake/help/v3.5/manual/cmake.1.html#options
1297 .. _cmake add_library: https://cmake.org/cmake/help/v3.5/command/add_library.html
1298 .. _cmake if: https://cmake.org/cmake/help/v3.5/command/if.html
1299 .. _cmake list: https://cmake.org/cmake/help/v3.5/command/list.html
1300 .. _cmake project: https://cmake.org/cmake/help/v3.5/command/project.html
1301 .. _cmake set: https://cmake.org/cmake/help/v3.5/command/set.html
1302 .. _cmake string: https://cmake.org/cmake/help/v3.5/command/string.html
1303 .. _cmake faq generated files: https://cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F
1304 .. _ADDITIONAL_MAKE_CLEAN_FILES: https://cmake.org/cmake/help/v3.5/prop_dir/ADDITIONAL_MAKE_CLEAN_FILES.html
1305 .. _ExternalProject: https://cmake.org/cmake/help/v3.5/module/ExternalProject.html
1306 .. _cmake language variables: https://cmake.org/cmake/help/v3.5/manual/cmake-variables.7.html#variables-for-languages
1307 .. _set_source_files_properties: https://cmake.org/cmake/help/v3.5/command/set_source_files_properties.html
1308 .. _target_compile_options: https://cmake.org/cmake/help/v3.5/command/target_compile_options.html
1309 .. _target_link_libraries: https://cmake.org/cmake/help/v3.5/command/target_link_libraries.html#command:target_link_libraries
1310 .. _cmake_toolchain_file: https://cmake.org/cmake/help/v3.5/variable/CMAKE_TOOLCHAIN_FILE.html
1311 .. _quirc: https://github.com/dlbeer/quirc
1312 .. _pyenv: https://github.com/pyenv/pyenv#README
1313 .. _virtualenv: https://virtualenv.pypa.io/en/stable/