(Espressif's IoT Development Framework)
The ESP-IDF API in Rust, with support for each ESP chip (ESP32, ESP32S2, ESP32S3, ESP32C3 etc.) based on the Rust target.
For more information, check out:
- The Rust on ESP Book
- The esp-idf-template project
- The esp-idf-svc project
- The esp-idf-hal project
- The Rust for Xtensa toolchain
- The Rust-with-STD demo project
- To build this crate, please follow all the build requirements specified in the ESP-IDF Rust Hello World template crate
- The relevant Espressif toolchain, as well as the ESP-IDF framework itself are all automatically
downloaded during the build:
- With feature
native
(default): utilizing native ESP-IDF tooling via the embuild crate or - With feature
pio
(backup): utilizing PlatformIO (also via the embuild crate).
- With feature
- Check the ESP-IDF Rust Hello World template crate for a "Hello, world!" Rust template demonstrating how to use and build this crate.
- Check the demo crate for a more comprehensive example in terms of capabilities.
This is the default feature for downloading all tools and building the ESP-IDF framework using the framework's "native" (own) tooling. It relies on build and installation utilities available in the embuild crate.
The native
builder installs all needed tools to compile this crate as well as the ESP-IDF framework itself.
TBD: Upcoming
This is a backup feature for installing all build tools and building the ESP-IDF framework. It uses PlatformIO via the embuild crate.
Similarly to the native
builder, the pio
builder also automatically installs all needed tools (PlatformIO packages and frameworks in this case) to compile this crate as well as the ESP-IDF framework itself.
NOTE: The pio
builder is less flexible than the default native
builder in that it can work with only one, specific version of ESP-IDF. At the time of writing, this is V4.3.2.
To enable Bluetooth, or do other configurations to the ESP-IDF sdkconfig you might take advantage of the cargo-pio Cargo subcommand:
- To install it, issue
cargo install cargo-pio --git https://github.com/ivmarkov/cargo-pio
- To open the ESP-IDF interactive menuconfig system, issue
cargo pio espidf menuconfig
in the root of your binary crate project - To use the generated/updated
sdkconfig
file, follow the steps described in the "Bluetooth Support" section
Environment variables are used to configure how the ESP-IDF framework is compiled.
Note that instead of / in addition to specifying those on the command line, you can also put these in a .config/cargo.toml
file inside your crate directory
(or a parent directory of your crate) by using the recently stabilized Cargo configurable-env feature.
The following environment variables are used by the build script:
-
ESP_IDF_SDKCONFIG_DEFAULTS
:A
;
-separated list of paths tosdkconfig.defaults
files to be used as base values for thesdkconfig
. If such a path is relative, it will be relative to the cargo workspace directory (i.e. the directory that contains thetarget
dir).If unspecified
sdkconfig.defaults
is used as default.For each defaults file in this list more specific version will also be searched and used. This happens with the following patterns and order (least to most specific):
<path>
<path>.<profile>
<path>.<mcu>
<path>.<profile>.<mcu>
where
<profile>
is the current cargo profile used (debug
/release
) and<mcu>
specifies the mcu for which this is currently compiled for (see theMCU
configuration option below).Also note that a setting contained in a more specific defaults file will override the same setting specified in a less specific one.
-
ESP_IDF_SDKCONFIG
:The base-path to the
sdkconfig
file used to configure theesp-idf
. If this is a relative path, it is relative to the cargo workspace directory.If unspecified
sdkconfig
is used as default.Similar to the
sdkconfig.defaults
-file a more specificsdkconfig
-file will be selected if available. This happens with the following patterns and precedence:<path>.<profile>.<mcu>
<path>.<mcu>
<path>.<profile>
<path>
Note (native builder only):
The cargo optimization options (debug
andopt-level
) are used by default to determine the compiler optimizations of theesp-idf
, however if the compiler optimization options are already set in thesdkconfig
they will be used instead. -
ESP_IDF_TOOLS_INSTALL_DIR
:The location where the ESP-IDF framework tooling is assumed to be/will be installed. The framework tooling is either PlatformIO (when the
pio
builder is used), or the ESP-IDF native toolset (when thenative
builder is used).This variable can take one of the following values:
-
workspace
(default) - the tooling will be installed/used in<crate-workspace-dir>/.embuild/platformio
forpio
, and<crate-workspace-dir>/.embuild/espressif
for thenative
builder; -
out
- the tooling will be installed/used inside the crate's build output directory, and will be deleted whencargo clean
is invoked; -
global
- the tooling will be installed/used in its standard directory (~/.platformio
for PlatformIO, and~./espressif
for the native ESP-IDF toolset); -
custom:<dir>
- the tooling will be installed/used in the directory specified by<dir>
. If this directory is a relative location, it is assumed to be relative to the crate's workspace dir.ATTENTION: Please be extra careful with the
custom:<dir>
setting when switching frompio
tonative
and the other way around, because the builder will install the tooling in<dir>
without using any additionalplatformio
orespressif
subdirectories, so if you are not careful, you might end up with both PlatformIO, as well as the ESP-IDF native tooling intermingled together in a single folder.
Note that both builders (
native
andpio
) clone the ESP-IDF GIT repository inside the tooling directory as well. This restriction might be lifted soon for thenative
builder, whereas the user would be able to point the build to a custom ESP-IDF repository location. -
-
ESP_IDF_VERSION
(native builder only):The version used for the
esp-idf
can be one of the following:commit:<hash>
: Uses the commit<hash>
of theesp-idf
repository. Note that this will clone the wholeesp-idf
not just one commit.tag:<tag>
: Uses the tag<tag>
of theesp-idf
repository.branch:<branch>
: Uses the branch<branch>
of theesp-idf
repository.v<major>.<minor>
or<major>.<minor>
: Uses the tagv<major>.<minor>
of theesp-idf
repository.<branch>
: Uses the branch<branch>
of theesp-idf
repository.
It defaults to
v4.3.2
. -
ESP_IDF_REPOSITORY
(native builder only):The URL to the git repository of the
esp-idf
, defaults to https://github.com/espressif/esp-idf.git.Note that when the
pio
builder is used, it is possible to achieve something similar toESP_IDF_VERSION
andESP_IDF_REPOSITORY
by using theplatform_packages
PlatformIO option as follows:ESP_IDF_PIO_CONF="platform_packages = framework-espidf @ <git-url> [@ <git-branch>]"
- The above approach however has the restriction that PlatformIO will always use the ESP-IDF build tooling from its own ESP-IDF distribution, so the user-provided ESP-IDF branch may or may not compile. The current PlatformIO tooling is suitable for compiling ESP-IDF branches derived from versions 4.3.X .
-
ESP_IDF_GLOB[_XXX]_BASE
andESP_IDF_GLOB[_XXX]_YYY
:A pair of environment variable prefixes that enable copying files and directory trees that match a certain glob mask into the native C project used for building the ESP-IDF framework:
-
ESP_IDF_GLOB[_XXX]_BASE
specifies the base directory which will be glob-ed for resources to be copied -
ESP_IDF_GLOB[_XXX]_BASE_YYY
specifies one or more environment variables that represent the glob masks of resources to be searched for and copied, using the directory designated by theESP_IDF_GLOB[_XXX]_BASE
environment variable as the root. For example, if the follwing variables are specified:ESP_IDF_GLOB_HOMEDIR_BASE=/home/someuser
ESP_IDF_GLOB_HOMEDIR_FOO=foo*
ESP_IDF_GLOB_HOMEDIR_BAR=bar*
... then all files and directories matching 'foo*' or 'bar*' from the home directory of the user will be copied in theESP-IDF C project.
Note also that
_HOMEDIR
in the above example is optional, and is just a mechanism allowing the user to specify more than base directory and its glob patterns.
-
-
ESP_IDF_PIO_CONF_XXX
(pio builder only):A PlatformIO setting (or multiple settings separated by a newline) that will be passed as-is to the
platformio.ini
file of the C project that compiles the ESP-IDF.- Check the PlatformIO documentation for more information as to what settings you can pass via this variable.
- Note also that this is not one variable - but rather - a family of variables all starting with
ESP_IDF_PIO_CONF_
. I.e., passingESP_IDF_PIO_CONF_1
as well asESP_IDF_PIO_CONF_FOO
is valid and all such variables will be honored
-
ESP_IDF_CMAKE_GENERATOR
(native builder only):The CMake generator to be used when building the ESP-IDF SDK. If not specified or set to
default
, Ninja will be used on all platforms except Linux/aarch64, where (for now) the Unix Makefiles generator will be used, as there are no Ninja builds for that platform provided by Espressif yet. Possible values for this environment variable are the names of all command-line generators that CMake supports with spaces and hyphens removed. -
MCU
:The MCU name (i.e.
esp32
,esp32s2
,esp32s3
esp32c3
andesp32h2
).-
If not set this will be automatically detected from the cargo target.
-
Note that older ESP-IDF versions might not support all MCUs from above.
-
If you are interested how it all works under the hood, check the build.rs build script of this crate.