forked from jj-vcs/jj
-
Notifications
You must be signed in to change notification settings - Fork 0
/
flake.nix
213 lines (181 loc) · 7.1 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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
{
description = "Jujutsu VCS, a Git-compatible DVCS that is both simple and powerful";
inputs = {
# For listing and iterating nix systems
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
# For installing non-standard rustc versions
rust-overlay.url = "github:oxalica/rust-overlay";
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, flake-utils, rust-overlay }: {
overlays.default = (final: prev: {
jujutsu = self.packages.${final.system}.jujutsu;
});
} //
(flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [
rust-overlay.overlays.default
];
};
filterSrc = src: regexes:
pkgs.lib.cleanSourceWith {
inherit src;
filter = path: type:
let
relPath = pkgs.lib.removePrefix (toString src + "/") (toString path);
in
pkgs.lib.all (re: builtins.match re relPath == null) regexes;
};
ourRustVersion = pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default);
ourRustPlatform = pkgs.makeRustPlatform {
rustc = ourRustVersion;
cargo = ourRustVersion;
};
# these are needed in both devShell and buildInputs
darwinDeps = with pkgs; lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.Security
darwin.apple_sdk.frameworks.SystemConfiguration
libiconv
];
# these are needed in both devShell and buildInputs
linuxNativeDeps = with pkgs; lib.optionals stdenv.isLinux [
mold-wrapped
];
# on macOS and Linux, use faster parallel linkers that are much more
# efficient than the defaults. these noticeably improve link time even for
# medium sized rust projects like jj
rustLinkerFlags =
if pkgs.stdenv.isLinux then
[ "-fuse-ld=mold" "-Wl,--compress-debug-sections=zstd" ]
else if pkgs.stdenv.isDarwin then
# on darwin, /usr/bin/ld actually looks at the environment variable
# $DEVELOPER_DIR, which is set by the nix stdenv, and if set,
# automatically uses it to route the `ld` invocation to the binary
# within. in the devShell though, that isn't what we want; it's
# functional, but Xcode's linker as of ~v15 (not yet open source)
# is ultra-fast and very shiny; it is enabled via -ld_new, and on by
# default as of v16+
[ "--ld-path=$(unset DEVELOPER_DIR; /usr/bin/xcrun --find ld)" "-ld_new" ]
else
[ ];
rustLinkFlagsString = pkgs.lib.concatStringsSep " " (pkgs.lib.concatMap (x:
[ "-C" "link-arg=${x}" ]
) rustLinkerFlags);
in
{
packages = {
jujutsu = ourRustPlatform.buildRustPackage {
pname = "jujutsu";
version = "unstable-${self.shortRev or "dirty"}";
buildFeatures = [ "packaging" ];
cargoBuildFlags = [ "--bin" "jj" ]; # don't build and install the fake editors
useNextest = true;
src = filterSrc ./. [
".*\\.nix$"
"^.jj/"
"^flake\\.lock$"
"^target/"
];
cargoLock.lockFile = ./Cargo.lock;
nativeBuildInputs = with pkgs; [
gzip
installShellFiles
makeWrapper
pkg-config
# for libz-ng-sys (zlib-ng)
# TODO: switch to the packaged zlib-ng and drop this dependency
cmake
# for signing tests
gnupg
openssh
] ++ linuxNativeDeps;
buildInputs = with pkgs; [
openssl zstd libgit2 libssh2
] ++ darwinDeps;
ZSTD_SYS_USE_PKG_CONFIG = "1";
LIBSSH2_SYS_USE_PKG_CONFIG = "1";
RUSTFLAGS = pkgs.lib.optionalString pkgs.stdenv.isLinux "-C link-arg=-fuse-ld=mold";
NIX_JJ_GIT_HASH = self.rev or "";
CARGO_INCREMENTAL = "0";
preCheck = ''
export RUST_BACKTRACE=1
'';
postInstall = ''
$out/bin/jj util mangen > ./jj.1
installManPage ./jj.1
installShellCompletion --cmd jj \
--bash <($out/bin/jj util completion bash) \
--fish <($out/bin/jj util completion fish) \
--zsh <($out/bin/jj util completion zsh)
'';
meta = {
description = "Git-compatible DVCS that is both simple and powerful";
homepage = "https://github.com/martinvonz/jj";
license = pkgs.lib.licenses.asl20;
mainProgram = "jj";
};
};
default = self.packages.${system}.jujutsu;
};
formatter = pkgs.nixpkgs-fmt;
checks.jujutsu = self.packages.${system}.jujutsu.overrideAttrs ({ ... }: {
# FIXME (aseipp): when running `nix flake check`, this will override the
# main package, and nerf the build and installation phases. this is
# because for some inexplicable reason, the cargo cache gets invalidated
# in between buildPhase and checkPhase, causing every nix CI build to be
# 2x as long.
#
# upstream issue: https://github.com/NixOS/nixpkgs/issues/291222
buildPhase = "true";
installPhase = "touch $out";
# NOTE (aseipp): buildRustPackage also, by default, runs `cargo check`
# in `--release` mode, which is far slower; the existing CI builds all
# use the default `test` profile, so we should too.
cargoCheckType = "test";
});
devShells.default = pkgs.mkShell {
packages = with pkgs; [
# NOTE (aseipp): explicitly add rust-src to the rustc compiler only in
# devShell. this in turn causes a dependency on the rust compiler src,
# which bloats the closure size by several GiB. but doing this here
# and not by default avoids the default flake install from including
# that dependency, so it's worth it
#
# relevant PR: https://github.com/rust-lang/rust/pull/129687
(ourRustVersion.override {
extensions = [ "rust-src" "rust-analyzer" ];
})
# Foreign dependencies
openssl zstd libgit2 libssh2
pkg-config
# Additional tools recommended by contributing.md
cargo-deny
cargo-insta
cargo-nextest
cargo-watch
# Miscellaneous tools
watchman
# In case you need to run `cargo run --bin gen-protos`
protobuf
# for libz-ng-sys (zlib-ng)
# TODO: switch to the packaged zlib-ng and drop this dependency
cmake
# To run the signing tests
gnupg
openssh
# For building the documentation website
uv
] ++ darwinDeps ++ linuxNativeDeps;
shellHook = ''
export RUST_BACKTRACE=1
export ZSTD_SYS_USE_PKG_CONFIG=1
export LIBSSH2_SYS_USE_PKG_CONFIG=1
export RUSTFLAGS="-Zthreads=0 ${rustLinkFlagsString}"
'';
};
}));
}