Skip to content

Commit 0eb440d

Browse files
Desktop: Improve Nix build times with more caching (#4007)
1 parent 211111a commit 0eb440d

File tree

6 files changed

+133
-106
lines changed

6 files changed

+133
-106
lines changed

.github/workflows/build.yml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ jobs:
643643
run: sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache
644644

645645
- name: 📦 Build Nix package
646-
run: nix build .#graphite${{ inputs.debug && '-dev' || '' }} --no-link --print-out-paths
646+
run: nix build .#graphite${{ inputs.debug && '-dev' || '' }} --no-link --print-out-paths --print-build-logs
647647

648648
- name: 📤 Push to Nix cache
649649
env:
@@ -653,8 +653,16 @@ jobs:
653653
nix run nixpkgs#cachix -- authtoken $NIX_CACHE_AUTH_TOKEN
654654
nix build .#graphite${{ inputs.debug && '-dev' || '' }} --no-link --print-out-paths | nix run nixpkgs#cachix -- push $NIX_CACHE_NAME
655655
656+
- name: 📤 Push Dependencies to dev Nix cache
657+
env:
658+
NIX_CACHE_AUTH_TOKEN: ${{ secrets.NIX_CACHE_AUTH_TOKEN_DEV }}
659+
NIX_CACHE_NAME: graphite-dev
660+
run: |
661+
nix run nixpkgs#cachix -- authtoken $NIX_CACHE_AUTH_TOKEN
662+
nix build .#graphite${{ inputs.debug && '-dev' || '' }}.deps --no-link --print-out-paths | nix run nixpkgs#cachix -- push $NIX_CACHE_NAME
663+
656664
- name: 🏗 Build Linux bundle
657-
run: nix build .#graphite${{ inputs.debug && '-dev' || '' }}-bundle.tar.xz && cp ./result ./graphite-linux-bundle.tar.xz
665+
run: nix build .#graphite-bundle${{ inputs.debug && '-dev' || '' }}.tar.xz && cp ./result ./graphite-linux-bundle.tar.xz
658666

659667
- name: 📦 Upload Linux bundle
660668
uses: actions/upload-artifact@v6
@@ -692,7 +700,7 @@ jobs:
692700
693701
- name: 🏗 Build Flatpak
694702
run: |
695-
nix build .#graphite${{ inputs.debug && '-dev' || '' }}-flatpak-manifest
703+
nix build .#graphite-flatpak-manifest${{ inputs.debug && '-dev' || '' }}
696704
697705
rm -rf .flatpak
698706
mkdir -p .flatpak

.github/workflows/provide-shaders.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,11 @@ jobs:
3535
raster_nodes_shaders_entrypoint.wgsl \
3636
"${{ github.sha }} raster_nodes_shaders_entrypoint.wgsl" \
3737
${{ secrets.ARTIFACTS_REPO_TOKEN }}
38+
39+
- name: 📤 Push shaders to dev Nix cache
40+
env:
41+
NIX_CACHE_AUTH_TOKEN: ${{ secrets.NIX_CACHE_AUTH_TOKEN_DEV }}
42+
NIX_CACHE_NAME: graphite-dev
43+
run: |
44+
nix run nixpkgs#cachix -- authtoken $NIX_CACHE_AUTH_TOKEN
45+
nix build .#graphite-raster-nodes-shaders --no-link --print-out-paths | nix run nixpkgs#cachix -- push $NIX_CACHE_NAME

.nix/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ in
6060
graphite-raster-nodes-shaders = lib.call ./pkgs/graphite-raster-nodes-shaders.nix;
6161
graphite-branding = lib.call ./pkgs/graphite-branding.nix;
6262
graphite-bundle = (lib.call ./pkgs/graphite-bundle.nix) { };
63-
graphite-dev-bundle = (lib.call ./pkgs/graphite-bundle.nix) { graphite = graphite-dev; };
63+
graphite-bundle-dev = (lib.call ./pkgs/graphite-bundle.nix) { graphite = graphite-dev; };
6464
graphite-flatpak-manifest = (lib.call ./pkgs/graphite-flatpak-manifest.nix) { };
65-
graphite-dev-flatpak-manifest = (lib.call ./pkgs/graphite-flatpak-manifest.nix) { graphite-bundle = graphite-dev-bundle; };
65+
graphite-flatpak-manifest-dev = (lib.call ./pkgs/graphite-flatpak-manifest.nix) { graphite-bundle = graphite-bundle-dev; };
6666

6767
# TODO: graphene-cli = lib.call ./pkgs/graphene-cli.nix;
6868

.nix/deps/crane.nix

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
1-
{ pkgs, inputs, ... }:
1+
{
2+
pkgs,
3+
inputs,
4+
...
5+
}:
26

37
{
4-
lib = inputs.crane.mkLib pkgs;
8+
lib = (inputs.crane.mkLib pkgs) // {
9+
vendorCargoDepsFlatten =
10+
src:
11+
pkgs.stdenvNoCC.mkDerivation (finalAttrs: {
12+
name = "graphite-cargo-vendored";
13+
inherit src;
14+
15+
installPhase = ''
16+
cp -rL --no-preserve=mode "$src" "$out"
17+
chmod -R u+w "$out"
18+
find "$out" -type f -print0 | xargs -r -0 sed -i "s|$src|$out|g"
19+
'';
20+
21+
disallowedReferences = [ finalAttrs.src ];
22+
23+
dontUnpack = true;
24+
dontConfigure = true;
25+
dontBuild = true;
26+
});
27+
};
528
}

