=====
CMake
=====
LVGL supports integrating with `CMake `__. It comes
with preconfigured targets for:
- `Espressif (ESP32) `__
- `MicroPython `__
- `Zephyr `__
On top of the preconfigured targets you can also use "plain" CMake to
integrate LVGL into any custom C/C++ project.
Prerequisites
*************
* CMake ( >= 3.12.4 )
* Compatible build tool e.g.
* `Make `__
* `Ninja `__
Building LVGL with CMake
************************
There are many ways to include external CMake projects into your own. A
modern one also used in this example is the CMake `FetchContent `__
module. This module conveniently allows us to download dependencies
directly at configure time from e.g. `GitHub `__.
Here is an example how we might include LVGL into our own project.
.. code:: cmake
cmake_minimum_required(VERSION 3.14)
include(FetchContent)
project(MyProject LANGUAGES C CXX)
# Build an executable called "MyFirmware"
add_executable(MyFirmware src/main.c)
# Specify path to own LVGL config header
set(LV_CONF_PATH
${CMAKE_CURRENT_SOURCE_DIR}/src/lv_conf.h
CACHE STRING "" FORCE)
# Fetch LVGL from GitHub
FetchContent_Declare(lvgl GIT_REPOSITORY https://github.com/lvgl/lvgl.git)
FetchContent_MakeAvailable(lvgl)
# The target "MyFirmware" depends on LVGL
target_link_libraries(MyFirmware PRIVATE lvgl::lvgl)
This configuration declares a dependency between the two targets
**MyFirmware** and **lvgl**. Upon building the target **MyFirmware**
this dependency will be resolved and **lvgl** will be built and linked
with it. Since LVGL requires a config header called `lv_conf.h `__
to be includable by its sources we also set the option :c:macro:`LV_CONF_PATH`
to point to our own copy of it.
Additional CMake options
========================
Besides :c:macro:`LV_CONF_PATH` there are few additional CMake options available.
Include paths options
---------------------
- :c:macro:`LV_LVGL_H_INCLUDE_SIMPLE`: which specifies whether to ``#include "lvgl.h"`` absolute or relative
============ ==============
ON (default) OFF
============ ==============
"lvgl.h" "../../lvgl.h"
============ ==============
- :c:macro:`LV_CONF_INCLUDE_SIMPLE`: which specifies whether to ``#include "lv_conf.h"`` and ``"lv_drv_conf.h"`` absolute or relative
=============== =====================
ON (default) OFF
=============== =====================
"lv_conf.h" "../../lv_conf.h"
"lv_drv_conf.h" "../../lv_drv_conf.h"
=============== =====================
..
We do not recommend disabling those options unless your folder layout
makes it absolutely necessary.
Examples/demos options
----------------------
| LVGL `examples `__ and
`demos `__ are built by default in
the main CMake file.
| To disable their built, use:
- :c:macro:`LV_CONF_BUILD_DISABLE_EXAMPLES`: Set to ``1`` to disable *examples* build
- :c:macro:`LV_CONF_BUILD_DISABLE_DEMOS`: Set to ``1`` to disable *demos* build
Building LVGL drivers
*********************
To build `LVGL drivers `__, you can use:
.. code:: cmake
FetchContent_Declare(lv_drivers
GIT_REPOSITORY https://github.com/lvgl/lv_drivers)
FetchContent_MakeAvailable(lv_drivers)
# The target "MyFirmware" depends on LVGL and drivers
target_link_libraries(MyFirmware PRIVATE lvgl::lvgl lvgl::drivers)
Build shared libraries with CMake
*********************************
By default, LVGL will be built as a static library (archive). CMake can
instead be instructed to build LVGL as shared library (.so/.dll/etc.):
.. code:: cmake
set(BUILD_SHARED_LIBS ON)
OR
.. code:: console
$ cmake "-DBUILD_SHARED_LIBS=ON" .