pkgを1.3.7にアップグレードすると、インストール済み全パッケージの再インストールが求められる。
この回避方法について示す。

そもそも、なんでそんな事になっているかというと。
端的に言って、パッケージシステムでのshared libraryの扱いに難があったため、1.3.7でキッチリ修正したのだと。
その影響で、何も知らずにパッケージをアップグレードしようとすると、「shared libraryに変更があったため」と全パッケージを再インストールしようとしてしまう。

もちろん、別に全部再インストールしたって問題ないわけだが、帯域も時間も電気ももったいないので、再インストールを必要最低限に止める方法が公儀から発表された次第である。

詳細は以下をご覧あれ。

http://lists.freebsd.org/pipermail/freebsd-ports-announce/2014-August/000086.html

手順1.なにはともあれpkgを1.3.7に

2014/8/28現在である。

$ sudo pkg update
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB
Removing expired entries: 100%
Adding new entries: 100%
Incremental update completed, 23466 packages processed:
23297 packages updated, 133 removed and 76 added.

$ pkg version -vRL=|grep pkg
pkg-1.3.6                          <   needs updating (remote has 1.3.7)

キター。
さっそくpkgをアップグレードする。

$ sudo pkg upgrade pkg
パスワード:
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB

Incremental update completed, 23466 packages processed:
0 packages updated, 0 removed and 0 added.

New version of pkg detected; it needs to be installed first.
The following 1 packages will be affected (of 0 checked):

Installed packages to be UPGRADED:
        pkg: 1.3.6 -> 1.3.7

The process will require 9 KB more space
2 MB to be downloaded

Proceed with this action [y/N]:y

Fetching pkg-1.3.7.txz: 100% of 2 MB
Checking integrity... done (0 conflicting)
[1/1] Upgrading pkg from 1.3.6 to 1.3.7: 100%
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB

Incremental update completed, 23466 packages processed:
0 packages updated, 0 removed and 0 added.

Checking integrity...
 done (0 conflicting)
Your packages are up to date
$

オゲ。

手順2.レポジトリカタログの強制更新とパッケージ解析

pkgをアップグレードした瞬間にレポジトリカタログの更新も走っている。
したがって、もう一回pkg updateする必要はないのだが、念のため手順に沿ってもう一回やる。

$ sudo pkg update -f
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%   944 B   0.9k/s    00:01
Fetching digests.txz: 100%    2 MB 291.4k/s    00:07
Fetching packagesite.txz: 100%    5 MB 294.8k/s    00:18
Processing new repository entries: 100%
FreeBSD repository update completed. 23466 packages processed:
  0 updated, 0 removed and 23466 added.
$

当たり前だがアップデートも削除もなし。
次。
手順によるとpkg check -Baせよと。
これは何かというと、下記の通りインストール済みshared librariesを解析するものだそうな。
つまりこの解析の結果、全ファイル再インストールという事態を避けられるわけですな?

以下、-B, -aのオプション説明をmanから抜粋。

pkg check -B or pkg check --shlibs is used to reanalyse shared libraries
     of installed packages.

     -a, --all     Process all packages.

実行…するが、ひょっとすると時間がかかるかも。
仮想マシン、かつ750個くらいパッケージがある状態で1時間近くかかった。
しかし実マシン(hp microserver)、120個くらいで2分。
パッケージの数、装置スペックによって前後するだろうが覚悟のこと。

改めて実行。

$ sudo pkg check -Ba
Checking all packages:  37%
pkg: fstat() failed for(/usr/local/include/cdio++/enum.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio++/mmc.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio++/read.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio/udf_file.h): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libcdio++.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libcdio.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libiso9660++.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libiso9660.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libudf.so): No such file or directory
Checking all packages: 100%
$

あとは通常通りpkg upgradeでよい。
理不尽な再インストールを求められることもありません。