如何确定 rpm 包是用哪些配置选项构建的?

ben*_*bot 6 compiling yum rpm configuration

这是我的第一个问题,我还是个新手,所以如果我遗漏或搞砸了什么,或者这是一个明显的解决方案,请原谅我。

我正在使用 CentOS 5.8(是的,我知道它很古老)并尝试测试一些鱿鱼配置

鱿鱼维基

NP:Squid 必须在构建前使用 --enable-http-violations 配置选项构建。

我已经进行了一些搜索,试图确定在哪里可以找到在包构建时指定的配置选项,但是由于没有通读所有 CentOS 文档,我似乎无法找到可以找到这些配置选项的位置。

我知道这个问题可能类似于这一个,但在这种情况下,具体的鱿鱼包可能已经定制的,而且我不知道我通过一些箍访问源不跳。

有没有一种方法可以在不提取规范文件的情况下使用 yum 或 rpm 列出配置标志?

slm*_*slm 6

您可以做的最接近的事情是查询%{OPTFLAGS}变量,以便大致了解用于给定 RPM 的编译器标志。

$ rpm -q --queryformat="%{NAME}: %{OPTFLAGS}\n" <package>
Run Code Online (Sandbox Code Playgroud)

但是,要获得实际的编译器选项,最好的办法是下载源 RPM (SRPM) 文件并查阅.spec用于构建它的文件。这是您可以找到用于构建给定 RPM 集的实际编译器选项的唯一真实来源。

1. 咨询 %{OPTFLAGS}

$ rpm -q --queryformat="%{NAME}: %{OPTFLAGS}\n" firefox
firefox: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

您可以查询 RPM 并指定您希望查询命令返回的结果的格式。在这种情况下,我们将返回 ,--queryformat="%{NAME}: %{OPTFLAGS}\n它返回包的名称以及该包的值%{OPTFLAGS}

您可以获得一个潜在查询标签的列表,如下所示:

$ rpm --querytags
Run Code Online (Sandbox Code Playgroud)

例子

$ rpm --querytags | grep OPTFLAGS
OPTFLAGS
Run Code Online (Sandbox Code Playgroud)

标签%{OPTFLAGS}定义如下

虽然该optflags条目在确定构建或安装平台方面没有发挥作用,但它确实在多平台包构建中发挥作用。该optflags条目用于定义可在构建过程中使用的标准选项集,特别是在编译过程中。

如果 RPM 在 Intel 80386 兼容架构上运行,则该optflags值将设置为-O2 -m486 -fno-strength-reduce。但是,如果 RPM 在基于 Sun SPARC 的系统上运行,optflags则将设置为-O2.

此项设置RPM_OPT_FLAGS环境变量,它可以在使用%prep%build%install脚本。

2. 咨询SRPM

为此,您可以像这样下载给定的 SRPM:

$ sudo yumdownloader --source <package name>
Run Code Online (Sandbox Code Playgroud)

然后,您可以提取.spec文件:

$ mkdir somedir; cd somedir
$ rpm2cpio ../firefox-29.0.1-1.fc19.src.rpm | cpio -ivd
Run Code Online (Sandbox Code Playgroud)

.spec然后可以查阅该文件:

$ ls -l | grep spec
-rw-r--r--. 1 saml saml     31913 Jun  7 08:03 firefox.spec
Run Code Online (Sandbox Code Playgroud)

注意:即使查阅.spec文件也可能无法揭示所使用的编译器选项,因为 RPM 规范宏%build在他们实际执行的操作中可能非常神秘,因此即使这种方法也可能不会显示编译器选项。

参考

  • @PavelŠimerda - 感谢您的反馈。修改了 A 以反映 `%{OPTFLAGS}` 的有限功能,并且还添加了一个关于咨询 SRPM 的部分。即使这不会给出 OP 想要的东西,但可能是您会找到的最接近的方法。 (2认同)

Pav*_*rda 2

问题是关于使用 RPM 元数据检索有关包特定编译时选项的信息。您要查找的信息不存在于 RPM 元数据中。您需要的不仅仅是一个 RPM(最好是包构建日志或构建目录中的一些文件),或者您需要使用特定于包的方式。

我不知道 CentOS 的构建信息的位置,对于 Fedora 来说它是:

http://koji.fedoraproject.org/

对于鱿鱼,封装的具体方式相当简单:

# squid -v
Squid Cache: Version 3.4.5
configure options:  '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--exec_prefix=/usr' '--libexecdir=/usr/lib64/squid' '--localstatedir=/var' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--with-logdir=$(localstatedir)/log/squid' '--with-pidfile=$(localstatedir)/run/squid.pid' '--disable-dependency-tracking' '--enable-eui' '--enable-follow-x-forwarded-for' '--enable-auth' '--enable-auth-basic=DB,LDAP,MSNT,MSNT-multi-domain,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB,getpwnam' '--enable-auth-ntlm=smb_lm,fake' '--enable-auth-digest=file,LDAP,eDirectory' '--enable-auth-negotiate=kerberos' '--enable-external-acl-helpers=LDAP_group,time_quota,session,unix_group,wbinfo_group' '--enable-storeid-rewrite-helpers=file' '--enable-cache-digests' '--enable-cachemgr-hostname=localhost' '--enable-delay-pools' '--enable-epoll' '--enable-icap-client' '--enable-ident-lookups' '--enable-linux-netfilter' '--enable-removal-policies=heap,lru' '--enable-snmp' '--enable-ssl' '--enable-ssl-crtd' '--enable-storeio=aufs,diskd,ufs' '--enable-wccpv2' '--enable-esi' '--enable-ecap' '--with-aio' '--with-default-user=squid' '--with-dl' '--with-openssl' '--with-pthreads' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic -fpie' 'LDFLAGS=-Wl,-z,relro  -pie -Wl,-z,relro -Wl,-z,now' 'CXXFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic -fpie' 'PKG_CONFIG_PATH=%{_PKG_CONFIG_PATH}:/usr/lib64/pkgconfig:/usr/share/pkgconfig'
Run Code Online (Sandbox Code Playgroud)

(以上输出是使用 Fedora rawhide 版本的鱿鱼制作的)

对于其他软件包,可能有也可能没有显示构建时配置的命令。要下载、提取和检查 SRPM 以猜测文件中编译的功能.spec,请参阅另一个答案的末尾。