ESP-IDF: Difference between revisions
imported>Wirew0rm Add the cryptography python package which is required by ESP-IDF |
imported>Staff-d Add new dependencies (cmake and glibcLocales as well as the python dependencies setuptools, pyelftools, pyparsing, click) and add IDF_TOOLS_PATH variable to the shell hook to enable the usage of idf.py |
||
Line 65: | Line 65: | ||
let | let | ||
inherit (nixpkgs) pkgs; | inherit (nixpkgs) pkgs; | ||
# esp-idf as of Nov 2019 requires pyparsing < 2.4 | |||
python2 = let | |||
packageOverrides = self: super: { | |||
pyparsing = super.pyparsing.overridePythonAttrs( old: rec { | |||
version = "2.3.1"; | |||
src = super.fetchPypi { | |||
pname="pyparsing"; | |||
inherit version; | |||
sha256="66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a"; | |||
}; | |||
}); | |||
}; | |||
in pkgs.python2.override{inherit packageOverrides; self= python2;}; | |||
in | in | ||
pkgs.stdenv.mkDerivation { | pkgs.stdenv.mkDerivation { | ||
name = "esp-idf-env"; | name = "esp-idf-env"; | ||
src = ./esp-idf; | |||
dontBuild = true; | |||
dontConfigure = true; | |||
buildInputs = with pkgs; [ | buildInputs = with pkgs; [ | ||
gawk gperf gettext automake bison flex texinfo help2man libtool autoconf ncurses5 | gawk gperf gettext automake bison flex texinfo help2man libtool autoconf ncurses5 cmake glibcLocales | ||
(python2.withPackages (ppkgs: with ppkgs; [ pyserial future cryptography ])) | (python2.withPackages (ppkgs: with ppkgs; [ pyserial future cryptography setuptools pyelftools pyparsing click ])) | ||
(pkgs.callPackage ~/esp/esp32-toolchain.nix {}) | (pkgs.callPackage ~/esp/esp32-toolchain.nix {}) | ||
]; | ]; | ||
Line 77: | Line 94: | ||
export NIX_CFLAGS_LINK=-lncurses | export NIX_CFLAGS_LINK=-lncurses | ||
export IDF_PATH=$HOME/esp/esp-idf | export IDF_PATH=$HOME/esp/esp-idf | ||
export IDF_TOOLS_PATH=$HOME/esp/esp-idf/tools | |||
export PATH="$IDF_TOOLS_PATH:$PATH" | |||
''; | ''; | ||
} | } |
Revision as of 20:23, 18 November 2019
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, fetchurl, makeWrapper, buildFHSUserEnv }:
let
fhsEnv = buildFHSUserEnv {
name = "esp32-toolchain-env";
targetPkgs = pkgs: with pkgs; [ zlib ];
runScript = "";
};
in
stdenv.mkDerivation rec {
name = "esp32-toolchain";
version = "1.22.0";
src = fetchurl {
url = "https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz";
sha256 = "0mji8jq1dg198z8bl50i0hs3drdqa446kvf6xpjx9ha63lanrs9z";
};
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 stdenv.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:
{ nixpkgs ? import <nixpkgs> {} }:
let
inherit (nixpkgs) pkgs;
# esp-idf as of Nov 2019 requires pyparsing < 2.4
python2 = let
packageOverrides = self: super: {
pyparsing = super.pyparsing.overridePythonAttrs( old: rec {
version = "2.3.1";
src = super.fetchPypi {
pname="pyparsing";
inherit version;
sha256="66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a";
};
});
};
in pkgs.python2.override{inherit packageOverrides; self= python2;};
in
pkgs.stdenv.mkDerivation {
name = "esp-idf-env";
src = ./esp-idf;
dontBuild = true;
dontConfigure = true;
buildInputs = with pkgs; [
gawk gperf gettext automake bison flex texinfo help2man libtool autoconf ncurses5 cmake glibcLocales
(python2.withPackages (ppkgs: with ppkgs; [ pyserial future cryptography setuptools pyelftools pyparsing click ]))
(pkgs.callPackage ~/esp/esp32-toolchain.nix {})
];
shellHook = ''
export NIX_CFLAGS_LINK=-lncurses
export IDF_PATH=$HOME/esp/esp-idf
export IDF_TOOLS_PATH=$HOME/esp/esp-idf/tools
export PATH="$IDF_TOOLS_PATH:$PATH"
'';
}
Save this as ~/esp/default.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.