什么是结构和build立OCaml项目的首选方法?

对于这个生态系统的新手来说,build立和pipe理build设中小型OCaml项目的正式的首选方法是不清楚的。 我理解了ocamlc的基础知识,它们反映了传统的UNIX C编译器,看起来很简单。 但是,在单个文件一次编译的水平之上,不清楚如何更好地pipe理编译的简单和干净。 这个问题并不是寻找潜在的工具,而是通过构build和build立标准的OCaml项目来看到一个或几个正确的(足够的)方法 – 经过社区的validation。

我的模型用例是一个纯粹的OCaml或OCaml以及一个C依赖项的一个适度但不重要的项目。 这样一个项目:

  1. 包含一些源文件
  2. 链接到一些标准库
  3. 链接到一个或多个第三方库
  4. 可以select包含一个C库和OCaml包装作为子项目(虽然这也可以单独pipe理,并作为第三方库包含,如(3))

几个替代工具脱颖而出:

  • 自定义Makefiles似乎是大多数开源OCaml软件包的通用标准,但看起来令人沮丧和复杂 – 甚至比适度的C / C ++项目更为复杂。 更糟糕的是,很多甚至看起来很简单的OCaml库在autoconf / automake层上面更复杂。
  • ocamlbuild似乎提供了一个现代的,简化的机制,用最less的configuration自动化构build,但是它并没有很好的logging给新手,也没有在OCaml生态系统的介绍性材料中用实例来表示,也没有被任何已发布的OCaml项目我浏览过灵感。
  • OASIS似乎是其他构build系统上的一个约定和库代码层,以支持构build一个包pipe理器和库,如Cabal。

(我也看到了OMake ,它似乎是一个自制的“ make++ ”,它也包括一套通用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU make提供了一个标准规则模板。 )

这些都是pipe理OCaml的首选,现代化的方式吗?

项目文件的结构如何?

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

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

有些人反对ocamlbuild,因为它是另一个构build工具,使包pipe理器工作变得复杂。 然而,它的易用性和包含在官方发行版中的事实正在被越来越广泛地使用。

你也可以跳过这一切,直接使用绿洲。 这是非常新的,稳定的版本尚未公布,但它是非常有用的。 它会自动为你生成myocamlbuild.ml。 如果不是这样的话,这很可能是不久的将来。 此外,通过使用绿洲,您将立即获得正在开发的OCaml CPAN系统oasis-db的优势。

关于pipe理图书馆,答案是ocamlfind。 如果安装了多个OCaml实例,则调用ocamlfind的相应副本将自动使所有引用库成为特定实例的引用,假定您对所有库都使用ocamlfind。 我目前使用godi来安装OCaml和库。 它使用ocamlfind,并且我没有安装多个OCaml实例的问题。

就个人而言,我会给ocamlbuild +1。 这是默认的规则足够好,可以用一个命令编译小型到中型的项目,而不需要很less的configuration。 它还强制执行一些非常合理的约定(不要混合源代码和编译结果)。 而对于较大的项目,可以根据自己的意愿进行定制,并附加额外的规则和插件。 在我工作的公司,我们将它用于一个大型项目 (Ocaml +一些C +一些预处理+ …),它的function就像一个魅力(并且比Makefiles更让我们头痛)。

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

为OMake +1。

几年前我们修改了构build基础设施,并select了OMake,原因如下:

  • 我们的产品由C,C ++,Managed C ++,Ruby和OCaml混合而成。
  • 我们的目标是Linux和Windows。
  • 我们在构build时与数据库进行交互。
  • 对于一些产品,我们不得不使用OCaml 3.10。
  • 我们最初的构build系统使用了autoconf / automake。
  • 我们需要源代码构build*。

说实话,我不知道我们是否可以用ocamlbuild做到这一点,我还没有testing过。 由于OCaml的bug追踪器中有一些活动,所以这个工具确实在使用。 如果你selectocamlbuild,确保你有一个最新版本的OCaml。

* OMake支持外部源代码构build有点不明显。 当来源为只读时,它也有一些问题。 我们不得不修补和重build我们的Windows版本的OMake。

好问题。 我会倾向于说:

1)ocamlbuild这很可能是编译的标准方式,因为它是高效,快速的,并且是官方发布的默认工具。 事实上,这是正式分配的好处,因为它更可能与时间保持一致。 此外,它已经启用了ocamlfind,所以它可以pipe理与ocamlfind一起安装的包,这是安装包的另一个标准(ocamlfind有点像C的pkg-config)

2)但是这对于你的项目是不够的。 与C的集成与ocamlbuild是基本的。 所以在这里,我可能会build议你使用绿洲来最终回答你的问题。 我也试过OMake,但不喜欢它。

3)但是,如果你不希望其他人能够在自己的机器上下载和构build你的项目,那么你的构build脚本不太可能正常工作。 此外,绿洲不处理pkg-config。 由于这些原因,我倾向于build议你使用ocaml-autoconf(ocamlmacros作为autotools)。 因为autotools是pipe理C库的标准,而且它是包维护者所熟知的。 它也可以处理交叉编译…

=> ocaml-autoconf与ocamlbuild