OCaml 软件包指南

出自 ArchWiki
Arch 软件包指南

32 位CLRCMake交叉编译工具DKMSEclipseElectronFontFree PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由软件OCamlPerlPHPPythonRRubyRust - SecurityShellVCSWeb 应用程序Wine

为使用 OCaml 编写的软件编写 PKGBUILD

软件包命名

对于库,使用 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 功能的一种方法是使用 --destdir 参数运行 configure 脚本,如下所示

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 代码很少(如果曾经)仅作为字节码分发,并且几乎总是包含原生代码:建议将 any 用作 arch 的唯一情况是仅分发未编译的源代码,通常是库,尽管许多库仍然分发原生代码。

这里的寓意是要意识到您正在分发什么,您的软件包很可能同时包含原生机器代码和字节码。

使用 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 软件包通常需要将额外的参数传递给 makemake install。另请记住,如果软件包不生成字节码,请删除 !strip 选项并更改架构。