62

对于生态系统的新手来说,目前尚不清楚构建和管理构建中小型 OCaml 项目的规范首选方式是什么。我了解ocamlc, &c 的基础知识——它们反映了传统的 UNIX C 编译器,足以看起来简单明了。但是,在单个文件的一次性编译级别之上,尚不清楚如何最好地简单而干净地管理编译。问题不在于寻找潜在的工具,而是找到一种或几种正确(足够)的方式——正如社区经验所验证的——用于构建和构建标准 OCaml 项目。

我的模型用例是一个普通但不平凡的项目,纯 OCaml 或 OCaml 加上 C 依赖项。这样的项目:

  1. 包含许多源文件
  2. 链接到许多标准库
  3. 一个或多个第三方库的链接
  4. 可选地包括一个 C 库和 OCaml 包装器作为子项目(尽管这也可以单独管理并作为第 3 方库包含,如 (3) 中所示)

几个替代工具脱颖而出:

  • 自定义 Makefile 似乎是大多数开源 OCaml 包中的通用标准,但显得冗长和复杂——甚至比普通的 C/C++ 项目还要复杂。更糟糕的是,许多甚至看似简单的 OCaml 库都将 autoconf/automake 置于顶层,以实现更大的复杂性。
  • ocamlbuild似乎提供了一种现代的、流线型的机制,用于以最少的配置自动构建,但对于新手来说没有很好的文档记录,也没有在 OCaml 生态系统的介绍性材料中以示例为代表,也没有被任何已发布的 OCaml 项目明显使用我已经浏览了灵感。
  • OASIS似乎是其他构建系统之上的一层约定和库代码,以支持构建包管理器和库,例如 Cabal。

(我还看到OMake,它似乎是一个自封的“ make++”,其中还包括一套通用语言的标准规则,包括 OCaml 和ocaml-make née OCamlMakefile,为 GNU 提供标准规则模板make。)

这些是否是管理 OCaml 构建的首选现代方式?

项目文件的结构如何最好?

如何包含和管理 3rd 方库依赖项?是首选在系统级别安装它们,还是有一种标准且直接的方式将它们本地管理到项目中?我更喜欢项目尽可能独立的模型。

4

5 回答 5

23

您已经获得了可用选项的完整列表,但这个问题不会有明确的答案。我个人的建议也是使用 ocamlbuild。这里提供的 myocamlbuild.ml 文件是一个好的开始。它将允许您轻松编译依赖于各种库的项目。我认为它不能处理绑定到 C 库的情况,但wiki上还有其他示例可能会有所帮助。

有些人反对 ocamlbuild,因为它是另一种构建工具,使包管理器的工作变得复杂。然而,它的易用性以及它包含在官方发行版中的事实使得它的使用越来越广泛。

你也可以跳过这一切,直接使用oasis。很新,还没有发布稳定版,但是很好用。它将自动为您生成 myocamlbuild.ml。如果还没有的话,这可能是在不久的将来要走的路。此外,通过使用 oasis,您将立即受益于 oasis-db,这是一个正在开发中的 OCaml 类 CPAN 系统。

关于管理图书馆,答案是 ocamlfind。如果您安装了多个 OCaml 实例,则调用 ocamlfind 的适当副本将自动导致对库的所有引用都是针对该特定实例的引用,假设您对所有库系统地使用 ocamlfind。我目前使用 godi 安装 OCaml 和库。它使用 ocamlfind,安装多个 OCaml 实例没有问题。

于 2011-05-11T12:43:56.307 回答
15

我个人会给 ocamlbuild +1。它的默认规则足以用一个命令编译中小型项目,而没有到非常小的配置。它还强制执行一些非常合理的约定(不将源与构建结果混合)。对于较大的项目,它可以根据自己的需要进行定制,带有额外的规则和插件。在我工作的公司,我们将它用于一个大型项目(Ocaml + 一些 C + 一些预处理 + ...),它的工作原理就像一个魅力(并且比 Makefile 给我们带来的麻烦要少得多)。

至于手册,我认为用户指南(可从作者的网页获得)应该足以让您入门。更时髦的东西可能需要更多的挖掘。

于 2011-05-10T21:45:01.563 回答
10

+1 为 OMake。

几年前,我们改进了构建基础架构并选择了 OMake,原因如下:

  • 我们的产品由 C、C++、托管 C++、Ruby 和 OCaml 混合而成。
  • 我们针对 Linux 和 Windows。
  • 我们在构建时与数据库交互。
  • 对于某些制作,我们必须使用 OCaml 3.10。
  • 我们最初的构建系统使用了 autoconf/automake。
  • 我们需要外源构建*。

老实说,我不知道我们是否可以使用 ocamlbuild 来完成,我还没有测试过。该工具肯定在使用,因为在 OCaml 的 bugtracker 中有一些围绕它的活动。如果您选择 ocamlbuild,请确保您拥有最新版本的 OCaml。

* OMake 以一种不太明显的方式支持源外构建。当源是只读的时,它也有一些问题。我们必须修补和重建我们的 Windows 版本的 OMake。

于 2011-05-11T13:51:07.563 回答
7

当前的建议是使用Dune,这是一个支持 OCaml 和 Reason 编译的可组合构建系统。它正在积极开发中。

快速入门页面提供了多种项目模板供您开始使用。

Dune 还可以处理以下问题:

Opam是 OCaml 的事实上的包管理器。除了查找和安装包,它还可以处理多个 OCaml 安装

Esy是来自 Reason 社区的更新的、由 package.json 驱动的包管理器。的卖点是它带来了开箱即用的项目沙盒,并提供了一种简单的方法来提取现有的 opam 包。

于 2020-03-31T02:56:01.673 回答
3

好问题。我倾向于说:

1) ocamlbuild 很可能是标准的编译方式,因为它高效、快速,而且是官方发行版给出的默认工具。它在官方发行版中的事实很好,因为它更有可能随着时间的推移而保留。此外,它启用了 ocamlfind,因此它可以管理使用 ocamlfind 安装的软件包,这是安装软件包的另一种标准(ocamlfind 有点像 C 的 pkg-config)

2)但这对您的项目来说还不够。与 C 的集成是 ocamlbuild 的基础。所以在这里我可能会建议你使用 oasis 来最终回答你的问题。我也尝试过 OMake,但不喜欢它。

3) 但是,如果您不希望其他人能够在他们自己的机器上下载和构建您的项目,那么您的构建脚本不太可能直接运行。此外,oasis 不处理 pkg-config。出于这些原因,我倾向于建议您使用 ocaml-autoconf(用于自动工具的 ocaml 宏)。因为 autotools 是管理 C 库的标准,并且它为包维护者所熟知。它还可以处理交叉编译...

=> 带有 ocamlbuild 的 ocaml-autoconf

于 2012-05-22T17:57:58.040 回答