FreeBSD ports の手入れについて

# FreeBSD の ports は時々依存関係が・・・

オプションの都合でしょうか、どう見ても必要なさそうなものがどんどん追加されていく傾向にあるのが、pkg/portsの宿命です。

元々の開発者が、

- イケテないライブラリを単に使いたくなくなってしまった。
- 依存しているライブラリの開発チームが喧嘩別れでも起こして更新（バグ取り）が止まってしまった
- 配布ライセンス変更で、便利なライブラリを捨て、別なものを使う羽目に陥る。

などのイベントに出くわしてしまうと、後には孤児となったライブラリパッケージとその依存関係だけが残ります。


## portsupgrade で出来ないこと。
/usr/ports/ports-mgmt/portupgrade だけに頼っているとこんな問題に出くわします。

<pre>
** Listing the failed packages (-:ignored / *:skipped / !:failed)
	* devel/py-setuptools (py36-setuptools-40.6.2)
	* devel/py-setuptools (py27-setuptools-40.6.2)
	* devel/py-pytz (py36-pytz-2018.7,1)
	* devel/py-pyasn1 (py36-pyasn1-0.4.2)
	* security/py-bcrypt (py36-bcrypt-3.1.5)
	* databases/py-sqlite3 (py27-sqlite3-2.7.15_7)
</pre>

これらはなんらかの理由で残されてしまったライブラリだったり、更新を邪魔する依存関係に組み敷かれているため、残しておくとろくなことがありません。

## pkg のコマンドで対応。

"pkg autoremove" は、このところ、頻繁に手入れに使っています。
これを知るまでは pkg_cutleaves を使ってチマチマ選定していました。
こいつは、古くなってどこからも <b><i>依存していない筈</i></b> のパッケージを自動でざっくり捨てます。判断間違いもありますが、問題になりそうな関係を解消してしまうので、後から足りないものを見つけてくる管理ツールで全部修復できます。


<pre>
$ sudo pkg autoremove 
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 12 packages:

Installed packages to be REMOVED:
	bison-3.2.2,1
	gettext-tools-0.19.8.1_1
	gmake-4.2.1_3
	help2man-1.47.8_1
	libtool-2.4.6_1
	p5-Locale-gettext-1.07
	texinfo-6.5_4,1
	p5-Locale-libintl-1.31
	p5-Module-Build-0.4224
	p5-Text-Unidecode-1.30
	p5-Unicode-EastAsianWidth-1.40
	pkgconf-1.6.0,1

Number of packages to be removed: 12

The operation will free 28 MiB.

Proceed with deinstalling packages? [y/N]: y
[1/12] Deinstalling help2man-1.47.8_1...
[1/12] Deleting files for help2man-1.47.8_1: 100%
[2/12] Deinstalling texinfo-6.5_4,1...
[2/12] Deleting files for texinfo-6.5_4,1: 100%
[3/12] Deinstalling bison-3.2.2,1...
[3/12] Deleting files for bison-3.2.2,1: 100%
[4/12] Deinstalling gettext-tools-0.19.8.1_1...
[4/12] Deleting files for gettext-tools-0.19.8.1_1: 100%
[5/12] Deinstalling gmake-4.2.1_3...
[5/12] Deleting files for gmake-4.2.1_3: 100%
[6/12] Deinstalling libtool-2.4.6_1...
[6/12] Deleting files for libtool-2.4.6_1: 100%
[7/12] Deinstalling p5-Locale-gettext-1.07...
[7/12] Deleting files for p5-Locale-gettext-1.07: 100%
[8/12] Deinstalling p5-Locale-libintl-1.31...
[8/12] Deleting files for p5-Locale-libintl-1.31: 100%
[9/12] Deinstalling p5-Module-Build-0.4224...
[9/12] Deleting files for p5-Module-Build-0.4224: 100%
[10/12] Deinstalling p5-Text-Unidecode-1.30...
[10/12] Deleting files for p5-Text-Unidecode-1.30: 100%
[11/12] Deinstalling p5-Unicode-EastAsianWidth-1.40...
[11/12] Deleting files for p5-Unicode-EastAsianWidth-1.40: 100%
[12/12] Deinstalling pkgconf-1.6.0,1...
[12/12] Deleting files for pkgconf-1.6.0,1: 100%
</pre>

## portsmaster を使う

本来は削ってはいけなかったものを探して戻すことが必要です。

<pre> 
$ sudo portsmaster -aGd 
</pre>

この後に、
<pre>
$ sudo portupgrade -a --batch
</pre>

としておけば、大体は解決される筈です。
これでも残るものは、 /usr/ports/UPDATING を見ておきましょう。

<pre>$ sudo portsnap fetch update</pre>

で更新されてなかったなんて話もたまにあります。
更新がたまると手動でのメンテナンスが必要な時に待たされます。
crontabに追記しておくことが望ましいです。

## 全部自動化すれば・・・
そんなことを考えたことが昔はありましたが、そこそこパッケージ依存性があるWeb系システムが構築されていると、定期的に行われるであろう自動更新で無慈悲にも依存ライブラリを消すことがあって起動しなくなってしまう事故は珍しくありません。無論トンがった開発用システムで自動更新を掛けて composerを毎日回しても、「正規表現ライブラリが変わったよ」なんて大規模変更では確実に破綻を生じてしまい修羅場を迎えることが間違いありませんので、手動で更新する際には必ず計画して関係者に通告しなければなりません。

## 追記 2019/04/12
FreeBSD12.0 まっさらなサーバから導入作業をしていて、portupgrade まではできたものの、その先がどうしても進めないことがあります。（さっき出た。。）

<pre>
root@strnh:/usr/ports/ports-mgmt/portupgrade # portinstall sudo zsh
Fetching the ports index ... Certificate verification failed for /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
34370572288:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:/usr/src/crypto/openssl/ssl/statem/statem_clnt.c:1925:
fetch: https://www.FreeBSD.org/ports/INDEX-12.bz2: Authentication error

</pre>

こういう時は 
<pre>
# pkg install ca_root_nss
</pre>

これで大抵は解決します（マシンの時計が狂ってるなんて時もたまにあります。。）

## 追記 2019/06/23
~~net/samba48 は、先月あたりから保守されている方の都合で、依存する以下、~~
などと勝手に思い込んでいますが、どうもまだ混乱しているようです。

* tevent は tevent1
* talloc は talloc1

と、変更されました。これらは競合する関係にあるのため、古い Makefileで
指定された依存関係が保存されていると、バッティングします。
~~対応するには、~~
<pre>
$ cd /usr/ports/net/samba48
$ sudo make config
</pre>
の作業が必要です。~~オプションを変更する必要は多分ないですが、
本来なら portsnap で日々更新していれば勝手に依存関係も
入れ替えられても問題ないと考えますが、実際には talloc1/tevent1
のように、多分 portsnap が動作した時点では、インストールパッケージ
として存在していないもので構築が完了した状態になっているときは、
一旦 make config して再構築するのが筋のようです。~~