BSD界隈四方山話

第4回FreeBSD 11からGNU roffをHeirloomへ変更

GNU groffを廃止してHeirloom DocToolsを導入 - FreeBSD 11

FreeBSDプロジェクトは2015年5月14日(協定世界時⁠⁠、開発ブランチのメーリングリストに投函したメール[RFC] Replace gnu groff in base by heirloom doctoolsにおいて、FreeBSD 11を目処にベースシステムからGNU groffを排除し、代わりに「Heirloom Documentation Tools」の機能の一部をFreeBSDのベースにマージする計画を発表しました。

具体的には/usr/bin/にインストールされるgroff(1)、mmroff(1)、nroff(1)、psroff(1)、troff(1)がベースシステムから廃止され、かわりにHeirloom Documentation Toolsからnroff(1)およびtroff(1)コマンドが導入されるものとみられます。

図1 FreeBSD 10.1-RELEASEのユーザランドにマージされているroff系コマンド
% ll /usr/bin/ | grep roff
-r-xr-xr-x   1 root  wheel      60168 Dec 25 11:30 groff
-r-xr-xr-x   1 root  wheel       2975 Dec  1  2013 mmroff
-r-xr-xr-x   1 root  wheel       2573 Dec 25 11:30 nroff
-r-xr-xr-x   1 root  wheel        148 Dec 25 11:30 psroff
-r-xr-xr-x   1 root  wheel     470808 Dec 25 11:30 troff
%
図2 FreeBSD 10.1-RELEASEに統合されているgroff(1)コマンド
% /usr/bin/groff -v
GNU groff version 1.19.2
Copyright (C) 2004 Free Software Foundation, Inc.
GNU groff comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of groff and its subprograms
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

called subprograms:

GNU grops (groff) version 1.19.2
GNU troff (groff) version 1.19.2
%

GNU groffは主にroff形式のオンラインマニュアルのフォーマットに使われますが、FreeBSDプロジェクトはすでにその目的ではmandoc(1)と呼ばれるコマンドを導入して、その目的ではmandoc(1)を使っています。

今回、ベースシステムからgroff(1)を廃止するだけではなく、Heirloom Documentation Toolsからtroff(1)およびnroff(1)をインポートする背景には、mandoc(1)でレンダリングできなかった場合に代替として使えるコマンドとしてよりフィーチャーリッチなHeirloom Documentation Toolsは都合が良いこと、roffのフル機能を実装したコマンドをベースシステムにマージしておくことは、roff形式のドキュメントをよく使っているUNIX系のシステムにおいては都合が良いこと、などが理由として挙げられています。

GNU groff

GNU groffはroff形式のテキストをターミナル、PostScript、PDF、HTML、ASCII/UTF8などに変換するためのタイプセットシステムです。UNIX系のオペレーティングシステムでは長らくオンラインマニュアルをroff形式で作成していますので、このマニュアルの表示や変換のために使われてきました。それ以外にも書籍のテキストデータをroffで作成するといったことも行われてきました。

GNU groffは長らくさまざまなオペレーティングシステムで使われてきました。しかし、GNU groffはあるバージョンからライセンスがGPLv3へ移行したため、それ以降のバージョンはFreeBSDのベースシステムに取り込めなくなりました(パッケージからインストールするのは問題ありません。ベースシステムに同梱してデフォルトのコマンドにするには、GPLv3に変わったバージョンからは取り込めなくなりました⁠⁠。

実際、FreeBSD 10.1-RELEASEのベースシステムに取り込まれているバージョンのベースになっているのはGNU groffはバージョン1.19.2、記事執筆段階でパッケージからインストールしたGNU groffのバージョンは1.22.2と、ベースシステムのGNU groffは古いままです。

図3 パッケージからインストールしたgroff(1)
% /usr/local/bin/groff -v
GNU groff version 1.22.2
Copyright (C) 2013 Free Software Foundation, Inc.
GNU groff comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of groff and its subprograms
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

called subprograms:

GNU grops (groff) version 1.22.2
GNU troff (groff) version 1.22.2
%

FreeBSDを高性能アプライアンスや組み込みデバイスで活用しているベンダは、ベースシステムにGPLv3のソースコードがマージされることを望んでいません。FreeBSDプロジェクトはベースシステムにGPLv3のソースコードをマージしない方針ですので、ベースシステムのGNU groffは古いままになり続けます。

ベースシステムのGNU groffはFreeBSD向けに移植されたものでフルセットではありませんし、バージョンも古いままです。このため、ベースシステムからGNU groffを排除することはロジカルな選択肢です。パッケージからインストールするGNU groffのほうがバージョンが新しくフルセットです。

Heirloom Documentation Tools

Heirloom Documentation Toolsはtroff(1)、nroff(1)およびこれに関連するユーティリティを含んだソフトウェアです。roff実装系の一つで、もともとOpenSolarisが公開されたときにツールの一部として公開されたものを個別に開発しているというものです。さまざまなコマンドが含まれていますが、nroff(1)とtroff(1)がベースシステムにマージされるものとみられます。

図4 パッケージからインストールされたHeirloom Documentation Tools
% pkg which /usr/local/bin/troff
/usr/local/bin/troff was installed by package heirloom-doctools-0.0.080407_1
% pkg which /usr/local/bin/nroff
/usr/local/bin/nroff was installed by package heirloom-doctools-0.0.080407_1
%

メーリングリストに投函されたRFCでは、このところHeirloom Documentation Toolsの開発が活発であること、FreeBSDのベースシステムにマージされているドキュメントをすべてレンダリングできること、またGNU groffと比較して次の点でFreeBSDと親和性が良いことが説明されています。

  • CDDLやBSDライセンスで提供されているためベースシステムにマージしやすい
  • 主にC言語で記述されている
  • 実装がオリジナルのAT&T版のマクロから派生している
  • GNU groffよりもサイズが小さい
  • GNU groffよりもUnicodeのサポートが優れている
  • GNU groffよりも優れたエラーメッセージを出力してくれる
  • GNU groffのマニュアルと比べHeirloom Documentation Toolsのマニュアルはmandoc(1)でフォーマットしやすい

今のところ大きな問題点は見つかっていないようなので、このままいけばFreeBSD 11.0-RELEASEからはベースシステムからGNU groff(1)および関連コマンドはなくなることになります。必要な場合にはパッケージからgroffをインストールして利用することになります。

BSDライセンスのコマンド

FreeBSDプロジェクトの初期の段階ではGNUプロジェクトから提供されているソフトウェアの多くがベースシステムにマージされましたが、ライセンスがGPLv2からGPLv3に変わったあたりからそうしたソフトウェアはアップデートされなくなりました。GPLv3のライセンスはベースシステムにマージしない方針だからです。

FreeBSDプロジェクトはOpenBSDプロジェクトやNetBSDプロジェクトで開発されたBSDライセンスベースのコマンドや、OpenSolarisのソースコード公開時に登場したCDDLベースのコマンドなどを取り込んで、GNUのツールからコマンドの変更を進めました。そうしたコマンドはGNUの実装系と比較してソースコードの量が少ないといった特徴があります。

パッケージやPorts Collectionからインストールするソフトウェアは基本的にサードパーティが出しているコードをそのまま利用すればよいのですが、ベースシステムにマージする場合にはちょっと状況が異なります。メンテナンスのしやすさなどからソースコードは多くないほうが便利です。

プロジェクト自前のコマンドを開発するのはOpenBSDプロジェクトなどで特に活発です。OpenBSDではこれまでサードパーティ製のソフトウェアをマージしていたものでも、ソースコードベースが大きくなってきたり、要望に合わない、またはセキュリティ上好ましくないと判断すると、プロジェクトでBSDライセンスベースの新しいソフトウェアを開発する傾向があります。

これまで次のコマンドがBSDライセンス版へ置き換わっています。

  • /usr/bin/cpio
  • /usr/bin/diff
  • /usr/bin/tar

/usr/bin/sortも新しい実装に置き換わったほか、grep(1)もBSDライセンス版が/usr/bin/bsdgrepとして導入されています。

GNU grepは最も置き換えが困難なコマンドの一つです。bsdgrepというBSDライセンス版の実装が存在しているものの、GNU grepのほうが処理が高速だからです。GNU grepは現在でも開発が進んでおり、現在でも処理の高速化が続いています。GNU grepはツールとしても重要なコマンドですし、その動作速度の高速性も重要です。GNU grepは当面デフォルトのまま使われ、BSD grepがデフォルトになるのはまだ先の話になるとみられます。

サードパーティ製ソフトウェア

パッケージやPorts Collectionなどからインストールされるサードパーティ製ソフトウェアは/usr/local/以下にインストールされます。ベースシステムのソフトウェアやリソースは/usr/local/以下にはインストールされませんので、/usr/local/以下にある限り、あとから追加されたサードパーティ製ソフトウェアだとわかります。

大雑把に分けて次のようにインストールが実施されます。

ファイルの種類 パス
バイナリ /usr/local/bin/
/usr/local/sbin/
設定ファイル /usr/local/etc/
ライブラリ /usr/local/lib/
マニュアル /usr/local/man/
ドキュメントほか /usr/local/share/
ヘッダファイル /usr/local/include/

/usr/local/以下のファイルがどのパッケージでインストールされたものであるかはpkg(8)コマンドのwhichサブコマンドで調べることができます。

図5 pkg(8) whichサブコマンドで元のパッケージやportsを調べる
% pkg which /usr/local/bin/ld
/usr/local/bin/ld was installed by package binutils-2.25
% pkg which -o /usr/local/bin/ld
/usr/local/bin/ld was installed by package devel/binutils
%

ベースシステムとサードパーティ製ソフトウェアは明示的に別の領域にインストールされます。こういった仕組みにすることで、ベースシステムに影響を与えることなくシステムが運用できるようになっています。

おすすめ記事

記事・ニュース一覧