Last modified: Friday, July 17, 2026

FreeBSD portsのoptionsファイルを再構築する

FreeBSD,ports,options,pkg,rebuild

15年ほど動かしているFreeBSDマシンの/var/db/ports/以下に、新旧のportsオプション情報が混在していることに気付きました。 ここの下は最近(と言っても、2013年6月以降)では、「カテゴリ名_ports名」のディレクトリ名になっています(例:x11_xorg-apps)。 昔はカテゴリ名が付いていなかったようで、これがずっと残っていたようです。

古い形式のディレクトリをばっさり削除するスクリプトを使ったはずが、手違いでなぜか /var/db/ports 自体が消えてしまっていました。あちゃーー

特にバックアップも残っていなかったので、現在インストール済みのpkgデータベースの情報から/var/db/ports/を再構築することにしました。 理屈ではできるはずなので、次の仕様をChatGPTに教えて手伝ってもらいました。

以上の処理を2段階で行うスクリプトにしました。

Step 1

Step 1のスクリプトを実行すると、次のファイルが生成されます。

このスクリプトは、built_by がないパッケージをすべて復元候補にします。そのため、recover.list には次のものも含まれます。

一方、依存portについてもユーザーがOPTIONSを変更していた可能性があるため、Step 1では automatic=1 のものを除外していません。 recover-packages.tsv の最終列が 1 なら依存関係として自動登録されたパッケージ、0 なら明示的に導入されたパッケージです。

Step 2

Step 2では、各originについて次の処理を行います。 入力として、Step 1で生成したrecover.listを取ります。

  1. 現在のportから OPTIONS_NAME、COMPLETE_OPTIONS_LIST、デフォルトの PORT_OPTIONS を取得
  2. インストール済みパッケージの %Ok (OPTIONS名)・%Ov (OPTIONS値) からビルド時OPTIONSを取得
  3. 現在も存在するOPTIONSは、パッケージ記録の値を優先
  4. パッケージ構築後に追加されたOPTIONSは、現在のデフォルト値を採用
  5. 削除・改名された古いOPTIONSは復元せず、ログへ記録
  6. /var/db/ports ではなく /tmp/recovered-ports に生成

Step 2のスクリプトを実行すると、次のログファイルが生成されます。

確認

生成されたoriginについて、ports frameworkがoptionsファイルを正常に読み込めるか一括検証します。

validate-recovered-options.sh

このスクリプトの実行結果が Validation failures: 0になれば、構文及び現在のports treeとの整合性は確認できたと判断できます。

実際に、例えば editors/emacs の設定を検証する場合は、OPTIONS_NAMEを直接仮定せず、次のように確認します。

cd /usr/ports/editors/emacs

make PORT_DBDIR=/tmp/recovered-ports -V OPTIONS_NAME
make PORT_DBDIR=/tmp/recovered-ports showconfig

インストール

最後に、空の/var/db/ports に対してインストールします。

install -d -m 755 /var/db/ports
cp -Rp /tmp/recovered-ports/. /var/db/ports/

おわりに

portsのオプション情報なので、無いなら無いでいいんですが、せっかくなのでpkgから復元してみました。 同じように/var/db/ports/を消してしまって困っている時に限って使ってください。 実際に使う時は十分にチェックしながらお願いします。 何が起こっても責任は取れません。


布目 淳@京都工芸繊維大学コンピュータシステム研究室 (nunome@kit.ac.jp)