2016年02月19日(金) [長年日記]
■ [howto][unix] RPMパッケージの依存関係の調べ方
CentOS 7を使っている。パッケージの依存関係の調べ方をメモ。
依存関係はrpmやyumコマンドを使って調べられるが、一番便利そうなのは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) を必要とするパッケージは存在しません。
とすればよさそう。