From 6bb610dfa76a600252b1964b543fe18853b3b49d Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Fri, 14 Nov 2025 12:29:08 +0000 Subject: [PATCH 1/6] desktop simple nix ci --- .github/workflows/build-nix-package.yml | 18 ++ .nix/{ => deps}/cef.nix | 4 +- .nix/deps/crane.nix | 5 + .nix/{ => deps}/rust-gpu.nix | 51 +++--- .nix/dev.nix | 12 ++ .nix/flake.lock | 16 ++ .nix/flake.nix | 159 +++++++----------- .nix/pkgs/graphene-raster-nodes-shaders.nix | 28 +++ .nix/pkgs/graphite.nix | 85 ++++++++++ desktop/Cargo.toml | 4 + .../assets/rs.graphite.GraphiteEditor.desktop | 2 +- desktop/embedded-resources/build.rs | 31 +++- desktop/wrapper/Cargo.toml | 3 +- 13 files changed, 280 insertions(+), 138 deletions(-) create mode 100644 .github/workflows/build-nix-package.yml rename .nix/{ => deps}/cef.nix (91%) create mode 100644 .nix/deps/crane.nix rename .nix/{ => deps}/rust-gpu.nix (54%) create mode 100644 .nix/dev.nix create mode 100644 .nix/pkgs/graphene-raster-nodes-shaders.nix create mode 100644 .nix/pkgs/graphite.nix diff --git a/.github/workflows/build-nix-package.yml b/.github/workflows/build-nix-package.yml new file mode 100644 index 0000000000..21b773381f --- /dev/null +++ b/.github/workflows/build-nix-package.yml @@ -0,0 +1,18 @@ +name: Build Nix Package + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + + - name: Build Nix Package Dev + run: nix build .nix#graphite-dev --print-build-logs diff --git a/.nix/cef.nix b/.nix/deps/cef.nix similarity index 91% rename from .nix/cef.nix rename to .nix/deps/cef.nix index 96f656dc17..7632fa37df 100644 --- a/.nix/cef.nix +++ b/.nix/deps/cef.nix @@ -1,4 +1,4 @@ -{ pkgs }: +{ pkgs, inputs, ... }: let libcef = pkgs.libcef.overrideAttrs (_: _: { @@ -22,5 +22,5 @@ let ''; in { - CEF_PATH = cefPath; + env.CEF_PATH = cefPath; } diff --git a/.nix/deps/crane.nix b/.nix/deps/crane.nix new file mode 100644 index 0000000000..368827082c --- /dev/null +++ b/.nix/deps/crane.nix @@ -0,0 +1,5 @@ +{ pkgs, inputs, ... }: + +{ + lib = inputs.crane.mkLib pkgs; +} diff --git a/.nix/rust-gpu.nix b/.nix/deps/rust-gpu.nix similarity index 54% rename from .nix/rust-gpu.nix rename to .nix/deps/rust-gpu.nix index 30836da646..8dc77bdf93 100644 --- a/.nix/rust-gpu.nix +++ b/.nix/deps/rust-gpu.nix @@ -1,15 +1,24 @@ -{ pkgs }: +{ pkgs, inputs, ... }: let - toolchainPkg = pkgs.rust-bin.nightly."2025-06-23".default.override { - extensions = - [ "rust-src" "rust-analyzer" "clippy" "cargo" "rustc-dev" "llvm-tools" ]; + extensions = [ "rust-src" "rust-analyzer" "clippy" "cargo" "rustc-dev" "llvm-tools" ]; + toolchain = pkgs.rust-bin.nightly."2025-06-23".default.override { + inherit extensions; }; - toolchainRustPlatform = pkgs.makeRustPlatform { - cargo = toolchainPkg; - rustc = toolchainPkg; - }; - rustc_codegen_spirv = toolchainRustPlatform.buildRustPackage (finalAttrs: { + cargo = pkgs.writeShellScriptBin "cargo" '' + #!${pkgs.lib.getExe pkgs.bash} + + filtered_args=() + for arg in "$@"; do + case "$arg" in + +nightly|+nightly-*) ;; + *) filtered_args+=("$arg") ;; + esac + done + + exec ${toolchain}/bin/cargo ${"\${filtered_args[@]}"} + ''; + rustc_codegen_spirv = (pkgs.makeRustPlatform { cargo = toolchain; rustc = toolchain; }).buildRustPackage (finalAttrs: { pname = "rustc_codegen_spirv"; version = "0-unstable-2025-08-04"; src = pkgs.fetchFromGitHub { @@ -27,21 +36,11 @@ let ]; doCheck = false; }); - cargoWrapper = pkgs.writeShellScriptBin "cargo" '' - #!${pkgs.lib.getExe pkgs.bash} - - filtered_args=() - for arg in "$@"; do - case "$arg" in - +nightly|+nightly-*) ;; - *) filtered_args+=("$arg") ;; - esac - done - - exec ${toolchainPkg}/bin/cargo ${"\${filtered_args[@]}"} - ''; -in { - RUST_GPU_PATH_OVERRIDE = "${cargoWrapper}/bin:${toolchainPkg}/bin"; - RUSTC_CODEGEN_SPIRV_PATH = - "${rustc_codegen_spirv}/lib/librustc_codegen_spirv.so"; +in +{ + toolchain = toolchain; + env = { + RUST_GPU_PATH_OVERRIDE = "${cargo}/bin:${toolchain}/bin"; + RUSTC_CODEGEN_SPIRV_PATH = "${rustc_codegen_spirv}/lib/librustc_codegen_spirv.so"; + }; } diff --git a/.nix/dev.nix b/.nix/dev.nix new file mode 100644 index 0000000000..809fc3d838 --- /dev/null +++ b/.nix/dev.nix @@ -0,0 +1,12 @@ +{ info, pkgs, inputs, deps, libs, tools, ... }: + +pkgs.mkShell ({ + packages = tools.all; + + LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}"; + XDG_DATA_DIRS = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS"; + + shellHook = '' + alias cargo='mold --run cargo' + ''; +} // deps.cef.env // deps.rustGPU.env) diff --git a/.nix/flake.lock b/.nix/flake.lock index 2f5a032046..fe4d3528d4 100644 --- a/.nix/flake.lock +++ b/.nix/flake.lock @@ -1,5 +1,20 @@ { "nodes": { + "crane": { + "locked": { + "lastModified": 1762538466, + "narHash": "sha256-8zrIPl6J+wLm9MH5ksHcW7BUHo7jSNOu0/hA0ohOOaM=", + "owner": "ipetkov", + "repo": "crane", + "rev": "0cea393fffb39575c46b7a0318386467272182fe", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, "flake-compat": { "locked": { "lastModified": 1733328505, @@ -50,6 +65,7 @@ }, "root": { "inputs": { + "crane": "crane", "flake-compat": "flake-compat", "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", diff --git a/.nix/flake.nix b/.nix/flake.nix index 46e8afeb25..da86600c54 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -19,52 +19,68 @@ inputs.nixpkgs.follows = "nixpkgs"; }; flake-utils.url = "github:numtide/flake-utils"; + crane.url = "github:ipetkov/crane"; # This is used to provide a identical development shell at `shell.nix` for users that do not use flakes flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"; }; - outputs = { nixpkgs, rust-overlay, flake-utils, ... }: - flake-utils.lib.eachDefaultSystem (system: - let - overlays = [ (import rust-overlay) ]; - pkgs = import nixpkgs { inherit system overlays; }; - - rustExtensions = [ "rust-src" "rust-analyzer" "clippy" "cargo" ]; - rust = pkgs.rust-bin.stable.latest.default.override { - targets = [ "wasm32-unknown-unknown" ]; - extensions = rustExtensions; - }; - - # Shared build inputs; libraries that need to be in LD_LIBRARY_PATH - buildInputs = [ + outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: + let + info = { + pname = "graphite"; + version = "unstable"; + src = ./..; + }; + + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ (import inputs.rust-overlay) ]; + }; + + deps = { + rust = import ./deps/rust.nix { inherit pkgs inputs; }; + crane = import ./deps/crane.nix { inherit pkgs inputs; }; + cef = import ./deps/cef.nix { inherit pkgs inputs; }; + rustGPU = import ./deps/rust-gpu.nix { inherit pkgs inputs; }; + }; + + libs = rec { + desktop = [ pkgs.wayland pkgs.openssl pkgs.vulkan-loader pkgs.libraw pkgs.libGL - - # X11 libraries, not needed on wayland! Remove when x11 is finally dead + ]; + desktop-x11 = [ pkgs.libxkbcommon pkgs.xorg.libXcursor pkgs.xorg.libxcb pkgs.xorg.libX11 ]; + desktop-all = desktop ++ desktop-x11; + }; - # Packages needed to build the package - buildTools = [ - rust + tools = rec { + desktop = [ + pkgs.pkg-config + ]; + frontend = [ + pkgs.lld pkgs.nodejs pkgs.nodePackages.npm pkgs.binaryen pkgs.wasm-bindgen-cli_0_2_100 pkgs.wasm-pack - pkgs.pkg-config pkgs.cargo-about ]; + dev = [ + pkgs.rustc + pkgs.cargo + pkgs.rust-analyzer + pkgs.clippy - # Development tools; not needed to build the package - devTools = [ pkgs.git pkgs.cargo-watch @@ -79,81 +95,26 @@ pkgs.samply pkgs.cargo-flamegraph ]; - - cefEnv = import ./cef.nix { inherit pkgs; }; - rustGPUEnv = import ./rust-gpu.nix { inherit pkgs; }; - - libPath = "${pkgs.lib.makeLibraryPath buildInputs}:${cefEnv.CEF_PATH}"; - in { - devShells.default = pkgs.mkShell ({ - packages = buildInputs ++ buildTools ++ devTools; - - LD_LIBRARY_PATH = libPath; - XDG_DATA_DIRS = - "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS"; - - shellHook = '' - alias cargo='mold --run cargo' - ''; - } // cefEnv // rustGPUEnv); - - packages.default = pkgs.rustPlatform.buildRustPackage (finalAttrs: { - pname = "graphite-editor"; - version = "unstable"; - src = pkgs.lib.cleanSource ./..; - - cargoLock = { - lockFile = ../Cargo.lock; - allowBuiltinFetchGit = true; - }; - - # TODO: Remove the need for this hash by using individual package resolutions and hashes from package-lock.json - npmDeps = pkgs.fetchNpmDeps { - inherit (finalAttrs) pname version; - src = "${finalAttrs.src}/frontend"; - hash = "sha256-UWuJpKNYj2Xn34rpMDZ75pzMYUOLQjPeGuJ/QlPbX9A="; - }; - - npmRoot = "frontend"; - npmConfigScript = "setup"; - makeCacheWritable = true; - - buildInputs = buildInputs; - nativeBuildInputs = buildTools ++ [ - pkgs.rustPlatform.cargoSetupHook - pkgs.npmHooks.npmConfigHook - pkgs.makeWrapper - ]; - - env = cefEnv // rustGPUEnv; - - buildPhase = '' - export HOME="$TMPDIR" - - pushd frontend - npm run build-native - popd - cargo build -r -p graphite-desktop - ''; - - installPhase = '' - mkdir -p $out/bin - cp target/release/graphite-desktop $out/bin/graphite-editor - - mkdir -p $out/share/applications - cp $src/desktop/assets/*.desktop $out/share/applications/ - - mkdir -p $out/share/icons/hicolor/scalable/apps - cp $src/desktop/assets/graphite-icon-color.svg $out/share/icons/hicolor/scalable/apps/ - ''; - - doCheck = false; - - postFixup = '' - wrapProgram "$out/bin/graphite-editor" \ - --prefix LD_LIBRARY_PATH : "${libPath}" \ - --set CEF_PATH "${cefEnv.CEF_PATH}" - ''; - }); - }); + all = frontend ++ dev; + }; + in + { + packages = rec { + graphiteWithArgs = args: (import ./pkgs/graphite.nix { + pkgs = pkgs // { inherit graphene-raster-nodes-shaders; }; + inherit info inputs deps libs tools; + }) args; + graphite = graphiteWithArgs { }; + graphite-dev = graphiteWithArgs { dev = true; }; + graphite-without-resources = graphiteWithArgs { embeddedResources = false; }; + graphite-without-resources-dev = graphiteWithArgs { embeddedResources = false; dev = true; }; + #TODO: graphene-cli = import ./pkgs/graphene-cli.nix { inherit info pkgs inputs deps libs tools; }; + graphene-raster-nodes-shaders = import ./pkgs/graphene-raster-nodes-shaders.nix { inherit info pkgs inputs deps libs tools; }; + + default = graphite; + }; + + devShells.default = import ./dev.nix { inherit pkgs deps libs tools; }; + } + ); } diff --git a/.nix/pkgs/graphene-raster-nodes-shaders.nix b/.nix/pkgs/graphene-raster-nodes-shaders.nix new file mode 100644 index 0000000000..7c9ae8afa1 --- /dev/null +++ b/.nix/pkgs/graphene-raster-nodes-shaders.nix @@ -0,0 +1,28 @@ +{ info, pkgs, deps, libs, tools, ... }: + +(deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage { + pname = "graphene-raster-nodes-shaders"; + inherit (info) version src; + + cargoVendorDir = deps.crane.lib.vendorMultipleCargoDeps { + inherit (deps.crane.lib.findCargoFiles (deps.crane.lib.cleanCargoSource info.src)) cargoConfigs; + cargoLockList = [ + "${info.src}/Cargo.lock" + "${deps.rustGPU.toolchain.passthru.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock" + ]; + }; + + strictDeps = true; + + env = deps.rustGPU.env; + + buildPhase = '' + cargo build -r -p graphene-raster-nodes-shaders + ''; + + installPhase = '' + cp target/spirv-builder/spirv-unknown-naga-wgsl/release/deps/graphene_raster_nodes_shaders_entrypoint.wgsl $out + ''; + + doCheck = false; +} diff --git a/.nix/pkgs/graphite.nix b/.nix/pkgs/graphite.nix new file mode 100644 index 0000000000..a5a5e4f6dc --- /dev/null +++ b/.nix/pkgs/graphite.nix @@ -0,0 +1,85 @@ +{ info, pkgs, inputs, deps, libs, tools, ... }: + +{ + embeddedResources ? true, + dev ? false, +}: + +let + resourcesCommon = { + pname = "${info.pname}-resources"; + inherit (info) version src; + strictDeps = true; + doCheck = false; + nativeBuildInputs = tools.frontend; + env.CARGO_PROFILE = if dev then "dev" else "release"; + cargoExtraArgs = "--target wasm32-unknown-unknown -p graphite-wasm --no-default-features --features native"; + }; + resources = deps.crane.lib.buildPackage (resourcesCommon // { + cargoArtifacts = deps.crane.lib.buildDepsOnly resourcesCommon; + + # TODO: Remove the need for this hash by using individual package resolutions and hashes from package-lock.json + npmDeps = pkgs.fetchNpmDeps { + inherit (info) pname version; + src = "${info.src}/frontend"; + hash = "sha256-UWuJpKNYj2Xn34rpMDZ75pzMYUOLQjPeGuJ/QlPbX9A="; + }; + + npmRoot = "frontend"; + npmConfigScript = "setup"; + makeCacheWritable = true; + + nativeBuildInputs = tools.frontend ++ [ pkgs.npmHooks.npmConfigHook ]; + + buildPhase = '' + export HOME="$TMPDIR" + + pushd frontend + npm run build-native${if dev then "-dev" else ""} + popd + ''; + + installPhase = '' + mkdir -p $out + cp -r frontend/dist/* $out/ + ''; + }); + common = { + inherit (info) pname version src; + strictDeps = true; + buildInputs = libs.desktop-all; + nativeBuildInputs = tools.desktop ++ [ pkgs.makeWrapper ]; + env = deps.cef.env // { + CARGO_PROFILE = if dev then "dev" else "release"; + }; + cargoExtraArgs = "-p graphite-desktop${if embeddedResources then "" else " --no-default-features --features recommended"}"; + doCheck = false; + }; +in + +deps.crane.lib.buildPackage (common // { + cargoArtifacts = deps.crane.lib.buildDepsOnly common; + + env = common.env // { + GRAPHENE_RASTER_NODES_SHADER_PATH = pkgs.graphene-raster-nodes-shaders; + } // (if embeddedResources then { + EMBEDDED_RESOURCES = resources; + } else {}); + + installPhase = '' + mkdir -p $out/bin + cp target/${if dev then "debug" else "release"}/graphite $out/bin/graphite + + mkdir -p $out/share/applications + cp $src/desktop/assets/*.desktop $out/share/applications/ + + mkdir -p $out/share/icons/hicolor/scalable/apps + cp $src/desktop/assets/graphite-icon-color.svg $out/share/icons/hicolor/scalable/apps/ + ''; + + postFixup = '' + wrapProgram "$out/bin/graphite" \ + --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}" \ + --set CEF_PATH "${deps.cef.env.CEF_PATH}" + ''; +}) diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index a45b091ac4..10143c358b 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -8,6 +8,10 @@ repository = "" edition = "2024" rust-version = "1.87" +[[bin]] +name = "graphite" +path = "src/main.rs" + [features] default = ["recommended", "embedded_resources"] recommended = ["gpu", "accelerated_paint"] diff --git a/desktop/assets/rs.graphite.GraphiteEditor.desktop b/desktop/assets/rs.graphite.GraphiteEditor.desktop index 50ee7686a6..4080cac69e 100644 --- a/desktop/assets/rs.graphite.GraphiteEditor.desktop +++ b/desktop/assets/rs.graphite.GraphiteEditor.desktop @@ -2,7 +2,7 @@ Name=Graphite GenericName=Vector & Raster Graphics Editor Comment=Open-source vector & raster graphics editor. Featuring node based procedural nondestructive editing workflow. -Exec=graphite-editor +Exec=graphite Terminal=false Type=Application Icon=graphite-icon-color diff --git a/desktop/embedded-resources/build.rs b/desktop/embedded-resources/build.rs index 899780fcaa..4275453af9 100644 --- a/desktop/embedded-resources/build.rs +++ b/desktop/embedded-resources/build.rs @@ -1,16 +1,31 @@ -const RESOURCES: &str = "../../frontend/dist"; +const EMBEDDED_RESOURCES_ENV: &str = "EMBEDDED_RESOURCES"; +const DEFAULT_RESOURCES_DIR: &str = "../../frontend/dist"; -// Check if the directory `RESOURCES` exists and sets the embedded_resources cfg accordingly -// Absolute path of `RESOURCES` available via the `EMBEDDED_RESOURCES` environment variable fn main() { - let crate_dir = std::path::PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); + let mut embedded_resources: Option = None; - println!("cargo:rerun-if-changed={RESOURCES}"); - if let Ok(resources) = crate_dir.join(RESOURCES).canonicalize() - && resources.exists() + println!("cargo:rerun-if-env-changed={EMBEDDED_RESOURCES_ENV}"); + if let Ok(embedded_resources_env) = std::env::var(EMBEDDED_RESOURCES_ENV) + && std::path::PathBuf::from(&embedded_resources_env).exists() { + embedded_resources = Some(embedded_resources_env); + } + + if embedded_resources.is_none() { + // Check if the directory `DEFAULT_RESOURCES_DIR` exists and sets the embedded_resources cfg accordingly + // Absolute path of `DEFAULT_RESOURCES_DIR` available via the `EMBEDDED_RESOURCES` environment variable + let crate_dir = std::path::PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); + println!("cargo:rerun-if-changed={DEFAULT_RESOURCES_DIR}"); + if let Ok(resources) = crate_dir.join(DEFAULT_RESOURCES_DIR).canonicalize() + && resources.exists() + { + embedded_resources = Some(resources.to_string_lossy().to_string()); + } + } + + if let Some(embedded_resources) = embedded_resources { println!("cargo:rustc-cfg=embedded_resources"); - println!("cargo:rustc-env=EMBEDDED_RESOURCES={}", resources.to_string_lossy()); + println!("cargo:rustc-env={EMBEDDED_RESOURCES_ENV}={embedded_resources}"); } else { println!("cargo:warning=Resource directory does not exist. Resources will not be embedded. Did you forget to build the frontend?"); } diff --git a/desktop/wrapper/Cargo.toml b/desktop/wrapper/Cargo.toml index 7c11fa7c68..266d2ab367 100644 --- a/desktop/wrapper/Cargo.toml +++ b/desktop/wrapper/Cargo.toml @@ -9,8 +9,7 @@ edition = "2024" rust-version = "1.87" [features] -default = ["gpu"] -gpu = ["graphite-editor/gpu"] +gpu = ["graphite-editor/gpu", "graphene-std/shader-nodes"] [dependencies] # Local dependencies From 0173aa023b4a1874db29be0b1079740b91171111 Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Fri, 14 Nov 2025 12:29:08 +0000 Subject: [PATCH 2/6] make workflow manual --- .github/workflows/build-nix-package.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-nix-package.yml b/.github/workflows/build-nix-package.yml index 21b773381f..2da86b2d34 100644 --- a/.github/workflows/build-nix-package.yml +++ b/.github/workflows/build-nix-package.yml @@ -1,8 +1,7 @@ name: Build Nix Package on: - push: - pull_request: + workflow_dispatch: {} jobs: build: From 548568a0e55f3c51c247333ce4d78055e14deed3 Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Fri, 14 Nov 2025 12:29:08 +0000 Subject: [PATCH 3/6] fixup --- .nix/dev.nix | 2 +- .nix/flake.nix | 1 - .nix/pkgs/graphene-raster-nodes-shaders.nix | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.nix/dev.nix b/.nix/dev.nix index 809fc3d838..81b6b47f14 100644 --- a/.nix/dev.nix +++ b/.nix/dev.nix @@ -1,4 +1,4 @@ -{ info, pkgs, inputs, deps, libs, tools, ... }: +{ pkgs, deps, libs, tools, ... }: pkgs.mkShell ({ packages = tools.all; diff --git a/.nix/flake.nix b/.nix/flake.nix index da86600c54..42515d5869 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -39,7 +39,6 @@ }; deps = { - rust = import ./deps/rust.nix { inherit pkgs inputs; }; crane = import ./deps/crane.nix { inherit pkgs inputs; }; cef = import ./deps/cef.nix { inherit pkgs inputs; }; rustGPU = import ./deps/rust-gpu.nix { inherit pkgs inputs; }; diff --git a/.nix/pkgs/graphene-raster-nodes-shaders.nix b/.nix/pkgs/graphene-raster-nodes-shaders.nix index 7c9ae8afa1..aa1f1889ff 100644 --- a/.nix/pkgs/graphene-raster-nodes-shaders.nix +++ b/.nix/pkgs/graphene-raster-nodes-shaders.nix @@ -1,4 +1,4 @@ -{ info, pkgs, deps, libs, tools, ... }: +{ info, pkgs, inputs, deps, libs, tools, ... }: (deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage { pname = "graphene-raster-nodes-shaders"; From c6bc876a5324c6aca22fc7f8143f3afba8f4a5df Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Fri, 14 Nov 2025 12:32:03 +0000 Subject: [PATCH 4/6] fix nix shell --- .nix/flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nix/flake.nix b/.nix/flake.nix index 42515d5869..40654aca45 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -94,7 +94,7 @@ pkgs.samply pkgs.cargo-flamegraph ]; - all = frontend ++ dev; + all = desktop ++ frontend ++ dev; }; in { From f47072c0b69045661ec99ca4bc96c8e8a73ccb36 Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Fri, 14 Nov 2025 12:43:30 +0000 Subject: [PATCH 5/6] nix fmt --- .nix/deps/cef.nix | 26 +-- .nix/deps/rust-gpu.nix | 50 +++-- .nix/dev.nix | 28 ++- .nix/flake.nix | 197 ++++++++++++-------- .nix/pkgs/graphene-raster-nodes-shaders.nix | 10 +- .nix/pkgs/graphite.nix | 118 +++++++----- .nix/shell.nix | 23 +-- libraries/path-bool/flake.nix | 24 ++- libraries/path-bool/shell.nix | 78 ++++---- 9 files changed, 334 insertions(+), 220 deletions(-) diff --git a/.nix/deps/cef.nix b/.nix/deps/cef.nix index 7632fa37df..86cc959fd4 100644 --- a/.nix/deps/cef.nix +++ b/.nix/deps/cef.nix @@ -1,12 +1,14 @@ { pkgs, inputs, ... }: let - libcef = pkgs.libcef.overrideAttrs (_: _: { - postInstall = '' - strip $out/lib/* - ''; - }); - cefPath = pkgs.runCommand "cef-path" {} '' + libcef = pkgs.libcef.overrideAttrs ( + _: _: { + postInstall = '' + strip $out/lib/* + ''; + } + ); + cefPath = pkgs.runCommand "cef-path" { } '' mkdir -p $out ln -s ${libcef}/include $out/include @@ -14,11 +16,13 @@ let find ${libcef}/libexec -type f -name "*" -exec ln -s {} $out/ \; cp -r ${libcef}/share/cef/* $out/ - echo '${builtins.toJSON { - type = "minimal"; - name = builtins.baseNameOf libcef.src.url; - sha1 = ""; - }}' > $out/archive.json + echo '${ + builtins.toJSON { + type = "minimal"; + name = builtins.baseNameOf libcef.src.url; + sha1 = ""; + } + }' > $out/archive.json ''; in { diff --git a/.nix/deps/rust-gpu.nix b/.nix/deps/rust-gpu.nix index 8dc77bdf93..2970d515a2 100644 --- a/.nix/deps/rust-gpu.nix +++ b/.nix/deps/rust-gpu.nix @@ -1,7 +1,14 @@ { pkgs, inputs, ... }: let - extensions = [ "rust-src" "rust-analyzer" "clippy" "cargo" "rustc-dev" "llvm-tools" ]; + extensions = [ + "rust-src" + "rust-analyzer" + "clippy" + "cargo" + "rustc-dev" + "llvm-tools" + ]; toolchain = pkgs.rust-bin.nightly."2025-06-23".default.override { inherit extensions; }; @@ -18,24 +25,29 @@ let exec ${toolchain}/bin/cargo ${"\${filtered_args[@]}"} ''; - rustc_codegen_spirv = (pkgs.makeRustPlatform { cargo = toolchain; rustc = toolchain; }).buildRustPackage (finalAttrs: { - pname = "rustc_codegen_spirv"; - version = "0-unstable-2025-08-04"; - src = pkgs.fetchFromGitHub { - owner = "Firestar99"; - repo = "rust-gpu-new"; - rev = "c12f216121820580731440ee79ebc7403d6ea04f"; - hash = "sha256-rG1cZvOV0vYb1dETOzzbJ0asYdE039UZImobXZfKIno="; - }; - cargoHash = "sha256-AEigcEc5wiBd3zLqWN/2HSbkfOVFneAqNvg9HsouZf4="; - cargoBuildFlags = [ - "-p" - "rustc_codegen_spirv" - "--features=use-compiled-tools" - "--no-default-features" - ]; - doCheck = false; - }); + rustc_codegen_spirv = + (pkgs.makeRustPlatform { + cargo = toolchain; + rustc = toolchain; + }).buildRustPackage + (finalAttrs: { + pname = "rustc_codegen_spirv"; + version = "0-unstable-2025-08-04"; + src = pkgs.fetchFromGitHub { + owner = "Firestar99"; + repo = "rust-gpu-new"; + rev = "c12f216121820580731440ee79ebc7403d6ea04f"; + hash = "sha256-rG1cZvOV0vYb1dETOzzbJ0asYdE039UZImobXZfKIno="; + }; + cargoHash = "sha256-AEigcEc5wiBd3zLqWN/2HSbkfOVFneAqNvg9HsouZf4="; + cargoBuildFlags = [ + "-p" + "rustc_codegen_spirv" + "--features=use-compiled-tools" + "--no-default-features" + ]; + doCheck = false; + }); in { toolchain = toolchain; diff --git a/.nix/dev.nix b/.nix/dev.nix index 81b6b47f14..c5ed0b4b78 100644 --- a/.nix/dev.nix +++ b/.nix/dev.nix @@ -1,12 +1,22 @@ -{ pkgs, deps, libs, tools, ... }: +{ + pkgs, + deps, + libs, + tools, + ... +}: -pkgs.mkShell ({ - packages = tools.all; +pkgs.mkShell ( + { + packages = tools.all; - LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}"; - XDG_DATA_DIRS = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS"; + LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}"; + XDG_DATA_DIRS = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS"; - shellHook = '' - alias cargo='mold --run cargo' - ''; -} // deps.cef.env // deps.rustGPU.env) + shellHook = '' + alias cargo='mold --run cargo' + ''; + } + // deps.cef.env + // deps.rustGPU.env +) diff --git a/.nix/flake.nix b/.nix/flake.nix index 40654aca45..a3ecfbe837 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -25,95 +25,130 @@ flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"; }; - outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: - let - info = { - pname = "graphite"; - version = "unstable"; - src = ./..; - }; + outputs = + inputs: + inputs.flake-utils.lib.eachDefaultSystem ( + system: + let + info = { + pname = "graphite"; + version = "unstable"; + src = ./..; + }; - pkgs = import inputs.nixpkgs { - inherit system; - overlays = [ (import inputs.rust-overlay) ]; - }; + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ (import inputs.rust-overlay) ]; + }; - deps = { - crane = import ./deps/crane.nix { inherit pkgs inputs; }; - cef = import ./deps/cef.nix { inherit pkgs inputs; }; - rustGPU = import ./deps/rust-gpu.nix { inherit pkgs inputs; }; - }; + deps = { + crane = import ./deps/crane.nix { inherit pkgs inputs; }; + cef = import ./deps/cef.nix { inherit pkgs inputs; }; + rustGPU = import ./deps/rust-gpu.nix { inherit pkgs inputs; }; + }; - libs = rec { - desktop = [ - pkgs.wayland - pkgs.openssl - pkgs.vulkan-loader - pkgs.libraw - pkgs.libGL - ]; - desktop-x11 = [ - pkgs.libxkbcommon - pkgs.xorg.libXcursor - pkgs.xorg.libxcb - pkgs.xorg.libX11 - ]; - desktop-all = desktop ++ desktop-x11; - }; + libs = rec { + desktop = [ + pkgs.wayland + pkgs.openssl + pkgs.vulkan-loader + pkgs.libraw + pkgs.libGL + ]; + desktop-x11 = [ + pkgs.libxkbcommon + pkgs.xorg.libXcursor + pkgs.xorg.libxcb + pkgs.xorg.libX11 + ]; + desktop-all = desktop ++ desktop-x11; + }; - tools = rec { - desktop = [ - pkgs.pkg-config - ]; - frontend = [ - pkgs.lld - pkgs.nodejs - pkgs.nodePackages.npm - pkgs.binaryen - pkgs.wasm-bindgen-cli_0_2_100 - pkgs.wasm-pack - pkgs.cargo-about - ]; - dev = [ - pkgs.rustc - pkgs.cargo - pkgs.rust-analyzer - pkgs.clippy + tools = rec { + desktop = [ + pkgs.pkg-config + ]; + frontend = [ + pkgs.lld + pkgs.nodejs + pkgs.nodePackages.npm + pkgs.binaryen + pkgs.wasm-bindgen-cli_0_2_100 + pkgs.wasm-pack + pkgs.cargo-about + ]; + dev = [ + pkgs.rustc + pkgs.cargo + pkgs.rust-analyzer + pkgs.clippy - pkgs.git + pkgs.git - pkgs.cargo-watch - pkgs.cargo-nextest - pkgs.cargo-expand + pkgs.cargo-watch + pkgs.cargo-nextest + pkgs.cargo-expand - # Linker - pkgs.mold + # Linker + pkgs.mold - # Profiling tools - pkgs.gnuplot - pkgs.samply - pkgs.cargo-flamegraph - ]; - all = desktop ++ frontend ++ dev; - }; - in - { - packages = rec { - graphiteWithArgs = args: (import ./pkgs/graphite.nix { - pkgs = pkgs // { inherit graphene-raster-nodes-shaders; }; - inherit info inputs deps libs tools; - }) args; - graphite = graphiteWithArgs { }; - graphite-dev = graphiteWithArgs { dev = true; }; - graphite-without-resources = graphiteWithArgs { embeddedResources = false; }; - graphite-without-resources-dev = graphiteWithArgs { embeddedResources = false; dev = true; }; - #TODO: graphene-cli = import ./pkgs/graphene-cli.nix { inherit info pkgs inputs deps libs tools; }; - graphene-raster-nodes-shaders = import ./pkgs/graphene-raster-nodes-shaders.nix { inherit info pkgs inputs deps libs tools; }; + # Profiling tools + pkgs.gnuplot + pkgs.samply + pkgs.cargo-flamegraph + ]; + all = desktop ++ frontend ++ dev; + }; + in + { + packages = rec { + graphiteWithArgs = + args: + (import ./pkgs/graphite.nix { + pkgs = pkgs // { + inherit graphene-raster-nodes-shaders; + }; + inherit + info + inputs + deps + libs + tools + ; + }) + args; + graphite = graphiteWithArgs { }; + graphite-dev = graphiteWithArgs { dev = true; }; + graphite-without-resources = graphiteWithArgs { embeddedResources = false; }; + graphite-without-resources-dev = graphiteWithArgs { + embeddedResources = false; + dev = true; + }; + #TODO: graphene-cli = import ./pkgs/graphene-cli.nix { inherit info pkgs inputs deps libs tools; }; + graphene-raster-nodes-shaders = import ./pkgs/graphene-raster-nodes-shaders.nix { + inherit + info + pkgs + inputs + deps + libs + tools + ; + }; - default = graphite; - }; + default = graphite; + }; - devShells.default = import ./dev.nix { inherit pkgs deps libs tools; }; - } - ); + devShells.default = import ./dev.nix { + inherit + pkgs + deps + libs + tools + ; + }; + + formatter = pkgs.nixfmt-tree; + } + ); } diff --git a/.nix/pkgs/graphene-raster-nodes-shaders.nix b/.nix/pkgs/graphene-raster-nodes-shaders.nix index aa1f1889ff..78d87f8e6e 100644 --- a/.nix/pkgs/graphene-raster-nodes-shaders.nix +++ b/.nix/pkgs/graphene-raster-nodes-shaders.nix @@ -1,4 +1,12 @@ -{ info, pkgs, inputs, deps, libs, tools, ... }: +{ + info, + pkgs, + inputs, + deps, + libs, + tools, + ... +}: (deps.crane.lib.overrideToolchain (_: deps.rustGPU.toolchain)).buildPackage { pname = "graphene-raster-nodes-shaders"; diff --git a/.nix/pkgs/graphite.nix b/.nix/pkgs/graphite.nix index a5a5e4f6dc..9159e902a4 100644 --- a/.nix/pkgs/graphite.nix +++ b/.nix/pkgs/graphite.nix @@ -1,4 +1,12 @@ -{ info, pkgs, inputs, deps, libs, tools, ... }: +{ + info, + pkgs, + inputs, + deps, + libs, + tools, + ... +}: { embeddedResources ? true, @@ -6,7 +14,7 @@ }: let - resourcesCommon = { + resourcesCommon = { pname = "${info.pname}-resources"; inherit (info) version src; strictDeps = true; @@ -15,35 +23,38 @@ let env.CARGO_PROFILE = if dev then "dev" else "release"; cargoExtraArgs = "--target wasm32-unknown-unknown -p graphite-wasm --no-default-features --features native"; }; - resources = deps.crane.lib.buildPackage (resourcesCommon // { - cargoArtifacts = deps.crane.lib.buildDepsOnly resourcesCommon; + resources = deps.crane.lib.buildPackage ( + resourcesCommon + // { + cargoArtifacts = deps.crane.lib.buildDepsOnly resourcesCommon; - # TODO: Remove the need for this hash by using individual package resolutions and hashes from package-lock.json - npmDeps = pkgs.fetchNpmDeps { - inherit (info) pname version; - src = "${info.src}/frontend"; - hash = "sha256-UWuJpKNYj2Xn34rpMDZ75pzMYUOLQjPeGuJ/QlPbX9A="; - }; + # TODO: Remove the need for this hash by using individual package resolutions and hashes from package-lock.json + npmDeps = pkgs.fetchNpmDeps { + inherit (info) pname version; + src = "${info.src}/frontend"; + hash = "sha256-UWuJpKNYj2Xn34rpMDZ75pzMYUOLQjPeGuJ/QlPbX9A="; + }; - npmRoot = "frontend"; - npmConfigScript = "setup"; - makeCacheWritable = true; + npmRoot = "frontend"; + npmConfigScript = "setup"; + makeCacheWritable = true; - nativeBuildInputs = tools.frontend ++ [ pkgs.npmHooks.npmConfigHook ]; + nativeBuildInputs = tools.frontend ++ [ pkgs.npmHooks.npmConfigHook ]; - buildPhase = '' - export HOME="$TMPDIR" + buildPhase = '' + export HOME="$TMPDIR" - pushd frontend - npm run build-native${if dev then "-dev" else ""} - popd - ''; + pushd frontend + npm run build-native${if dev then "-dev" else ""} + popd + ''; - installPhase = '' - mkdir -p $out - cp -r frontend/dist/* $out/ - ''; - }); + installPhase = '' + mkdir -p $out + cp -r frontend/dist/* $out/ + ''; + } + ); common = { inherit (info) pname version src; strictDeps = true; @@ -52,34 +63,47 @@ let env = deps.cef.env // { CARGO_PROFILE = if dev then "dev" else "release"; }; - cargoExtraArgs = "-p graphite-desktop${if embeddedResources then "" else " --no-default-features --features recommended"}"; + cargoExtraArgs = "-p graphite-desktop${ + if embeddedResources then "" else " --no-default-features --features recommended" + }"; doCheck = false; }; in -deps.crane.lib.buildPackage (common // { - cargoArtifacts = deps.crane.lib.buildDepsOnly common; +deps.crane.lib.buildPackage ( + common + // { + cargoArtifacts = deps.crane.lib.buildDepsOnly common; - env = common.env // { - GRAPHENE_RASTER_NODES_SHADER_PATH = pkgs.graphene-raster-nodes-shaders; - } // (if embeddedResources then { - EMBEDDED_RESOURCES = resources; - } else {}); + env = + common.env + // { + GRAPHENE_RASTER_NODES_SHADER_PATH = pkgs.graphene-raster-nodes-shaders; + } + // ( + if embeddedResources then + { + EMBEDDED_RESOURCES = resources; + } + else + { } + ); - installPhase = '' - mkdir -p $out/bin - cp target/${if dev then "debug" else "release"}/graphite $out/bin/graphite + installPhase = '' + mkdir -p $out/bin + cp target/${if dev then "debug" else "release"}/graphite $out/bin/graphite - mkdir -p $out/share/applications - cp $src/desktop/assets/*.desktop $out/share/applications/ + mkdir -p $out/share/applications + cp $src/desktop/assets/*.desktop $out/share/applications/ - mkdir -p $out/share/icons/hicolor/scalable/apps - cp $src/desktop/assets/graphite-icon-color.svg $out/share/icons/hicolor/scalable/apps/ - ''; + mkdir -p $out/share/icons/hicolor/scalable/apps + cp $src/desktop/assets/graphite-icon-color.svg $out/share/icons/hicolor/scalable/apps/ + ''; - postFixup = '' - wrapProgram "$out/bin/graphite" \ - --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}" \ - --set CEF_PATH "${deps.cef.env.CEF_PATH}" - ''; -}) + postFixup = '' + wrapProgram "$out/bin/graphite" \ + --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}" \ + --set CEF_PATH "${deps.cef.env.CEF_PATH}" + ''; + } +) diff --git a/.nix/shell.nix b/.nix/shell.nix index 17dae9531b..5b13af2e20 100644 --- a/.nix/shell.nix +++ b/.nix/shell.nix @@ -16,16 +16,13 @@ # > nix-shell .nix --command "npm start" # Uses flake compat to provide a development shell that is identical to the one defined in the flake -(import - ( - let - lock = builtins.fromJSON (builtins.readFile ./flake.lock); - nodeName = lock.nodes.root.inputs.flake-compat; - in - fetchTarball { - url = lock.nodes.${nodeName}.locked.url; - sha256 = lock.nodes.${nodeName}.locked.narHash; - } - ) - { src = ./.; } -).shellNix +(import ( + let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + nodeName = lock.nodes.root.inputs.flake-compat; + in + fetchTarball { + url = lock.nodes.${nodeName}.locked.url; + sha256 = lock.nodes.${nodeName}.locked.narHash; + } +) { src = ./.; }).shellNix diff --git a/libraries/path-bool/flake.nix b/libraries/path-bool/flake.nix index a9056e3ec6..b15637b3f5 100644 --- a/libraries/path-bool/flake.nix +++ b/libraries/path-bool/flake.nix @@ -11,20 +11,32 @@ }; }; - outputs = {self, nixpkgs, flake-utils, rust-overlay }: - flake-utils.lib.eachDefaultSystem ( system: + outputs = + { + self, + nixpkgs, + flake-utils, + rust-overlay, + }: + flake-utils.lib.eachDefaultSystem ( + system: let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; toolchain = pkgs.rust-bin.stable.latest.default.override { - extensions = ["rust-src" "clippy" "rust-analyzer"]; + extensions = [ + "rust-src" + "clippy" + "rust-analyzer" + ]; }; buildInputs = with pkgs; [ - llvm + llvm ]; - in { + in + { devShells.default = pkgs.mkShell { stdenv = pkgs.clangStdenv; packages = with pkgs; [ @@ -40,7 +52,7 @@ cargo ]; inherit buildInputs; - + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; }; } diff --git a/libraries/path-bool/shell.nix b/libraries/path-bool/shell.nix index 08980c1f09..1cc9cf74d8 100644 --- a/libraries/path-bool/shell.nix +++ b/libraries/path-bool/shell.nix @@ -33,42 +33,54 @@ let rustc-wasm = pkgs.rust-bin.stable.latest.default.override { targets = [ "wasm32-unknown-unknown" ]; # wasm-pack needs this - extensions = [ "rust-src" "rust-analyzer" "clippy"]; + extensions = [ + "rust-src" + "rust-analyzer" + "clippy" + ]; }; in - # Make a shell with the dependencies we need - pkgs.mkShell { - packages = with pkgs; [ - rustc-wasm - nodejs - cargo - cargo-watch - cargo-nextest - cargo-expand - wasm-pack - binaryen - wasm-bindgen-cli - vulkan-loader - libxkbcommon - llvm - gcc-unwrapped.lib - llvmPackages.libcxxStdenv - pkg-config - # used for profiling - gnuplot - samply - cargo-flamegraph +# Make a shell with the dependencies we need +pkgs.mkShell { + packages = with pkgs; [ + rustc-wasm + nodejs + cargo + cargo-watch + cargo-nextest + cargo-expand + wasm-pack + binaryen + wasm-bindgen-cli + vulkan-loader + libxkbcommon + llvm + gcc-unwrapped.lib + llvmPackages.libcxxStdenv + pkg-config + # used for profiling + gnuplot + samply + cargo-flamegraph - # For Rawkit tests - libraw + # For Rawkit tests + libraw - # Use Mold as a linker - mold - ]; + # Use Mold as a linker + mold + ]; - # Hacky way to run Cargo through Mold - LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [pkgs.openssl pkgs.vulkan-loader pkgs.libxkbcommon pkgs.llvmPackages.libcxxStdenv pkgs.gcc-unwrapped.lib pkgs.llvm pkgs.libraw]; - shellHook = '' + # Hacky way to run Cargo through Mold + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ + pkgs.openssl + pkgs.vulkan-loader + pkgs.libxkbcommon + pkgs.llvmPackages.libcxxStdenv + pkgs.gcc-unwrapped.lib + pkgs.llvm + pkgs.libraw + ]; + shellHook = '' alias cargo='mold --run cargo' - ''; - } + ''; +} From 3d80f306c133f9effcd1ed2a7b96608afc23532c Mon Sep 17 00:00:00 2001 From: Timon Schelling Date: Sun, 16 Nov 2025 13:19:21 +0000 Subject: [PATCH 6/6] fix shell --- .nix/dev.nix | 4 ++-- .nix/flake.nix | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.nix/dev.nix b/.nix/dev.nix index c5ed0b4b78..d80d7793e6 100644 --- a/.nix/dev.nix +++ b/.nix/dev.nix @@ -8,9 +8,9 @@ pkgs.mkShell ( { - packages = tools.all; + packages = tools.all ++ libs.all; - LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs.desktop-all}:${deps.cef.env.CEF_PATH}"; + LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath libs.all}:${deps.cef.env.CEF_PATH}"; XDG_DATA_DIRS = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS"; shellHook = '' diff --git a/.nix/flake.nix b/.nix/flake.nix index a3ecfbe837..7779f586f2 100644 --- a/.nix/flake.nix +++ b/.nix/flake.nix @@ -62,6 +62,7 @@ pkgs.xorg.libX11 ]; desktop-all = desktop ++ desktop-x11; + all = desktop-all; }; tools = rec {