.nix/pkgs/graphite-raster-nodes-shaders.nix

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
{ info, deps, ... }:
1+
{
2+
info,
3+
deps,
4+
self,
5+
system,
6+
...
7+
}:
28

39
(deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage {
4-
pname = "raster-nodes-shaders";
10+
pname = "graphite-raster-nodes-shaders";
511
inherit (info) version src;
612

7-
cargoVendorDir = deps.crane.lib.vendorMultipleCargoDeps {
8-
inherit (deps.crane.lib.findCargoFiles (deps.crane.lib.cleanCargoSource info.src)) cargoConfigs;
9-
cargoLockList = [
10-
"${info.src}/Cargo.lock"
11-
"${deps.rustGPU.toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock"
12-
];
13-
};
13+
inherit (self.packages.${system}.graphite) cargoVendorDir cargoArtifacts;
1414

1515
strictDeps = true;
1616

.nix/pkgs/graphite.nix

Lines changed: 78 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -14,125 +14,107 @@
1414

1515
let
1616
branding = self.packages.${system}.graphite-branding;
17-
cargoVendorDir = deps.crane.lib.vendorCargoDeps { inherit (info) src; };
18-
resourcesCommon = {
19-
pname = "${info.pname}-resources";
20-
inherit (info) version src;
21-
inherit cargoVendorDir;
22-
strictDeps = true;
23-
nativeBuildInputs = [
24-
pkgs.pkg-config
25-
pkgs.lld
26-
pkgs.nodejs
27-
pkgs.nodePackages.npm
28-
pkgs.binaryen
29-
pkgs.wasm-bindgen-cli_0_2_100
30-
pkgs.wasm-pack
31-
pkgs.cargo-about
32-
];
33-
buildInputs = [ pkgs.openssl ];
34-
env.CARGO_PROFILE = if dev then "dev" else "release";
35-
cargoExtraArgs = "--target wasm32-unknown-unknown -p graphite-wasm-wrapper --no-default-features --features native";
36-
doCheck = false;
37-
};
38-
resources = deps.crane.lib.buildPackage (
39-
resourcesCommon
40-
// {
41-
cargoArtifacts = deps.crane.lib.buildDepsOnly resourcesCommon;
42-
43-
npmDeps = pkgs.importNpmLock {
44-
npmRoot = "${info.src}/frontend";
45-
};
46-
47-
npmRoot = "frontend";
48-
npmConfigScript = "setup";
49-
makeCacheWritable = true;
50-
51-
nativeBuildInputs = [
52-
pkgs.importNpmLock.npmConfigHook
53-
pkgs.removeReferencesTo
54-
]
55-
++ resourcesCommon.nativeBuildInputs;
56-
57-
prePatch = ''
58-
mkdir branding
59-
cp -r ${branding}/* branding
60-
cp ${info.src}/.branding branding/.branding
61-
'';
62-
63-
buildPhase = ''
64-
export HOME="$TMPDIR"
65-
66-
pushd frontend
67-
npm run native:build-${if dev then "dev" else "production"}
68-
popd
69-
'';
70-
71-
installPhase = ''
72-
mkdir -p $out
73-
cp -r frontend/dist/* $out/
74-
'';
75-
76-
postFixup = ''
77-
find "$out" -type f -exec remove-references-to -t "${cargoVendorDir}" '{}' +
78-
'';
79-
}
80-
);
8117
libs = [
8218
pkgs.wayland
8319
pkgs.vulkan-loader
8420
pkgs.libGL
8521
pkgs.openssl
8622
pkgs.libraw
87-
8823
# X11 Support
8924
pkgs.libxkbcommon
9025
pkgs.libXcursor
9126
pkgs.libxcb
9227
pkgs.libX11
9328
];
29+
9430
common = {
9531
inherit (info) pname version src;
96-
inherit cargoVendorDir;
97-
strictDeps = true;
32+
cargoVendorDir = deps.crane.lib.vendorCargoDepsFlatten (
33+
deps.crane.lib.vendorMultipleCargoDeps {
34+
inherit (deps.crane.lib.findCargoFiles (deps.crane.lib.cleanCargoSource info.src)) cargoConfigs;
35+
cargoLockList = [
36+
"${info.src}/Cargo.lock"
37+
"${deps.rustGPU.toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock"
38+
];
39+
}
40+
);
9841
buildInputs = libs;
99-
nativeBuildInputs = [
100-
pkgs.pkg-config
101-
pkgs.cargo-about
102-
pkgs.removeReferencesTo
103-
];
104-
env = deps.cef.env // {
105-
CARGO_PROFILE = if dev then "dev" else "release";
106-
};
107-
cargoExtraArgs = "-p graphite-desktop";
42+
strictDeps = true;
10843
doCheck = false;
10944
};
45+
46+
cargoArtifacts = deps.crane.lib.buildDepsOnly (
47+
common
48+
// {
49+
nativeBuildInputs = [
50+
pkgs.pkg-config
51+
pkgs.lld
52+
];
53+
env = deps.cef.env;
54+
buildPhase =
55+
let
56+
profile = if dev then "dev" else "release";
57+
in
58+
''
59+
cargo check --profile ${profile} --locked -p graphite-desktop-platform-linux
60+
cargo build --profile ${profile} --locked -p graphite-desktop-platform-linux
61+
62+
cargo check --profile ${profile} --target wasm32-unknown-unknown --locked -p graphite-wasm-wrapper --no-default-features --features native
63+
cargo build --profile ${profile} --target wasm32-unknown-unknown --locked -p graphite-wasm-wrapper --no-default-features --features native
64+
65+
cargo check --locked -p third-party-licenses --features desktop
66+
cargo build --locked -p third-party-licenses --features desktop
67+
68+
cargo check --profile ${profile} --locked -p graphite-desktop-bundle
69+
cargo build --profile ${profile} --locked -p graphite-desktop-bundle
70+
'';
71+
}
72+
);
11073
in
11174

11275
deps.crane.lib.buildPackage (
11376
common
11477
// {
115-
cargoArtifacts = deps.crane.lib.buildDepsOnly common;
78+
inherit cargoArtifacts;
11679

117-
env = common.env // {
118-
RASTER_NODES_SHADER_PATH = self.packages.${system}.graphite-raster-nodes-shaders;
119-
EMBEDDED_RESOURCES = resources;
120-
GRAPHITE_GIT_COMMIT_HASH = self.rev or "unknown";
121-
GRAPHITE_GIT_COMMIT_DATE = self.lastModified or "unknown";
122-
};
80+
buildInputs = libs;
81+
nativeBuildInputs = [
82+
pkgs.pkg-config
83+
pkgs.lld
84+
pkgs.nodejs
85+
pkgs.nodePackages.npm
86+
pkgs.binaryen
87+
pkgs.wasm-bindgen-cli_0_2_100
88+
pkgs.wasm-pack
89+
pkgs.cargo-about
90+
pkgs.removeReferencesTo
91+
pkgs.importNpmLock.npmConfigHook
92+
];
12393

12494
npmDeps = pkgs.importNpmLock {
12595
npmRoot = "${info.src}/frontend";
12696
};
12797
npmRoot = "frontend";
128-
nativeBuildInputs = [
129-
pkgs.importNpmLock.npmConfigHook
130-
pkgs.nodePackages.npm
131-
]
132-
++ common.nativeBuildInputs;
98+
npmConfigScript = "setup";
99+
makeCacheWritable = true;
100+
101+
env = deps.cef.env // {
102+
RASTER_NODES_SHADER_PATH = self.packages.${system}.graphite-raster-nodes-shaders;
103+
GRAPHITE_GIT_COMMIT_HASH = self.rev or "unknown";
104+
GRAPHITE_GIT_COMMIT_DATE = self.lastModified or "unknown";
105+
};
106+
107+
postPatch = ''
108+
mkdir branding
109+
cp -r ${branding}/* branding
110+
cp ${info.src}/.branding branding/.branding
111+
'';
133112

134113
preBuild = ''
135-
${lib.getExe self.packages.${system}.tools.third-party-licenses}
114+
# Prevent `package-installer.js` from trying to update npm dependencies
115+
touch -r frontend/package-lock.json -d '+1 year' frontend/node_modules/.install-timestamp
116+
117+
export HOME="$TMPDIR"
136118
''
137119
+ (
138120
if self ? rev then
@@ -143,6 +125,10 @@ deps.crane.lib.buildPackage (
143125
""
144126
);
145127

128+
buildPhaseCargoCommand = "cargo run build desktop${if dev then " debug" else ""}";
129+
130+
doNotPostBuildInstallCargoBinaries = true;
131+
146132
installPhase = ''
147133
mkdir -p $out/bin
148134
cp target/${if dev then "debug" else "release"}/graphite $out/bin/graphite
@@ -161,12 +147,14 @@ deps.crane.lib.buildPackage (
161147
'';
162148

163149
postFixup = ''
164-
remove-references-to -t "${cargoVendorDir}" $out/bin/graphite
150+
remove-references-to -t "${common.cargoVendorDir}" $out/bin/graphite
165151
166152
patchelf \
167153
--set-rpath "${pkgs.lib.makeLibraryPath libs}:${deps.cef.env.CEF_PATH}" \
168154
--add-needed libGL.so \
169155
$out/bin/graphite
170156
'';
157+
158+
passthru.deps = cargoArtifacts;
171159
}
172160
)

0 commit comments

Comments
 (0)