dpkg-shlibdeps: error: no dependency information found for
Asked Answered
T

8

52

I'm compiling a deb package and when I run dpkg-buildpackage I get:

dpkg-shlibdeps: error: no dependency information found for /usr/local/lib/libopencv_highgui.so.2.3 

    ...
    make: *** [binary-arch] Error 2

This happens because I installed the dependency manually. I know that the problem will be fixed if I install the dependency (or use checkinstall), and I want to generate the package anyway because I'm not interested on dependency checking. I know that I can give to dpkg-shlibdeps the option --ignore-missing-info which prevents a fail if dependency information can't be found. But I don't know how to pass this option to dpkg-shlibdeps since I'm using dpkg-buildpackage and dpkg-buildpackage calls dpkg-shlibdeps...

I have already tried:

sudo dpkg-buildpackage -rfakeroot -d -B

And with:

export DEB_DH_MAKESHLIBS_ARG=--ignore-missing-info

as root.

Any ideas?

Timehonored answered 28/6, 2012 at 4:37 Comment(0)
H
67

use:

override_dh_shlibdeps:
    dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

if your rule file hasn't the dh_shlibdeps call in it. That's usually the case if you've

%:
    dh $@

as only rule in it ... in above you must use a tab and not spaces in front of the dh_shlibdeps

Headwork answered 13/9, 2013 at 18:42 Comment(0)
A
19

If you want it to just ignore that flag, change the debian/rules line from:

dh_shlibdeps

to:

dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
Aun answered 21/2, 2013 at 0:10 Comment(4)
what if the debian/rules file doesn't contain that line?Corollary
Some line must be triggering that message, which means there must be some rule that is calling dpkg-shlibdeps. If it's not the dh_shlibdeps wrapper script, then what is it?Aun
@WesHardaker In the case of CPack, there is no debian/rules file.Usually
CPack automatically produces a debian/rules file, and it does include the option --ignore-missing-info if dpkg-shlibdeps supports it. Since version 3.20, CPack also supports the option -l of dpkg-shlibdeps, which can be set via the variable CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS.Repertory
E
16

Yet another way, without modifying build scripts, just creating one file.

You can specify local shlib overrides by creating debian/shlibs.local with the following format: library-name soname-version dependencies

For example, given the following (trimmed) ldd /path/to/binary output

libevent-2.0.so.5 => /usr/lib/libevent-2.0.so.5 (0x00007fc9e47aa000)
libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fc9e4161000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fc9e3b1a000)

The contents of debian/shlibs.local would be:

libevent-2.0 5 libevent-2.0
libgcrypt 20 libgcrypt
libpthread 0 libpthread

The "dependencies" list (third column) doesn't need to be 100% accurate - I just use the library name itself again.

Of course this isn't needed in a sane debian system which has this stuff defined in /var/lib/dpkg/info (which can be used as inspiration for these overrides). Mine isn't a sane debian system.

Earthbound answered 8/8, 2015 at 2:9 Comment(1)
That was close but pretty useless if you depend on the very library that breaks the build (plus the way you have it, it creates a circular dependency). It works for me if I change the dependency name to an existing library. In my package, I used: libnvbuf_utils 1.0.0 libgcc1 and now I get my package built. libgcc1 is a given is you have compiled executables. As you mentioned, you'll see the list of libraries using ldd so you can pick any one of them from there. You could also check the very library you're having a problem with using objdump -x ... to see what it depends on.Driveway
B
9

Instead of merely ignoring the error, you might also want to fix the source of the error, which is usually either a missing or an incorrect package.shlibs or package.symbols file in package which contains the shared library triggering the error.

[1] documents how dpkg-shlibdeps uses the package.shlibs resp. package.symbols, files, [2] documents the format of the package.shlibs and package.symbols files.

Brisling answered 11/2, 2014 at 19:10 Comment(1)
In case where the package you're building provides private shared libraries the better approach is to use the -ldirectory option of dpkg-shlibdeps – see manpages.debian.org/testing/dpkg-dev/dpkg-shlibdeps.1.en.htmlMerchandise
T
4

You've just misspelled your export. It should be like this:

export DEB_DH_SHLIBDEPS_ARGS_ALL=--dpkg-shlibdeps-params=--ignore-missing-info
Tektite answered 16/10, 2013 at 6:17 Comment(0)
S
3

dpkg-buildpackage uses make to process debian/rules. in this process, dpkg-buildpackage it might call dpkg-shlibdeps.

thus, the proper way to pass modify a part of the package building process is to edit debian/rules. it's hard to give you any more hints, without seeing the actual debian/rules.

Scherzando answered 28/6, 2012 at 19:56 Comment(0)
G
-1

You can use this:

dh_makeshlibs -a -n

exactly after dh_install

Greensward answered 28/5, 2017 at 14:14 Comment(0)
T
-2

Finally I did it in the brute way:

I edited the script /usr/bin/dpkg-shlibdeps, changing this :

my $ignore_missing_info = 0;

to

my $ignore_missing_info = 1;
Timehonored answered 28/6, 2012 at 15:21 Comment(2)
this seems to be an extraordinary dangerous idea. if you want to replace binaries, you should at least try to put the alternatives into /usr/local/Lineage
Ouch! Yeah... Don't do that. Not a good solution. @Earthbound had the very solution you want to use, but the dependency he proposed was not going to work (i.e. depend on yourself is bad, but since that's the very library which needs to be properly defined, it will still be wrong. I put a comment with what I've done and it works like a charm.)Driveway

© 2022 - 2024 — McMap. All rights reserved.