これまでの回では、Cabalを使って作成したHaskellのパッケージをたびたび利用してきました。しかし、そうしたパッケージの作り方をきちんと説明したことはありませんでした。今回は、Cabalによるパッケージの作成方法を詳しく説明します。

パッケージの雛形を作成する

 Cabalを使ったパッケージの構成には、多くのパッケージに共通する定型の部分と、パッケージごとに異なる部分が存在します。このうち定型部分の作成は自動化できます。

 その目的でCabalが提供しているのがcabal initコマンドです。このコマンドを使うことで、パッケージの構成に必要な一通りのファイルを用意できます。新しくパッケージを作る場合には、cabal initコマンドでパッケージの雛形を作成するとよいでしょう。このコマンドの実行後に表示される個々の質問でのデフォルト値は、最新版の「cabal-install 1.16.0」とHaskell Platform 2012.2.0.0に同梱されている「cabal-install 0.14.0」とで異なります。今回はcabal-install 1.16を使って説明します。

 cabal initコマンドを実行すると、対話的な処理が始まります。まずパッケージの名前を尋ねられます。

$ cabal init
Package name? [default: sample]

 コマンドを実行した現在のディレクトリ名が、デフォルトのパッケージ名になります。問題がなければそのままEnterキーを押してください。次の項目に進みます。

 次に、作成するパッケージのバージョンを指定します。デフォルトでは0.1.0.0です。

Package version? [default: 0.1.0.0]

 パッケージのライセンスを指定します。

Please choose a license:
 * 1) (none)
   2) GPL-2
   3) GPL-3
   4) LGPL-2.1
   5) LGPL-3
   6) BSD3
   7) MIT
   8) Apache-2.0
   9) PublicDomain
  10) AllRightsReserved
  11) Other (specify)
Your choice? [default: (none)]

 デフォルトのライセンスはnoneになっています。候補として挙げられているライセンスの中に使用したいものがあれば、それを選んでください。PublicDomain、AllRightsReserved、Otherを除き、選んだライセンスに応じたLICENSEファイルが現在のディレクトリに生成されます。ここでライセンスを指定しない場合には、自分でLICENSEファイルを用意する必要があります。

 ライセンスにこだわりがないなら、Haskell界隈でよく利用されているBSD3がおすすめです。BSD3は、三条項BSDライセンス(3-clause BSD license)、すなわち修正BSDライセンスのことです(参考リンク)。

 候補の中に使いたいライセンスがない場合には、11のOtherを選んでライセンス名を入力してください。

Your choice? 11
Please specify?

 次に、パッケージの作者名とパッケージのメンテナのメール・アドレスを入力します。

Author name? 

Maintainer email? 

 入力するメール・アドレスは、アドレスだけでなく「名前 <メール・アドレス>」の形にしたほうがよいでしょう。作者がメンテナを兼ねている場合には、自分の名前とメール・アドレスを入力してください。プロジェクトで開発していて複数のメンテナがいる場合には、開発プロジェクト名とプロジェクトのメール・アドレスを入力するとよいでしょう。

 次に、パッケージの開発プロジェクトのWebサイト、またはパッケージの開発に利用しているバージョン管理システムのレポジトリのURLを入力します。

Project homepage/repo URL? 

 一つの開発プロジェクトで複数のパッケージを開発している場合には、レポジトリではなくWebサイトのURLを入力するとよいでしょう。個別のレポジトリのURLは別途記述できます。

 続いてプロジェクトの概要(synopsis)を入力します。

Project synopsis? 

 プロジェクトまたはパッケージの大まかな概要を記述します。詳しい説明は、別途記述できます。

 次に、プロジェクトの分類(category)を指定します。

Project category:
 * 1) (none)
   2) Codec
   3) Concurrency
   4) Control
   5) Data
   6) Database
   7) Development
   8) Distribution
   9) Game
  10) Graphics
  11) Language
  12) Math
  13) Network
  14) Sound
  15) System
  16) Testing
  17) Text
  18) Web
  19) Other (specify)
Your choice? [default: (none)]

 複数の分類に当てはまる場合には、とりあえずどれか一つを選んでください。initコマンドで作成するのはあくまで雛形であり、後で変更できます。

 適切な選択肢がない場合には、「19) Other」を選んで、自分で分類を入力します。

Your choice? 19
Please specify?

 次に、パッケージでビルドするのがライブラリか、実行可能ファイルかを指定します。

What does the package build:
   1) Library
   2) Executable
Your choice? 

 他の項目とは異なり、この項目にはデフォルトの値はありません。選択肢しなかった場合にはエラーになり、入力を再度求められます。

What does the package build:
   1) Library
   2) Executable
Your choice?
 is not a valid choice.

 一つのパッケージで、ライブラリとそのサンプル・プログラムの実行可能ファイルの両方を提供する場合もあります。そうした場合には、とりあえず1を選んでおきましょう。実行可能ファイルを併せて提供することは、後で追加で記述できます(参考リンク)。サンプル・プログラムだけを*-examplesという別のパッケージで提供するという方法もあります(参考リンク)。

 最後に、生成されるファイルに、それぞれの意味を記したドキュメントを付けるかどうかを尋ねられます。

Include documentation on what each field means y/n? [default: n] y

 一通りの入力が終わると、入力された情報に基づいてパッケージを構成するファイルが生成されます。

Guessing dependencies...

Generating LICENSE...
Generating Setup.hs...
Generating sample.cabal...


You may want to edit the .cabal file and add a Description field.

 生成されたファイルの内訳は、選んだライセンスの内容を示したLICENSEファイルと、パッケージの内容を示した<パッケージ名>.cabalファイル、<パッケージ名>.cabalファイルの利用に必要なスクリプトであるSetup.hsファイルの三つです。

$ ls
LICENSE  Setup.hs  sample.cabal

 ライセンスを指定しなかった場合(もしくはPublicDomain、AllRightsReserved、Otherを選択した場合)には、「LICENSEファイルを用意する必要がある」という意味の警告メッセージが表示されます。

Generating LICENSE...
Warning: unknown license type, you must put a copy in LICENSE yourself.
~ 略 ~

$ ls
Setup.hs  sample.cabal

 プロジェクトの概要を入力しなかった場合には、「*.cabalファイルを修正して内容を追加する必要がある」という意味の警告メッセージが表示されます。

Generating LICENSE...
Generating Setup.hs...
Generating sample.cabal...

Warning: no synopsis given. You should edit the .cabal file and add one.
You may want to edit the .cabal file and add a Description field.