使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径
Posted
技术标签:
【中文标题】使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径【英文标题】:Installing pkg-config files to proper path on CentOS with automake 【发布时间】:2015-05-13 21:24:20 【问题描述】:我维护了几个使用 automake 构建的项目(我们称它们为 lib1 和 lib2)。 lib2 依赖于 lib1 作为库,而我在 CentOS 上的 pkg-config 默认值存在一些问题。理想情况下,我希望用户不必设置任何环境变量即可正确安装所有内容。
现在,它只是假设 $PREFIX/lib/pkgconfig
作为我的 .pc 文件的目的地,但在 CentOS 7 上,$PREFIX
的默认值为 /usr/local
但默认情况下 pkgconfig
仅在 /usr/share/pkgconfig
和 @ 中查找987654328@。因此,lib2
无法找到 lib1
和 pkg-config
,并且配置脚本崩溃了。
那么,问题来了,我在lib1
中的make install
如何正确检测到安装pkg-config
文件的目录?
【问题讨论】:
考虑将搜索目录添加到PKG_CONFIG_PATH
环境变量。 man pkg-config
有更多关于 env-vars 的详细信息。
效果很好。但是,我一直在寻找一种解决方案,以便通用平台(例如 RHEL/CentOS)使用它们的默认配置!
所以您想要基于configure.ac
中的PKG_CHECK_MODULES
宏的解决方案?如果目录没有内置到 pkg-config 的搜索路径中,您将需要在 somewhere 中设置搜索目录。
真正的问题不是在哪里搜索 pacakges,而是在哪里安装 .pc 文件。更像是一个宏来确定 pkgconfig 想要它的 pc 文件去哪里,因为在这种情况下 $prefix/lib/pkgconfig 似乎是错误的。
confg.site
控制在何处查找内容,例如基于 Red Hat 的系统上的 lib64
库目录。 Fedora 也遇到了这个问题。另见config.site for vendor libs on Fedora x86_64。
【参考方案1】:
来自man pkg-config
PKG_INSTALLDIR(目录)
将变量 pkgconfigdir 替换为模块应安装 pkg-config .pc 文件的位置。默认情况下 目录是 $libdir/pkgconfig,但可以通过传递 DIRECTORY 来更改默认值。用户可以通过
--with-pkgconfigdir
参数。
这允许您向用户公开 pkg-config 文件的安装目录(并且 - 如果您的发行版修补了 pkg-config 以使用非标准搜索路径,它有望为您的系统选择正确的默认值) .
例子:
配置.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
$
【讨论】:
以上是关于使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CentOS 上将 Python3.5.2 设置为默认 Python 版本?
如何在 centos 上将 subversion(svn) 1.6.11 版本升级到 1.8.5 版本?
在 CentOS 上将 PHP 5.3 更新到 PHP 5.5 后,我无法访问 phpmyadmin
如何在 centos 上将 dotnetcore 从 1.0.4 版本升级到 2.0.2 版本?