{ description = "A Nix binary cache server"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; lix = { url = "git+ssh://git@git.lix.systems/lix-project/lix"; flake = false; }; lix-module = { url = "git+ssh://git@git.lix.systems/lix-project/nixos-module"; inputs.nixpkgs.follows = "nixpkgs"; inputs.lix.follows = "lix"; }; flake-utils.url = "github:numtide/flake-utils"; crane = { url = "github:ipetkov/crane"; inputs.nixpkgs.follows = "nixpkgs"; }; flake-compat = { url = "github:edolstra/flake-compat"; flake = false; }; }; outputs = { self, nixpkgs, lix-module, flake-utils, crane, ... }: let supportedSystems = flake-utils.lib.defaultSystems ++ [ "riscv64-linux" ]; makeCranePkgs = pkgs: let craneLib = crane.mkLib pkgs; in pkgs.callPackage ./crane.nix { inherit craneLib; }; in flake-utils.lib.eachSystem supportedSystems (system: let pkgs = import nixpkgs { inherit system; overlays = [lix-module.overlays.default]; }; cranePkgs = makeCranePkgs pkgs; inherit (pkgs) lib; in rec { packages = { default = packages.attic; inherit (cranePkgs) attic attic-client attic-server; attic-nixpkgs = pkgs.callPackage ./package.nix { }; attic-ci-installer = pkgs.callPackage ./ci-installer.nix { inherit self; }; book = pkgs.callPackage ./book { attic = packages.attic; }; } // (lib.optionalAttrs (system != "x86_64-darwin") { # Unfortunately, x86_64-darwin fails to evaluate static builds # TODO: Make this work with Crane attic-static = (pkgs.pkgsStatic.callPackage ./package.nix { }).overrideAttrs (old: { nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ pkgs.nukeReferences ]; # Read by pkg_config crate (do some autodetection in build.rs?) PKG_CONFIG_ALL_STATIC = "1"; "NIX_CFLAGS_LINK_${pkgs.pkgsStatic.stdenv.cc.suffixSalt}" = "-lc"; RUSTFLAGS = "-C relocation-model=static"; postFixup = (old.postFixup or "") + '' rm -f $out/nix-support/propagated-build-inputs nuke-refs $out/bin/attic ''; }); attic-client-static = packages.attic-static.override { clientOnly = true; }; }) // (lib.optionalAttrs pkgs.stdenv.isLinux { attic-server-image = pkgs.dockerTools.buildImage { name = "attic-server"; tag = "main"; copyToRoot = [ # Debugging utilities for `fly ssh console` pkgs.busybox packages.attic-server # Now required by the fly.io sshd pkgs.dockerTools.fakeNss ]; config = { Entrypoint = [ "${packages.attic-server}/bin/atticd" ]; Env = [ "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" ]; }; }; }); devShells = { default = pkgs.mkShell { inputsFrom = with packages; [ attic book ]; nativeBuildInputs = with pkgs; [ rustc rustfmt clippy cargo-expand cargo-outdated cargo-edit tokio-console sqlite-interactive editorconfig-checker flyctl wrk ] ++ (lib.optionals pkgs.stdenv.isLinux [ linuxPackages.perf ]); RUST_SRC_PATH = "${pkgs.rustPlatform.rustcSrc}/library"; ATTIC_DISTRIBUTOR = "dev"; }; demo = pkgs.mkShell { nativeBuildInputs = [ packages.default ]; shellHook = '' >&2 echo >&2 echo '🚀 Run `atticd` to get started!' >&2 echo ''; }; }; devShell = devShells.default; internal = { inherit (cranePkgs) attic-tests cargoArtifacts; }; checks = let makeIntegrationTests = pkgs: import ./integration-tests { pkgs = import nixpkgs { inherit system; overlays = [ self.overlays.default ]; }; flake = self; }; unstableTests = makeIntegrationTests pkgs; in lib.optionalAttrs pkgs.stdenv.isLinux unstableTests; }) // { overlays = { default = final: prev: let cranePkgs = makeCranePkgs final; in { inherit (cranePkgs) attic attic-client attic-server; }; }; nixosModules = { atticd = { imports = [ ./nixos/atticd.nix ]; services.atticd.useFlakeCompatOverlay = false; nixpkgs.overlays = [ self.overlays.default ]; }; }; }; }