OCaml パッケージガイドライン
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
OCaml で書かれたソフトウェアの PKGBUILD を作成する方法。
目次
パッケージの命名
ライブラリの場合、ocaml-modulename
を使ってください。アプリケーションの場合、プログラムの名前を使ってください。どちらの場合にしても、名前は全て小文字にしてください。
ファイルの場所
ライブラリ
OCaml のライブラリは /usr/lib/ocaml
にインストールしてください。/usr/lib/ocaml/site-lib
を使うのは非推奨です。
OCaml のライブラリは ocaml-findlib を使ってインストールします。ocaml-findlib
にはライブラリを管理しやすくするライブラリメタデータが含まれています。Ocaml ソフトウェアのデファクトスタンダードとして多くのソフトウェアが ocaml-findlib
を必要とします。
ocaml-findlib
はソースアーカイブに含まれている META
という名前のファイルから必要なデータを抽出します。ファイルが含まれていない場合 Debian, Ubuntu, Fedora などのパッケージからもらってくるか、あるいはメンテナ自身が作成する必要があります。また、ファイルを含めるようにソフトウェアの開発元にリクエストを送って下さい。
ocaml-findlib
でパッケージをインストールするときは OCAMLFIND_DESTDIR
変数が使われます。詳しくは下の PKGBUILD を参照。
OASIS
OCaml のパッケージは DESTDIR
を無視して OASIS を使って実行ファイルをインストールします。OASIS で DESTDIR
が使われないのは仕様です (issue #852)。--destdir
引数を使って configure
スクリプトを実行することで DESTDIR
のような機能を有効にできます:
build() { cd "${srcdir}/${srcname}-${pkgver}" ./configure --prefix /usr --destdir "$pkgdir" # build commands }
OCaml バイトコードとレベル
OCaml は複数の"レベル"でコードを実行することができます。トップコードレベルではコンパイルを行わずに OCaml のコードを解釈し、バイトコードレベルではマシンに依存しないバイトコードが作成され、ネイティブレベルでは (C/C++ と同じように) 機械語のバイナリが作成されます。
OCaml のパッケージをビルドするときは、ネイティブのマシンコードがコンパイルされるのかバイトコードがコンパイルされるのか、あるいはその両方か確認する必要があります。レベルが違うと様々な状況が生まれ、あるいはパッケージのオプションや依存関係に問題を起こすこともあります。
バイトコードが生成される場合は PKGBUILD に以下を記述してバイトコードを保護してください:
options=('!strip')
パッケージにバイトコードを含まず、バイナリだけを配布する場合、ocaml
を依存パッケージに指定する必要はありません。ただし、OCaml コンパイラは ocaml
パッケージに入っているため makedepends には指定する必要があります。パッケージにネイティブコードとバイトコードの両方を含める場合は ocaml
は依存パッケージでありながら makedepends にも指定する必要があります。
稀に OCaml のコードがバイトコードとしてのみ配布されていることがあります: コンパイルされていないソースコードしか配布されていない場合に arch に any を使うことが推奨されます。ただし多くのライブラリはネイティブコードを配布しています。
パッケージで何が配布されるのか、パッケージにネイティブのマシンコードとバイトコードが含まれるのかどうか確認するのが肝要です。
Dune を使用した PKGBUILD の例
Dune は、OCaml プロジェクトでますます使用されるようになっている新しいビルドシステムです。
注意すべき点の 1 つは、単一のプロジェクトで OPAM/findlib の意味で複数の パッケージ を構築でき、それぞれが /usr/lib/ocaml/
に独自のディレクトリを持つということです。例については、ocaml-cairo を参照してください。リリースビルドの場合、すべての パッケージ を明示的にリストする必要があります。
# Contributor: Your Name <youremail@domain.com> pkgname=ocaml-<package name> pkgver=4.2 pkgrel=1 license=() arch=('x86_64') pkgdesc="An OCaml Package" url="" depends=('ocaml') makedepends=('dune') source=() options=('!strip') sha256sums=() build() { cd "${srcdir}/${pkgname}-${pkgver}" # The "-p" flag is necessary for release builds, see the Dune manpage. Dune will complain if you forget some packages. dune build -p package1,package1-extension,package2 } package() { cd "${srcdir}/${pkgname}-${pkgver}" DESTDIR="${pkgdir}" dune install --prefix "/usr" --libdir "lib/ocaml" # Dune installs documentation in /usr/doc, fix that. install -dm755 "${pkgdir}/usr/share/" mv "${pkgdir}/usr/doc" "${pkgdir}/usr/share/" }
プレーンな findlib を使用した PKGBUILD の例
# Contributor: Your Name <youremail@domain.com> pkgname=ocaml-<package name> pkgver=4.2 pkgrel=1 license=() arch=('x86_64') pkgdesc="An OCaml Package" url="" depends=('ocaml') makedepends=('ocaml-findlib') source=() options=('!strip') md5sums=() OCAMLFIND_DESTDIR="${pkgdir}$(ocamlfind printconf destdir)" build() { cd "${srcdir}/${pkgname}-${pkgver}" mkdir -p "$OCAMLFIND_DESTDIR" ./configure --prefix=/usr make } package() { cd "${srcdir}/${pkgname}-${pkgver}" env DESTDIR="${pkgdir}" \ OCAMLFIND_DESTDIR="$OCAMLFIND_DESTDIR" \ make install }
多くの OCaml パッケージでは、make
および make install
に追加のパラメータを渡す必要があることが多いことに注意してください。また、パッケージがバイトコードを生成しない場合は、必ず !strip
オプションを削除し、アーキテクチャを変更してください。