diff --git a/pkgs/applications/virtualization/libnvidia-container/default.nix b/pkgs/applications/virtualization/libnvidia-container/default.nix index c7743bf44fc0..c74416ac33ba 100644 --- a/pkgs/applications/virtualization/libnvidia-container/default.nix +++ b/pkgs/applications/virtualization/libnvidia-container/default.nix @@ -1,5 +1,6 @@ { stdenv , lib +, addOpenGLRunpath , fetchFromGitHub , pkg-config , libelf @@ -8,25 +9,31 @@ , rpcsvc-proto , libtirpc , makeWrapper +, substituteAll +, go }: let - modp-ver = "450.57"; + modprobeVersion = "495.44"; nvidia-modprobe = fetchFromGitHub { owner = "NVIDIA"; repo = "nvidia-modprobe"; - rev = modp-ver; - sha256 = "0r4f6lpbbqqs9932xd2mr7bxn6a3xdalcwq332fc1amrrkgzfyv7"; + rev = modprobeVersion; + sha256 = "sha256-Y3ZOfge/EcmhqI19yWO7UfPqkvY1CHHvFC5l9vYyGuU="; + }; + modprobePatch = substituteAll { + src = ./modprobe.patch; + inherit modprobeVersion; }; in stdenv.mkDerivation rec { pname = "libnvidia-container"; - version = "1.5.0"; + version = "1.9.0"; src = fetchFromGitHub { owner = "NVIDIA"; repo = pname; rev = "v${version}"; - sha256 = "sha256-b9yQ1mEo1EkjXMguV0t98OvFEQO4h76EVu154MsB2II="; + sha256 = "sha256-7OTawWwjeKU8wIa8I/+aSvAJli4kEua94nJSNyCajpE="; }; patches = [ @@ -36,11 +43,53 @@ stdenv.mkDerivation rec { # path. ./libnvc-ldconfig-and-path-fixes.patch - # the libnvidia-container Makefile wants to build and install static - # libtirpc libraries; this patch prevents that from happening - ./avoid-static-libtirpc-build.patch + # fix bogus struct declaration + ./inline-c-struct.patch ]; + postPatch = '' + sed -i \ + -e 's/^REVISION ?=.*/REVISION = ${src.rev}/' \ + -e 's/^COMPILER :=.*/COMPILER = $(CC)/' \ + mk/common.mk + + mkdir -p deps/src/nvidia-modprobe-${modprobeVersion} + cp -r ${nvidia-modprobe}/* deps/src/nvidia-modprobe-${modprobeVersion} + chmod -R u+w deps/src + pushd deps/src + + patch -p0 < ${modprobePatch} + touch nvidia-modprobe-${modprobeVersion}/.download_stamp + popd + + # 1. replace DESTDIR=$(DEPS_DIR) with empty strings to prevent copying + # things into deps/src/nix/store + # 2. similarly, remove any paths prefixed with DEPS_DIR + # 3. prevent building static libraries because we don't build static + # libtirpc (for now) + # 4. prevent installation of static libraries because of step 3 + # 5. prevent installation of libnvidia-container-go.so twice + sed -i Makefile \ + -e 's#DESTDIR=\$(DEPS_DIR)#DESTDIR=""#g' \ + -e 's#\$(DEPS_DIR)\$#\$#g' \ + -e 's#all: shared static tools#all: shared tools#g' \ + -e '/$(INSTALL) -m 644 $(LIB_STATIC) $(DESTDIR)$(libdir)/d' \ + -e '/$(INSTALL) -m 755 $(libdir)\/$(LIBGO_SHARED) $(DESTDIR)$(libdir)/d' + ''; + + enableParallelBuilding = true; + + preBuild = '' + HOME="$(mktemp -d)" + ''; + + NIX_CFLAGS_COMPILE = [ "-I${libtirpc.dev}/include/tirpc" ]; + NIX_LDFLAGS = [ "-L${libtirpc.dev}/lib" "-ltirpc" ]; + + nativeBuildInputs = [ pkg-config go rpcsvc-proto makeWrapper ]; + + buildInputs = [ libelf libcap libseccomp libtirpc ]; + makeFlags = [ "WITH_LIBELF=yes" "prefix=$(out)" @@ -50,32 +99,14 @@ stdenv.mkDerivation rec { "CFLAGS=-DWITH_TIRPC" ]; - postPatch = '' - sed -i \ - -e 's/^REVISION ?=.*/REVISION = ${src.rev}/' \ - -e 's/^COMPILER :=.*/COMPILER = $(CC)/' \ - mk/common.mk - - mkdir -p deps/src/nvidia-modprobe-${modp-ver} - cp -r ${nvidia-modprobe}/* deps/src/nvidia-modprobe-${modp-ver} - chmod -R u+w deps/src - pushd deps/src - patch -p0 < ${./modprobe.patch} - touch nvidia-modprobe-${modp-ver}/.download_stamp - popd - ''; - - postInstall = '' - wrapProgram $out/bin/nvidia-container-cli \ - --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:/run/opengl-driver-32/lib - ''; - - NIX_CFLAGS_COMPILE = [ "-I${libtirpc.dev}/include/tirpc" ]; - NIX_LDFLAGS = [ "-L${libtirpc.dev}/lib" "-ltirpc" ]; - - nativeBuildInputs = [ pkg-config rpcsvc-proto makeWrapper ]; - - buildInputs = [ libelf libcap libseccomp libtirpc ]; + postInstall = + let + inherit (addOpenGLRunpath) driverLink; + libraryPath = lib.makeLibraryPath [ "$out" driverLink "${driverLink}-32" ]; + in + '' + wrapProgram $out/bin/nvidia-container-cli --prefix LD_LIBRARY_PATH : ${libraryPath} + ''; meta = with lib; { homepage = "https://github.com/NVIDIA/libnvidia-container"; diff --git a/pkgs/applications/virtualization/libnvidia-container/inline-c-struct.patch b/pkgs/applications/virtualization/libnvidia-container/inline-c-struct.patch new file mode 100644 index 000000000000..dab574e58398 --- /dev/null +++ b/pkgs/applications/virtualization/libnvidia-container/inline-c-struct.patch @@ -0,0 +1,14 @@ +diff --git a/src/nvcgo.c b/src/nvcgo.c +index 98789a3..47ad02b 100644 +--- a/src/nvcgo.c ++++ b/src/nvcgo.c +@@ -33,7 +33,8 @@ + void nvcgo_program_1(struct svc_req *, register SVCXPRT *); + + static struct nvcgo_ext { +- struct nvcgo; ++ struct rpc rpc; ++ struct libnvcgo api; + bool initialized; + void *dl_handle; + } global_nvcgo_context; diff --git a/pkgs/applications/virtualization/libnvidia-container/modprobe.patch b/pkgs/applications/virtualization/libnvidia-container/modprobe.patch index 8e7b0a723ec0..c28b6bad291d 100644 --- a/pkgs/applications/virtualization/libnvidia-container/modprobe.patch +++ b/pkgs/applications/virtualization/libnvidia-container/modprobe.patch @@ -1,6 +1,6 @@ -diff -ruN nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.c nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.c ---- nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.c 2020-07-09 17:06:05.000000000 +0000 -+++ nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.c 2020-08-18 12:43:03.223871514 +0000 +diff -ruN nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.c nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.c +--- nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.c 2020-07-09 17:06:05.000000000 +0000 ++++ nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.c 2020-08-18 12:43:03.223871514 +0000 @@ -840,10 +840,10 @@ return mknod_helper(major, minor_num, vgpu_dev_name, NV_PROC_REGISTRY_PATH); } @@ -16,9 +16,9 @@ diff -ruN nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.c nvidia-m { char field[32]; FILE *fp; -diff -ruN nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.h nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.h ---- nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.h 2020-07-09 17:06:05.000000000 +0000 -+++ nvidia-modprobe-450.57/modprobe-utils/nvidia-modprobe-utils.h 2020-08-18 12:43:44.227745050 +0000 +diff -ruN nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.h nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.h +--- nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.h 2020-07-09 17:06:05.000000000 +0000 ++++ nvidia-modprobe-@modprobeVersion@/modprobe-utils/nvidia-modprobe-utils.h 2020-08-18 12:43:44.227745050 +0000 @@ -81,6 +81,7 @@ int nvidia_nvswitch_get_file_state(int minor); int nvidia_cap_mknod(const char* cap_file_path, int *minor);