OCaml软件包指南
包命名
对于库,请使用 ocaml-模块名。对于应用程序,请使用程序名。无论哪种情况,名称都应全部小写。
文件放置
库
OCaml 库应安装在 /usr/lib/ocaml 下。安装在 /usr/lib/ocaml/site-lib 是不推荐的。
OCaml 库应使用 ocaml-findlib 进行安装。ocaml-findlib 在包中包含库元数据,便于管理库。它是事实上的标准,许多 OCaml 软件现在都需要它。
ocaml-findlib 从名为 META 的文件中提取必要的数据,该文件应包含在源存档中。如果此文件未包含,应从相应的 Debian、Ubuntu 或 Fedora 包中获取,或由维护者为包创建。还应向包的上游开发者请求包含此文件。
使用 ocaml-findlib 安装包时,应使用 OCAMLFIND_DESTDIR 变量。有关详细信息,请参阅下面的 PKGBUILD 示例。
OASIS
使用 OASIS 安装可执行文件的 OCaml 包会忽略 DESTDIR。这是 OASIS 的一个已知限制(issue #493)。启用 DESTDIR 功能的一种方法是运行 configure 脚本并带有 --destdir 参数,如下所示:
build() {
cd "${srcname}-${pkgver}"
./configure --prefix /usr --destdir "$pkgdir"
# build commands
}
OCaml 字节码和级别
OCaml 可以在多个“级别”上运行代码,顶层解释 OCaml 代码而不编译,字节码级别创建与机器无关的字节码,而本机级别创建机器码二进制文件(类似于 C/C++)。
构建 OCaml 包时,您需要了解构建过程是编译本机代码、字节码,还是(在许多情况下)两者都编译。这会产生一些可能导致包选项和正确依赖关系问题的场景。
如果产生了任何字节码,则 PKGBUILD 必须包含以下内容来保护字节码:
options=('!strip')
如果包不包含字节码,只分发二进制文件,则 ocaml 不需要作为依赖项,但当然需要作为 makedepends,因为 ocaml 包提供了 OCaml 编译器。如果包同时包含本机代码和字节码,则 ocaml 应同时是依赖项和 makedepends。
OCaml 代码很少(如果曾经)只以字节码形式分发,并且几乎总是包含本机代码:使用 *任何* 作为 *体系结构* 是可取的唯一情况是仅分发未编译的源代码时,通常是与库一起分发,尽管许多库仍会分发本机代码。
这里故事的寓意是,要了解您正在分发的内容,很可能您的包同时包含本机机器代码和字节码。
使用 Dune 的 PKGBUILD 示例
Dune 是一个 OCaml 项目日益广泛使用的新构建系统。
需要注意的是,单个项目可以在 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 "${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 "${pkgname}-${pkgver}"
DESTDIR="${pkgdir}" dune install --prefix "/usr" --libdir "/usr/lib/ocaml" --docdir "/usr/share/doc"
}
使用纯 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 "${pkgname}-${pkgver}"
mkdir -p "$OCAMLFIND_DESTDIR"
./configure --prefix=/usr
make
}
package() {
cd "${pkgname}-${pkgver}"
env DESTDIR="${pkgdir}" \
OCAMLFIND_DESTDIR="$OCAMLFIND_DESTDIR" \
make install
}
请记住,许多 OCaml 包通常需要将额外的参数传递给 make 和 make install。另外,如果包不产生字节码,请记住删除 !strip 选项并更改体系结构。