aboutsummaryrefslogtreecommitdiff
path: root/flake.nix
blob: 3018d7cd798eca43ed62be2aed192f791678bd7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
{
  nixConfig = {
    substituters =
      [ "https://cache.nixos.org/" "https://nix-community.cachix.org" "https://nix.cache.vapor.systems" ];
    trusted-public-keys = [
      "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
      "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
      "nix.cache.vapor.systems-1:OjV+eZuOK+im1n8tuwHdT+9hkQVoJORdX96FvWcMABk="
    ];
  };
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    naersk = {
      url = "github:nmattia/naersk";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, rust-overlay, utils, naersk }:
    with nixpkgs.lib;
    recursiveUpdate (utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};

        rust = rust-overlay.packages."${system}".rust;

        naersk-lib = naersk.lib."${system}".override {
          cargo = rust;
          rustc = rust;
        };
      in rec {
        packages.default = packages.gtree;

        packages.gtree = naersk-lib.buildPackage {
          pname = "gtree";
          root = ./.;

          nativeBuildInputs = [ pkgs.perl ];

          cargoBuildOptions = prev:
            prev ++ [ "--features=vendored-libgit2,vendored-openssl" ];
        };

        apps.default = utils.lib.mkApp { drv = packages.default; };

        devShell = pkgs.mkShell { nativeBuildInputs = [ rust pkgs.perl ]; };
      })) (utils.lib.eachSystem [
        utils.lib.system.x86_64-linux
        utils.lib.system.aarch64-linux
      ] (system:
        let
          pkgs = nixpkgs.legacyPackages.${system};

          staticInputs = with pkgs; [
            pkgsStatic.stdenv.cc
            pkgsStatic.openssl.dev
            rust
            perl
          ];

          target =
            "${elemAt (strings.splitString "-" system) 0}-unknown-linux-musl";

          rust = rust-overlay.packages."${system}".rust.override {
            extensions = [ "rust-src" ];
            targets = [ target ];
          };

          naersk-lib = naersk.lib."${system}".override {
            cargo = rust;
            rustc = rust;
          };
        in rec {
          # `nix build`
          packages.gtreeStatic = naersk-lib.buildPackage {
            pname = "gtree";
            root = ./.;

            nativeBuildInputs = staticInputs;

            CARGO_BUILD_TARGET = target;
            CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS =
              "-C target-feature=+crt-static";
            CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS =
              "-C target-feature=+crt-static";

            OPENSSL_STATIC = true;
            OPENSSL_DIR = "${pkgs.pkgsStatic.openssl}";
            OPENSSL_LIB_DIR = "${pkgs.pkgsStatic.openssl.out}/lib";
            OPENSSL_INCLUDE_DIR = "${pkgs.pkgsStatic.openssl.dev}/include";
          };

          devShell = pkgs.mkShell {
            nativeBuildInputs = staticInputs;

            shellHook = ''
              export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="-C target-feature=+crt-static"
              export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="-C target-feature=+crt-static"

              export OPENSSL_STATIC=1
              export OPENSSL_DIR="${pkgs.pkgsStatic.openssl}"
              export OPENSSL_LIB_DIR="${pkgs.pkgsStatic.openssl.out}/lib"
              export OPENSSL_INCLUDE_DIR="${pkgs.pkgsStatic.openssl.dev}/include"
            '';
          };
        }));
}