{ description = "Sorcery, a static Git forge"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; outputs = { nixpkgs, ... }: let forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-darwin" ]; perSystem = system: let pkgs = import nixpkgs { inherit system; }; buildPkgs = if pkgs.stdenv.hostPlatform.isLinux then pkgs.pkgsStatic else pkgs; denoDeps = pkgs.stdenvNoCC.mkDerivation { pname = "sorcery-web-deps"; version = "0.1.0"; src = ./web; nativeBuildInputs = [ pkgs.deno ]; dontConfigure = true; dontFixup = true; buildPhase = '' runHook preBuild export DENO_DIR=$TMPDIR/deno-cache export DENO_NO_UPDATE_CHECK=1 deno cache --frozen --lock=deno.lock *.ts *.tsx git/*.ts runHook postBuild ''; installPhase = '' runHook preInstall mkdir -p "$out" cp -R "$DENO_DIR"/{npm,remote} "$out/" deno run --no-config --no-lock --allow-read --allow-write ${./nix/normalize-deno-cache.ts} "$out" deno.lock runHook postInstall ''; outputHashMode = "recursive"; outputHashAlgo = "sha256"; outputHash = "sha256-9t3jyDDbzL/GgTHfo5J8p7Atb4wCpkXlYEwimm7DXa0="; }; shlex = pkgs.fetchFromGitHub { owner = "char"; repo = "shlex"; rev = "293b7c4bdc3b6c9a3195d226f0d8e92bf4516f96"; hash = "sha256-aL5AJYVjnmvu8BJMD3f1z99e4MGJgNkUrOidWhr27NE="; }; sorcery = pkgs.lib.makeOverridable ({ enableTypst ? false }: buildPkgs.rustPlatform.buildRustPackage { pname = "sorcery"; version = "0.1.0"; src = ./.; buildFeatures = pkgs.lib.optional enableTypst "typst"; cargoLock = { lockFile = ./Cargo.lock; outputHashes."arbrisseau-0.1.0" = "sha256-vvHdwNWSV2QVvJ+5a0dW5rAYIHcuVlQW6ME+B+uCH5k="; }; nativeBuildInputs = [ pkgs.deno pkgs.gitMinimal ]; preBuild = '' cp -R ${denoDeps} deno-dir chmod -R u+w deno-dir export DENO_DIR=$PWD/deno-dir (cd web && deno task check && deno task test && deno task build) ''; meta.mainProgram = "sorceryd"; }) {}; sorcery-ssh = pkgs.stdenv.mkDerivation { pname = "sorcery-ssh"; version = "0.1.0"; src = pkgs.lib.fileset.toSource { root = ./extra/sorcery-ssh; fileset = pkgs.lib.fileset.unions [ ./extra/sorcery-ssh/build.zig ./extra/sorcery-ssh/build.zig.zon ./extra/sorcery-ssh/src ]; }; nativeBuildInputs = [ pkgs.zig ]; postPatch = '' mkdir -p zig-pkg ln -s ${shlex} zig-pkg/shlex-0.1.1-O1DEI5oDAQARcXkYasXdAAsR0riDfb-1_riTtx0vemxN ''; dontSetZigDefaultFlags = true; zigBuildFlags = [ "-Dtarget=${if pkgs.stdenv.hostPlatform.isLinux then "x86_64-linux-musl" else "aarch64-macos"}" "-Doptimize=ReleaseSafe" ]; zigCheckFlags = [ "-Dtarget=${if pkgs.stdenv.hostPlatform.isLinux then "x86_64-linux-musl" else "aarch64-macos"}" "-Doptimize=ReleaseSafe" ]; doCheck = true; meta.mainProgram = "sorcery-ssh"; }; sorcery-ssh-tui = buildPkgs.rustPlatform.buildRustPackage { pname = "sorcery-ssh-tui"; version = "0.1.0"; src = ./extra/sorcery-ssh/tui; cargoLock.lockFile = ./extra/sorcery-ssh/tui/Cargo.lock; meta.mainProgram = "sorcery-ssh-tui"; }; in { packages = { default = sorcery; sorcery-typst = sorcery.override { enableTypst = true; }; inherit sorcery-ssh sorcery-ssh-tui; }; devShells.default = buildPkgs.mkShell { inputsFrom = [ sorcery sorcery-ssh sorcery-ssh-tui ]; nativeBuildInputs = [ pkgs.git pkgs.rustfmt pkgs.zig ]; CARGO_BUILD_TARGET = buildPkgs.stdenv.hostPlatform.rust.rustcTarget; }; }; in { packages = forAllSystems (system: (perSystem system).packages); devShells = forAllSystems (system: (perSystem system).devShells); }; }