aboutsummaryrefslogtreecommitdiff
path: root/flake.nix
blob: f616506fe1f2ee9cc4cadc98ebf2abaee6f32d32 (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
{
  nixConfig = {
    substituters =
      [ "https://cache.nixos.org/" "https://nix-community.cachix.org" ];
    trusted-public-keys = [
      "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
      "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
    ];
  };
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-23.05";

    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    crane = {
      url = "github:ipetkov/crane";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    advisory-db = {
      url = "github:rustsec/advisory-db";
      flake = false;
    };

    utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, utils, fenix, crane, advisory-db }:
    with nixpkgs.lib;
    utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};

        rustToolchain = with fenix.packages.${system};
          combine ([ latest.toolchain ] ++ (if system == "x86_64-linux" then
            [ targets.x86_64-unknown-linux-musl.latest.rust-std ]
          else
            [ ]));

        nativeBuildInputs = with pkgs;
          [
            rustToolchain
            pkg-config

            pkgsStatic.openssl
          ] ++ lib.optional stdenv.isDarwin [
            pkgs.libiconv
            pkgs.darwin.apple_sdk.frameworks.Security
          ];

        OPENSSL_DIR = "${pkgs.pkgsStatic.openssl}";
        OPENSSL_LIB_DIR = "${pkgs.pkgsStatic.openssl.out}/lib";
        OPENSSL_CRYPTO_LIBRARY = "${pkgs.pkgsStatic.openssl.out}/lib";
        OPENSSL_INCLUDE_DIR = "${pkgs.pkgsStatic.openssl.dev}/include";
        CARGO_BUILD_TARGET = if system == "x86_64-linux" then
          "x86_64-unknown-linux-musl"
        else
          null;
        CARGO_BUILD_RUSTFLAGS = if system == "x86_64-linux" then
          "-C target-feature=+crt-static"
        else
          null;

        graphqlFilter = path: _type: builtins.match ".*graphql$" path != null;
        markdownFilter = path: _type: builtins.match ".*md$" path != null;
        markdownOrCargo = path: type:
          (graphqlFilter path type) || (markdownFilter path type)
          || (craneLib.filterCargoSources path type);

        # crane setup
        craneLib = crane.lib.${system}.overrideToolchain rustToolchain;
        src = nixpkgs.lib.cleanSourceWith {
          src = craneLib.path ./.; # The original, unfiltered source
          filter = markdownOrCargo;
        };

        cargoArtifacts = self.packages.${system}.cargoArtifacts;
      in {
        packages = {
          cargoArtifacts = craneLib.buildDepsOnly {
            inherit src;
            inherit nativeBuildInputs OPENSSL_DIR OPENSSL_LIB_DIR
              OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR CARGO_BUILD_TARGET
              CARGO_BUILD_RUSTFLAGS;
          };

          #####################################
          # Build Binaries
          gtree = craneLib.buildPackage {
            inherit cargoArtifacts src;
            inherit nativeBuildInputs OPENSSL_DIR OPENSSL_LIB_DIR
              OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR CARGO_BUILD_TARGET
              CARGO_BUILD_RUSTFLAGS;
          };

          default = self.packages.${system}.gtree;
        };

        devShells.default = pkgs.mkShell {
          inherit nativeBuildInputs OPENSSL_DIR OPENSSL_LIB_DIR
            OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR CARGO_BUILD_TARGET
            CARGO_BUILD_RUSTFLAGS;
        };

        formatter = pkgs.nixfmt;
      });
}