Skip to content

Commit 32848b1

Browse files
committed
refactor(nix): propagate workspace crate inputs
1 parent 8e61ef1 commit 32848b1

3 files changed

Lines changed: 103 additions & 41 deletions

File tree

flake.nix

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,29 @@
3939

4040
craneLib = (crane.mkLib pkgs).overrideToolchain (_: rustToolchain);
4141

42+
crateSpecs = import ./nix/crate.nix {
43+
inherit pkgs;
44+
root = ./.;
45+
};
46+
4247
# Crate-by-crate crane helpers (workspace graph, minimal per-crate
4348
# source, buildWorkspaceCrate). See nix/workspace.nix.
4449
workspace = import ./nix/workspace.nix {
4550
inherit lib pkgs craneLib;
4651
root = ./.;
52+
inherit crateSpecs;
4753
};
4854
inherit (workspace) buildWorkspaceCrate;
4955

50-
crateSpecs = import ./nix/crate.nix {
51-
inherit pkgs;
52-
root = ./.;
56+
workspaceCrates = lib.mapAttrs (_: buildWorkspaceCrate) crateSpecs;
57+
crates = {
58+
openshell-cli = workspaceCrates.openshell-cli.package;
59+
openshell-server = workspaceCrates.openshell-server.package;
60+
openshell-sandbox = workspaceCrates.openshell-sandbox.package;
61+
openshell-driver-vm = workspaceCrates.openshell-driver-vm.package;
62+
openshell-driver-kubernetes = workspaceCrates.openshell-driver-kubernetes.package;
63+
openshell-driver-podman = workspaceCrates.openshell-driver-podman.package;
5364
};
54-
crates = lib.mapAttrs (_: buildWorkspaceCrate) crateSpecs;
5565

5666
treefmtEval = treefmt-nix.lib.evalModule pkgs {
5767
projectRootFile = "flake.nix";

nix/crate.nix

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,23 @@
55
pkgs,
66
root,
77
}:
8-
let
9-
# z3 (found via pkg-config) and libclang (for z3-sys bindgen) are only needed
10-
# by crates whose closure contains openshell-prover.
11-
withZ3 = {
12-
nativeBuildInputs = [
13-
pkgs.pkg-config
14-
pkgs.protobuf
15-
];
16-
buildInputs = [ pkgs.z3 ];
17-
env.LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
18-
};
19-
in
208
{
21-
# Each crate declares the compile-time assets its build needs: its own plus
22-
# those of its workspace deps (proto/ arrives via openshell-core, providers/
23-
# via openshell-providers, registry/ via openshell-prover).
24-
openshell-cli = withZ3 // {
9+
# Each crate declares the compile-time assets and build tools it needs. The
10+
# workspace builder collects nativeBuildInputs/buildInputs/env from the
11+
# transitive Cargo closure.
12+
openshell-bootstrap = {
13+
dir = "openshell-bootstrap";
14+
assets = [ (root + "/proto") ];
15+
};
16+
openshell-cli = {
2517
dir = "openshell-cli";
2618
assets = [
2719
(root + "/proto")
2820
(root + "/providers")
2921
(root + "/crates/openshell-prover/registry")
3022
];
3123
};
32-
openshell-server = withZ3 // {
24+
openshell-server = {
3325
dir = "openshell-server";
3426
assets = [
3527
(root + "/proto")
@@ -38,9 +30,17 @@ in
3830
(root + "/crates/openshell-server/migrations")
3931
];
4032
};
33+
openshell-core = {
34+
dir = "openshell-core";
35+
nativeBuildInputs = [ pkgs.protobuf ];
36+
assets = [ (root + "/proto") ];
37+
};
38+
openshell-driver-docker = {
39+
dir = "openshell-driver-docker";
40+
assets = [ (root + "/proto") ];
41+
};
4142
openshell-sandbox = {
4243
dir = "openshell-sandbox";
43-
nativeBuildInputs = [ pkgs.protobuf ];
4444
assets = [
4545
(root + "/proto")
4646
(root + "/crates/openshell-sandbox/data")
@@ -49,20 +49,59 @@ in
4949
};
5050
openshell-driver-vm = {
5151
dir = "openshell-driver-vm";
52-
nativeBuildInputs = [ pkgs.protobuf ];
5352
assets = [
5453
(root + "/proto")
5554
(root + "/crates/openshell-driver-vm/scripts")
5655
];
5756
};
5857
openshell-driver-kubernetes = {
5958
dir = "openshell-driver-kubernetes";
60-
nativeBuildInputs = [ pkgs.protobuf ];
6159
assets = [ (root + "/proto") ];
6260
};
6361
openshell-driver-podman = {
6462
dir = "openshell-driver-podman";
65-
nativeBuildInputs = [ pkgs.protobuf ];
6663
assets = [ (root + "/proto") ];
6764
};
65+
openshell-ocsf = {
66+
dir = "openshell-ocsf";
67+
assets = [ (root + "/crates/openshell-ocsf/schemas") ];
68+
};
69+
openshell-policy = {
70+
dir = "openshell-policy";
71+
assets = [ (root + "/proto") ];
72+
};
73+
openshell-prover = {
74+
dir = "openshell-prover";
75+
nativeBuildInputs = [ pkgs.pkg-config ];
76+
buildInputs = [ pkgs.z3 ];
77+
env.LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
78+
assets = [
79+
(root + "/crates/openshell-prover/registry")
80+
(root + "/crates/openshell-prover/testdata")
81+
];
82+
};
83+
openshell-providers = {
84+
dir = "openshell-providers";
85+
assets = [
86+
(root + "/proto")
87+
(root + "/providers")
88+
];
89+
};
90+
openshell-router = {
91+
dir = "openshell-router";
92+
assets = [ (root + "/proto") ];
93+
};
94+
openshell-server-macros = {
95+
dir = "openshell-server-macros";
96+
};
97+
openshell-tui = {
98+
dir = "openshell-tui";
99+
assets = [
100+
(root + "/proto")
101+
(root + "/providers")
102+
];
103+
};
104+
openshell-vfio = {
105+
dir = "openshell-vfio";
106+
};
68107
}

nix/workspace.nix

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
root,
1919
# Member directory, relative to root.
2020
crateDir ? "crates",
21+
# Crate metadata keyed by workspace crate directory.
22+
crateSpecs ? { },
2123
# Version stamped onto every crate derivation.
2224
version ? "0.0.0",
2325
}:
@@ -50,6 +52,12 @@ let
5052
}
5153
);
5254

