跳转至内容

OCaml软件包指南

来自 ArchWiki
Arch 软件包指南

32位CLRCMake交叉编译工具DKMSEclipse 插件Electron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由应用程序OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWeb 应用程序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 功能的一种方法是运行 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 包通常需要将额外的参数传递给 makemake install。另外,如果包不产生字节码,请记住删除 !strip 选项并更改体系结构。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.