Skip to content

Conversation

PassiveLemon
Copy link
Contributor

@PassiveLemon PassiveLemon commented Jun 3, 2024

Description of changes

Adds WiVRn #278126 (comment)

Continuation of #299830 because I goofed.

Things done

  • Built on platform(s)
    • x86_64-linux
    • aarch64-linux
    • x86_64-darwin
    • aarch64-darwin
  • For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)
    • sandbox = relaxed
    • sandbox = true
  • Tested, as applicable:
  • Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
  • Tested basic functionality of all binary files (usually in ./result/bin/)
  • 24.11 Release Notes (or backporting 23.11 and 24.05 Release notes)
    • (Package updates) Added a release notes entry if the change is major or breaking
    • (Module updates) Added a release notes entry if the change is significant
    • (Module addition) Added a release notes entry if adding a new NixOS module
  • Fits CONTRIBUTING.md.

Add a 👍 reaction to pull requests you find important.

@github-actions github-actions bot added 6.topic: nixos Issues or PRs affecting NixOS modules, or package usability issues specific to NixOS 8.has: documentation This PR adds or changes documentation 8.has: changelog This PR adds or changes release notes 8.has: module (update) This PR changes an existing module in `nixos/` labels Jun 3, 2024
@PassiveLemon
Copy link
Contributor Author

@ckiee

This comment was marked as off-topic.

@Pandapip1 Pandapip1 added the 12.approvals: 1 This PR was reviewed and approved by one person. label Jun 3, 2024
@Scrumplex

This comment was marked as outdated.

@Pandapip1

This comment was marked as spam.

@PassiveLemon
Copy link
Contributor Author

From what Ofborg says, it looks like the monado CMake feature is involved but I don't really know why it fails. It builds on my system and it built in the other PR before

@Scrumplex
Copy link
Member

I think it just can't build the monado derivation currently because of the downtime of FDO GitLab

@Scrumplex
Copy link
Member

Scrumplex commented Jun 4, 2024

I have refactored the derivation a little, utilizing finalAttrs and moving the sources into the derivation itself, so overriding is much easier.

From 49cf6b5a420e347c1edcfc18f7e9787091fc1434 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <[email protected]>
Date: Tue, 4 Jun 2024 23:23:01 +0200
Subject: [PATCH] wivrn: refactor derivation

Signed-off-by: Sefa Eyeoglu <[email protected]>
---
 pkgs/by-name/wi/wivrn/package.nix | 59 ++++++++++++++-----------------
 1 file changed, 26 insertions(+), 33 deletions(-)

diff --git a/pkgs/by-name/wi/wivrn/package.nix b/pkgs/by-name/wi/wivrn/package.nix
index 67ec086ab758..81c798ee8b6b 100644
--- a/pkgs/by-name/wi/wivrn/package.nix
+++ b/pkgs/by-name/wi/wivrn/package.nix
@@ -3,7 +3,7 @@
 , stdenv
 , fetchFromGitHub
 , fetchFromGitLab
-, fetchpatch
+, applyPatches
 , avahi
 , boost
 , cmake
@@ -38,55 +38,36 @@
 , vulkan-tools
 , x264
 }:
