Skip to content

Commit 3e95d66

Browse files
committed
Refactor flake output structures
- `defaultOverlay` -> `overlays.default` The old name is kept but with a warning. - `defaultApp` is removed. - `defaultPackage` -> `packages.default` - Names in `packages` now use `_` instead of `-` for version separator. Eg. `rust_1_49_0`, `rust-nightly_2022-06-29`. - `rust{,-nightly,-beta}-latest` are removed.
1 parent d7a31ac commit 3e95d66

File tree

2 files changed

+35
-54
lines changed

2 files changed

+35
-54
lines changed

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,13 @@ And then feel free to use it anywhere like
4545

4646
This repository already has flake support.
4747

48-
NOTE: **Only the output `overlay` is stable and preferred to be used in your flake.**
49-
Other outputs like `packages` and `defaultPackage` are for human try and are subject to change.
48+
**Warning: Only the output `overlay`/`overlays` are currently stable. Use other outputs at your own risk!**
5049

5150
For a quick play, just use `nix shell` to bring the latest stable rust toolchain into scope.
5251
(All commands below requires preview version of Nix with flake support.)
5352
```shell
5453
$ nix shell github:oxalica/rust-overlay
55-
$ rustc --version
54+
$ rustc --version # This is only an example. You may get a newer version here.
5655
rustc 1.49.0 (e1884a8e3 2020-12-29)
5756
$ cargo --version
5857
cargo 1.49.0 (d00d64df9 2020-12-05)

flake.nix

+33-51
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,42 @@
2727

2828
in {
2929

30-
overlay = final: prev: overlay final prev;
30+
# Compat.
31+
overlay =
32+
builtins.trace
33+
"warning: rust-overlay's flake output `overlay` is deprecated in favor of `overlays.default`"
34+
overlay;
35+
36+
overlays = {
37+
default = overlay;
38+
rust-overlay = overlay;
39+
};
3140

3241
} // flake-utils.lib.eachSystem allSystems (system: let
3342
pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; };
3443
in rec {
35-
# `defaultApp`, `defaultPackage` and `packages` are for human only.
36-
# They are subject to change and **DO NOT** depend on them in your flake.
37-
# Please use `overlay` instead.
38-
39-
defaultApp = {
40-
type = "app";
41-
program = "${defaultPackage}/bin/rustc";
42-
};
43-
defaultPackage = packages.rust;
44+
# TODO: Flake outputs except `overlay[s]` are not stabilized yet.
4445

4546
packages = let
47+
select = version: comps: if version == "latest" then null else comps.default or null;
4648
result =
4749
mapAttrs' (version: comps: {
48-
name = "rust-${replaceStrings ["."] ["-"] version}";
49-
value = comps.default or null;
50+
name = "rust_${replaceStrings ["."] ["_"] version}";
51+
value = select version comps;
5052
}) pkgs.rust-bin.stable //
5153
mapAttrs' (version: comps: {
52-
name = "rust-nightly-${version}";
53-
value = comps.default or null;
54+
name = "rust-nightly_${version}";
55+
value = select version comps;
5456
}) pkgs.rust-bin.nightly //
5557
mapAttrs' (version: comps: {
56-
name = "rust-beta-${version}";
57-
value = comps.default or null;
58+
name = "rust-beta_${version}";
59+
value = select version comps;
5860
}) pkgs.rust-bin.beta //
59-
{
60-
rust = result.rust-latest;
61-
rust-nightly = result.rust-nightly-latest;
62-
rust-beta = result.rust-beta-latest;
61+
rec {
62+
rust = pkgs.rust-bin.stable.latest.default;
63+
rust-beta = pkgs.rust-bin.beta.latest.default;
64+
rust-nightly = pkgs.rust-bin.nightly.latest.default;
65+
default = rust;
6366
};
6467
in filterAttrs (name: drv: drv != null) result;
6568

@@ -69,16 +72,11 @@
6972

7073
rustHostPlatform = pkgs.rust.toRustTarget pkgs.hostPlatform;
7174

72-
assertEq = lhs: rhs: {
73-
assertion = lhs == rhs;
74-
message = "`${lhs}` != `${rhs}`";
75-
};
76-
assertUrl = drv: url: let
77-
srcUrl = head drv.src.urls;
78-
in assertEq srcUrl url;
79-
75+
assertEq = (flake-utils.lib.check-utils system).isEqual;
76+
assertUrl = drv: url: assertEq (head drv.src.urls) url;
77+
in
8078
# Check only tier 1 targets.
81-
assertions = optionalAttrs (elem system [ "aarch64-linux" "x86_64-linux" ]) {
79+
optionalAttrs (elem system [ "aarch64-linux" "x86_64-linux" ]) {
8280
url-no-arch = assertUrl stable."1.48.0".rust-src "https://static.rust-lang.org/dist/2020-11-19/rust-src-1.48.0.tar.xz";
8381
url-kind-nightly = assertUrl nightly."2021-01-01".rustc "https://static.rust-lang.org/dist/2021-01-01/rustc-nightly-${rustHostPlatform}.tar.xz";
8482
url-kind-beta = assertUrl beta."2021-01-01".rustc "https://static.rust-lang.org/dist/2021-01-01/rustc-beta-${rustHostPlatform}.tar.xz";
@@ -94,11 +92,9 @@
9492
url-kind-1 = assertUrl stable."1.34.2".llvm-tools-preview "https://static.rust-lang.org/dist/2019-05-14/llvm-tools-1.34.2%20(6c2484dc3%202019-05-13)-${rustHostPlatform}.tar.xz";
9593
url-fix = assertUrl nightly."2019-01-10".rustc "https://static.rust-lang.org/dist/2019-01-10/rustc-nightly-${rustHostPlatform}.tar.xz";
9694

95+
# 1.30.0 has `rustfmt` still in preview state.
96+
rename-unavailable = assertEq (stable."1.30.0" ? rustfmt) false;
9797
rename-available = assertEq stable."1.48.0".rustfmt stable."1.48.0".rustfmt-preview;
98-
rename-unavailable = {
99-
assertion = !(stable."1.30.0" ? rustfmt);
100-
message = "1.30.0 has rustfmt still in preview state";
101-
};
10298

10399
latest-stable-legacy = assertEq pkgs.latest.rustChannels.stable.rustc stable.latest.rustc;
104100
latest-beta-legacy = assertEq pkgs.latest.rustChannels.beta.rustc beta.latest.rustc;
@@ -147,32 +143,18 @@
147143
extensions = [ "rustfmt" "rustc-dev" ];
148144
targets = [ "aarch64-unknown-linux-gnu" ];
149145
});
146+
147+
latest-nightly-default = rust-bin.selectLatestNightlyWith (toolchain: toolchain.default);
148+
149+
# Darwin specific tests.
150150
} // optionalAttrs (system == "aarch64-darwin") {
151151
url-forward = assertUrl
152152
nightly."2022-02-02".rust-docs
153153
"https://static.rust-lang.org/dist/2022-02-02/rust-docs-nightly-x86_64-apple-darwin.tar.xz";
154-
};
155-
156-
checkDrvs = optionalAttrs (elem system [ "aarch64-linux" "x86_64-linux" ]) {
157-
latest-nightly-default = rust-bin.selectLatestNightlyWith (toolchain: toolchain.default);
158-
} // optionalAttrs (system == "aarch64-darwin") {
159154
aarch64-darwin-use-x86-docs = rust-bin.stable."1.51.0".default.override {
160155
targets = [ "x86_64-apple-darwin" ];
161156
targetExtensions = [ "rust-docs" ];
162157
};
163158
};
164-
165-
failedAssertions =
166-
filter (msg: msg != null) (
167-
mapAttrsToList
168-
(name: { assertion, message }: if assertion
169-
then null
170-
else "Assertion `${name}` failed: ${message}\n")
171-
assertions);
172-
173-
in if failedAssertions == []
174-
then checkDrvs
175-
else throw (builtins.toString failedAssertions);
176-
177159
});
178160
}

0 commit comments

Comments
 (0)