From b57aa88291910689aeaa83ff40dd02c50ab8199b Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Sun, 19 May 2024 17:27:59 +1200 Subject: [PATCH 1/3] libXNVCtrl: build shared library The libXNVCtrl library is used by several programs in nixpkgs to get Nvidia GPU stats, and they all load the library dynamically, but the libXNVCtrl package only builds a static library. There is no build flag to enable this, so we have to patch the Makefile to produce a shared library. Based on a patch by @negativo17 for Fedora. https://github.com/negativo17/nvidia-settings/blob/master/nvidia-settings-libXNVCtrl.patch --- .../libxnvctrl-build-shared-3xx.patch | 24 +++++++++++++++++++ .../nvidia-x11/libxnvctrl-build-shared.patch | 21 ++++++++++++++++ .../os-specific/linux/nvidia-x11/settings.nix | 9 +++++++ 3 files changed, 54 insertions(+) create mode 100644 pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared-3xx.patch create mode 100644 pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared.patch diff --git a/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared-3xx.patch b/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared-3xx.patch new file mode 100644 index 000000000000..d2e074add754 --- /dev/null +++ b/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared-3xx.patch @@ -0,0 +1,24 @@ +--- a/src/libXNVCtrl/Makefile ++++ b/src/libXNVCtrl/Makefile +@@ -33,6 +33,8 @@ + + LIBXNVCTRL = libXNVCtrl.a + ++LIBXNVCTRL_SHARED = $(OUTPUTDIR)/libXNVCtrl.so ++ + LIBXNVCTRL_PROGRAM_NAME = "libXNVCtrl" + + LIBXNVCTRL_VERSION := $(NVIDIA_VERSION) +@@ -62,6 +64,12 @@ + $(LIBXNVCTRL) : $(OBJS) + $(AR) ru $@ $(OBJS) + ++$(LIBXNVCTRL_SHARED): $(LIBXNVCTRL_OBJ) ++ $(RM) $@ $@.* ++ $(CC) -shared -Wl,-soname=$(@F).0 -o $@.0.0.0 $(LDFLAGS) $^ -lXext -lX11 ++ ln -s $(@F).0.0.0 $@.0 ++ ln -s $(@F).0 $@ ++ + # define the rule to build each object file + $(foreach src,$(SRC),$(eval $(call DEFINE_OBJECT_RULE,TARGET,$(src)))) + diff --git a/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared.patch b/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared.patch new file mode 100644 index 000000000000..ad1dc1eae400 --- /dev/null +++ b/pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared.patch @@ -0,0 +1,21 @@ +--- a/src/libXNVCtrl/xnvctrl.mk ++++ b/src/libXNVCtrl/xnvctrl.mk +@@ -39,6 +39,8 @@ + + LIBXNVCTRL = $(OUTPUTDIR)/libXNVCtrl.a + ++LIBXNVCTRL_SHARED = $(OUTPUTDIR)/libXNVCtrl.so ++ + LIBXNVCTRL_SRC = $(XNVCTRL_DIR)/NVCtrl.c + + LIBXNVCTRL_OBJ = $(call BUILD_OBJECT_LIST,$(LIBXNVCTRL_SRC)) +@@ -47,3 +49,9 @@ + + $(LIBXNVCTRL) : $(LIBXNVCTRL_OBJ) + $(call quiet_cmd,AR) ru $@ $(LIBXNVCTRL_OBJ) ++ ++$(LIBXNVCTRL_SHARED): $(LIBXNVCTRL_OBJ) ++ $(RM) $@ $@.* ++ $(CC) -shared -Wl,-soname=$(@F).0 -o $@.0.0.0 $(LDFLAGS) $^ -lXext -lX11 ++ ln -s $(@F).0.0.0 $@.0 ++ ln -s $(@F).0 $@ diff --git a/pkgs/os-specific/linux/nvidia-x11/settings.nix b/pkgs/os-specific/linux/nvidia-x11/settings.nix index 2d9dfd81829e..0df0989c123d 100644 --- a/pkgs/os-specific/linux/nvidia-x11/settings.nix +++ b/pkgs/os-specific/linux/nvidia-x11/settings.nix @@ -43,6 +43,14 @@ let makeFlags = [ "OUTPUTDIR=." # src/libXNVCtrl + "libXNVCtrl.a" + "libXNVCtrl.so" + ]; + + patches = [ + # Patch the Makefile to also produce a shared library. + (if lib.versionOlder nvidia_x11.settingsVersion "400" then ./libxnvctrl-build-shared-3xx.patch + else ./libxnvctrl-build-shared.patch) ]; installPhase = '' @@ -52,6 +60,7 @@ let cp libXNVCtrl.a $out/lib cp NVCtrl.h $out/include/NVCtrl cp NVCtrlLib.h $out/include/NVCtrl + cp -P libXNVCtrl.so* $out/lib ''; }; From 4e353b67f667766b1c6489f23c20b920ab0c82f5 Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Sun, 19 May 2024 18:00:51 +1200 Subject: [PATCH 2/3] nixos/nvidia: make libXNVCtrl available on nvidia systems --- nixos/modules/hardware/video/nvidia.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/modules/hardware/video/nvidia.nix b/nixos/modules/hardware/video/nvidia.nix index 3caec769400c..949b1e346269 100644 --- a/nixos/modules/hardware/video/nvidia.nix +++ b/nixos/modules/hardware/video/nvidia.nix @@ -285,7 +285,7 @@ in KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 1'" ''; hardware.opengl = { - extraPackages = [ nvidia_x11.out ]; + extraPackages = [ nvidia_x11.out nvidia_x11.settings.libXNVCtrl ]; extraPackages32 = [ nvidia_x11.lib32 ]; }; environment.systemPackages = [ nvidia_x11.bin ]; From e8c66dc41dd95c70718ba9f5ab34e9ebe23e49c4 Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Mon, 20 May 2024 06:57:07 +1200 Subject: [PATCH 3/3] nvidia-settings: add aidalgol as maintainer --- pkgs/os-specific/linux/nvidia-x11/settings.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/os-specific/linux/nvidia-x11/settings.nix b/pkgs/os-specific/linux/nvidia-x11/settings.nix index 0df0989c123d..e13f3a157b64 100644 --- a/pkgs/os-specific/linux/nvidia-x11/settings.nix +++ b/pkgs/os-specific/linux/nvidia-x11/settings.nix @@ -147,6 +147,6 @@ stdenv.mkDerivation { license = licenses.unfreeRedistributable; platforms = nvidia_x11.meta.platforms; mainProgram = "nvidia-settings"; - maintainers = with maintainers; [ abbradar ]; + maintainers = with maintainers; [ abbradar aidalgol ]; }; }