Files
arduino-sketch-builder-nix/README.md

133 lines
4.1 KiB
Markdown

# arduino-sketch-builder-nix
A flake that allows building Arduino sketches with nix.
This project is based on [arduino-nix](https://github.com/bouk/arduino-nix).
## Example
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
arduino-sketch-builder-nix.url = "git+https://git.clerie.de/clerie/arduino-sketch-builder-nix";
arduino-index = {
url = "github:bouk/arduino-indexes";
flake = false;
};
arduino-esp32 = {
url = "github:espressif/arduino-esp32/gh-pages";
flake = false;
};
};
outputs = {
self,
nixpkgs,
arduino-sketch-builder-nix,
arduino-index,
arduino-esp32,
...
}@attrs:
let
overlays = [
(arduino-sketch-builder-nix.overlay)
(arduino-sketch-builder-nix.mkArduinoPackageOverlay (arduino-index + "/index/package_index.json"))
(arduino-sketch-builder-nix.mkArduinoPackageOverlay (arduino-index + "/index/package_rp2040_index.json"))
(arduino-sketch-builder-nix.mkArduinoLibraryOverlay (arduino-index + "/index/library_index.json"))
(arduino-sketch-builder-nix.mkArduinoPackageOverlay (arduino-esp32 + "/package_esp32_index.json"))
];
in
(flake-utils.lib.eachDefaultSystem (system:
let
pkgs = (import nixpkgs) {
inherit system overlays;
};
# arduinoEnv provides bin/arduino-cli and some useful helpers functions
arduinoEnv = pkgs.makeArduinoEnv {
libraries = with pkgs.arduinoLibraries; [
(arduino-sketch-builder-nix.latestVersion ADS1X15)
(arduino-sketch-builder-nix.latestVersion Ethernet_Generic)
(arduino-sketch-builder-nix.latestVersion SCL3300)
(arduino-sketch-builder-nix.latestVersion TMCStepper)
(arduino-sketch-builder-nix.latestVersion pkgs.arduinoLibraries."Adafruit PWM Servo Driver Library")
];
packages = with pkgs.arduinoPackages; [
platforms.arduino.avr."1.6.23"
platforms.rp2040.rp2040."2.3.3"
];
};
arduinoEnvESP32 = pkgs.makeArduinoEnv {
packages = with pkgs.arduinoPackages; [
platforms.esp32.esp32."2.0.14"
];
# ESP32 tools require python with some custom dependencies
# we can provide them via runtimeInputs
runtimeInputs = with pkgs; [
(python3.withPackages(ps: with ps; [ pyserial ]))
];
};
in rec {
packages = {
inherit arduinoEnv;
my-rp2020-project = arduinoEnv.buildArduinoSketch {
name = "my-rp2040-project";
src = ./. + "/my-rp2040-project";
fqbn = "arduino:mbed_rp2040:pico";
};
my-esp32-poe-iso-project = arduinoEnvESP32.buildArduinoSketch {
name = "my-esp32-poe-iso-project";
src = ./. + "/my-esp32-poe-iso-project";
fqbn = "esp32:esp32:esp32-poe-iso";
};
};
hydraJobs = {
# Build binary tarball in CI
my-esp32-poe-iso-project = my-esp32-poe-iso-project.binaryTarball;
};
}
));
}
```
### Package and library index
You need to provide a package index and library index. You can use [arduino-indexes](https://github.com/bouk/arduino-indexes) as a collection of common indexes. Accessing them via this git repo allows Nix Flakes to pin them as an input.
Alternatively, you can just download and check in the official Arduino indexes:
- <https://downloads.arduino.cc/packages/package_index.json>
- <https://downloads.arduino.cc/libraries/library_index.json>
### Interactive arduino-cli usage:
```
nix shell .#arduinoEnv
```
This adds a wrapped version of `arduino-cli` to your path that reflects you Arduino environment.
### Build Arduino Sketch
```
nix build .#my-rp2040-project
```
Now you have `result` in your current working directory containing the compile outputs.
### Upload to board
```
nix run .#my-rp2040-project.uploadArduinoSketch -- -p /dev/ttyUSB0
```
This with upload the sketch via serial on `/dev/ttyUSB0`.
You can append any additional options from `arduino-cli upload` after `--`.
It uses the same fqbn as specified in `buildArduinoSketch`.