51

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?

Ryan M
  • 18,333
  • 31
  • 67
  • 74
user1370912
  • 919
  • 2
  • 9
  • 15

8 Answers8

63

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

Scott Stensland
  • 26,870
  • 12
  • 93
  • 104
buzz
  • 739
  • 5
  • 5
17

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
Wes Hardaker
  • 21,735
  • 2
  • 38
  • 69
  • 4
    what if the debian/rules file doesn't contain that line? – knocte Mar 03 '13 at 22:10
  • 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? – Wes Hardaker Mar 04 '13 at 14:54
  • @WesHardaker In the case of CPack, there is no debian/rules file. – Stéphane May 14 '19 at 13:17
  • 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`. – dvo May 22 '23 at 09:23
15

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.

dequis
  • 2,100
  • 19
  • 25
  • 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. – Alexis Wilke Nov 12 '20 at 04:01
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.

kerel
  • 9
  • 3
smani
  • 1,953
  • 17
  • 13
  • 3
    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 https://manpages.debian.org/testing/dpkg-dev/dpkg-shlibdeps.1.en.html – Piotr Dobrogost Jan 19 '18 at 08:57
4

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

export DEB_DH_SHLIBDEPS_ARGS_ALL=--dpkg-shlibdeps-params=--ignore-missing-info
Rkshvch
  • 113
  • 2
  • 5
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.

umläute
  • 28,885
  • 9
  • 68
  • 122
-1

You can use this:

dh_makeshlibs -a -n

exactly after dh_install

-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;
user1370912
  • 919
  • 2
  • 9
  • 15
  • 12
    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/ – umläute Jun 28 '12 at 19:52
  • Ouch! Yeah... Don't do that. Not a good solution. @dequis 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.) – Alexis Wilke Nov 12 '20 at 04:04