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

使用automake将pkg配置文件安装到CentOS上的正确路径,centos,automake,pkg-config,Centos,Automake,Pkg Config,我维护了几个使用automake构建的项目(我们称它们为lib1和lib2)。lib2依赖于lib1作为库,我对CentOS上的pkg配置默认值有一些问题。理想情况下,我希望用户不必设置任何环境变量来正确安装所有内容 现在,它只是假设${PREFIX}/lib/pkgconfig是我的.pc文件的目标,但是在CentOS 7上,${PREFIX}的默认值是/usr/local,但是pkgconfig默认情况下只在/usr/share/pkgconfig和/usr/lib64/pkgconfig中

我维护了几个使用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
文件的目录

PKG_INSTALLDIR(目录)

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

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

例如:

configure.ac:

[...]
PKG_INSTALLDIR
[...]
Makefile.am:

[...]
pkgconfig_DATA = lib1.pc
[...]
用法

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

有很多发行版,仅仅因为在我的社区中流行一个发行版,这并不意味着其他社区也是如此(或者不会改变)

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

另外,我认为这相当奇怪,您的
pkg配置
不会在
/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
$

考虑向环境变量添加搜索目录。code>man-pkg-config提供了有关env-vars的更多详细信息。这很好。然而,我一直在寻找一种解决方案,使通用平台(如RHEL/CentOS)能够使用其默认配置!那么您想要一个基于
configure.ac
中的
PKG\u CHECK\u MODULES
宏的解决方案吗?如果pkg config的搜索路径中没有内置目录,则需要在某处设置搜索目录。问题实际上不是在何处搜索pacakes,而是在何处安装.pc文件。更像是一个宏,它可以找出pkgconfig希望它的pc文件放在哪里,因为在这种情况下${prefix}/lib/pkgconfig似乎是错误的。
confg.site
控制查找内容的位置,比如基于Red Hat的系统上的
lib64
的库目录。Fedora也面临这个问题。另见。
$ 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
$