自動インストールフラグを制御する

FreeBSDにおいて、 インストールされているパッケージの自動インストールフラグを制御する方法、 コマンドを紹介します。

例によって自分用の備忘録を兼ねて。

FreeBSDには、あるportもしくはパッケージをアンインストールすると、そのパッケージが依存していたパッケージを自動的に削除する機能があります。下回りとしては pkg autoremove がそれですね。また portmaster を使っている場合には portmaster -ds というコマンドを使うこともあるでしょう。

これが実現できるのは、各パッケージが明示的にインストールされたのか、別のパッケージに必要だからインストール(=自動インストール)されたのか、その情報が記録されているからです。

しかしFreeBSDシステムをなんとなくで長期に運用していますと、この自動インストール情報が意図せぬ状態になり、pkg autoremove / portmaster -ds では削除されないパッケージが出てきてしまうことがあるのです。portsの更新が途中で止まって続きから実行する時とか…

そこで本記事では、この自動インストールフラグを制御するコマンド+オプションを紹介します。うん、前置きが長くなっちゃった。

まずは自動インストールされた(=暗黙的にインストールされた)パッケージの一覧を取得してみましょう。

自動インストールされているパッケージの一覧

pkg query -e '%a = 1' %o

次に自動インストールされていない(=明示的にインストールされた)パッケージの一覧を取得してみましょう。

自動インストールされていないパッケージの一覧

pkg query -e '%a = 0' %o

pkg query コマンドは条件に一致するパッケージを表示するコマンドです。-e で条件を指定でき %a は自動インストールフラグを意味しています。そして %o はパッケージ名というかその元になった ports の名前ですね。

この2つのコマンドで、各パッケージが自分が意図したどおりの自動インストールフラグを持っているかどうか確認しましょう。

ここでは仮に lang/ruby に自動インストールフラグが付いていなかった、つまりフラグを付けたいとすると、以下の様なコマンドを実行します。

自動インストールフラグを立てる

pkg set -A 1 lang/ruby

このようにフラグを付けた後に pkg autoremove を実行すると、もしも他のパッケージから使われていなければ、lang/ruby パッケージがアンインストールされるという寸法です。

逆に自動インストールフラグが付いてしまっていた、消したい場合には以下の様なコマンドになります。

自動インストールフラグを寝かす

pkg set -A 0 lang/ruby

なお pkg set コマンドは引数に複数のパッケージ名を受け取れないので、一度に沢山のフラグを操作するには xargs -L 1 を併用すると良いんじゃないでしょうか。

pkg query -e '%a = 0' %o | grep ruby | xargs -L 1 pkg set -A 1

だいたいこんな感じで、名前に ruby を含む全てのパッケージに対して、自動インストールフラグを設定できます。