From fd00d1925bb65c8e89d3fdd4cf0bc37339d4735d Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sun, 10 May 2026 15:57:12 +0200 Subject: [PATCH] feat(nix): remove devenv, build backend with nix --- backend/Cargo.toml | 2 + flake.lock | 219 +++---------------------------------------- flake.nix | 52 ++++++---- nix/backend.nix | 24 +++++ nix/package.nix | 21 ----- nix/rust-version.nix | 11 --- nix/shell.nix | 74 +++++---------- 7 files changed, 93 insertions(+), 310 deletions(-) create mode 100644 nix/backend.nix delete mode 100644 nix/package.nix delete mode 100644 nix/rust-version.nix diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 7f4d103..29430aa 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -5,6 +5,8 @@ edition = "2024" publish = false authors = ["Lucien Cartier-Tilet "] license = "AGPL-3.0-only" +description = "Backend for STA, communicating with the physical relay" +homepage = "https://labs.phundrak.com/phundrak/sta" [lib] path = "src/lib.rs" diff --git a/flake.lock b/flake.lock index b49e38f..38f5a14 100644 --- a/flake.lock +++ b/flake.lock @@ -23,76 +23,6 @@ "type": "github" } }, - "cachix": { - "inputs": { - "devenv": [ - "devenv" - ], - "flake-compat": [ - "devenv", - "flake-compat" - ], - "git-hooks": [ - "devenv", - "git-hooks" - ], - "nixpkgs": [ - "devenv", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1760971495, - "narHash": "sha256-IwnNtbNVrlZIHh7h4Wz6VP0Furxg9Hh0ycighvL5cZc=", - "owner": "cachix", - "repo": "cachix", - "rev": "c5bfd933d1033672f51a863c47303fc0e093c2d2", - "type": "github" - }, - "original": { - "owner": "cachix", - "ref": "latest", - "repo": "cachix", - "type": "github" - } - }, - "devenv": { - "inputs": { - "cachix": "cachix", - "flake-compat": "flake-compat", - "flake-parts": "flake-parts", - "git-hooks": "git-hooks", - "nix": "nix", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1766843567, - "narHash": "sha256-062oL6KZCH7ePf4BBG61OdFJUh5ovw6zTpd/lVwy/xk=", - "owner": "cachix", - "repo": "devenv", - "rev": "d0f2c8545f09e5aba9d321079a284b550371879d", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "devenv", - "type": "github" - } - }, - "devenv-root": { - "flake": false, - "locked": { - "narHash": "sha256-d6xi4mKdjkX2JFicDIv5niSzpyI0m/Hnm8GGAIU04kY=", - "type": "file", - "url": "file:///dev/null" - }, - "original": { - "type": "file", - "url": "file:///dev/null" - } - }, "fenix": { "inputs": { "nixpkgs": [ @@ -115,43 +45,6 @@ "type": "github" } }, - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1761588595, - "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "devenv", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1760948891, - "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -186,115 +79,25 @@ "type": "github" } }, - "git-hooks": { - "inputs": { - "flake-compat": [ - "devenv", - "flake-compat" - ], - "gitignore": "gitignore", - "nixpkgs": [ - "devenv", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1760663237, - "narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "devenv", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "nix": { - "inputs": { - "flake-compat": [ - "devenv", - "flake-compat" - ], - "flake-parts": [ - "devenv", - "flake-parts" - ], - "git-hooks-nix": [ - "devenv", - "git-hooks" - ], - "nixpkgs": [ - "devenv", - "nixpkgs" - ], - "nixpkgs-23-11": [ - "devenv" - ], - "nixpkgs-regression": [ - "devenv" - ] - }, - "locked": { - "lastModified": 1761648602, - "narHash": "sha256-H97KSB/luq/aGobKRuHahOvT1r7C03BgB6D5HBZsbN8=", - "owner": "cachix", - "repo": "nix", - "rev": "3e5644da6830ef65f0a2f7ec22830c46285bfff6", - "type": "github" - }, - "original": { - "owner": "cachix", - "ref": "devenv-2.30.6", - "repo": "nix", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1764580874, - "narHash": "sha256-GMlWyeVh6fVuPeJI+ZmbJVV8DDS5wfdfDY88FHt5g/8=", - "owner": "cachix", - "repo": "devenv-nixpkgs", - "rev": "dcf61356c3ab25f1362b4a4428a6d871e84f1d1d", + "lastModified": 1777954456, + "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "type": "github" }, "original": { - "owner": "cachix", - "ref": "rolling", - "repo": "devenv-nixpkgs", + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { "alejandra": "alejandra", - "devenv": "devenv", - "devenv-root": "devenv-root", "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", "rust-overlay": "rust-overlay" @@ -324,11 +127,11 @@ ] }, "locked": { - "lastModified": 1766803264, - "narHash": "sha256-eGK6He8BR6L7N73kyyjz/vGxZX1Usnr8Gwfs3D18KgE=", + "lastModified": 1777950921, + "narHash": "sha256-NpOgt8ISaHTDNJZjNUfwFfbieKfRXzab4WKM31gZCGA=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "6b5c52313aaf3f3e1a0a6757bb89846edfb5195c", + "rev": "366ea19e0e55b768f74b7a0b2a20f847e7ae828d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 1f48f99..3bee35e 100644 --- a/flake.nix +++ b/flake.nix @@ -1,57 +1,69 @@ { inputs = { - nixpkgs.url = "github:cachix/devenv-nixpkgs/rolling"; + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; alejandra = { url = "github:kamadorueda/alejandra/4.0.0"; inputs.nixpkgs.follows = "nixpkgs"; }; - devenv = { - url = "github:cachix/devenv"; - inputs.nixpkgs.follows = "nixpkgs"; - }; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; - devenv-root = { - url = "file+file:///dev/null"; - flake = false; - }; }; nixConfig = { extra-trusted-public-keys = [ - "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + "phundrak.cachix.org-1:osJAkYO0ioTOPqaQCIXMfIRz1/+YYlVFkup3R2KSexk=" + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ]; extra-substituters = [ - "https://devenv.cachix.org" + "https://phundrak.cachix.org?priority=10" + "https://nix-community.cachix.org?priority=20" + "https://cache.nixos.org?priority=30" ]; }; outputs = { - self, nixpkgs, flake-utils, rust-overlay, alejandra, ... - } @ inputs: + }: flake-utils.lib.eachDefaultSystem ( system: let overlays = [(import rust-overlay)]; pkgs = import nixpkgs {inherit system overlays;}; rustVersion = pkgs.rust-bin.stable.latest.default; - rustPlatform = pkgs.makeRustPlatform { - cargo = rustVersion; - rustc = rustVersion; + targets = { + linux-x86_64 = { + crossPkgs = pkgs; + triple = "x86_64-unknown-linux-gnu"; + }; + linux-aarch64 = { + crossPkgs = pkgs.pkgsCross.aarch64-multiplatform; + triple = "aarch64-unknown-linux-gnu"; + }; + }; + mkRustBuild = import ./nix/backend.nix; + packages = { + linux-x86_64 = mkRustBuild targets.linux-x86_64; + linux-aarch64 = mkRustBuild targets.linux-aarch64; + }; + defaultBySystem = { + "x86_64-linux" = packages.linux-x86_64; + "aarch64-linux" = packages.linux-aarch64; }; in { formatter = alejandra.defaultPackage.${system}; - packages = import ./nix/package.nix {inherit pkgs rustPlatform;}; - devShell = import ./nix/shell.nix { - inherit inputs pkgs self rustVersion system; - }; + packages.backend = + packages + // { + default = defaultBySystem.${system} or packages.linux-x86_64; + }; + devShell = import ./nix/shell.nix {inherit pkgs rustVersion;}; } ); } diff --git a/nix/backend.nix b/nix/backend.nix new file mode 100644 index 0000000..b8c459e --- /dev/null +++ b/nix/backend.nix @@ -0,0 +1,24 @@ +target: let + cargoToml = fromTOML (builtins.readFile ../backend/Cargo.toml); + inherit (cargoToml.package) name version; + pkgs = target.crossPkgs; + buildArgs = { + pname = name; + inherit version; + src = pkgs.lib.cleanSource ../.; + cargoLock.lockFile = ../Cargo.lock; + useNextest = true; + meta = { + inherit (cargoToml.package) description homepage; + }; + postBuild = "${pkgs.upx}/bin/upx target/*/release/*${name}"; + }; + rustVersion = pkgs.rust-bin.stable.latest.default.override { + targets = [target.triple]; + }; + rustPlatform = target.crossPkgs.makeRustPlatform { + cargo = rustVersion; + rustc = rustVersion; + }; +in + rustPlatform.buildRustPackage buildArgs diff --git a/nix/package.nix b/nix/package.nix deleted file mode 100644 index fa7ab0d..0000000 --- a/nix/package.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ - pkgs, - rustPlatform, - ... -}: let - cargoToml = builtins.fromTOML (builtins.readFile ../Cargo.toml); - name = cargoToml.package.name; - version = cargoToml.package.version; - rustBuild = rustPlatform.buildRustPackage { - pname = name; - inherit version; - src = ../.; - cargoLock.lockFile = ../Cargo.lock; - }; - settingsDir = pkgs.runCommand "settings" {} '' - mkdir -p $out/settings - cp ${../settings}/*.yaml $out/settings/ - ''; -in { - jj-mcp = rustBuild; -} diff --git a/nix/rust-version.nix b/nix/rust-version.nix deleted file mode 100644 index aa84d34..0000000 --- a/nix/rust-version.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - rust-overlay, - inputs, - system, - ... -}: let - overlays = [(import rust-overlay)]; -in rec { - pkgs = import inputs.nixpkgs {inherit system overlays;}; - version = pkgs.rust-bin.stable.latest.default; -} diff --git a/nix/shell.nix b/nix/shell.nix index 57be22e..08ed512 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,58 +1,32 @@ { - inputs, pkgs, - self, rustVersion, - system, - ... }: -inputs.devenv.lib.mkShell { - inherit inputs pkgs; - modules = [ - { - packages = with pkgs; [ - # Backend - (rustVersion.override { - extensions = [ - "clippy" - "rust-src" - "rust-analyzer" - "rustfmt" - ]; - }) - bacon - cargo-deny - cargo-edit - cargo-shuttle - cargo-tarpaulin - just - marksman # Markdown LSP server - sqlx-cli - tombi # TOML LSP server - - # Frontend - nodejs_24 - rustywind # tailwind - nodePackages.prettier - nodePackages.eslint - nodePackages.pnpm +pkgs.mkShell { + packages = with pkgs; [ + (rustVersion.override { + extensions = [ + "clippy" + "rust-src" + "rust-analyzer" + "rustfmt" ]; + }) + bacon + cargo-deny + cargo-edit + cargo-shuttle + cargo-tarpaulin + just + marksman # Markdown LSP server + sqlx-cli + tombi # TOML LSP server - processes.backend-run.exec = "bacon run"; - - enterShell = '' - echo "🦀 Rust MCP development environment loaded!" - echo "📦 Rust version: $(rustc --version)" - echo "📦 Cargo version: $(cargo --version)" - echo "" - echo "Available tools:" - echo " - rust-analyzer (LSP)" - echo " - clippy (linter)" - echo " - rustfmt (formatter)" - echo " - bacon (continuous testing/linting)" - echo " - cargo-deny (dependency checker)" - echo " - cargo-tarpaulin (code coverage)" - ''; - } + # Frontend + nodejs_24 + rustywind # tailwind + prettier + eslint + pnpm ]; }