[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: pkg-config "Requires" fields and propagated inputs
From: |
Taylan Ulrich Bayırlı/Kammer |
Subject: |
Re: pkg-config "Requires" fields and propagated inputs |
Date: |
Tue, 24 Mar 2015 23:52:18 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux) |
address@hidden (Ludovic Courtès) writes:
> Do you have an example of a package that uses Requires.private?
libxrandr is a good test case. Indeed I patched it a few days ago
because some libraries in its Requires.private weren't propagated, which
fixed my issue.
>> However, pkg-config isn't aware of compile-time/run-time dependency
>> differences; it's considered an error if a Requires.private of libfoo
>> isn't found,
>
> Really, even without --static?
>
>> because as far as pkg-config is concerned, it means libfoo is
>> dysfunctional. So we *do* need to propagate Requires.private, for the
>> sake of pkg-config. (The problem mainly manifests in the form of
>> ./configure scripts claiming libfoo isn't found when it's only libbar
>> that's missing, because in that case pkg-config returns an error to
>> the ./configure script when inquired about libfoo.)
>
> Do you have an example of that?
I hit the issue with libxrandr while packaging mpv. It has x11 under
its Requires.private, and:
$ ./pre-inst-env guix environment --pure -E guile guile-json mpv
GNU Guile 2.0.11
Copyright (C) 1995-2014 Free Software Foundation, Inc.
Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.
Enter `,help' for help.
scheme@(guile-user)> ,use (srfi srfi-1)
scheme@(guile-user)> (define path (string-split (getenv "PKG_CONFIG_PATH") #\:))
scheme@(guile-user)> (find (lambda (s) (string-match "x11" s)) path)
$1 = "/gnu/store/99bgd1yjf51y0mrh2p40g499ida8l1qr-libx11-1.6.2/lib/pkgconfig"
scheme@(guile-user)> (system* "pkg-config" "--exists" "xrandr")
$2 = 0
scheme@(guile-user)> (system* "pkg-config" "--print-errors" "xrandr")
$3 = 0
scheme@(guile-user)> (system* "pkg-config" "--libs" "xrandr")
-L/gnu/store/05a5lxii4qvgf9jnxq85jvmbpalljr9a-libxrandr-1.4.2/lib -lXrandr
$4 = 0
scheme@(guile-user)> (define path* (filter (lambda (s) (not (string-match "x11"
s))) path))
scheme@(guile-user)> (setenv "PKG_CONFIG_PATH" (string-join path* ":"))
scheme@(guile-user)> (system* "pkg-config" "--exists" "xrandr")
$5 = 256
scheme@(guile-user)> (system* "pkg-config" "--print-errors" "xrandr")
Package x11 was not found in the pkg-config search path.
Perhaps you should add the directory containing `x11.pc'
to the PKG_CONFIG_PATH environment variable
Package 'x11', required by 'xrandr', not found
$6 = 256
scheme@(guile-user)> (system* "pkg-config" "--libs" "xrandr")
-L/gnu/store/05a5lxii4qvgf9jnxq85jvmbpalljr9a-libxrandr-1.4.2/lib -lXrandr
$7 = 0
scheme@(guile-user)>
So while e.g. --libs actually works, --exists reports failure, and
--print-errors explains why.
One could say this is partially a bug, because if libxrandr statically
linked against libx11, then libx11 needn't exist at build nor run time.
It might be nice to have build-only propagated inputs. On the other
hand, someone installing libxrandr in their profile will expect
pkg-config on libxrandr to work without errors. More generally, they
will expect any build operation to work; i.e. a user might want to use
Guix-installed libraries for Guix-external development, and build-only
propagated inputs would mean annoying such users because they now have
to install them manually. Unless we provide a special "install for
development" operation that is. But the complexity grows. :-)
Taylan