forked from martinvonz/jj
-
Notifications
You must be signed in to change notification settings - Fork 0
/
flake.nix
187 lines (159 loc) · 5.95 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
{
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";
# For installing non-standard rustc versions
rust-overlay.url = "github:oxalica/rust-overlay";
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
rust-overlay.inputs.flake-utils.follows = "flake-utils";
};
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;
};
rust-version = pkgs.rust-bin.stable."1.76.0".default;
ourRustPlatform = pkgs.makeRustPlatform {
rustc = rust-version;
cargo = rust-version;
};
# 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
];
# NOTE (aseipp): on Linux, go ahead and use mold by default to improve
# link times a bit; mostly useful for debug build speed, but will help
# over time if we ever get more dependencies, too
useMoldLinker = pkgs.stdenv.isLinux;
# these are needed in both devShell and buildInputs
linuxNativeDeps = with pkgs; lib.optionals stdenv.isLinux [
mold-wrapped
];
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 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 useMoldLinker "-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)
'';
};
default = self.packages.${system}.jujutsu;
};
apps.default = {
type = "app";
program = "${self.packages.${system}.jujutsu}/bin/jj";
};
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 {
buildInputs = with pkgs; [
# The CI checks against the latest nightly rustfmt, so we should too.
# NOTE (aseipp): include this FIRST before the rust-version override
# below; otherwise, it will be overridden by the rust-version and
# we'll get stable rustfmt instead.
(rust-bin.selectLatestNightlyWith (toolchain: toolchain.rustfmt))
# Using the minimal profile with explicit "clippy" extension to avoid
# two versions of rustfmt
(rust-version.override {
extensions = [
"rust-src" # for rust-analyzer
"clippy"
];
})
# Foreign dependencies
openssl zstd libgit2 libssh2
pkg-config
# Make sure rust-analyzer is present
rust-analyzer
# Additional tools recommended by contributing.md
cargo-deny
cargo-insta
cargo-nextest
cargo-watch
# In case you need to run `cargo run --bin gen-protos`
protobuf
# To run the signing tests
gnupg
openssh
# For building the documentation website
poetry
] ++ darwinDeps ++ linuxNativeDeps;
shellHook = ''
export RUST_BACKTRACE=1
export ZSTD_SYS_USE_PKG_CONFIG=1
export LIBSSH2_SYS_USE_PKG_CONFIG=1
'' + pkgs.lib.optionalString useMoldLinker ''
export RUSTFLAGS="-C link-arg=-fuse-ld=mold"
'';
};
}));
}