From b57aa88291910689aeaa83ff40dd02c50ab8199b Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Sun, 19 May 2024 17:27:59 +1200 Subject: [PATCH] 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 ''; };