Add reproducible Nix dev environment

This commit is contained in:
cor 2026-01-04 23:11:11 +01:00
parent bed1fbf849
commit 003837a634
No known key found for this signature in database
3 changed files with 182 additions and 0 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
.vscode .vscode
lib/EpdFont/fontsrc lib/EpdFont/fontsrc
*.generated.h *.generated.h
result

61
flake.lock Normal file
View File

@ -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
}

120
flake.nix Normal file
View File

@ -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";
};
};
};
}