diff --git a/arduino-env.nix b/arduino-env.nix new file mode 100644 index 0000000..6c630eb --- /dev/null +++ b/arduino-env.nix @@ -0,0 +1,69 @@ +{ lib, pkgs }: + +let + mkArduinoEnv = { + packages + , libraries + , nativeBuildInputs ? [] + }: let + arduino-cli = pkgs.wrapArduinoCLI { + inherit packages libraries; + }; + in pkgs.stdenvNoCC.mkDerivation (finalAttrs: { + name = "arduino-env"; + + buildInputs = [ pkgs.makeWrapper ]; + + nativeBuildInputs = [ + arduino-cli + ] ++ nativeBuildInputs; + + phases = ["buildPhase"]; + + buildPhase = '' + mkdir -p $out + makeWrapper ${arduino-cli}/bin/arduino-cli $out/bin/arduino-cli \ + --prefix PATH : ${lib.makeBinPath nativeBuildInputs} + ''; + + passthru = { + buildArduinoSketch = buildArduinoSketch finalAttrs.finalPackage; + }; + }); + + buildArduinoSketch = arduinoEnv: { + name + , src + , fqbn + }: let + in pkgs.stdenvNoCC.mkDerivation (finalAttrs: { + inherit name src; + nativeBuildInputs = with pkgs; [ + arduinoEnv + ]; + + buildPhase = '' + arduino-cli compile --log --output-dir=out --fqbn=${fqbn} + ''; + + installPhase = '' + mkdir -p $out + cp -R out/* $out + ''; + + passthru = { + uploadArduinoSketch = uploadArduinoSketch arduinoEnv { + inherit fqbn; + arduinoSketch = (finalAttrs.finalPackage); + }; + }; + }); + + uploadArduinoSketch = arduinoEnv: { + arduinoSketch + , fqbn + }: pkgs.writeScriptBin "upload-arduino-sketch" '' + ${arduinoEnv}/bin/arduino-cli upload --log --input-dir=${arduinoSketch} --fqbn=${fqbn} "$@" + ''; +in + mkArduinoEnv diff --git a/flake.nix b/flake.nix index 18086d3..7b766be 100644 --- a/flake.nix +++ b/flake.nix @@ -16,6 +16,7 @@ overlay = (self: super: { wrapArduinoCLI = self.callPackage ./wrap-arduino-cli.nix { }; + mkArduinoEnv = self.callPackage ./arduino-env.nix {}; }); # Expose helper to select package