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 を使うことが推奨されます。ただし多くのライブラリはネイティブコードを配布しています。
パッケージで何が配布されるのか、パッケージにネイティブのマシンコードとバイトコードが含まれるのかどうか確認するのが肝要です。
サンプル PKGBUILD
# Contributor: Your Name <youremail@domain.com>
pkgname=ocaml-<package name>
pkgver=4.2
pkgrel=1
license=()
arch=('i686' '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' オプションを外してアーキテクチャを変更してください。