web-dev-qa-db-ja.com

rpmパッケージがどの構成オプションでビルドされているかをどのように判断しますか?

これは私の最初の質問で、私はまだかなり新しいので、何かを見逃したり、失敗したりした場合、またはこれが明らかな解決策である場合は、ご容赦ください。

私はCentOS 5.8を使用しています(はい、それは古いことを知っています)、いくつかのSquid構成をテストしようとしています

Squid wiki から:

NP:Squidは、ビルドする前に--enable-http-violations configureオプションでビルドする必要があります。

パッケージのビルド時に指定された構成オプションがどこにあるかを確認するためにいくつかの検索を行いましたが、CentOSのすべてのドキュメントを読むだけでは、これらの構成オプションがどこにあるのかを見つけることができません。

この質問が this one に似ていることは知っていますが、この場合、特定のsquidパッケージがカスタムビルドされている可能性があり、いくつかのフープを飛び越えずにソースにアクセスできるかどうかはわかりません。

Specファイルを抽出せずに、yumまたはrpmで構成フラグをリストする方法はありますか?

6
bendobot

問題は、RPMメタデータを使用して、パッケージ固有のコンパイル時オプションに関する情報を取得することです。探している情報がRPMメタデータに含まれていません。 RPM(理想的にはパッケージビルドログまたはビルドディレクトリの一部のファイル)だけではなく、パッケージ固有の方法を使用する必要があります。

CentOSのビルド情報の場所はわかりません。Fedoraの場合は次のようになります。

http://koji.fedoraproject.org/

Squidの場合、パッケージ固有の方法はかなり簡単です。

# 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'

(上記の出力は、Fedoraのrawhideバージョンのsquidを使用して作成されました)

他のパッケージの場合、ビルド時の構成を表示するコマンドがある場合とない場合があります。 SRPMのダウンロード、抽出、および.specファイルからの機能でコンパイルされた機能の推測については、他の回答の最後を参照してください。

1
Pavel Šimerda

最も近い方法は、%{OPTFLAGS}変数をクエリして、特定のRPMに使用されたコンパイラフラグの概要を把握することです。

$ rpm -q --queryformat="%{NAME}: %{OPTFLAGS}\n" <package>

ただし、実際のコンパイラオプションを取得するには、ソース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

使い方

RPMをクエリして、クエリコマンドが返す結果の形式を指定できます。この場合、--queryformat="%{NAME}: %{OPTFLAGS}\nを返します。これは、パッケージの名前とそのパッケージの値%{OPTFLAGS}を返します。

次のような潜在的なクエリタグのリストを取得できます。

$ rpm --querytags

$ rpm --querytags | grep OPTFLAGS
OPTFLAGS

タグ %{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>

次に、.specファイルを抽出できます。

$ mkdir somedir; cd somedir
$ rpm2cpio ../firefox-29.0.1-1.fc19.src.rpm | cpio -ivd

その後、.specファイルを参照できます。

$ ls -l | grep spec
-rw-r--r--. 1 saml saml     31913 Jun  7 08:03 firefox.spec

注:.specファイルを調べても、RPMスペックマクロ%buildであるため、使用されているコンパイラオプションを明らかにできない可能性があります。彼らが実際に何をしているのか非常に謎めいている可能性があるので、このアプローチでさえコンパイラーオプションを表示しないでしょう。

参考文献

6
slm