Skip to content

Commit a77dcdb

Browse files
authored
add tooling for Nix files (#62)
Define a `flake_package_dev_deps` extension that obtains development dependencies from nixpkgs. This uses the existing `flake.nix` in `//extensions`. The dev dependencies include: * `nixd` * `nixfmt` * `nixfmt-tree` `nixd` (and `nixfmt`) must be fetched explicitly with ``` bazel fetch @nixd ``` as these are only used as part of the Zed project settings. This PR also adds `gnused` as a package, as it is used extensively by shell runfiles: https://github.com/bazelbuild/rules_shell/blob/main/shell/runfiles/runfiles.bash#L184 Change-Id: Ibb8c58fbf876a2eb3c612b3985f45840be7f7d79
1 parent 07d38b9 commit a77dcdb

File tree

7 files changed

+260
-81
lines changed

7 files changed

+260
-81
lines changed

.zed/settings.json

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
"file_scan_exclusions": [".cache/"],
88
"languages": {
99
"Nix": {
10-
"language_servers": [ "nil", "!nixd" ],
10+
"language_servers": ["nixd", "!nil"],
1111
"formatter": {
12-
"external": {
13-
"command": "alejandra",
14-
"arguments": ["--quiet", "--"]
15-
}
16-
}
12+
"external": {
13+
// initialize with
14+
// bazel fetch @nixfmt
15+
"command": "./external/+flake_package_dev_deps+nixfmt/bin/nixfmt",
16+
"arguments": ["--quiet", "--"]
17+
}
18+
}
1719
},
1820
"Starlark": {
19-
"enable_language_server": true,
2021
"language_servers": ["starpls"],
2122
"formatter": {
2223
"external": {
@@ -52,6 +53,21 @@
5253
]
5354
}
5455
},
56+
"nixd": {
57+
"binary": {
58+
// initialize with
59+
// bazel fetch @nixd
60+
"path": "./external/+flake_package_dev_deps+nixd/bin/nixd"
61+
},
62+
"settings": {
63+
"nixpkgs": {
64+
"expr": "import (builtins.getFlake \"./tools/nix\").inputs.nixpkgs {}"
65+
},
66+
"diagnostic": {
67+
"suppress": ["sema-unused-def-lambda-noarg-formal"]
68+
}
69+
}
70+
},
5571
"starpls": {
5672
"binary": {
5773
"arguments": [

MODULE.bazel

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,15 @@ python = use_extension(
183183
)
184184
python.defaults(python_version = "3.11")
185185
python.toolchain(python_version = "3.11")
186+
187+
flake_package_dev_deps = use_extension(
188+
"//extensions:flake_package_deps.bzl",
189+
"flake_package_dev_deps",
190+
dev_dependency = True,
191+
)
192+
use_repo(
193+
flake_package_dev_deps,
194+
"nixd",
195+
"nixfmt",
196+
"nixfmt-tree",
197+
)

MODULE.bazel.lock

Lines changed: 78 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/flake.nix

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,33 @@
55
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
66
};
77

8-
outputs = {
9-
self,
10-
nixpkgs,
11-
}: let
12-
systems = ["x86_64-linux" "aarch64-darwin"];
13-
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
14-
in {
15-
packages = forAllSystems (
16-
system: let
17-
pkgs = nixpkgs.legacyPackages.${system};
18-
in {
19-
inherit (pkgs) gdb qemu;
20-
}
21-
);
22-
};
8+
outputs =
9+
{
10+
self,
11+
nixpkgs,
12+
}:
13+
let
14+
systems = [
15+
"x86_64-linux"
16+
"aarch64-darwin"
17+
];
18+
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
19+
in
20+
{
21+
packages = forAllSystems (
22+
system:
23+
let
24+
pkgs = nixpkgs.legacyPackages.${system};
25+
in
26+
{
27+
inherit (pkgs)
28+
gdb
29+
qemu
30+
nixd
31+
nixfmt-tree
32+
;
33+
nixfmt = pkgs.nixfmt-rfc-style;
34+
}
35+
);
36+
};
2337
}

extensions/flake_package_deps.bzl

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ exports_files(["flake.nix", "flake.lock"])
2222
""",
2323
executable = False,
2424
)
25+
rctx.repo_metadata(reproducible = True)
2526

2627
_flake_copy = repository_rule(
2728
implementation = _flake_copy_impl,
@@ -34,41 +35,69 @@ _flake_copy = repository_rule(
3435
),
3536
)
3637

37-
def _native_binary_build_file_content(binary):
38+
def _native_binary_build_file_content(binary, *, package = None):
3839
return """
3940
load("@bazel_skylib//rules:native_binary.bzl", "native_binary")
4041
4142
native_binary(
42-
name = "{binary}",
43+
name = "{package}",
4344
out = "{binary}",
4445
src = "bin/{binary}",
4546
visibility = ["//visibility:public"],
4647
)
47-
""".format(binary = binary)
48+
""".format(
49+
binary = binary,
50+
package = package or binary,
51+
)
4852

49-
def _flake_package_deps_impl(_mctx):
53+
def _provide_binary(pkgs):
5054
_flake_copy(
5155
name = "flake_copy",
5256
flake_file = "//extensions:flake.nix",
5357
flake_lock_file = "//extensions:flake.lock",
5458
)
5559

56-
nixpkgs_flake_package(
57-
name = "qemu-system-arm",
58-
nix_flake_file = "@flake_copy//:flake.nix",
59-
nix_flake_lock_file = "@flake_copy//:flake.lock",
60-
package = "qemu",
61-
build_file_content = _native_binary_build_file_content("qemu-system-arm"),
62-
)
60+
for package in pkgs:
61+
if type(package) != "dict":
62+
package = {"name": package}
6363

64-
nixpkgs_flake_package(
65-
name = "gdb",
66-
nix_flake_file = "@flake_copy//:flake.nix",
67-
nix_flake_lock_file = "@flake_copy//:flake.lock",
68-
package = "gdb",
69-
build_file_content = _native_binary_build_file_content("gdb"),
70-
)
64+
defaults = {
65+
"nix_flake_file": "@flake_copy//:flake.nix",
66+
"nix_flake_lock_file": "@flake_copy//:flake.lock",
67+
"package": package["name"],
68+
"build_file_content": _native_binary_build_file_content(package["name"]),
69+
}
70+
71+
nixpkgs_flake_package(
72+
**(defaults | package)
73+
)
74+
75+
def _flake_package_deps_impl(_mctx):
76+
_provide_binary([
77+
"gdb",
78+
{
79+
"name": "qemu-system-arm",
80+
"package": "qemu",
81+
},
82+
])
7183

7284
flake_package_deps = module_extension(
7385
implementation = _flake_package_deps_impl,
7486
)
87+
88+
def _flake_package_dev_deps_impl(_mctx):
89+
_provide_binary([
90+
"nixd",
91+
"nixfmt",
92+
{
93+
"name": "nixfmt-tree",
94+
"build_file_content": _native_binary_build_file_content(
95+
package = "nixfmt-tree",
96+
binary = "treefmt",
97+
),
98+
},
99+
])
100+
101+
flake_package_dev_deps = module_extension(
102+
implementation = _flake_package_dev_deps_impl,
103+
)

tools/BUILD.bazel

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
load("@buildifier_prebuilt//:rules.bzl", "buildifier")
22
load("@hedron_compile_commands//:refresh_compile_commands.bzl", "refresh_compile_commands")
3+
load("@local_workspace_directories//:defs.bzl", "BAZEL_WORKSPACE_ROOT")
34
load("@platforms//host:constraints.bzl", "HOST_CONSTRAINTS")
4-
load("@rules_multirun//:defs.bzl", "multirun")
5+
load("@rules_multirun//:defs.bzl", "command", "multirun")
56
load("@rules_shell//shell:sh_binary.bzl", "sh_binary")
67

78
buildifier(
@@ -16,6 +17,29 @@ buildifier(
1617
mode = "fix",
1718
)
1819

20+
command(
21+
name = "nixfmt.check",
22+
args = [
23+
"--ci",
24+
"--tree-root",
25+
BAZEL_WORKSPACE_ROOT,
26+
"--working-dir",
27+
BAZEL_WORKSPACE_ROOT,
28+
],
29+
command = "@nixfmt-tree",
30+
)
31+
32+
command(
33+
name = "nixfmt",
34+
args = [
35+
"--tree-root",
36+
BAZEL_WORKSPACE_ROOT,
37+
"--working-dir",
38+
BAZEL_WORKSPACE_ROOT,
39+
],
40+
command = "@nixfmt-tree",
41+
)
42+
1943
genrule(
2044
name = "gen-clang-format",
2145
outs = ["clang-format.bash"],
@@ -52,6 +76,7 @@ multirun(
5276
commands = [
5377
":buildifier.check",
5478
":clang-format.check",
79+
":nixfmt.check",
5580
],
5681
)
5782

@@ -60,6 +85,7 @@ multirun(
6085
commands = [
6186
":buildifier",
6287
":clang-format",
88+
":nixfmt",
6389
],
6490
)
6591

0 commit comments

Comments
 (0)