オープンソースのコードをめぐっては、 誰かがそれを移植し、使用し、開発に協力することを妨げることのないよう、 数多くの伝統ある良き慣習が存在しています。 それらの慣例のいくつかは Unix および Linux の世界で 伝統的に受け継がれてきたものです。 その他の慣例は、 World Wide Web のような特徴ある新しい技術やツールに関連して、 最近になって生み出されたものです。
この文書は正しい慣習について知るための一助となるでしょう。 各章の見出しには、 それぞれがチェックリストの項目となるように要旨をまとめました。 あなたの配布物が旅に出る前の点検項目とお考え下さい。
この文書は毎月 comp.os.linux.answers
に投稿されます。
また metalab.unc.edu
の pub/Linux/docs/HOWTO
を含め、
数多くの Linux FTP サイトに保管されています。
また、この HOWTO の最新の版を World Wide Web では http://metalab.unc.edu/LDP/HOWTO/Software-Release-Practice-HOWTO.html で読むことができます。
この HOWTO に関する質問や意見は Eric S. Raymond, esr@snark.thyrsus.com 宛にお気軽にお寄せ下さい。
この HOWTO の日本語版は http://www.linux.or.jp/JF/JFdocs/Software-Release-Practice-HOWTO.html で最新のものを読むことができます。 訳文に関する質問や意見は <JF@linux.or.jp> 宛にお寄せ下さい。
なお、翻訳文には JF Project の以下の方々の意見・校正が反映されています。
Metalab や PSA そして CPAN のような アーカイヴサイトの管理者にかかる負担が増えるにつれて、 登録作業の一部あるいは全てをプログラムによって処理するという傾向に なってきています (つまり、人間によって行われるのではないということです)。
これによって プロジェクトとアーカイヴファイルの名称が、 計算機のプログラムによって解析し理解されるよう、 正しい形式で名前付けされていることの重要性が増しました。
もし全てのアーカイヴのファイルに GNU のような名前付け -- つまり小文字のアルファベットから成る基本名称を頭に付けて、 ダッシュ (-) を付加し、続けてバージョン数字列、拡張子、 その他の識別子を付けるやり方 -- がされていたら、 これは誰の目にもわかりやすいものになります。
仮に `foobar' という名前で呼ばれているプロジェクトの、 バージョン 1、リリース 1、パッチレベル 3 があるとしましょう。 もしそれが単一のアーカイヴとして成立しているなら (おそらくは ソースコードでしょう)、以下のような名前付けがいいでしょう:
ソースアーカイヴ
LSM ファイル (Metalab に登録する場合).
次のようなのは ダメ です:
これは多くのプログラムに `foobar123' という名の プロジェクトのバージョン番号のないアーカイヴと見なされてしまいます。
これは多くのプログラムに `foobar1' という名の プロジェクトのバージョン 2.3 のアーカイヴと見なされてしまいます。
多くのプログラムはこいつを `foobar-v1' という名のプロジェクトだと解釈されてしまいます。
アンダースコアは人間が喋りにくいし、 入力しづらいし、覚えにくいです。
小賢しい利己主義者と思われても 構わない ならば。 おまけにこれは喋りにくいし、入力しづらいし、覚えにくいです。
ファイル名によってソースとバイナリアーカイヴや、 異なる種類のバイナリを区別したり、 ビルドの時のオプションのたぐいを表現する必要があるなら、 それらはバージョン番号の後に付加するファイル識別子として 取り扱うようにしてください。つまり、以下のような方法です:
ソースコード
バイナリ (タイプは不明)
ELF バイナリ
静的にリンクされた ELF バイナリ
SPARC 向けバイナリ
`foobar-ELF-1.2.3.tar.gz' みたいなのはやめましょう。 これはプログラムが基本名称から内部識別子 (`-ELF' のような部分) を 導き出しにくくなるからです。
よい名前の一般的形式は、以下のような部分から順番に成り立っています:
-
).
)
プロジェクトやコミュニティによっては、 名前付けとバージョン番号について明確に定義された慣習があり、 その場合は上記のアドバイスにならう必要はありません。 たとえば Apache のモジュールには mod_foo のような名前が一般的に使われており、 それ自身のバージョン番号とそれが動作する Apache のバージョン番号の両方が 付加されています。 同様に Perl のモジュールには浮動小数点として取り扱い可能なバージョン番号 が付けられていて (たとえば 1.3.3 のような形式よりも 1.303 のような形式を 見ることが多いでしょう)、Foo::Bar というモジュールのバージョン 1.303 の 配布物には、Foo-Bar-1.303.tar.gz という名称が付けられることが一般的です。
コミュニティと開発集団に独自の慣習を調べ、それを大切にしてください。
基本名称はプロジェクトのファイル全体を通して共通のものとし、
それは読みやすく、入力しやすく、そして覚えやすいものにするべきです。
アンダースコア(_
)を使うのはやめましょう。
それと、格段の理由のない限り、
全体あるいは一部にでも大文字を使うのはやめましょう。
人間の目視による自然な検索順序を困惑させることになりますし、
まるで小賢しく立ち振舞おうとする下衆な利己主義者みたいじゃないですか。
ふたつの異なるプロジェクトが同じ基本名称を持つと、みんなが混乱します。 はじめてのリリースの前には名前が衝突してないかをチェックしましょう。 このチェックには index file of Metalab が便利です。
あなたの選択するライセンスには、 共同開発者たちとユーザの間で合意したい 社会的な契約事項が定義されることになります。 また、ソフトウェアに授けた著作権は、 ソフトウェアとそこからの派生物に関するライセンス事項において、 主としてあなたの権利を法的に主張するものとして機能します。
パブリック・ドメインでないかぎり、全ての著作物には、 ひとつないしは複数の著作権が存在しています。 ベルヌ条約 (1978 年からアメリカ合衆国でも有効な法律) の元では、 著作権は必ずしも明示されなくてもよいことになっています。 したがって、仮に著作権が明示されていなくても、 著作者は著作権を保持していることになります。
誰を著作者としてカウントするか、ということは、 特に多数の人の手が加わったソフトウェアの場合、大変な難問となり得ます。 ライセンス条項が重要である理由がここにあります。 協定の内容によっては、それを設定することによって、 著作権の保持者による独断的な行動から自身を守る権利を、 ユーザたちにも認めることができるようになります。
独占状態にあるソフトウェアでは、 ライセンス条項は専ら著作権を保護するものとして設計されています。 所有者 (著作権保持者) には法的分野における幅広い権利を認める一方で、 ユーザにはほんのわずかな権利しか認めない、というやり方です。 著作権保持者こそが一番重要であり、 またライセンスの論理における制限があまりに厳しいために、 ライセンス条項そのものの厳密な特記事項は 大抵の場合あまり重要でなかったりします。
オープン・ソース・ソフトウェアにおいては、状況はまったく正反対です。 著作権はライセンスを保護するために存在しています。 著作権保持者が常に維持できる唯一の権利は、 ライセンスを強く主張することだけです。 その一方で、ほんのわずかな権利を除く、ほとんど全ての選択権はユーザにあります。 とりわけ、著作権保持者はすでに人手に渡ったコピーに関する条項は変更できません。 それゆえ、オープン・ソース・ソフトウェアにおいては、 著作権保持者はほとんど無力です。 しかし、ライセンス条項はとても重要な意味を持っています。
通常、プロジェクトの著作権保持者はその時点でのプロジェクトリーダーか、 プロジェクトを援助している組織です。 プロジェクトを新しいリーダーに引き継ぐことが、 著作権保持者が変わることによって示されることもよくあります。 しかしながら、これは絶対的に堅固なルールというわけではありません。 たとえば多くのオープン・ソース・プロジェクトには 複数の著作権保持者が存在していますが、 このことが法的な問題を引き起こしたという 実例は過去にありません。
いくつかのプロジェクトは 著作権を Free Software Foundation に譲渡することを選択しています。 この組織はオープン・ソースを防御することに関心があり、 そのために法律家の力も借りることができる、という考えに基づくものです。
実際のライセンス供与にあたり、 そのライセンスが誘引するいくつかの異なった種類の権利について、 区別して考えることができます。 複製・再配布する権利、 使用する権利、 個人的な用途にあわせて改変する権利、そして 改変したものの複製物を再配布する権利です。 どの権利においてもライセンスによって制限が加えられる可能性があります。
あるソフトウェアを ``オープン・ソース'' あるいは ``フリー'' (古くからの用語) と定義づける条件について、深く掘り下げて考察した結果が Open Source Initiative にまとめられています。 ここではライセンスに関して以下のような制限事項が要求されています :
このガイドラインでは 改変をほどこしたバイナリの再配布に関する制限も 禁止されています。 これは、余計な負担を強いられることなく、 自分たちの作業したコードを提供したいという ソフトウェア・ディストビュータのニーズに合わせた結果です。 一方で改変したソース・コードは 改変前のソース・コードとそれに対するパッチの組合わせで再配布されるよう、 作者が要求することを認めています。 これによって当初の作者の意図と、 第三者による改変の様子を ``追跡調査'' する仕組みが確立できることになります。
OSD は `OSI Certified Open Source (OSI 公認オープン・ソース)' 認定マーク の法的な定義であり、 どんな人でも歩み寄れるように ``フリー・ソフトウェア'' を より良く定義したものです。 全ての標準的なライセンス (MIT, BSD, Artistic, そして GPL/LGPL) がこれに合致します (ただし、GPL のようないくつかのライセンスには、 それを選択する前に理解しなければならない別の制限事項も存在しています)。
非商用に限定して使用を許可するライセンスは、 たとえ ``GPL'' あるいは その他の標準ライセンスによる装飾がされていたとしても、 オープン・ソースのライセンス形態は 満たしていない ことに注意してください。 それは特定の職業、人間、集団を差別するものなのです。 そして、CD-ROM 配布業者や オープン・ソース・ソフトウェアを商業的に普及させようとする人々にとっては、 非常に悩ましい頭痛の種となるのです。
これまでに説明してきた一般法則を実践に移す方法について説明します。
法律家を擁するスポンサー団体による支援がある場合、 その団体に著作権を渡したい、というケースもあるでしょう。
Open Source Definition は、 この世界におけるライセンスの確固たる標準です。 OSD そのものはライセンス条項ではなく、 あるライセンス条項がオープン・ソース・ライセンスとして 機能することを保証するための、 必要最小限の権利関係を定義づけるものといえます。 OSD とそれを補足するものは Open Source Initiative のウェブ・サイトから入手できます。
すでに普及している OSD 準拠のライセンスには、 大変よく確立された伝統ある解釈が盛り込まれています。 開発者は (その気さえあれば、ユーザも) それらが意図するものを理解しており、 納得できるならリスクを引き受け、 そして自らの関与したものを交換取引するのです。 ですから、 可能な限り OSI のサイトにある標準的なライセンスのどれかを 利用するようにしましょう。
もし自分自身でライセンス条項を書かなければならないなら、 OSI によって認定を受けるようにしましょう。 これによって際限のない論争と無駄を回避することができるでしょう。 ライセンスについての議論の応酬がいかに始末に負えないものになるか、 あなたがそれを経験していないなら想像もつかないでしょうが、 ライセンスはオープン・ソース社会の真核部分に触れる ほとんど宗教がかった誓約に関するものなので、 人々はつい激情に駆られやすくなってしまうのです。
さらにいえば、 もしあなたのライセンス条項が法廷で審判を受けることになれば、 すでに確立された解釈体系の存在がいかに重要であるか、 証明されることになるでしょう。 これを書いている時点 (1999 年後半) では、 どのオープン・ソース・ライセンスに関しても、 有効・無効のどちらの判例もありません。 しかしながら、これは起源となった共同体においては当然予期され、 また妥当な慣習に基づいたライセンス条項および契約事項であると 法廷で解釈されるはずの、法律的に有効な主張です (少なくともアメリカ合衆国では。 そしておそらくイングランドとそれ以外のブリテン諸国など、 他の慣習法に則った国々でも)。
ここで触れる話題のほとんどは、Linux 圏のみならず、 他の Unix も含めた移植性の確保に関係するものです。 他の Unix へ移植可能であるということは、 プロフェッショナリズムとハッカー主義の美徳であるだけでなく、 将来において Linux 自体に変化が起きた場合にそなえた 貴重な保険ということもできます。
結論から言えば、誰かがあなたのコードを Linux 以外のシステムにおいて ビルドしようとするのは明らかです。 移植性を高めておけば、あなたが受け取る煩わしくて面倒な email の数を 減らすことができるでしょう。
移植性と安定性のために、ANSI C もしくは可搬性の保証されているスクリプト言語を 使いましょう。 プラットフォームを越えて単一の実装が存在しているからです。
これに適合するスクリプト言語としては、 Python, Perl, Tcl, そして Emacs Lisp などがあります。 プレインな古い shell は不合格です。 微妙な違いのある、たくさんの異なる実装が存在していますし、 エイリアスのようなユーザカスタマイズによって、 shell の実行環境が ごちゃごちゃになっていることも想定されるからです。
Java は可搬性の高い言語であることを約束していますが、 今のところ Linux で利用できる実装は完全ではなく、 Linux との親和性も貧弱です。 Java は成熟するに連れてさらに人気を増していくように見えますが、 現時点ではまだ薄氷を踏むような選択と言えます。
C 言語で開発しているなら、ANSI で用意されたすべての機能を 好きなように使ってください。モジュール間の矛盾を洗い出すために 便利なファンクション・プロトタイプもこれに含まれます。 旧式の K&R コンパイラはすでに歴史の遺物です。
その一方で、たとえば `-pipe' オプションやネストされた関数構造など、 GCC 固有の機能が使えると仮定してはいけません。 誰かが Linux 以外、GCC 以外のシステムに移植する際に、 この問題が付きまとい、困らせることになります。
C 言語で開発しているなら、システムの環境設定を探査したり、 makefile を仕立てたりといった、可搬性にまつわる事柄を操作するために、 autoconf/automake/autoheader ユーティリティーを使いましょう。 今日では、ソースからビルドする際に、 "configure; make" とタイプして、 きれいに、そして正しく作り上げられることを人々は期待しているのです。
C 言語で開発している場合は、 リリースの前に少なくとも一回は -Wall オプションを付けてテストコンパイルを行い、 エラーが出ないことを確認しましょう。 これは非常に多くのエラーを検出します。 究極を目指すなら、-pedantic オプションを付けてコンパイルしてみましょう。
Perl で書いている場合は、コードに -c (場合によっては -T) オプションを付けて チェックしてみましょう。信心深く行うなら perl -w と `use strict' ですね (これについては Perl のドキュメントを参照してください)。
これから述べるガイドラインでは、誰かが配布物をダウンロードし、中身を取り出して 展開した際に、配布物はどのように現れるべきか、という事を説明します。
開発の初心者が冒しやすい誤りの中で、もっともわずらわしいものは、 配布物中のファイルとディレクトリをカレントディレクトリにぶちまけ、 すでにそこにあるファイル群を上書きする可能性のある tarball を作ってしまう、というものです。 こうしては絶対にいけません!
これを避けるには、アーカイヴされたファイルを全てプロジェクト名で始まる 専用のディレクトリに入れれば、現在のディレクトリの直下 にある、単一のトップ・ディレクトリの中に展開されるでしょう。
これを完璧に行うための makefile の裏技があります。 配布物のディレクトリが `foobar' という名前で、 SRC という変数には配布ファイルのリストが入っているとします。 これには GNU tar 1.13 が必要です。
VERS=1.0 foobar-$(VERS).tar.gz: tar --name-prefix='foobar-$(VERS)/' -czf foobar-$(VERS).tar.gz $(SRC)
もし古い tar を使っている場合は、以下のようにします。
foobar-$(VERS).tar.gz: @ls $(SRC) | sed s:^:foobar-$(VERS)/: >MANIFEST @(cd ..; ln -s foobar foobar-$(VERS)) (cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`) @(cd ..; rm foobar-$(VERS))
ソース配布物のロードマップとなる README もしくは READ.ME というファイルを 用意しましょう。古来の言い伝えでは、これはソースを展開した勇敢なる探検者たちが 最初に目にして読むはずの書、ということになっています。
README の中に書いておきたい項目は:
README ファイルを読むより先に、 勇敢なる探検者たちは展開した 配布物のトップディレクトリのファイル名を探索するでしょう。 ファイルの名称は、それ自体が情報を含んでいます。 標準的な名前付けの慣例を踏襲することによって、 次に何を見るべきなのかという重要な手がかりを、探検者たちに示すことができます。
標準的なトップレベルのファイル名とそれが意味するものについて説明しましょう。 配布物にこれら全部が必要ではありません。
最初に読む案内書
設定・ビルド・インストール方法の解説
プロジェクトに対する貢献者のリスト
プロジェクトに関する最近のニュース
プロジェクトの履歴
プロジェクトのライセンス (GNU 流の慣習)
プロジェクトのライセンス
配布物に含まれるファイルの一覧
プロジェクトに関して、よく尋ねられる質問とその回答を記したプレインテキストのドキュメント
Emacs や vi で利用するタグファイル
これらのファイル名が全て大文字で構成されているという慣習は、 それらがビルドの部品として使われるのではなく、 パッケージに関する一般的情報を含んだ人間が読むべきものだと 暗示していることに注意してください。
インストールに使われるバイナリパッケージの事実上の標準フォーマットは、 Red Hat Package Manager, RPM です。 これはもっとも人気のある Linux ディストリビューションの特長となっており、 事実上他の Linux ディストリビューションでも サポートされています (Debian と Slackware は除きます。 ただし Debian では RPM からインストールすることも可能です)。
したがって、ソースコードの tarball と同様に、 インストール可能な RPM 形式のファイルを プロジェクトのサイトで提供するのは良い考えです。
また、ソース・コードの tarball の中には RPM の spec ファイルを含め、 Makefile の中ではそこから RPM を生成する仕組みを提供するのも良い考えでしょう。 spec ファイルには rpm の -t オプションで tarball から見つけられるように、 `.spec' という拡張子を与えておきましょう。
形式に関して点数を稼ぎたいなら、 Makefile あるいは version.h を読み込んで正しいバージョン番号を自動的に 返すような Shell スクリプトを利用し、spec ファイルを生成するようにしましょう。
あなたのソフトウェアは、 その存在を知られない限り世界に貢献することはできません。 また、プロジェクトの存在をインターネット上で明らかにすることは、 ユーザを増やしたり共同開発者を募るのに役立つでしょう。 これについての標準的な手法に関して解説します。
comp.os.linux.announce で新たなリリースのお知らせをしましょう。
それ自体がよく購読されている Newsgroup である上に、 Freshmeat のような Web ベースで新着情報を扱うサイトへも転送されています。
あなたのアプリケーションに直接関連する USENET の Newsgroup を見つけて、 そこでもアナウンスしましょう。 慎みを持って、 ソフトウェアとしての機能が関係する Newsgroup にのみ投稿してください。
例えば IMAP サーバに問い合わせを行う Perl で書かれたプログラムを リリースしようとしているなら、 間違いなく comp.mail.imap には投稿するべきでしょう。 しかしプログラムが Perl の先鋭的テクニックのお手本にもなるものでなければ、 おそらく comp.lang.perl には投稿しない方がよいでしょう。
アナウンスにはプロジェクトの Web サイトの URL も示しておきましょう。
(訳注: 日本語の Newsgroup では
fj.sources
でソフトウェア公開のアナウンスがされています。
本来テキストエンコードされたソースコードのアーカイブを、
直接投稿する Newsgroup でしたが、
最近はアナウンスのみを投稿することの方が増えています。
投稿する記事には Followup-To:
ヘッダで
fj.sources.d
を指定することがマナーとなっています。)
プロジェクトのユーザあるいは開発者のコミュニティを しっかりと築くことを目指すならば、 Web サイトを用意した方がよいでしょう。 Web サイトに用意する標準的な内容は以下のようなものです:
プロジェクトのサイトによっては、 一次ソースツリーへの匿名アクセスが可能な URL を用意することもあります。
開発の協力者が交流を行い、パッチを交換できるような非公開のメーリングリストを 用意することが一般によく行われています。 プロジェクトの進歩状況を知らせて欲しい人々を対象とした、アナウンスのための メーリングリストがあってもよいでしょう。
ここ数年の間、 Metalab archive は Linux のソフトウェアのための重要な拠点となってきました。
それ以外に以下のような重要なサイトがあります:
関係者がみなボランティアである場合、 プロジェクトを上手に運用するということは、 それ自体が特殊な課題となります。 このことは、この HOWTO で取り上げるには大きすぎる題材です。 幸いなことに、これに関する要点を理解するための助けとなる、 幾つかの文書が存在しています。
基礎となる開発集団と、 '早目にリリース、しょっちゅうリリース' の 'バザール・モデル' に関しては、 The Cathedral and the Bazaar (伽藍とバザール) を参照してください。
動機付けに関する考察、共同体の風習、衝突の解決といった話題については、 Homesteading the Noosphere (ノウアスフィアの開墾) をご覧下さい。
経済的側面と適切なビジネス・モデルに関しては、 The Magic Cauldron (魔法のおなべ). を参照してください。
これらの文書はオープン・ソース開発に関する決定版というわけではありません。 しかし、もっとも早くに書かれた意義深い分析であり、 これに代わる文書は未だに出てきていません。
(訳注: この節で取り上げた文書の翻訳が以下で参照できます。