-let
-  wivrnVersion = "0.15";
+stdenv.mkDerivation (finalAttrs: {
+  pname = "wivrn";
+  version = "0.15";
 
-  wivrnSrc = fetchFromGitHub {
+  src = fetchFromGitHub {
     owner = "meumeu";
     repo = "wivrn";
-    rev = "v${wivrnVersion}";
+    rev = "v${finalAttrs.version}";
     hash = "sha256-RVRbL9hqy9pMKjvzwaP+9HGEfdpAhmlnnvqZsEGxlCw=";
   };
 
-  monadoVersion = builtins.head (builtins.elemAt (builtins.split
-    "monado\n +GIT_TAG +([A-Za-z0-9]+)"
-    (builtins.readFile (wivrnSrc + "/CMakeLists.txt"))
-  ) 1);
-
-  monado = stdenv.mkDerivation {
-    pname = "monado";
-    version = monadoVersion;
-
+  monadoSrc = applyPatches {
     src = fetchFromGitLab {
       domain = "gitlab.freedesktop.org";
       owner = "monado";
       repo = "monado";
-      rev = monadoVersion;
+      rev = "ffb71af26f8349952f5f820c268ee4774613e200";
       hash = "sha256-+RTHS9ShicuzhiAVAXf38V6k4SVr+Bc2xUjpRWZoB0c=";
     };
 
     patches = [
-      (wivrnSrc + "/patches/monado/0001-c-multi-disable-dropping-of-old-frames.patch")
-      (wivrnSrc + "/patches/monado/0002-ipc-server-Always-listen-to-stdin.patch")
-      (wivrnSrc + "/patches/monado/0003-c-multi-Don-t-log-frame-time-diff.patch")
+      ("${finalAttrs.src}/patches/monado/0001-c-multi-disable-dropping-of-old-frames.patch")
+      ("${finalAttrs.src}/patches/monado/0002-ipc-server-Always-listen-to-stdin.patch")
+      ("${finalAttrs.src}/patches/monado/0003-c-multi-Don-t-log-frame-time-diff.patch")
     ];
 
     postPatch = ''
       substituteInPlace CMakeLists.txt --replace "add_subdirectory(doc)" ""
     '';
-
-    dontBuild = true;
-
-    installPhase = ''
-      cp -r . $out
-    '';
   };
-in
-stdenv.mkDerivation {
-  pname = "wivrn";
-  version = wivrnVersion;
-
-  src = wivrnSrc;
 
   nativeBuildInputs = [
     cmake
@@ -128,6 +109,18 @@ stdenv.mkDerivation {
     cudaPackages.cudatoolkit
   ];
 
+  postUnpack = ''
+    # Let's make sure our monado source revision matches what is used by WiVRn upstream
+    ourMonadoRev="${finalAttrs.monadoSrc.src.rev}"
+    theirMonadoRev=$(grep -A1 "https://gitlab.freedesktop.org/monado/monado" ${finalAttrs.src.name}/CMakeLists.txt | tail -n1 | sed 's/.*GIT_TAG\s*//')
+    if [ ! "$theirMonadoRev" == "$ourMonadoRev" ]; then
+      echo "Our Monado source revision doesn't match CMakeLists.txt." >&2
+      echo "  theirs: $theirMonadoRev" >&2
+      echo "    ours: $ourMonadoRev" >&2
+      return 1
+    fi
+  '';
+
   cmakeFlags = [
     (lib.cmakeBool "WIVRN_USE_VAAPI" true)
     (lib.cmakeBool "WIVRN_USE_X264" true)
@@ -138,7 +131,7 @@ stdenv.mkDerivation {
     (lib.cmakeBool "WIVRN_BUILD_CLIENT" false)
     (lib.cmakeBool "WIVRN_OPENXR_INSTALL_ABSOLUTE_RUNTIME_PATH" true)
     (lib.cmakeBool "FETCHCONTENT_FULLY_DISCONNECTED" true)
-    (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_MONADO" "${monado}")
+    (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_MONADO" "${finalAttrs.monadoSrc}")
   ];
 
   passthru.updateScript = nix-update-script { };
@@ -146,10 +139,10 @@ stdenv.mkDerivation {
   meta = with lib; {
     description = "An OpenXR streaming application to a standalone headset";
     homepage = "https://github.com/Meumeu/WiVRn/";
-    changelog = "https://github.com/Meumeu/WiVRn/releases/tag/v${wivrnVersion}";
+    changelog = "https://github.com/Meumeu/WiVRn/releases/tag/v${finalAttrs.version}";
     license = licenses.gpl3Only;
     maintainers = with maintainers; [ passivelemon ];
     platforms = platforms.linux;
     mainProgram = "wivrn-server";
   };
-}
+})
-- 
2.44.1

@Pandapip1
Copy link
Member

Actually, might it make sense to patch wivrn to use the latest version of monado instead?

@xytovl
Copy link

xytovl commented Jun 5, 2024

Actually, might it make sense to patch wivrn to use the latest version of monado instead?

I do not recommend it, updating monado often requires changes in WiVRn itself, see latest updates on dev branch:
Meumeu/WiVRn@27235d3
Meumeu/WiVRn@eaf6efd
Meumeu/WiVRn@41044fe (which didn't require any change).

You may backport those changes if you wish, but you may not always have a compatible version.

@PassiveLemon
Copy link
Contributor Author

I believe it currently is best to target the official releases rather than backporting changes. I like the idea case of checking if the versions match so if WiVRn is automatically updated but the Monado source isn't, a broken package isn't released.

@PassiveLemon
Copy link
Contributor Author

Also I think it would be of interest to add WiVRn configuration to the module as well. It's in json so there's probably some parts of other modules I can use to get that working. I'll probably look into it tomorrow.

@Pandapip1
Copy link
Member

Fair enough. Is it possible to have an update script update something other than the derivation's src?

@ofborg ofborg bot added 8.has: package (new) This PR adds a new package 11.by: package-maintainer This PR was created by a maintainer of all the package it changes. 10.rebuild-darwin: 0 This PR does not cause any packages to rebuild on Darwin. 10.rebuild-linux: 1-10 This PR causes between 1 and 10 packages to rebuild on Linux. labels Jun 6, 2024
@PassiveLemon
Copy link
Contributor Author

Config file doesn't appear to be that hard to implement, however it's loaded from the users config dir by default and I don't think there's a flag to specify a config file to load. Not sure how this could be done otherwise. Maybe a suggestion for upstream.

@wegank wegank removed the 12.approvals: 1 This PR was reviewed and approved by one person. label Jun 7, 2024
@nixos-discourse
Copy link

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/prs-already-reviewed/2617/2049

@tomodachi94
Copy link
Member

Sorry for the wait! Changes look good. It looks like a few of the reviewers have a lot of experience with modules, so I'm making the assumption that they caught most potential problems with this module.

@tomodachi94 tomodachi94 merged commit d249539 into NixOS:master Oct 20, 2024
33 of 35 checks passed
@Titaniumtown
Copy link
Contributor

@PassiveLemon Thanks for your hard work getting this working. I've fully moved off of ALVR now in favor of WiVRn, and I'm loving it.

@NovaViper
Copy link
Contributor

Can't wait to give this a try! Is anyone aware if WiVRn can be used with SteamVR and the Quest 2?

@Titaniumtown
Copy link
Contributor

@Titaniumtown
Copy link
Contributor

But you actually ditch SteamVR entirely with WiVRn. You launch the game from the desktop then put on the headset :p

@NovaViper
Copy link
Contributor

@NovaViper I just wrote docs on it! https://wiki.nixos.org/wiki/VR#WiVRn

Here's how i implemented it:

https://git.gardling.com/titaniumtown/dotfiles/src/commit/4e4f69484f68277cded571bac0daf7142c3bd6b3/home-manager/system-nixos.nix#L31

and

https://git.gardling.com/titaniumtown/dotfiles/src/commit/4e4f69484f68277cded571bac0daf7142c3bd6b3/etcnixos/vr.nix

Hope that helps!

Thank you! Will take a look at this in the morning!

@Titaniumtown
Copy link
Contributor

Happy to help. Feel free to ping me on the matrix or here if you have any questions!

@NovaViper
Copy link
Contributor

But you actually ditch SteamVR entirely with WiVRn. You launch the game from the desktop then put on the headset :p

🤔 I wonder if that would work with Beat Saber and VRChat (in particular Beat Saber because it's a bit hectic to get running because of its recently added OpenXR dependency). Hopefully I can get the NVEC stuff working (is actually what's currently holding up the current nixpkgs PR for the latest version for ALVR).

@Titaniumtown
Copy link
Contributor

Titaniumtown commented Oct 20, 2024

I can confirm it works with Beat Saber! It was the first game I tested.

Compared to ALVR. I get way better visual fidelity on my Quest 2. ALVR always seemed a bit blurry and weird no matter how much i tweaked it.

Only downside over WiVRn is that you don't get all of the Steam niceties like launching your games from VR, because that's all SteamVR stuff. I guess you could use wlx-overlay-s and use Steam from there though haha.

@LuNeder
Copy link
Contributor

LuNeder commented Oct 20, 2024

Only downside over WiVRn is that you don't get all of the Steam niceties like launching your games from VR

I think you might be able to use StardustXR for that

@PassiveLemon PassiveLemon deleted the wivrn-init branch October 20, 2024 15:04
@NovaViper
Copy link
Contributor

@Titaniumtown Hey sorry for the lengthy delay in my reply! I finally got around to installing it but I can't figure out how to get the games to launch.. Beat Saber oddly crashes WiVRn with Segmentation Fault errors and VRChat just screams at me that it couldn't initialize EasyAntiCheat 😭

@PassiveLemon
Copy link
Contributor Author

If you have an Nvidia GPU, make sure you have the monado-vulkan-layers (it's in unstable) installed in opengl.extraPackages, that's probably what is causing the segfault. As for VRC, some race condition results in EAC getting angry lol. You can reduce the chances by limiting VRC to a couple cores on start but you may just have to relaunch until it works.

@NovaViper
Copy link
Contributor

NovaViper commented Nov 11, 2024

Hey thanks @PassiveLemon! Adding monado-vulkan-layers to the hardware.graphics.extraPackages made it actually stop segfaulting! I hadn't been able to get VRChat working, I can get it to go past the EAC issues but then it just immedately closes with GLib-GObject-CRITICAL **: 00:44:54.893: g_object_unref: assertion 'G_IS_OBJECT (object)' failed in the journal 😭
Ah I found out I had to unset SDL_VIDEODRIVER, and that made EAC not scream anymore and VRChat now works and runs fine!

I'm also looking at setting up StardustXR, is there currently anyway to set it up in NixOS along with WiVRn?

@Pandapip1
Copy link
Member

Pandapip1 commented Nov 11, 2024

is there currently anyway to set it up in NixOS along with WiVRn?

Theoretically, all you need to do is install stardust-xr-server, run it, and install and run stardust-xr-protostar (once it lands in unstable).

I hadn't had much luck with getting stardust to work back when I had a headset to test with. I don't currently have access to a working headset, which makes testing significantly harder, so bug reports are very welcome.

@NovaViper
Copy link
Contributor

@Pandapip1 I gave it a try and uh.... it immediately crashes with my system 😅 . It tries to connect to WiVRn but then immediately disconnects and spams this in the terminal (completely floods it actually!):

ERROR [ipc_send] sendmsg(136) failed: '32' 'Broken pipe'!
ERROR [ipc_client_session_poll_events] ipc_call_session_poll_events failed: XRT_ERROR_IPC_FAILURE [/nix/store/BFF96Z4FKNP9SY4RK6JN084IPWD8QYK4-source-patched/src/xrt/ipc/client/ipc_client_session.c:56]
XR_ERROR_INSTANCE_LOST in xrPollEvent: Call to "xrt_session_poll_events" failed
XR_ERROR_SESSION_LOST in xrSyncActions: Session is lost
XR_ERROR_SESSION_LOST in xrLocateSpace: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStatePose: Session is lost
XR_ERROR_SESSION_LOST in xrLocateSpace: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStatePose: Session is lost
XR_ERROR_SESSION_LOST in xrLocateSpace: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStatePose: Session is lost
XR_ERROR_SESSION_LOST in xrLocateSpace: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStatePose: Session is lost
XR_ERROR_SESSION_LOST in xrLocateSpace: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateFloat: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrGetActionStateBoolean: Session is lost
XR_ERROR_SESSION_LOST in xrLocateHandJointsEXT: Session is lost
XR_ERROR_SESSION_LOST in xrLocateHandJointsEXT: Session is lost

And the only way to kill the process is by running killall stardust-xr-server -9v

@Pandapip1
Copy link
Member

From the StardustXR discord:

image

@technobaboo
Copy link

btw for stardust you should run the flake at https://github.com/StardustXR/telescope because that has a full stardust setup for you ready to go :)

@NovaViper
Copy link
Contributor

@technobaboo Hey does the telescope flake work with the systemd service that the wivrn module creates?

@technobaboo
Copy link

technobaboo commented Nov 14, 2024

uhhhhhhhhhhhh i have no idea, you can easily launch the executable though?

for reference i'm an XR UX designer/dev who made stardust but packaging it and such has been a total nightmare, i'm not really the best person to answer these type of questions (especially about nix) but i do know how stardust is put together. I'm genuinely considering switching off of stereokit for stardust to avoid the headache that comes along with a c++ dependency in a rust project which might just clear up all the graphics issues as bevy uses vulkan under the hood via wgpu.

@NovaViper
Copy link
Contributor

NovaViper commented Nov 14, 2024

Uh... it dies still even with telescope 👀

❯ nix run github:StardustXR/telescope
[SK info] Before init >>>
libEGL warning: egl: failed to create dri2 screen
LOG in xrCreateInstance: Instance created
        createInfo->applicationInfo.applicationName: Stardust XR
        createInfo->applicationInfo.applicationVersion: 1
        createInfo->applicationInfo.engineName: StereoKit
        createInfo->applicationInfo.engineVersion: 16384
        createInfo->applicationInfo.apiVersion: 1.1.38
        appinfo.detected.engine.name: (null)
        appinfo.detected.engine.version: 0.0.0
        quirks.disable_vulkan_format_depth_stencil: false
        quirks.no_validation_error_in_create_ref_space: true
        quirks.skip_end_session: false
        quirks.parallel_views: false

LOG in xrCreateInstance: Selected devices
        Head: 'WiVRn HMD'
        Eyes: '<none>'
        Left: 'WiVRn HMD left hand controller'
        Right: 'WiVRn HMD right hand controller'
        Gamepad: '<none>'
        Hand-Tracking Left: 'WiVRn HMD left hand controller'
        Hand-Tracking Right: 'WiVRn HMD right hand controller'
ERROR [ipc_compositor_get_reference_bounds_rect] ipc_call_compositor_get_reference_bounds_rect failed: XRT_ERROR_NOT_IMPLEMENTED [/nix/store/BFF96Z4FKNP9SY4RK6JN084IPWD8QYK4-source-patched/src/xrt/ipc/client/ipc_client_compositor.c:868]
ERROR [ipc_compositor_get_reference_bounds_rect] ipc_call_compositor_get_reference_bounds_rect failed: XRT_ERROR_NOT_IMPLEMENTED [/nix/store/BFF96Z4FKNP9SY4RK6JN084IPWD8QYK4-source-patched/src/xrt/ipc/client/ipc_client_compositor.c:868]
xkbcommon: ERROR: Unrecognized RMLVO option "terminate:ctrl_alt_bksp" was ignored
xkbcommon: ERROR: Unrecognized RMLVO option "caps:ctrl_modifier" was ignored
[src/main.rs:27:13] Args::parse() = Args {
    x: 0.0,
    y: 0.0,
    z: -0.5,
    yaw: None,
    command: [
        "hexagon_launcher",
    ],
}
Setting connection env var STARDUST_INSTANCE to stardust-0
Setting connection env var QT_QPA_PLATFORM to wayland
Setting connection env var SDL_VIDEODRIVER to wayland
Setting connection env var GDK_BACKEND to wayland
Setting connection env var MOZ_ENABLE_WAYLAND to 1
Setting connection env var WAYLAND_DISPLAY to wayland-1
Setting connection env var FLAT_WAYLAND_DISPLAY to wayland-0
Setting connection env var CLUTTER_BACKEND to wayland
Io error: Connection reset by peer (os error 104)
thread 'main' panicked at /build/source/src/server/mod.rs:713:39:
called `Result::unwrap()` on an `Err` value: Io(Os { code: 104, kind: ConnectionReset, message: "Connection reset by peer" })
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Error: IO Error: Connection reset by peer (os error 104)

Location:
    src/main.rs:44:27
The application panicked (crashed).
Message:  called `Result::unwrap()` on an `Err` value: MessengerError { e: ReceiverDropped }
Location: hexagon_launcher/src/main.rs:47

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.
 2024-11-14T17:17:22.918Z INFO  xwayland_process > (EE) could not connect to wayland server
thread 'main' panicked at src/flatland.rs:43:37:
called `Option::unwrap()` on a `None` value
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
/nix/store/g0455djm5pz6vb6zik744blzpaw6vi76-telescope/bin/telescope: line 8: 1536969 Segmentation fault      (core dumped) stardust-xr-server -d -o 1 -e "/nix/store/yvlc4yl3dhq1na7hv9qsykawsh48lacs-startup_script/bin/startup_script" "$@"

Log for wivrn from journalctl (I put it in a file because it's really long) wivrn-with-telescope.log

@technobaboo
Copy link

technobaboo commented Nov 14, 2024

what in the world is going on here, it looks like literally nothing can connect via unix domain sockets somehow? is this in a sandbox?

@LuNeder
Copy link
Contributor

LuNeder commented Nov 14, 2024

what in the world is going on here, it looks like literally nothing can connect via unix domain sockets somehow? is this in a sandbox?

The systemd service is hardened, that might be related

            # Hardening options
            CapabilityBoundingSet = [ "CAP_SYS_NICE" ];
            AmbientCapabilities = [ "CAP_SYS_NICE" ];
            LockPersonality = true;
            NoNewPrivileges = true;
            PrivateTmp = true;
            ProtectClock = true;
            ProtectControlGroups = true;
            ProtectKernelLogs = true;
            ProtectKernelModules = true;
            ProtectKernelTunables = true;
            ProtectProc = "invisible";
            ProtectSystem = "strict";
            RemoveIPC = true;
            RestrictNamespaces = true;
            RestrictSUIDSGID = true;

@technobaboo
Copy link

yeah idk, the files are all in $XDG_RUNTIME_DIR so if that's affected that'd be why this is all catastrophically failing

@NovaViper
Copy link
Contributor

Is there a way to fix it on my end? I wonder if there needs to be a module made available on NixOS to make it function properly with the wivrn NixOS module 🤔

@technobaboo
Copy link

i honestly have no clue what's happening here, the way stardust works is that the server creates a unix domain socket at $XDG_RUNTIME_DIR/stardust-0 and $XDG_RUNTIME_DIR/wayland-<lowest free number> and monado/wivrn make $XDG_RUNTIME_DIR/monado_comp_ipc there and then the stardust clients, wayland apps, openxr runtime libraries, etc. connect to those and send messages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
6.topic: nixos Issues or PRs affecting NixOS modules, or package usability issues specific to NixOS 8.has: changelog This PR adds or changes release notes 8.has: documentation This PR adds or changes documentation 8.has: module (new) This PR adds a module in `nixos/` 8.has: module (update) This PR changes an existing module in `nixos/` 8.has: package (new) This PR adds a new package 10.rebuild-darwin: 0 This PR does not cause any packages to rebuild on Darwin. 10.rebuild-linux: 1-10 This PR causes between 1 and 10 packages to rebuild on Linux. 11.by: package-maintainer This PR was created by a maintainer of all the package it changes. 12.approvals: 3+ This PR was reviewed and approved by three or more persons.
Projects
None yet
Development

Successfully merging this pull request may close these issues.