メモの日々


2016年02月19日(金) [長年日記]

[howto][unix] RPMパッケージの依存関係の調べ方

CentOS 7を使っている。パッケージの依存関係の調べ方をメモ。

依存関係はrpmyumコマンドを使って調べられるが、一番便利そうなのはrepoqueryコマンドだった。repoqueryは yum-utils パッケージに含まれている。

指定パッケージが必要とするパッケージ一覧を得る

repoqueryの--requiresを使う。それだけだとパッケージ名ではなくcapabilityというものが表示されてしまうが、--resolveを付けるとパッケージ名が表示される。それだけだとパッケージ名にepochというものが付与されてしまうので、--qfで出力フォーマットを指定してみる。

$ repoquery --requires --resolve --qf='%{nvra}' gcc-c++ | sort
gcc-4.8.5-4.el7.x86_64
glibc-2.17-105.el7.i686
glibc-2.17-106.el7_2.4.x86_64
gmp-6.0.0-12.el7_1.x86_64
libmpc-1.0.1-3.el7.x86_64
libstdc++-4.8.5-4.el7.i686
libstdc++-4.8.5-4.el7.x86_64
libstdc++-devel-4.8.5-4.el7.i686
libstdc++-devel-4.8.5-4.el7.x86_64
mpfr-3.1.1-4.el7.x86_64
zlib-1.2.7-15.el7.x86_64

しかし、これだと指定パッケージが直接必要としているパッケージしか得られていない。間接的に必要とするパッケージも得たい場合は、--recursiveオプションを付ければよさそう。

$ repoquery --requires --resolve --qf='%{nvra}' --recursive gcc-c++ | sort
basesystem-10.0-7.el7.centos.noarch
bash-4.2.46-19.el7.x86_64
binutils-2.23.52.0.1-55.el7.x86_64
(省略)
tzdata-2015g-1.el7.noarch
xz-libs-5.1.2-12alpha.el7.x86_64
zlib-1.2.7-15.el7.x86_64

yumコマンドを利用する場合は、deplistサブコマンドが使える。

$ yum deplist gcc-c++ | grep provider | sort | uniq
   provider: gcc.x86_64 4.8.5-4.el7
   provider: glibc.i686 2.17-106.el7_2.4
   provider: glibc.x86_64 2.17-106.el7_2.4
   provider: gmp.x86_64 1:6.0.0-12.el7_1
   provider: libmpc.x86_64 1.0.1-3.el7
   provider: libstdc++-devel.i686 4.8.5-4.el7
   provider: libstdc++-devel.x86_64 4.8.5-4.el7
   provider: libstdc++.i686 4.8.5-4.el7
   provider: libstdc++.x86_64 4.8.5-4.el7
   provider: mpfr.x86_64 3.1.1-4.el7
   provider: zlib.x86_64 1.2.7-15.el7

repoqueryの--recursive相当の機能は無さそう。

rpmコマンドの場合は--requiresを指定するとcapability一覧が分かる。パッケージ名を得るなら--whatprovidesと組み合わせて

$ rpm -q --requires gcc-c++ | cut -d ' ' -f 1 | xargs rpm -q --whatprovides | sort | uniq
gcc-4.8.5-4.el7.x86_64
glibc-2.17-106.el7_2.4.x86_64
gmp-6.0.0-12.el7_1.x86_64
libmpc-1.0.1-3.el7.x86_64
libstdc++-4.8.5-4.el7.x86_64
libstdc++-devel-4.8.5-4.el7.x86_64
mpfr-3.1.1-4.el7.x86_64
rpmlib(CompressedFileNames) を提供するパッケージは存在しません。
rpmlib(FileDigests) を提供するパッケージは存在しません。
rpmlib(PartialHardlinkSets) を提供するパッケージは存在しません。
rpmlib(PayloadFilesHavePrefix) を提供するパッケージは存在しません。
rpmlib(PayloadIsXz) を提供するパッケージは存在しません。
zlib-1.2.7-15.el7.x86_64

とすればよさそう。rpmlibとは何なのか。

rpmコマンドの場合はインストール済みパッケージしか対象にできない。頑張れば再帰的にパッケージ名を得ることもできるかな。

指定パッケージを必要とするパッケージ一覧を得る

repoqueryの--whatrequiresが使える。

$ repoquery --whatrequires --qf='%{nvra}' gcc-c++ | sort
R-core-devel-3.2.3-4.el7.x86_64
abi-compliance-checker-1.99.13-1.el7.noarch
gcc-objc++-4.8.5-4.el7.x86_64
node-gyp-0.10.6-2.el7.noarch
octave-devel-3.8.2-18.el7.x86_64
qt-creator-3.5.1-1.el7.x86_64
systemtap-testsuite-2.8-10.el7.x86_64

--recursiveを使えば間接的に必要としているパッケージも得られる。

$ repoquery --whatrequires --qf='%{nvra}' --recursive gcc-c++ | sort
R-3.2.3-4.el7.x86_64
R-core-devel-3.2.3-4.el7.x86_64
R-devel-3.2.3-4.el7.x86_64
R-java-devel-3.2.3-4.el7.x86_64
R2spec-4.2.1-1.el7.noarch
abi-compliance-checker-1.99.13-1.el7.noarch
abi-tracker-1.4-2.el7.noarch
gcc-objc++-4.8.5-4.el7.x86_64
node-gyp-0.10.6-2.el7.noarch
npm-1.3.6-5.el7.noarch
octave-devel-3.8.2-18.el7.x86_64
pkgdiff-1.7.1-1.el7.noarch
qt-creator-3.5.1-1.el7.x86_64
qt-creator-data-3.5.1-1.el7.noarch
qt-creator-doc-3.5.1-1.el7.noarch
qt-creator-translations-3.5.1-1.el7.noarch
systemtap-testsuite-2.8-10.el7.x86_64

yumには同等の機能は無さそう。rpmの場合は--provicesと--whatrequiresを組み合わせて

$ rpm -q --provides gcc-c++ | cut -d ' ' -f 1 | xargs rpm -q --whatrequires | sort | uniq
abi-compliance-checker-1.99.13-1.el7.noarch
gcc-c++(x86-64) を必要とするパッケージは存在しません。

とすればよさそう。