forked from zingolabs/zingolib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
flake.nix
180 lines (143 loc) · 5.77 KB
/
flake.nix
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
{
description = "zingolib workspace";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
crane = {
url = "github:ipetkov/crane";
inputs.nixpkgs.follows = "nixpkgs";
};
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.rust-analyzer-src.follows = "";
};
flake-utils.url = "github:numtide/flake-utils";
advisory-db = {
url = "github:rustsec/advisory-db";
flake = false;
};
};
outputs = { self, nixpkgs, crane, fenix, flake-utils, advisory-db, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pname = "zingolib-workspace";
version =
let
inherit (builtins) readFile fromTOML;
in
(fromTOML (readFile "${src}/zingolib/Cargo.toml")).package.version;
pkgs = nixpkgs.legacyPackages.${system};
inherit (pkgs) lib;
craneLib = crane.mkLib pkgs;
# TODO: filter source to improve caching / source specificity.
# Source specificity means selecting only things which impact the resulting build. For example, `README.md` in most projects does not.
# For now we cast a wide net just to get the build to work.
src = ./.;
# See: https://github.com/zcash/librustzcash/issues/1420
# -and: https://github.com/zingolabs/zingolib/pull/1214#issuecomment-2168047527
zcbi1420-workaround = pkgs.writeScript "zcbi1420-workaround.sh" ''
#! ${pkgs.bash}/bin/bash
set -efuo pipefail
cargo_config='.cargo-home/config.toml'
function get_nix_store_cargo_prereqs {
grep '^directory' "$cargo_config" \
| sed 's/^directory = "//; s/"$//'
}
mkdir ./rw_dependencies
for store_src in $(get_nix_store_cargo_prereqs)
do
rw_src_name="$(echo "$store_src" | tr '/' '_')"
rw_src="./rw_dependencies/$rw_src_name"
cp -r --dereference "$store_src" "$rw_src"
chmod -R u+w "$rw_src"
sed -i "s|$store_src|$rw_src|" "$cargo_config"
done
# For diagnostics (not necessary for build):
echo "+- Contents of $cargo_config:"
echo '|'
sed 's/^/| /' "$cargo_config"
'';
# Common arguments can be set here to avoid repeating them later
# Note: we include system dependencies commonly that only some (transitive) crates require.
commonArgs = {
inherit pname version src;
strictDeps = true;
doCheck = false;
# All packages in `nativeBuildInputs` are required at build time but _must not_ be required at runtime:
nativeBuildInputs = with pkgs; [
# We include `pkg-config` because `openssl-sys` requires it.
pkg-config
# We include git because `zingolib` requires it in its `build.rs` script via the `build_utils` crate.
git
# Note that the default package derivation runs nextest, as well as some flake check targets
cargo-nextest
];
buildInputs = [
# We include `openssl` lib in all crates, even though it is only necessary for the `openssl-sys` crate.
pkgs.openssl
];
# Additional environment variables can be set directly
# MY_CUSTOM_VAR = "some value";
};
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
in
{
packages = {
default = craneLib.buildPackage (commonArgs // {
inherit cargoArtifacts;
nativeBuildInputs = commonArgs.nativeBuildInputs ++ [
pkgs.protobuf
];
});
};
apps = {};
devShells.default = craneLib.devShell {
inherit cargoArtifacts;
# Inherit inputs from checks.
checks = self.checks.${system};
# Additional dev-shell environment variables can be set directly
# MY_CUSTOM_DEVELOPMENT_VAR = "something else";
# Extra inputs can be added here; cargo and rustc are provided by default.
packages = [
pkgs.protobuf
];
};
checks = {
# Run clippy (and deny all warnings) on the workspace source,
# again, reusing the dependency artifacts from above.
#
# Note that this is done as a separate derivation so that
# we can block the CI if there are issues here, but not
# prevent downstream consumers from building our crate by itself.
my-workspace-clippy = craneLib.cargoClippy (commonArgs // {
inherit cargoArtifacts;
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
});
my-workspace-doc = craneLib.cargoDoc (commonArgs // {
inherit cargoArtifacts;
});
# Check formatting
my-workspace-fmt = craneLib.cargoFmt {
inherit cargoArtifacts pname version src;
};
# Audit dependencies
my-workspace-audit = craneLib.cargoAudit (commonArgs // {
inherit advisory-db;
});
# Audit licenses
my-workspace-deny = craneLib.cargoDeny {
inherit cargoArtifacts pname version src;
};
# Run tests with cargo-nextest
# Consider setting `doCheck = false` on other crate derivations
# if you do not want the tests to run twice
my-workspace-nextest = craneLib.cargoNextest (commonArgs // {
inherit cargoArtifacts;
doCheck = true;
cargoTestCommand = "cargo nextest run -E'not (package(libtonode-tests) + package(darkside-tests))'";
partitions = 1;
partitionType = "count";
});
};
});
}