[PATCH] gnu: vulkan-tools: Wrap binaries with LD_LIBRARY_PATH.

  • Open
  • quality assurance status badge
Details
4 participants
  • Kaelyn
  • Ludovic Courtès
  • nathan
  • Sughosha
Owner
unassigned
Submitted by
Sughosha
Severity
normal
S
S
Sughosha wrote on 22 May 11:36 +0200
(address . guix-patches@gnu.org)(name . Sughosha)(address . sughosha@disroot.org)
0f2a806ee6259147a098e8d672d03ed768fde5fa.1716370579.git.sughosha@disroot.org
This fixes not finding vulkan-loader.

* gnu/packages/vulkan.scm (vulkan-tools)[arguments]<#:phases>:
Wrap-binaries with LD_LIBRARY_PATH.

Change-Id: I9aaf1cf04f70f1da976fa84d2189ca2c01b9520f
---
gnu/packages/vulkan.scm | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

Toggle diff (26 lines)
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 4c53a19aba..dcf97e98dd 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -368,7 +368,16 @@ (define-public vulkan-tools
(replace 'check
(lambda* (#:key tests? #:allow-other-keys)
(when tests?
- (invoke "./tests/vulkan_tools_tests")))))))
+ (invoke "./tests/vulkan_tools_tests"))))
+ (add-after 'install 'wrap-binaries
+ (lambda* (#:key outputs #:allow-other-keys)
+ (for-each
+ (lambda (file)
+ (wrap-program file
+ `("LD_LIBRARY_PATH" ":" =
+ (,(getenv "LIBRARY_PATH")))))
+ (find-files (string-append (assoc-ref outputs "out")
+ "/bin"))))))))
(home-page
"https://github.com/KhronosGroup/Vulkan-Tools")
(synopsis "Tools and utilities for Vulkan")

base-commit: e9b25a6c6c626a560d28a1f732e6e5d362d584a4
--
2.41.0
K
K
Kaelyn wrote on 26 May 20:51 +0200
(name . 71109@debbugs.gnu.org)(address . 71109@debbugs.gnu.org)
0sbkYdBDyA3AoA6l8fAUcxreG-bXFqu9fbRWAgwmboKLPENMF9TZlwA1ksjsl0tJ-odegouxVvGTZ2rgMh6o0U77FuvvOqB0TZA_F-u1K48=@protonmail.com
Hi,

This patch looks good to me, and I've confirmed it fixes the issue with vulkaninfo not running.

I am curious though as to what caused vulkaninfo to need LD_LIBRARY_PATH, as before the the vulkan updates a couple of months ago (at least as of gitish 4d79a9c from early April), vulkaninfo worked fine without needing LD_LIBRARY_PATH set. The new need does have me a bit concerned that other vulkan apps which used to work may need a similar workaround to keep functioning as expected.

Cheers,
Kaelyn
L
L
Ludovic Courtès wrote on 31 May 12:38 +0200
Re: [bug#71109] [PATCH] gnu: vulkan-tools: Wrap binaries with LD_LIBRARY_PATH.
(name . Sughosha)(address . sughosha@disroot.org)
87y17qtgea.fsf@gnu.org
Hi,

Sughosha <sughosha@disroot.org> skribis:

Toggle quote (2 lines)
> This fixes not finding vulkan-loader.

Could you show how to test it?

Toggle quote (4 lines)
> + (wrap-program file
> + `("LD_LIBRARY_PATH" ":" =
> + (,(getenv "LIBRARY_PATH")))))

This is probably a bit too broad because LIBRARY_PATH includes
build-time-only dependencies (python, gawk, binutils, bzip2, etc.).

Could we explicitly list what needs to be there instead?

Also maybe change ‘=’ to ‘suffix’ so users can still override
LD_LIBRARY_PATH.

Thanks,
Ludo’.
K
K
Kaelyn wrote on 31 May 18:47 +0200
(name . Ludovic Courtès)(address . ludo@gnu.org)
GhYe3_3wNVv8gllrCy804hA6hIJw0Sw7yLwhyzrCV2L-VyvoLY_MLlqO02qpw0jGLSKoVi94FkTKLFoMQLeeeBFNPE6I1OxEoMhYJJXJ2f0=@protonmail.com
Hi,

On Friday, May 31st, 2024 at 3:38 AM, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (11 lines)
>
>
> Hi,
>
> Sughosha sughosha@disroot.org skribis:
>
> > This fixes not finding vulkan-loader.
>
>
> Could you show how to test it?

At least for me, the problem shows up simply with vulkan-tools installed (or using "guix shell vulkan-tools") using a guix commit after the latest (1.3.280) vulkan updates. Simply running "vulkaninfo" results in the error:

ERROR at /tmp/guix-build-vulkan-tools-1.3.280.0.drv-0/source/vulkaninfo/./vulkaninfo.h:412: Failed to initialize: Vulkan loader is not installed, not found, or failed to load.

Toggle quote (11 lines)
>
> > + (wrap-program file
> > + `("LD_LIBRARY_PATH" ":" =
> > + (,(getenv "LIBRARY_PATH")))))
>
>
> This is probably a bit too broad because LIBRARY_PATH includes
> build-time-only dependencies (python, gawk, binutils, bzip2, etc.).
>
> Could we explicitly list what needs to be there instead?

A bit of local testing just now suggests setting LD_LIBRARY_PATH to the vulkan-loader package's lib dir should be enough to resolve the error.

Cheers,
Kaelyn

Toggle quote (5 lines)
> Also maybe change ‘=’ to ‘suffix’ so users can still override
> LD_LIBRARY_PATH.
>
> Thanks,
> Ludo’.
S
S
Sughosha wrote on 31 May 17:21 +0200
(name . Ludovic Courtès)(address . ludo@gnu.org)
3564606.iIbC2pHGDl@localhost.localdomain
On Friday, May 31, 2024 4:08:53 PM IST Ludovic Courtès wrote:
Toggle quote (21 lines)
> Hi,
>
> Sughosha <sughosha@disroot.org> skribis:
> > This fixes not finding vulkan-loader.
>
> Could you show how to test it?
>
> > + (wrap-program file
> > + `("LD_LIBRARY_PATH" ":" =
> > + (,(getenv "LIBRARY_PATH")))))
>
> This is probably a bit too broad because LIBRARY_PATH includes
> build-time-only dependencies (python, gawk, binutils, bzip2, etc.).
>
> Could we explicitly list what needs to be there instead?
>
> Also maybe change ‘=’ to ‘suffix’ so users can still override
> LD_LIBRARY_PATH.
>
> Thanks,
> Ludo’.
Hi,
Thanks for your review!

Toggle quote (1 lines)
> Could you show how to test it?
Currently if I just run `vulkaninfo`, this error appears:
```
ERROR at /tmp/guix-build-vulkan-tools-1.3.280.0.drv-0/source/vulkaninfo/./
vulkaninfo.h:412: Failed to initialize: Vulkan loader is not installed, not
found, or failed to load.
```
I don't know if something should be patched before building itself.
But if I run: `LD_LIBRARY_PATH=$(guix build vulkan-loader)/lib vulkaninfo`,
the program will be executed without any error.

Toggle quote (2 lines)
> This is probably a bit too broad because LIBRARY_PATH includes
> build-time-only dependencies (python, gawk, binutils, bzip2, etc.).
If I wrap only with vulkan-loader's library path also, it works. But would it
be a "right" way of wrapping a program.

Toggle quote (1 lines)
> Also maybe change ‘=’ to ‘suffix’ so users can still override
Yes, you are right. I will change it.

--
Sughosha
N
N
nathan wrote on 2 Jun 03:19 +0200
[bug#71109] [PATCH] gnu: vulkan-tools: Wrap binaries with LD_LIBRARY_PATH.
66f9f6e2-434b-08e7-b5d5-c9d1cfd99b50@nborghese.com
commit e156996c478a8e5d040ccf199437bcdbdbab63ed in vulkan-tools makes it
use volk to load vulkan instead of a bunch of custom code in the repo.
volk uses dlopen("libvulkan.so.1").
i dont remember volk ever working, so this just propagated the bug to
another program.
attached is a patch to hard-code the libvulkan.so path into volk.

vulkan-headers also has dlopen for libvulkan.so.
i dont know which programs use it, but next time we have to rebuild
everything we may as well patch it.
i attached a patch that shows how to do it.
From 811d7567098e00711ee4c9c80afbe544ebe1c08e Mon Sep 17 00:00:00 2001
Message-ID: <811d7567098e00711ee4c9c80afbe544ebe1c08e.1717290934.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 1 Jun 2024 21:14:13 -0400
Subject: [PATCH] example of how to patch patch of vulkan-loader into
vulkan-headers

Change-Id: Ic674a4d965d8049e388d75137111ed0253ca3b18
---
gnu/packages/vulkan.scm | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)

Toggle diff (60 lines)
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 4c53a19aba..2fc2feeeba 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -238,7 +238,8 @@ (define-public glslang
;; include/SPIRV/{bitutils,hex_float}.h are Apache 2.0.
license:asl2.0))))
-(define-public vulkan-headers
+;; vulkan-headers, but without the path to vulkan-loader patched in.
+(define vulkan-headers/no-loader
(package
(name "vulkan-headers")
(version "1.3.280.0")
@@ -255,6 +256,7 @@ (define-public vulkan-headers
(build-system cmake-build-system)
(arguments
`(#:tests? #f)) ; No tests.
+ (properties '((hidden? . #t)))
(home-page
"https://github.com/KhronosGroup/Vulkan-Headers")
(synopsis "Vulkan Header files and API registry")
@@ -262,6 +264,24 @@ (define-public vulkan-headers
"Vulkan-Headers contains header files and API registry for Vulkan.")
(license (list license:asl2.0)))) ;LICENSE.txt
+(define-public vulkan-headers
+ (package
+ (inherit vulkan-headers/no-loader)
+ (arguments
+ (substitute-keyword-arguments (package-arguments vulkan-headers/no-loader)
+ ((#:phases phases #~%standard-phases)
+ #~(modify-phases #$phases
+ (add-after 'unpack 'patch-loader-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "include/vulkan/vulkan.hpp"
+ (("dlopen\\( \"libvulkan.so")
+ (string-append "dlopen(\"" (assoc-ref inputs "vulkan-loader")
+ "/lib/libvulkan.so")))))))))
+ (inputs
+ (modify-inputs (package-inputs vulkan-headers/no-loader)
+ (prepend vulkan-loader)))
+ (properties '())))
+
(define-public vulkan-loader
(package
(name "vulkan-loader")
@@ -318,7 +338,7 @@ (define-public vulkan-loader
python
wayland))
(inputs
- (list vulkan-headers libxrandr))
+ (list vulkan-headers/no-loader libxrandr))
(native-search-paths
(list (search-path-specification
(variable "XDG_DATA_DIRS")

base-commit: fa7906d64881ee12e0c418136b44c73766e3d169
--
2.45.1
From ee4581690b6486a65bf0e4faed3f2c88cac70d9e Mon Sep 17 00:00:00 2001
Message-ID: <ee4581690b6486a65bf0e4faed3f2c88cac70d9e.1717286310.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 1 Jun 2024 19:55:24 -0400
Subject: [PATCH] gnu: volk: Hard-code path of vulkan-loader for dynamic
loading

* gnu/packages/vulkan.scm (volk):
[arguments]: use gexp.
<#:phases>: patch dlopen with libvulkan.so. fixes vulkan-tools and potentially
other programs too.
[input]: add vulkan-loader

Change-Id: I5ef0eb13d35e517b8947faddace641882a775b80
---
gnu/packages/vulkan.scm | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)

Toggle diff (30 lines)
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 4c53a19aba..215a592266 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -568,9 +568,18 @@ (define-public volk
"0x4jhc8n9c4k8svmmcaxxs613xbsav7wam94gacddlm738cwp13v"))))
(build-system cmake-build-system)
(arguments
- '(#:tests? #f ;no test
- #:configure-flags '("-DVOLK_INSTALL=ON" "-DVOLK_PULL_IN_VULKAN=ON")))
- (inputs (list vulkan-headers))
+ (list
+ #:tests? #f ;no test
+ #:configure-flags #~(list "-DVOLK_INSTALL=ON" "-DVOLK_PULL_IN_VULKAN=ON")
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'patch-loader-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "volk.c"
+ (("dlopen\\(\"libvulkan.so")
+ (string-append "dlopen(\"" (assoc-ref inputs "vulkan-loader")
+ "/lib/libvulkan.so"))))))))
+ (inputs (list vulkan-headers vulkan-loader))
(synopsis "Meta loader for Vulkan API")
(description
"Volk is a meta-loader for Vulkan. It allows you to dynamically load

base-commit: fa7906d64881ee12e0c418136b44c73766e3d169
--
2.45.1
L
L
Ludovic Courtès wrote 5 days ago
(name . nathan)(address . nathan_mail@nborghese.com)
87tthzkw4w.fsf@gnu.org
Hi nathan and all,

nathan <nathan_mail@nborghese.com> skribis:

Toggle quote (9 lines)
> From 811d7567098e00711ee4c9c80afbe544ebe1c08e Mon Sep 17 00:00:00 2001
> Message-ID: <811d7567098e00711ee4c9c80afbe544ebe1c08e.1717290934.git.nathan_mail@nborghese.com>
> From: nathan <nathan_mail@nborghese.com>
> Date: Sat, 1 Jun 2024 21:14:13 -0400
> Subject: [PATCH] example of how to patch patch of vulkan-loader into
> vulkan-headers
>
> Change-Id: Ic674a4d965d8049e388d75137111ed0253ca3b18

[...]

Toggle quote (15 lines)
> From ee4581690b6486a65bf0e4faed3f2c88cac70d9e Mon Sep 17 00:00:00 2001
> Message-ID: <ee4581690b6486a65bf0e4faed3f2c88cac70d9e.1717286310.git.nathan_mail@nborghese.com>
> From: nathan <nathan_mail@nborghese.com>
> Date: Sat, 1 Jun 2024 19:55:24 -0400
> Subject: [PATCH] gnu: volk: Hard-code path of vulkan-loader for dynamic
> loading
>
> * gnu/packages/vulkan.scm (volk):
> [arguments]: use gexp.
> <#:phases>: patch dlopen with libvulkan.so. fixes vulkan-tools and potentially
> other programs too.
> [input]: add vulkan-loader
>
> Change-Id: I5ef0eb13d35e517b8947faddace641882a775b80

These two patches make sense to me.

I applied them with minor tweaks: using ‘search-input-file’ rather than
‘assoc-ref’ in build phases, and commit log modifications to match our
conventions.

Thank you!

Ludo’.
Closed
L
L
Ludovic Courtès wrote 5 days ago
control message for bug #71109
(address . control@debbugs.gnu.org)
87h6dzkupl.fsf@gnu.org
reopen 71109
tags 71109 - fixed patch
quit
L
L
Ludovic Courtès wrote 5 days ago
Re: [bug#71109] [PATCH] gnu: vulkan-tools: Wrap binaries with LD_LIBRARY_PATH.
(name . nathan)(address . nathan_mail@nborghese.com)
87bk47kujd.fsf@gnu.org
Hi,

I spoke a bit too fast: given that many packages depend on
‘vulkan-headers’, this should be applied on a branch.

Attached as the updated patches.

John, could you apply them on the ‘mesa-updates’ branch? (I realized
there’s no formal ‘mesa’ team contrary to what I thought; perhaps there
should be one?).

Thanks,
Ludo’.
From 577a58ac4d23e7fa749fddb3007a3ad14c40f38d Mon Sep 17 00:00:00 2001
Message-ID: <577a58ac4d23e7fa749fddb3007a3ad14c40f38d.1718143100.git.ludo@gnu.org>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 1 Jun 2024 21:14:13 -0400
Subject: [PATCH 1/2] gnu: vulkan-headers: Hard-code libvulkan.so file name.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* gnu/packages/vulkan.scm (vulkan-headers): Rename to…
(vulkan-headers/no-loader): … this.
(vulkan-headers): New variable.
(vulkan-loader): Depend on ‘vulkan-headers/no-loader’.

Change-Id: Ic674a4d965d8049e388d75137111ed0253ca3b18
Co-authored-by: Ludovic Courtès <ludo@gnu.org>
---
gnu/packages/vulkan.scm | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)

Toggle diff (61 lines)
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 25542c1e064..5ff47be92e2 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -246,7 +246,8 @@ (define-public glslang
;; include/SPIRV/{bitutils,hex_float}.h are Apache 2.0.
license:asl2.0))))
-(define-public vulkan-headers
+;; vulkan-headers, but without the path to vulkan-loader patched in.
+(define-public vulkan-headers/no-loader
(package
(name "vulkan-headers")
(version "1.3.280.0")
@@ -263,6 +264,7 @@ (define-public vulkan-headers
(build-system cmake-build-system)
(arguments
`(#:tests? #f)) ; No tests.
+ (properties '((hidden? . #t)))
(home-page
"https://github.com/KhronosGroup/Vulkan-Headers")
(synopsis "Vulkan Header files and API registry")
@@ -270,6 +272,25 @@ (define-public vulkan-headers
"Vulkan-Headers contains header files and API registry for Vulkan.")
(license (list license:asl2.0)))) ;LICENSE.txt
+(define-public vulkan-headers
+ (package
+ (inherit vulkan-headers/no-loader)
+ (arguments
+ (substitute-keyword-arguments (package-arguments vulkan-headers/no-loader)
+ ((#:phases phases #~%standard-phases)
+ #~(modify-phases #$phases
+ (add-after 'unpack 'patch-libvulkan-file-name
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "include/vulkan/vulkan.hpp"
+ (("dlopen\\( \"libvulkan.so")
+ (string-append "dlopen(\""
+ (search-input-file
+ inputs "/lib/libvulkan.so"))))))))))
+ (inputs
+ (modify-inputs (package-inputs vulkan-headers/no-loader)
+ (prepend vulkan-loader)))
+ (properties '())))
+
(define-public vulkan-loader
(package
(name "vulkan-loader")
@@ -326,7 +347,7 @@ (define-public vulkan-loader
python
wayland))
(inputs
- (list vulkan-headers libxrandr))
+ (list vulkan-headers/no-loader libxrandr))
(native-search-paths
(list (search-path-specification
(variable "XDG_DATA_DIRS")

base-commit: 7daf9328921f9f7d4fe4839d8e16091bd9f06072
--
2.45.1
From 2cb9899209d1807cd18e9ed68a634faca48c6d89 Mon Sep 17 00:00:00 2001
Message-ID: <2cb9899209d1807cd18e9ed68a634faca48c6d89.1718143100.git.ludo@gnu.org>
In-Reply-To: <577a58ac4d23e7fa749fddb3007a3ad14c40f38d.1718143100.git.ludo@gnu.org>
References: <577a58ac4d23e7fa749fddb3007a3ad14c40f38d.1718143100.git.ludo@gnu.org>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 1 Jun 2024 19:55:24 -0400
Subject: [PATCH 2/2] gnu: volk: Hard-code path of vulkan-loader for dynamic
loading
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Until now, we’d get:

$ guix shell vulkan-tools -- vulkaninfo
ERROR at /tmp/guix-build-vulkan-tools-1.3.280.0.drv-0/source/vulkaninfo/./vulkaninfo.h:412: Failed to initialize: Vulkan loader is not installed, not found, or failed to load.

This patch fixes it and potentially for other programs as well.

* gnu/packages/vulkan.scm (volk)[arguments]: use gexp.
<#:phases>: Patch dlopen with libvulkan.so.
[input]: Add vulkan-loader.

Change-Id: I5ef0eb13d35e517b8947faddace641882a775b80
Co-authored-by: Ludovic Courtès <ludo@gnu.org>
---
gnu/packages/vulkan.scm | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)

Toggle diff (29 lines)
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 5ff47be92e2..5d322f3ddb9 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -597,9 +597,19 @@ (define-public volk
"0x4jhc8n9c4k8svmmcaxxs613xbsav7wam94gacddlm738cwp13v"))))
(build-system cmake-build-system)
(arguments
- '(#:tests? #f ;no test
- #:configure-flags '("-DVOLK_INSTALL=ON" "-DVOLK_PULL_IN_VULKAN=ON")))
- (inputs (list vulkan-headers))
+ (list
+ #:tests? #f ;no test
+ #:configure-flags #~(list "-DVOLK_INSTALL=ON" "-DVOLK_PULL_IN_VULKAN=ON")
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'patch-loader-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "volk.c"
+ (("dlopen\\(\"libvulkan.so")
+ (string-append "dlopen(\""
+ (search-input-file
+ inputs "/lib/libvulkan.so")))))))))
+ (inputs (list vulkan-headers vulkan-loader))
(synopsis "Meta loader for Vulkan API")
(description
"Volk is a meta-loader for Vulkan. It allows you to dynamically load
--
2.45.1
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 71109@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 71109
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch