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

Build 构造和构建OCaml项目的首选方法是什么?,build,makefile,ocaml,ocamlbuild,Build,Makefile,Ocaml,Ocamlbuild,对于生态系统的新手来说,构建和管理中小型OCaml项目的标准首选方式是什么还不清楚。我了解ocamlc,&c的基础知识,它们与传统的unixc编译器完全相同,看起来非常简单。但是,除了单个文件的一次性编译之外,还不清楚如何简单、干净地管理编译。问题不在于寻找潜在的工具,而在于寻找一种或几种正确(足够)的方法——社区经验证明了这一点——来构建和构建标准的OCaml项目 我的模型用例是一个普通但非平凡的项目,由纯OCaml或OCaml加上C依赖项组成。这样一个项目: 包含许多源文件 指向多个标准库的

对于生态系统的新手来说,构建和管理中小型OCaml项目的标准首选方式是什么还不清楚。我了解
ocamlc
,&c的基础知识,它们与传统的unixc编译器完全相同,看起来非常简单。但是,除了单个文件的一次性编译之外,还不清楚如何简单、干净地管理编译。问题不在于寻找潜在的工具,而在于寻找一种或几种正确(足够)的方法——社区经验证明了这一点——来构建和构建标准的OCaml项目

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

  • 包含许多源文件
  • 指向多个标准库的链接
  • 指向一个或多个第三方库的链接
  • 可选地包括一个C库和OCaml包装器作为子项目(尽管这也可以单独管理并作为第三方库包括,如(3)所示)
  • 有几种替代工具脱颖而出:

    • 定制Makefiles似乎是大多数开源OCaml包中的通用标准,但却令人沮丧地显得冗长和复杂——甚至比一般的C/C++项目更为复杂。更糟糕的是,许多看似简单的OCaml库将autoconf/automake放在最上面,以实现更大的复杂性
    • 它似乎提供了一种现代化、简化的机制,用于以最少的配置自动化构建,但对于新手来说,它并没有很好的文档记录,也没有在OCaml生态系统的介绍性材料中给出示例,也没有明显地被我浏览过的各种已发布的OCaml项目所使用
    • 似乎是其他构建系统之上的一层约定和库代码,以支持构建包管理器和库,如Cabal
    (我还看到,它似乎是一个自封的“
    make++
    ”,它还包括一套通用语言的标准规则,包括OCaml和née OCamlMakefile,为GNU
    make
    提供了一个标准规则模板)

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

    项目文件的最佳结构是什么


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

    我个人认为ocamlbuild需要+1。它的默认规则足够好,只需一个命令就可以编译中小型项目,而无需进行非常小的配置。它还强制执行一些非常合理的约定(不要将源代码与构建结果混合)。对于更大的项目,它可以根据需要定制,并带有额外的规则和插件。在我工作的公司,我们将它用于一个(Ocaml+一些C+一些预处理+…),它就像一个符咒一样工作(给我们带来的麻烦比Makefiles少得多)


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

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

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

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

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

    +1 for OMake

    几年前,我们对构建基础设施进行了改造,选择OMake的原因如下:

      我们的产品由C、C++、托管C++、露比和OCAML组成。
    • 我们的目标是Linux和Windows
    • 我们在构建时与数据库交互
    • 对于某些产品,我们必须使用OCAML3.10
    • 我们最初的构建系统使用autoconf/automake
    • 我们需要源代码外版本*
    老实说,我不知道我们是否可以用ocamlbuild实现它,我还没有测试过它。该工具确实在使用中,因为在OCaml的bug跟踪器中有一些活动围绕着它。如果您选择ocamlbuild,请确保您拥有最新版本的OCaml


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

    问得好。我倾向于说:

    1) 奥卡姆建筑 它可能是编译的标准方式,因为它高效、快速,并且是官方发行版提供的默认工具。事实上,它是在官方发行是好的一点,贝克