构建和构建OCaml项目的首选方法是什么?

jrk*_*jrk 57 ocaml makefile build ocamlbuild

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

我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:

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

几个替代工具脱颖而出:

  • 自定义Makefile似乎是大多数开源OCaml包中的通用标准,但看起来令人沮丧的冗长和复杂 - 甚至比适度的C/C++项目更令人沮丧.更糟糕的是,许多甚至看似简单的OCaml库层都将autoconf/automake置于顶层,以实现更高的复杂性.
  • ocamlbuild似乎提供了一种现代化,简化的机制,可以使用最少的配置自动化构建,但是对于新手来说没有很好的文档记录,在OCaml生态系统的介绍性材料中也没有示例,也没有被各种已发布的OCaml项目明显使用.我一直在寻找灵感.
  • OASIS似乎是其他构建系统顶层的约定和库代码层,以支持构建包管理器和库,如Cabal.

(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)

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

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

如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.

Ash*_*wal 21

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

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

您也可以跳过所有这些并直接使用oasis.这是非常新的,稳定版本尚未公布,但它非常实用.它会自动为您生成myocamlbuild.ml.如果不是这样,这可能是在不久的将来发展的方式.此外,通过使用oasis,您将立即获得oasis-db的好处,这是一个正在开发的OCaml的CPAN系统.

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

  • 这个答案已经差不多三年了.我想分享一下我作为新人的经历.经过多次努力之后,我得出的结论是,通过`ocamlfind`吞噬文档并使用`ocamlc`,`ocamlopt`和`ocamlmklib`是构建OCaml项目最不痛苦的方法.我在这里记录了我的发现https://github.com/pacemkr/ocaml-scrypt/blob/master/Makefile我确定`oasis`和`myocamlbuild.ml`文件可以解决实际问题.我试过,我真的有,但这两个工具都在扼杀抽象的潜在复杂性. (5认同)
  • 另一个简单的Makefile,供后人使用:https://github.com/pacemkr/ocaml-termbox/blob/master/Makefile (3认同)
  • 我认为我的回答也已过时.最近我一直在使用[OMake](http://omake.metaprl.org/),但我对所有构建工具都不满意,并希望最终会出现从根本上更好的东西. (2认同)
  • 事情正在改善,'opam`并不真正关心构建系统,这很好.`ocamlfind`使用`ocamlc`和朋友更容易.这两个让我足够接近.最难的部分是理解所有中间工件(cm*)及其来源,以及`cclib`和类似标志的间接,它们如何与包一起传递,自定义运行时构建等. (2认同)

ako*_*ski 14

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

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

  • 对于所有ocamlbuild粉丝:请记住*你*可以通过帮助编写文档,发布有趣的自制`myocamlbuild.ml`文件的片段,甚至可能为代码做贡献来改进工具(但为此你应该首先联系开发人员以获取您想要的功能(在我的愿望清单上轻松定位:允许调用ocamldoc来生成点图). (7认同)

blt*_*txd 10

为OMake +1.

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

  • 我们的产品由C,C++,托管C++,Ruby和OCaml组成.
  • 我们的目标是Linux和Windows.
  • 我们在构建时与数据库进行交互.
  • 对于某些制作,我们必须使用OCaml 3.10.
  • 我们的原始构建系统使用autoconf/automake.
  • 我们需要out-of-source build*.

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

*OMake以一种非显而易见的方式支持源外构建.当源是只读时,它也有一些问题.我们必须修补并重建我们的Windows版本的OMake.

  • 我想看看omake和ocamlbuild之间的比较.我使用omake取得了很大的成功.当我尝试ocamlbuild时没有那么多运气,但那是几年前的事. (3认同)

kev*_*nji 7

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

快速入门页面提供了各种项目模板开始。

Dune 还可以处理以下问题:

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

Esy是一个较新的 package.json 驱动的包管理器,诞生于 Reason 社区。它的特点是它带来了开箱即用的项目沙箱,并提供了一种简单的方法来提取现有的 opam 包。