OCaml 软件包指南
32 位 – CLR – CMake – 交叉编译工具 – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由软件 – OCaml – Perl – PHP – Python – R – Ruby – Rust - Security – Shell – VCS – Web 应用程序 – Wine
软件包命名
对于库,使用 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 软件包通常需要将额外的参数传递给 make
和 make install
。另请记住,如果软件包不生成字节码,请删除 !strip
选项并更改架构。