{ description = "beamdev - a BEAM development MCP server for coding agents"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; crane.url = "github:ipetkov/crane"; flake-parts.url = "github:hercules-ci/flake-parts"; flake-parts.inputs.nixpkgs-lib.follows = "nixpkgs"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = inputs@{ flake-parts, ... }: flake-parts.lib.mkFlake { inherit inputs; } { systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; perSystem = { config, inputs', pkgs, ... }: let inherit (pkgs) lib; cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml); static = pkgs.stdenv.hostPlatform.isLinux; target = "${pkgs.stdenv.hostPlatform.qemuArch}-unknown-linux-musl"; rustToolchain = inputs'.rust-overlay.packages.rust.override ( lib.optionalAttrs static { targets = [ target ]; } ); craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rustToolchain; commonArgs = { pname = cargoToml.package.name; inherit (cargoToml.package) version; src = craneLib.cleanCargoSource ./.; strictDeps = true; env = lib.optionalAttrs static { CARGO_BUILD_TARGET = target; CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static"; }; nativeBuildInputs = lib.optionals static [ pkgs.pkgsStatic.stdenv.cc ]; }; in { packages.beamdev = craneLib.buildPackage ( commonArgs // { cargoArtifacts = craneLib.buildDepsOnly commonArgs; # The test suite drives real Erlang and Elixir nodes over # distribution, which the build sandbox cannot start. doCheck = false; meta = { inherit (cargoToml.package) description; homepage = cargoToml.package.repository; license = lib.licenses.asl20; mainProgram = "beamdev"; }; } ); packages.default = config.packages.beamdev; devShells.default = pkgs.mkShell { packages = [ pkgs.cargo pkgs.rustc pkgs.rustfmt pkgs.clippy pkgs.rust-analyzer pkgs.cargo-outdated pkgs.beamPackages.erlang pkgs.beamPackages.elixir ]; env.RUST_SRC_PATH = "${pkgs.rustPlatform.rustLibSrc}"; }; }; }; }