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 ]; 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..e13f3a157b64 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 ''; }; @@ -138,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 ]; }; }