55+
specFor = dir: lib.attrByPath [ dir ] { } crateSpecs;
56+
57+
closureList = closure: field: lib.concatLists (map (d: (specFor d).${field} or [ ]) closure);
58+
59+
closureEnv = closure: lib.foldl' lib.recursiveUpdate { } (map (d: (specFor d).env or { }) closure);
60+
5361
# Every member's Cargo.toml, cargo must see all of them to resolve the
5462
# workspace even for crates whose source we leave out.
5563
allManifests = map (d: cratesRoot + "/${d}/Cargo.toml") crateDirs;
@@ -94,14 +102,17 @@ let
94102
let
95103
closure = closureOf dir;
96104
workspaceDeps = lib.filter (d: d != dir) closure;
105+
effectiveNativeBuildInputs = lib.unique (
106+
closureList closure "nativeBuildInputs" ++ nativeBuildInputs
107+
);
108+
effectiveBuildInputs = lib.unique (closureList closure "buildInputs" ++ buildInputs);
109+
effectiveEnv = lib.recursiveUpdate (closureEnv closure) env;
97110
common = {
98111
pname = dir;
99-
inherit
100-
version
101-
nativeBuildInputs
102-
buildInputs
103-
env
104-
;
112+
inherit version;
113+
nativeBuildInputs = effectiveNativeBuildInputs;
114+
buildInputs = effectiveBuildInputs;
115+
env = effectiveEnv;
105116
strictDeps = true;
106117
# Build only, skip the cargo test/check phase for now.
107118
doCheck = false;
@@ -142,16 +153,18 @@ let
142153
}
143154
);
144155
in
145-
craneLib.buildPackage (
146-
common
147-
// {
148-
src = mkSrc {
149-
dirs = closure;
150-
inherit assets;
151-
};
152-
cargoArtifacts = workspaceLibs;
153-
}
154-
);
156+
{
157+
package = craneLib.buildPackage (
158+
common
159+
// {
160+
src = mkSrc {
161+
dirs = closure;
162+
inherit assets;
163+
};
164+
cargoArtifacts = workspaceLibs;
165+
}
166+
);
167+
};
155168
in
156169
{
157170
inherit buildWorkspaceCrate;

0 commit comments

Comments
 (0)