2017/02/13

pkg_rolling-replace

pkgsrcからインストールしたパッケージを更新するために自作スクリプトを利用しようと思いましたが、どうも調子が良くありません。気になった問題点は次のようなところです。
  • 処理中にエラーが出た場合、運が悪いと依存するパッケージの一部が削除済みになっていて、復活させる手段がない。
  • 依存するパッケージを何度もビルドしているような気がして、効率が悪そうな気がする。

これらの問題を頑張って解決するように自作スクリプトを改良するよりも、既に利用されているツールを使う方が安心感があると思うようになりました。pkgsrcの中にpkgtools/pkg_rolling-replaceというものがあるので使ってみました。

使ってみたところ、今後のpkgsrcの更新はpkg_rolling-replaceを使っていこうという気になりました。ただし若干問題点があるので注意は必要です。

依存関係を辿って多くのパッケージをビルドし直すために、とても時間がかかります。もしビルド中にエラーが出てしまうとシステムの不整合がおきる可能性が残ります。これは最終的にpkg_rolling-replaceが正常終了してくれれば整合性が保たれることになりますが、途中でエラーが出たら放置しておいてはいけません。このことは「how to upgrade packages」でも指摘されています。
Because pkg_rolling-replace just invokes make replace, the problems of ABI changes with make replace apply to pkg_rolling-replace, and the system will be in a state which might be inconsistent while pkg_rolling-replace is executing. But, by the time pkg_rolling-replace has successfully finished, the system will be consistent because every package that has a depending package 'make replaced' out from under it will be marked unsafe_depends, and then replaced itself. This replace "rolls" up the dependency tree because pkg_rolling-replace sorts the packages by dependency and replaces the earliest needing-rebuild package first.

今回の実行中には次のようなエラーが出てしまいました。出力されているメッセージだけを見るとディレクトリを変えられなかったというだけで、何が問題なのか見えません。どうやら数か月前にdevel/gmockが廃止され、devel/googletestに統合されたようです。既にdevel/gmockがインストールされていたので、pkg_rolling-replaceは更新対象としようとしてエラーが出てしまったようです。pkg_deleteでgmockを削除しようとしたら、依存関係があるため単独では消せませんでした。-fオプションを指定して強制的に削除して、あとはpkg_rolling-replaceの処理にまかせました。
RR> Checking if gmock has new depends...
cd: can't cd to /usr/pkgsrc/devel/gmock
make: don't know how to make show-depends. Stop

またpkgsrcの各パッケージが必要とするdistfilesをダウンロードするため/usr/pkgsrc/mk/defaults/mk.confから日本固有の設定を/etc/mk.confに転記しておいたのですが、こうするとパッケージによってはdistfilesをダウンロードできなくてビルドが止まってしまいました。この設定を調整して問題がないようにすべきところでしょうが、今後の課題とします。

0 件のコメント:

コメントを投稿