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

+54
+24
pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared-3xx.patch
···
··· 1 + --- a/src/libXNVCtrl/Makefile 2 + +++ b/src/libXNVCtrl/Makefile 3 + @@ -33,6 +33,8 @@ 4 + 5 + LIBXNVCTRL = libXNVCtrl.a 6 + 7 + +LIBXNVCTRL_SHARED = $(OUTPUTDIR)/libXNVCtrl.so 8 + + 9 + LIBXNVCTRL_PROGRAM_NAME = "libXNVCtrl" 10 + 11 + LIBXNVCTRL_VERSION := $(NVIDIA_VERSION) 12 + @@ -62,6 +64,12 @@ 13 + $(LIBXNVCTRL) : $(OBJS) 14 + $(AR) ru $@ $(OBJS) 15 + 16 + +$(LIBXNVCTRL_SHARED): $(LIBXNVCTRL_OBJ) 17 + + $(RM) $@ $@.* 18 + + $(CC) -shared -Wl,-soname=$(@F).0 -o $@.0.0.0 $(LDFLAGS) $^ -lXext -lX11 19 + + ln -s $(@F).0.0.0 $@.0 20 + + ln -s $(@F).0 $@ 21 + + 22 + # define the rule to build each object file 23 + $(foreach src,$(SRC),$(eval $(call DEFINE_OBJECT_RULE,TARGET,$(src)))) 24 +
+21
pkgs/os-specific/linux/nvidia-x11/libxnvctrl-build-shared.patch
···
··· 1 + --- a/src/libXNVCtrl/xnvctrl.mk 2 + +++ b/src/libXNVCtrl/xnvctrl.mk 3 + @@ -39,6 +39,8 @@ 4 + 5 + LIBXNVCTRL = $(OUTPUTDIR)/libXNVCtrl.a 6 + 7 + +LIBXNVCTRL_SHARED = $(OUTPUTDIR)/libXNVCtrl.so 8 + + 9 + LIBXNVCTRL_SRC = $(XNVCTRL_DIR)/NVCtrl.c 10 + 11 + LIBXNVCTRL_OBJ = $(call BUILD_OBJECT_LIST,$(LIBXNVCTRL_SRC)) 12 + @@ -47,3 +49,9 @@ 13 + 14 + $(LIBXNVCTRL) : $(LIBXNVCTRL_OBJ) 15 + $(call quiet_cmd,AR) ru $@ $(LIBXNVCTRL_OBJ) 16 + + 17 + +$(LIBXNVCTRL_SHARED): $(LIBXNVCTRL_OBJ) 18 + + $(RM) $@ $@.* 19 + + $(CC) -shared -Wl,-soname=$(@F).0 -o $@.0.0.0 $(LDFLAGS) $^ -lXext -lX11 20 + + ln -s $(@F).0.0.0 $@.0 21 + + ln -s $(@F).0 $@
+9
pkgs/os-specific/linux/nvidia-x11/settings.nix
··· 43 44 makeFlags = [ 45 "OUTPUTDIR=." # src/libXNVCtrl 46 ]; 47 48 installPhase = '' ··· 52 cp libXNVCtrl.a $out/lib 53 cp NVCtrl.h $out/include/NVCtrl 54 cp NVCtrlLib.h $out/include/NVCtrl 55 ''; 56 }; 57
··· 43 44 makeFlags = [ 45 "OUTPUTDIR=." # src/libXNVCtrl 46 + "libXNVCtrl.a" 47 + "libXNVCtrl.so" 48 + ]; 49 + 50 + patches = [ 51 + # Patch the Makefile to also produce a shared library. 52 + (if lib.versionOlder nvidia_x11.settingsVersion "400" then ./libxnvctrl-build-shared-3xx.patch 53 + else ./libxnvctrl-build-shared.patch) 54 ]; 55 56 installPhase = '' ··· 60 cp libXNVCtrl.a $out/lib 61 cp NVCtrl.h $out/include/NVCtrl 62 cp NVCtrlLib.h $out/include/NVCtrl 63 + cp -P libXNVCtrl.so* $out/lib 64 ''; 65 }; 66