ESP-IDF: Difference between revisions
imported>Bendlas m mention vscode in comment for tutorial link |
imported>Mirrexagon Updated toolchain derivation to latest as of 2021-11-03, overhauled shell.nix to create a Python venv |
||
Line 17: | Line 17: | ||
stdenv.mkDerivation rec { | stdenv.mkDerivation rec { | ||
pname = "esp32-toolchain"; | |||
version = " | version = "2021r2"; | ||
src = fetchurl { | src = fetchurl { | ||
url = "https:// | url = "https://github.com/espressif/crosstool-NG/releases/download/esp-${version}/xtensa-esp32-elf-gcc8_4_0-esp-${version}-linux-amd64.tar.gz"; | ||
sha256 = | hash = "sha256-PrPWiyf6a6Wvb4jaIcuPrOm+AJTaqolgeTz+Vwq3hf8="; | ||
}; | }; | ||
Line 52: | Line 52: | ||
== Setting up ESP-IDF and the development shell == | == Setting up ESP-IDF and the development shell == | ||
Clone the [https://github.com/espressif/esp-idf | Clone the [https://github.com/espressif/esp-idf espressif/esp-idf] repository: | ||
<syntaxhighlight lang="sh"> | <syntaxhighlight lang="sh"> | ||
cd ~/esp | cd ~/esp | ||
Line 58: | Line 58: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Now that we have ESP-IDF in place, it's time to set up the nix-shell environment with all the dependencies we need | Now that we have ESP-IDF in place, it's time to set up the <code>nix-shell</code> environment with all the dependencies we need. | ||
Note that this environment uses a Python virtual environment and pip to get all the necessary Python dependencies, which is easier to keep up to date than using Python packages from Nix (at the cost of some reproducibility). The virtual environment is created if it doesn't already exist. When updating ESP-IDF, delete the <code>.python_env</code> directory and re-run <code>nix-shell</code>. | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
{ | { pkgs ? import <nixpkgs> {} }: | ||
pkgs.mkShell { | |||
name = "esp-idf-env"; | |||
buildInputs = with pkgs; [ | |||
(pkgs.callPackage ./esp32-toolchain.nix {}) | |||
git | |||
wget | |||
gnumake | |||
flex | |||
bison | |||
gperf | |||
pkgconfig | |||
cmake | |||
ncurses5 | |||
ninja | |||
(python3.withPackages (p: with p; [ | |||
pip | |||
virtualenv | |||
])) | |||
( | |||
]; | ]; | ||
shellHook = '' | shellHook = '' | ||
export | export IDF_PATH=$(pwd)/esp-idf | ||
export | export PATH=$IDF_PATH/tools:$PATH | ||
export | export IDF_PYTHON_ENV_PATH=$(pwd)/.python_env | ||
if [ ! -e $IDF_PYTHON_ENV_PATH ]; then | |||
python -m venv $IDF_PYTHON_ENV_PATH | |||
. $IDF_PYTHON_ENV_PATH/bin/activate | |||
pip install -r $IDF_PATH/requirements.txt | |||
else | |||
. $IDF_PYTHON_ENV_PATH/bin/activate | |||
fi | |||
''; | ''; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Save this as <code>~/esp/ | Save this as <code>~/esp/shell.nix</code>. | ||
You can now enter the development shell with the ESP32 toolchain and dependencies of ESP-IDF: | You can now enter the development shell with the ESP32 toolchain and dependencies of ESP-IDF: | ||
<syntaxhighlight lang="sh"> | <syntaxhighlight lang="sh"> | ||
cd ~/esp | cd ~/esp | ||
nix-shell | nix-shell | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 113: | Line 121: | ||
== See also == | == See also == | ||
* [https://github.com/bgamari/esp32.nix esp32.nix] provides nix expression for building the | * [https://github.com/bgamari/esp32.nix esp32.nix] provides nix expression for building the esp32 sdk as well as micropython. | ||
* [https://github.com/taktoa/esp32-baremetal esp32-baremetal] has an example how to build esp32 firmware without relying on an sdk. | * [https://github.com/taktoa/esp32-baremetal esp32-baremetal] has an example how to build esp32 firmware without relying on an sdk. | ||
* [https://specific.solutions.limited/projects/hanging-plotter/electronics tutorial] for setting up the prebuilt toolchain with vscode | * [https://specific.solutions.limited/projects/hanging-plotter/electronics tutorial] for setting up the prebuilt toolchain with vscode | ||
[[Category:Guide]] | [[Category:Guide]] |
Revision as of 05:25, 3 November 2021
ESP-IDF is the official framework to develop programs for the Espressif Systems ESP32 series microcontrollers. This guide explains how to install and use ESP-IDF on NixOS (I have not tested this on non-NixOS systems, but it might also work).
Setting up the toolchain
ESP-IDF uses the Xtensa ESP32 GCC toolchain. Espressif hosts prebuilt binaries on their website. Sadly, these are not statically compiled, and do not work on NixOS without the use of a FHS environment. I will use buildFHSUserEnv
to make the binaries work. Let's make a derivation out of this:
{ stdenv, lib, fetchurl, makeWrapper, buildFHSUserEnv }:
let
fhsEnv = buildFHSUserEnv {
name = "esp32-toolchain-env";
targetPkgs = pkgs: with pkgs; [ zlib ];
runScript = "";
};
in
stdenv.mkDerivation rec {
pname = "esp32-toolchain";
version = "2021r2";
src = fetchurl {
url = "https://github.com/espressif/crosstool-NG/releases/download/esp-${version}/xtensa-esp32-elf-gcc8_4_0-esp-${version}-linux-amd64.tar.gz";
hash = "sha256-PrPWiyf6a6Wvb4jaIcuPrOm+AJTaqolgeTz+Vwq3hf8=";
};
buildInputs = [ makeWrapper ];
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
cp -r . $out
for FILE in $(ls $out/bin); do
FILE_PATH="$out/bin/$FILE"
if [[ -x $FILE_PATH ]]; then
mv $FILE_PATH $FILE_PATH-unwrapped
makeWrapper ${fhsEnv}/bin/esp32-toolchain-env $FILE_PATH --add-flags "$FILE_PATH-unwrapped"
fi
done
'';
meta = with lib; {
description = "ESP32 toolchain";
homepage = https://docs.espressif.com/projects/esp-idf/en/stable/get-started/linux-setup.html;
license = licenses.gpl3;
};
}
Create a new directory ~/esp
and save this derivation as ~/esp/esp-toolchain.nix
.
Setting up ESP-IDF and the development shell
Clone the espressif/esp-idf repository:
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Now that we have ESP-IDF in place, it's time to set up the nix-shell
environment with all the dependencies we need.
Note that this environment uses a Python virtual environment and pip to get all the necessary Python dependencies, which is easier to keep up to date than using Python packages from Nix (at the cost of some reproducibility). The virtual environment is created if it doesn't already exist. When updating ESP-IDF, delete the .python_env
directory and re-run nix-shell
.
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
name = "esp-idf-env";
buildInputs = with pkgs; [
(pkgs.callPackage ./esp32-toolchain.nix {})
git
wget
gnumake
flex
bison
gperf
pkgconfig
cmake
ncurses5
ninja
(python3.withPackages (p: with p; [
pip
virtualenv
]))
];
shellHook = ''
export IDF_PATH=$(pwd)/esp-idf
export PATH=$IDF_PATH/tools:$PATH
export IDF_PYTHON_ENV_PATH=$(pwd)/.python_env
if [ ! -e $IDF_PYTHON_ENV_PATH ]; then
python -m venv $IDF_PYTHON_ENV_PATH
. $IDF_PYTHON_ENV_PATH/bin/activate
pip install -r $IDF_PATH/requirements.txt
else
. $IDF_PYTHON_ENV_PATH/bin/activate
fi
'';
}
Save this as ~/esp/shell.nix
.
You can now enter the development shell with the ESP32 toolchain and dependencies of ESP-IDF:
cd ~/esp
nix-shell
That's all you need to start developing with ESP-IDF on NixOS! The next step is to follow the ESP-IDF Get Started guide from section "Start a project" onward.
See also
- esp32.nix provides nix expression for building the esp32 sdk as well as micropython.
- esp32-baremetal has an example how to build esp32 firmware without relying on an sdk.
- tutorial for setting up the prebuilt toolchain with vscode