build - 构建和构建 OCaml 项目的首选方式是什么?

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

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

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

几个替代工具脱颖而出:

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

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

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

项目文件的最佳结构是怎样的?

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

最佳答案

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

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

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

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

https://stackoverflow.com/questions/5956317/

相关文章:

visual-studio-2010 - MSbuild 是否需要在构建服务器上安装 Visual

ubuntu - 试图包含一个库,但不断收到 'undefined reference to' 消息

c++ - 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

ios - Swift 框架不适用于命名为 'Debug' 或 'Release' : No suc

android - 使用 gradle 签署产品 flavor

visual-studio - Visual Studio 在构建期间不断挂起

c# - 自动在 Visual Studio c# 项目中嵌入 mercurial 修订信息

build - CMakeLists.txt 中未使用 CMAKE_BUILD_TYPE

python - 有没有办法将 python 应用程序编译成静态二进制文件?

android - 如何将构建时间戳写入apk