A common error when building from source is something like the error below:
meson.build:50:0: ERROR: Native dependency 'foo' not foundor a similar warning
meson.build:63:0: ERROR: Invalid version of dependency, need 'foo' ['>= 1.1.0'] found '1.0.0'.Seeing that can be quite discouraging, but luckily, in many cases it's not too difficult to fix. As usual, there are many ways to get to a successful result, I'll describe what I consider the simplest.
What does it mean? Dependencies are simply libraries or tools that meson needs to build the project. Usually these are declared like this in meson.build:
dep_foo = dependency('foo', version: '>= 1.1.0')In human words: "we need the development headers for library foo (or 'libfoo') of version 1.1.0 or later". meson uses the pkg-config tool in the background to resolve that request. If we require package foo, pkg-config searches for a file foo.pc in the following directories:
- /usr/lib/pkgconfig,
- /usr/lib64/pkgconfig,
- /usr/share/pkgconfig,
- /usr/local/lib/pkgconfig,
- /usr/local/share/pkgconfig
And important note here: in most cases, we need the development headers of said library, installing just the library itself is not sufficient. After all, we're trying to build against it, not merely run against it.
What package provides the foo.pc file?
In many cases the package is the development version of the package name. Try foo-devel (Fedora, RHEL, SuSE, ...) or foo-dev (Debian, Ubuntu, ...). yum and dnf provide a great shortcut to install any pkg-config dependency:
$> dnf install "pkgconfig(foo)"
$> yum install "pkgconfig(foo)"will automatically search and install the right package, including its dependencies.
apt-get requires a bit more effort:
$> apt-get install apt-file $> apt-file update $> apt-file search --package-only foo.pc foo-dev $> apt-get install foo-devFor those running Arch and pacman, the sequence is:
$> pacman -S pkgfile $> pkgfile -u $> pkgfile foo.pc extra/foo $> pacman -S extra/fooOnce that's done you can re-run meson and see if all dependencies have been met. If more packages are missing, follow the same process for the next file.
Any users of other distributions - let me know how to do this on yours and I'll update the post
My version is wrong!
It's not uncommon to see the following error after installing the right package:
meson.build:63:0: ERROR: Invalid version of dependency, need 'foo' ['>= 1.1.0'] found '1.0.0'.Now you're stuck and you have a problem. What this means is that the package version your distribution provides is not new enough to build your software. This is where the simple solutions and and it all gets a bit more complicated - with more potential errors. Unless you are willing to go into the deep end, I recommend moving on and accepting that you can't have the newest bits on an older distribution. Because now you have to build the dependencies from source and that may then require to build their dependencies from source and before you know you've built 30 packages. If you're willing read on, otherwise - sorry, you won't be able to run your software today.
Manually installing dependencies
Now you're in the deep end, so be aware that you may see more complicated errors in the process. First of all you need to figure out where to get the source from. I'll now use cairo as example instead of foo so you see actual data. On rpm-based distributions like Fedora run dnf or yum:
$> dnf info cairo-devel # or yum info cairo-devel Loaded plugins: auto-update-debuginfo, langpacks Installed Packages Name : cairo-devel Arch : x86_64 Version : 1.13.1 Release : 0.1.git337ab1f.fc20 Size : 2.4 M Repo : installed From repo : fedora Summary : Development files for cairo URL : http://cairographics.org License : LGPLv2 or MPLv1.1 Description : Cairo is a 2D graphics library designed to provide high-quality : display and print output. : : This package contains libraries, header files and developer : documentation needed for developing software which uses the cairo : graphics library.The important field here is the URL line - got to that and you'll find the source tarballs. That should be true for most projects but you may need to google for the package name and hope. Search for the tarball with the right version number and download it. On Debian and related distributions, cairo is provided by the libcairo2-dev package. Run apt-cache show on that package:
$> apt-cache show libcairo2-dev Package: libcairo2-dev Source: cairo Version: 1.12.2-3 Installed-Size: 2766 Maintainer: Dave BeckettIn this case it's the Homepage line that matters, but the process of downloading tarballs is the same as above. For Arch users, the interesting line is URL as well:Architecture: amd64 Provides: libcairo-dev Depends: libcairo2 (= 1.12.2-3), libcairo-gobject2 (= 1.12.2-3),[...] Suggests: libcairo2-doc Description-en: Development files for the Cairo 2D graphics library Cairo is a multi-platform library providing anti-aliased vector-based rendering for multiple target backends. . This package contains the development libraries, header files needed by programs that want to compile with Cairo. Homepage: http://cairographics.org/ Description-md5: 07fe86d11452aa2efc887db335b46f58 Tag: devel::library, role::devel-lib, uitoolkit::gtk Section: libdevel Priority: optional Filename: pool/main/c/cairo/libcairo2-dev_1.12.2-3_amd64.deb Size: 1160286 MD5sum: e29852ae8e8e5510b00b13dbc201ce66 SHA1: 2ed3534d02c01b8d10b13748c3a02820d10962cf SHA256: a6099cfbcc6bd891e347dd9abc57b7f137e0fd619deaff39606fd58f0cc60d27
$> pacman -Si cairo | grep URL Repository : extra Name : cairo Version : 1.12.16-1 Description : Cairo vector graphics library Architecture : x86_64 URL : http://cairographics.org/ Licenses : LGPL MPL ....
Now to the complicated bit: In most cases, you shouldn't install the new version over the system version because you may break other things. You're better off installing the dependency into a custom folder ("prefix") and point pkg-config to it. So let's say you downloaded the cairo tarball, now you need to run:
$> mkdir $HOME/dependencies/ $> tar xf cairo-someversion.tar.xz $> cd cairo-someversion $> autoreconf -ivf $> ./configure --prefix=$HOME/dependencies $> make && make install $> export PKG_CONFIG_PATH=$HOME/dependencies/lib/pkgconfig:$HOME/dependencies/share/pkgconfig # now go back to original project and run meson againSo you create a directory called dependencies and install cairo there. This will install cairo.pc as $HOME/dependencies/lib/cairo.pc. Now all you need to do is tell pkg-config that you want it to look there as well - so you set PKG_CONFIG_PATH. If you re-run meson in the original project, pkg-config will find the new version and meson should succeed. If you have multiple packages that all require a newer version, install them into the same path and you only need to set PKG_CONFIG_PATH once. Remember you need to set PKG_CONFIG_PATH in the same shell as you are running configure from.
In the case of dependencies that use meson, you replace autotools and make with meson and ninja:
$> mkdir $HOME/dependencies/ $> tar xf foo-someversion.tar.xz $> cd foo-someversion $> meson builddir -Dprefix=$HOME/dependencies $> ninja -C builddir install $> export PKG_CONFIG_PATH=$HOME/dependencies/lib/pkgconfig:$HOME/dependencies/share/pkgconfig # now go back to original project and run meson again
If you keep seeing the version error the most common problem is that PKG_CONFIG_PATH isn't set in your shell, or doesn't point to the new cairo.pc file. A simple way to check is:
$> pkg-config --modversion cairo 1.13.1Is the version number the one you installed or the system one? If it is the system one, you have a typo in PKG_CONFIG_PATH, just re-set it. If it still doesn't work do this:
$> cat $HOME/dependencies/lib/pkgconfig/cairo.pc prefix=/usr exec_prefix=/usr libdir=/usr/lib64 includedir=/usr/include Name: cairo Description: Multi-platform 2D graphics library Version: 1.13.1 Requires.private: gobject-2.0 glib-2.0 >= 2.14 [...] Libs: -L${libdir} -lcairo Libs.private: -lz -lz -lGL Cflags: -I${includedir}/cairoIf the Version field matches what pkg-config returns, then you're set. If not, keep adjusting PKG_CONFIG_PATH until it works. There is a rare case where the Version field in the installed library doesn't match what the tarball said. That's a defective tarball and you should report this to the project, but don't worry, this hardly ever happens. In almost all cases, the cause is simply PKG_CONFIG_PATH not being set correctly. Keep trying :)
Let's assume you've managed to build the dependencies and want to run the newly built project. The only problem is: because you built against a newer library than the one on your system, you need to point it to use the new libraries.
$> export LD_LIBRARY_PATH=$HOME/dependencies/liband now you can, in the same shell, run your project.
Good luck!
2 comments:
For Arch's pacman ≥5.1, file search is supported natively (although nowhere quite as fast nor flexible as pkgfile, but does the job):
# pacman -Fy
# pacman -Fs libcurl.pc
core/curl 7.60.0-1
usr/lib/pkgconfig/libcurl.pc
# pacman -Fsq libcurl.pc
core/curl
Regarding this syntax to install the devel dependencies of a package:
sudo dnf install "pkgconfig(cairo)"
That seems really useful. But I don't see this syntax documented at the DNF Command Reference
https://dnf.readthedocs.io/en/latest/command_ref.html
Or, am I not seeing it?
Post a Comment