From 003837a634d2a31907fa7398a6f19fa724df94b5 Mon Sep 17 00:00:00 2001 From: cor Date: Sun, 4 Jan 2026 23:11:11 +0100 Subject: [PATCH] Add reproducible Nix dev environment --- .gitignore | 1 + flake.lock | 61 +++++++++++++++++++++++++++ flake.nix | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore index bae255eb..5535dbb2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .vscode lib/EpdFont/fontsrc *.generated.h +result diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..9dd743ba --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1765835352, + "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1767379071, + "narHash": "sha256-EgE0pxsrW9jp9YFMkHL9JMXxcqi/OoumPJYwf+Okucw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fb7944c166a3b630f177938e478f0378e64ce108", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1765674936, + "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..e16937c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,120 @@ +{ + description = "CrossPoint Reader - Firmware for Xteink X4 e-paper display"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-parts.url = "github:hercules-ci/flake-parts"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + + perSystem = { config, self', pkgs, lib, system, ... }: + let + # Version from platformio.ini + version = "0.12.0"; + + # Create a platformio wrapper with all required dependencies + platformio = pkgs.platformio-core.overrideAttrs (old: { + propagatedBuildInputs = (old.propagatedBuildInputs or [ ]) ++ [ + pkgs.python3Packages.packaging + ]; + }); + + # Python with required packages for build scripts + pythonEnv = pkgs.python3.withPackages (ps: [ ps.pip ]); + + # FHS environment to run PlatformIO with dynamically linked toolchains + fhsEnv = pkgs.buildFHSEnv { + name = "pio-env"; + targetPkgs = pkgs: [ + platformio + pythonEnv + pkgs.git + pkgs.zlib + pkgs.stdenv.cc.cc.lib + ]; + runScript = "bash"; + }; + + # Build script that runs inside FHS environment + buildScript = pkgs.writeShellScriptBin "build-firmware" '' + set -e + echo "Building CrossPoint Reader firmware..." + echo "" + + # Ensure we're in the project directory + if [ ! -f platformio.ini ]; then + echo "Error: platformio.ini not found. Run this from the project root." + exit 1 + fi + + # Run the build inside FHS environment + ${fhsEnv}/bin/pio-env -c "pio run -e gh_release" + + echo "" + echo "Build complete! Firmware at: .pio/build/gh_release/firmware.bin" + ''; + + # Wrapper for pio that runs inside FHS environment + pioWrapper = pkgs.writeShellScriptBin "pio" '' + exec ${fhsEnv}/bin/pio-env -c "pio $*" + ''; + in + { + packages = { + default = buildScript; + build-script = buildScript; + }; + + devShells.default = pkgs.mkShell { + packages = [ + # Build tools (wrapped for FHS compatibility) + fhsEnv + pioWrapper + buildScript + pythonEnv + + # C/C++ language server + pkgs.clang-tools + + # Python language server + pkgs.python3Packages.python-lsp-server + + # Nix language server + pkgs.nixd + + # Git for submodules + pkgs.git + + # Useful utilities + pkgs.esptool + ]; + + shellHook = '' + echo "CrossPoint Reader development environment" + echo "" + echo "Build commands:" + echo " pio run - Build firmware (default env, via FHS wrapper)" + echo " pio run -e gh_release - Build release firmware" + echo " pio run --target upload - Flash to device" + echo " build-firmware - Build release firmware directly" + echo "" + echo "Enter FHS shell for direct PlatformIO access:" + echo " pio-env - Enter FHS shell with PlatformIO" + echo "" + echo "Language servers available:" + echo " clangd - C/C++ LSP" + echo " pylsp - Python LSP" + echo " nixd - Nix LSP" + ''; + }; + + apps.build = { + type = "app"; + program = "${buildScript}/bin/build-firmware"; + }; + }; + }; +}