OCaml パッケージガイドライン

提供: ArchWiki
2023年6月28日 (水) 15:02時点におけるKgx (トーク | 投稿記録)による版 (プレーンな findlib を使用した PKGBUILD の例を翻訳して追加)
ナビゲーションに移動 検索に移動

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 のコードがバイトコードとしてのみ配布されていることがあります: コンパイルされていないソースコードしか配布されていない場合に archany を使うことが推奨されます。ただし多くのライブラリはネイティブコードを配布しています。

パッケージで何が配布されるのか、パッケージにネイティブのマシンコードとバイトコードが含まれるのかどうか確認するのが肝要です。

Dune を使用した PKGBUILD の例

[1] は、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 オプションを削除し、アーキテクチャを変更してください。