`dnf install 'pkgconfig(NAME)'`语法究竟是如何工作的?

问题描述 投票:0回答:2

Fedora 打包指南永久链接)正式建议在声明构建依赖项时使用

pkgconfig(NAME)
语法。例如,您可以声明
BuildRequires: libxcb-devel
,而不是
BuildRequires: pkgconfig(xcb)
。 (同样,
dnf install 'pkgconfig(xcb)'
会提供安装
libxcb-devel
,这就是为什么我认为这是
dnf
的功能,而不是 SPEC 文件处理器。)

我一直很好奇,老实说,这几年我一直在做包装,这一直困扰着我——这到底是如何工作的?我知道

pkg-config
(或
pkgconf
)使用
.pc
文件来确定库的关联名称和参数,并且这些
.pc
文件随开发库一起提供(Fedora 上的
*-devel
包)。但这就是问题所在 - 在安装提供
dnf
文件的
pkgconfig(xcb)
之前,构建系统(更具体地说,
libxcb-devel
)如何解析类似
.pc
的声明?

此时我能想到的唯一可能的解释是,是否存在某种远程存储库中所有

.pc
文件的中央注册表,
dnf
可以轻松查询。但我完全找不到这方面的文档,也没有注意到各个镜像中存在这样的文件。

那么

dnf install pkgconfig(NAME)
到底有什么魔力呢?
pkgconfig(NAME)
和它们指向的具体包之间是否存在映射(或计算映射的命令)?这将使我在
BuildRequires:
中查找要声明的正确名称的过程变得更加容易。

packaging pkg-config dnf
2个回答
1
投票

所以我做了一些挖掘,结果发现

pkgconfig(...)
条目在包元数据中被列为“提供”条目。因此
pkgconfig(...)
语法实际上并没有什么特别之处;这只是dnf眼中的另一根弦而已。事实上,在 dnf 存储库 中快速搜索根本不会返回任何内容:

$ rg 'pkg-?conf(ig)?'
# nothing printed

在包构建过程中,

rpmbuild
似乎会查找spec文件声明的所有
*.pc
文件,并生成相应的
pkgconfig(...)
提供条目。这些条目存储在包元数据中,这意味着即使在安装包之前也可以轻松查询它们。

要列出包提供的项目,请运行:

$ dnf repoquery --provides <PKG>

# for example (bzip2-devel, RHEL8)
$ dnf repoquery --provides bzip2-devel
bzip2-devel = 1.0.6-26.el8
bzip2-devel(x86-32) = 1.0.6-26.el8
bzip2-devel(x86-64) = 1.0.6-26.el8
pkgconfig(bzip2) = 1.0.6

要列出提供项目的包,请运行:

$ dnf provides <ITEM>

# for example (pkgconfig(bzip2), RHEL8)
# note that parentheses need to be either quoted or escaped
# see https://unix.stackexchange.com/a/26064/375550
$ dnf provides 'pkgconfig(bzip2)'
bzip2-devel-1.0.6-26.el8.i686 : Libraries and header files for apps which will use bzip2
Repo        : rhel-8-for-x86_64-baseos-rpms
Matched from:
Provide    : pkgconfig(bzip2) = 1.0.6

bzip2-devel-1.0.6-26.el8.x86_64 : Libraries and header files for apps which will use bzip2
Repo        : rhel-8-for-x86_64-baseos-rpms
Matched from:
Provide    : pkgconfig(bzip2) = 1.0.6

0
投票

接受的答案主要讨论运行时依赖关系以及DNF如何解决它们。

然而,在

BuildRequires:
字段中,
pkgconfig()
语法的使用更多地与
pkgconf
如何解决构建时依赖关系有关。引用您链接到的指南

给定包的构建基础设施通常会使用 pkg-config 来查找和使用所需的库。

因此,pkgconfig(foo) 是构建依赖项的真实声明

请注意,在 Fedora 26 之后,这意味着 Ariadne Conill 的

pkgconf
。以下提交与此处相关

https://github.com/pkgconf/pkgconf/commit/f9101659bc46401ad412d3132ba4fe09d06fec91

https://github.com/pkgconf/pkgconf/commit/d304d9cb2e3ddd1aada1eaa6211b1b41015a246a

© www.soinside.com 2019 - 2024. All rights reserved.