FreeBSD を利用する場合の、build や install に関するメモです。

新スタイルの buildworld

/usr/src 直下で make を直接叩くことで、world や kernel を作成できます。新しいバージョンに更新する場合には、作成されるタイミングを考慮して build コマンドを叩くようにしましょう。

たとえば、新しいバージョンに更新する場合には buildworld buildkernel と叩くことになります。

kernel を作成する場合、通常新しい world によって作成されることになり、これはターゲットとなる kernel を作るためには、次のようなステップを踏むためです。

  1. 新しい world/kernel を作るための build tool を作成する。
  2. 作成した build tool を使い、新しい world を作成する。
  3. 作成した build tool を使い、新しい kernel を作成する。

これは、build 環境が 2.x 時代で a.out バイナリ環境で、build されるターゲット環境が 3.x で ELF バイナリにする、という場合で考えるとわかりやすいでしょう。

build tool は 2.x 用 a.out バイナリで、そこから出力されるバイナリが 3.x 用 ELF バイナリになります。クロスコンパイル時にも同様の形でないと出力できない事は想像に難くないでしょう。

最新ソースに更新して kernel を作り直す場合には、kernel が新しい機能を利用したりする場合がありますので、変更内容を確認してから kernel を作り直すようにしましょう。変更点がわからない場合は、buildworld/buildkernel をセットで行いましょう。;)

なお、kernel を作る場合には make buildkernel KERNCONF=MYKERNEL、kernel を作っていれる場合には make buildkernel installkernel KERNCONF=MYKERNEL という感じになります。

world も作る場合には make buildworld buildkernel KERNCONF=MYKERNEL と、world を作って入れる場合には make buildworld buildkernel installkernel installworld KERNCONF=MYKERNEL とします。

なお、変更点を確認し、mergemaster が必要な場合には mergemaster も行いましょう。わからない場合は、world を更新したら mergemaster を行う、という事を覚えておきましょう。

なお、当然のことながら、先に handbook の world 更新に関する部分を一読しておくことをお勧めします。

mergemaster を簡単に

mergemaster -siva 後、mergemaster -sivr すると楽に作業が行えます。

-siva により、現在環境にないファイルをコピーしますので、変更のあるファイルのみを -sivr で適用することになりますので、単に mergemaster する場合よりも格段に作業量が減ります。

なお、変更点を merge する場合、R は replace、L は leave として覚えた方が間違いが少なくてすみます。right/left では考えないようにしましょう。:)

portupgrade ユーティリティの利用

ports からアプリケーションをインストールする場合、新しいバージョンに更新する際には、ports ツリーを更新する前にあらかじめ make deinstall するか、pkg_delete で削除した後に make install する必要があります。

こうした通常の方法では、pkg_delete し忘れてしまった場合などにゴミが残るなどの弊害があります。

こうした問題を避けたりするには、sysutils カテゴリにある portupgrade ユーティリティをインストールしておくと、非常に容易に管理が行えるようになります。

portupgrade ユーティリティによるアプリケーションのインストールは、大きく分けて新規インストールの portinstall と、既にインストールされているアプリケーションを更新する portupgrade の 2 つに分けられます。

この他に、もっとも利用されるユーティリティはインストールされているアプリケーションのバージョンを確認するための portversion と、インストールされているバージョン管理データベースの不整合を修正する pkgdb ツールです。

portinstall/portupgrade は、ports システムを利用しますので、依存関係を見て必要な物を自動的にインストールしてくれます。

また、必要な ports が更新されている場合、そちらも更新したい、という場合のために -r オプションを指定することで同時に build し直してくれます。

逆に、アップグレード対象の ports に依存している ports がある場合、そちらも作り直したい、という場合には -R オプションを指定します。

この他、強制的に build しなおしたい、という場合には -f オプションを利用します。

この 3 つを組み合わせ、portupgrade -frR png といった形で指定すると、png に依存するもの、png が依存するものを強制的に全て作り直す、といった事が行われます。これは、ライブラリのメジャーバージョンが上がったときなど依存関係のものを全部作り直したい、といった場合に有効です。

portinstall や portupgrade などは、portsdb ユーティリティによって作られるバージョン管理データベースを利用しています。

このデータベースは ports ツリーのデータを元に作成されますので、ports ツリーを更新したら portsdb -uU で更新する、という癖を付けておくと良いでしょう。

このデータベースが更新されていないと、新しく追加された ports が portinstall/portupgrade から見つけられない、という事になったりします。

portinstall/portupgrade でインストールする ports は列挙することができます。クライアント環境を構築する場合、最初に portinstall XFree86 wrapper screen zsh windowmaker などと列挙することで、一気にインストールすることも可能です。

なお、ここで列挙された項目の依存関係は、portinstall/portupgrade が勝手に面倒を見てくれますので、必要そうな物はガンガンと書いて良いでしょう。

また、packages の形でインストールされる商用アプリケーション (Wnn7 など) などでは、ports ツリーには当然データが無いことになります。

こうした場合、pkgdb -F で不整合を解消する場合に必ず引っ掛かる場面が出てきます。この場合、/usr/local/etc にインストールされる pkgtools.conf に HOLD_PKGS という項目があります。

ここに項目を追加することで、整合性確認の際に対象から外すことができるようになります。ここにはパッケージ名で指定しますので、/var/db/pkg 下で確認しておくと良いでしょう。

なお、たとえば Wnn の場合には 'ja-dpkey7*', 'ja-wnn7-*', といった形でワイルドカード指定すると、マイナーバージョンアップの場合の影響を受けずに指定することができます。

マニュアルを最新に維持する

日本語マニュアルを最新に維持する場合には、一番簡単な方法は CVS を利用することです。

/usr/share/examples/cvsup/doc-supfile を利用して、まず /usr/doc 以下を最新バージョンに更新します。

次に、目的の言語コードに合わせて /usr/doc/lang.encode/man 以下で make && make install することで、/usr/share/man 以下に最新のマニュアルをインストールできます。lang.encode は、自分が利用するものを選んでください。日本語であれば ja_JP.eucJP とかでしょう。

なお、標準の英語マニュアルは installworld 時に更新されるため、追加で必要となるマニュアルだけを更新するだけで良いようになっています。

なお、マニュアルだけではなく、handbook 等全てを更新する場合には、/usr/doc/ja_JP.eucJP 以下で make すると良い様になっています。

なお、この場合には FreeBSD Documentation Project Primer for New Contributors にある通り、textproc/docproj メタポートを利用し、必要なアプリケーションを全て入れると簡単に行えます。

TeX を必要としない形式だけを生成したい場合には make JADETEX=no install として TeX 用のソフトをインストールしないようにしておけば、ディスクスペースや処理時間の削減になります。

また、ドキュメントを生成する際には /usr/doc/ja_JP.eucJP などの下で make FORMATS=txt や make FORMATS="html txt" とします。

なお、常に一定の形式しか生成しない場合、/etc/make.conf 以下に FORMATS を指定しておくと良いでしょう。この場合には、FORMATS=html txt などと列挙するだけで、"" によって括る必要はありません。