使用 automake 将 pkg 配置文件安装到 CentOS 上的正确路径



我维护了几个使用automake构建的项目(我们称它们为lib1和lib2)。 lib2 依赖于 lib1 作为一个库,我对 CentOS 上的 pkg 配置默认值有一些问题。 理想情况下,我希望用户不必设置任何环境变量即可正确安装所有内容。

现在,它只是假设${PREFIX}/lib/pkgconfig是我的 .pc 文件的目的地,但在 CentOS 7 上,${PREFIX} 的默认值是 /usr/local 但默认情况下pkgconfig只在/usr/share/pkgconfig/usr/lib64/pkgconfig中查找。 因此,lib2找不到pkg-config lib1,配置脚本会崩溃。

所以,问题是,我的make install lib1如何正确检测安装pkg-config文件的目录?

来自 man pkg-config

PKG_INSTALLDIR(目录)

将变量 pkgconfigdir 替换为模块应安装 pkg-config .pc 文件的位置。默认情况下 目录是 $libdir/pkgconfig,但可以通过传递 DIRECTORY 来更改默认值。 用户可以通过 --with-pkgconfigdir参数。

这允许您向用户公开 pkg-config 文件的安装目录(并且 - 如果您的发行版修补 pkg-config 以使用非标准搜索路径,它希望为您的系统选择正确的默认值)。

例:

configure.ac:

[...]
PKG_INSTALLDIR
[...]

Makefile.am:

[...]
pkgconfig_DATA = lib1.pc
[...]

用法

$ ./configure --prefix=/usr --with-pkgconfigdir=/usr/lib64/pkgconfig

注意

请不要对pkg-config查找文件的位置做出特定于发行版的假设。始终使用默认值(它们是有充分理由的默认值),并提供一种为非标准系统覆盖这些默认值的方法。

那里有很多分布,仅仅因为在我的社区中占上风,这并不意味着其他社区也是如此(或不会改变)。

如果您的发行版不遵循标准,那没关系,但它应该是一致的;如果它不能保持一致(例如 pkg-config /foo/baz中查找文件,但PKG_INSTALLDIR pkgconfigdir扩展到 /usr/lib/pkg-config ),那么您应该在发行版中报告错误。

另外,我认为这很奇怪,您的pkg-config不会在/usr/local中搜索文件。例如,在我的 Debian/sid 系统上,它首先搜索/usr/local,然后/usr

$ which pkg-config
/usr/bin/pkg-config
$ strace -e trace=open pkg-config --cflags foo 2>&1  | grep /usr
open("/usr/local/lib/x86_64-linux-gnu/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/share/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("/usr/lib/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("/usr/share/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
$

最新更新