「OCaml パッケージガイドライン」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
45行目: 45行目:
 
パッケージで何が配布されるのか、パッケージにネイティブのマシンコードとバイトコードが含まれるのかどうか確認するのが肝要です。
 
パッケージで何が配布されるのか、パッケージにネイティブのマシンコードとバイトコードが含まれるのかどうか確認するのが肝要です。
   
== サンプル PKGBUILD ==
+
== Dune を使用した PKGBUILD の例 ==
  +
  +
[https://dune.build/Dune] は、OCaml プロジェクトでますます使用されるようになっている新しいビルドシステムです。
  +
  +
注意すべき点の 1 つは、単一のプロジェクトで OPAM/findlib の意味で複数の ''パッケージ'' を構築でき、それぞれが {{ic|/usr/lib/ocaml/}} に独自のディレクトリを持つということです。例については、{{pkg|ocaml-cairo}} を参照してください。リリースビルドの場合、すべての ''パッケージ'' を明示的にリストする必要があります。
   
 
{{bc|1=
 
{{bc|1=
54行目: 58行目:
 
pkgrel=1
 
pkgrel=1
 
license=('')
 
license=('')
arch=('i686' 'x86_64')
+
arch=('x86_64')
 
pkgdesc="An OCaml Package"
 
pkgdesc="An OCaml Package"
 
url=""
 
url=""
 
depends=('ocaml')
 
depends=('ocaml')
makedepends=('ocaml-findlib')
+
makedepends=('dune')
 
source=()
 
source=()
 
options=('!strip')
 
options=('!strip')
md5sums=()
+
sha256sums=()
 
OCAMLFIND_DESTDIR="${pkgdir}$(ocamlfind printconf destdir)"
 
   
 
build() {
 
build() {
 
cd "${srcdir}/${pkgname}-${pkgver}"
 
cd "${srcdir}/${pkgname}-${pkgver}"
  +
# The "-p" flag is necessary for release builds, see the Dune manpage. Dune will complain if you forget some packages.
mkdir -p "$OCAMLFIND_DESTDIR"
 
  +
dune build -p package1,package1-extension,package2
./configure --prefix=/usr
 
make
 
 
}
 
}
   
 
package() {
 
package() {
 
cd "${srcdir}/${pkgname}-${pkgver}"
 
cd "${srcdir}/${pkgname}-${pkgver}"
env DESTDIR="${pkgdir}" \
+
DESTDIR="${pkgdir}" dune install --prefix "/usr" --libdir "lib/ocaml"
  +
OCAMLFIND_DESTDIR="$OCAMLFIND_DESTDIR" \
 
  +
# Dune installs documentation in /usr/doc, fix that.
make install
 
  +
install -dm755 "${pkgdir}/usr/share/"
  +
mv "${pkgdir}/usr/doc" "${pkgdir}/usr/share/"
 
}
 
}
 
}}
 
}}
 
大抵の OCaml パッケージでは make や make install にパラメータを追加で指定する必要があることを覚えてください。また、パッケージがバイトコードを生成しない場合は'' '!strip' ''オプションを外してアーキテクチャを変更してください。
 

2023年6月28日 (水) 15:01時点における版

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/"
}