对于新手来说,在构建小到中等规模的OCaml项目时,什么是最推荐的结构和管理方式并不清楚。我了解ocamlc
的基本知识等--它们足够类似于常规的UNIX C编译器,看起来很简单。但是,在单个文件一次性编译的层面之上,如何以简单和清晰的方式管理编译并不清楚。问题不在于寻找潜在的工具,而在于看到一个或多个正确(足够)的方式--这些方式已经由社区的经验验证过--来构建和管理标准的OCaml项目。
我的模型用例是一个适度但非平凡的项目,纯粹使用OCaml或OCaml加上一个C依赖项。这样的项目:
- 包含许多源文件
- 链接到一些标准库
- 链接到一个或多个第三方库
- 可选地包含一个C库和OCaml包装器作为子项目(尽管这也可以单独管理并作为第三方库包含,如(3))
有几个备选工具:
- 自定义Makefile似乎是大多数开源OCaml软件包中的通用标准,但看起来比适度的C/C++项目更为冗长和复杂。更糟糕的是,许多看似简单的OCaml库在其上层autoconf/automake以增加更多的复杂性。
- ocamlbuild似乎提供了一种现代化、简化的机制来自动化构建,只需要最少的配置,但对于新手来说文档不充分,在OCaml生态系统的入门材料中没有被示例代表,也没有被我浏览过的各种已发布的OCaml项目所使用,因此不是很明显。
- OASIS似乎是在支持构建软件包管理器和库(如Cabal)的其他构建系统之上的一个公约和库代码层。
我还看到了一个名为OMake的工具,它自诩为“make++
”,还包括一套适用于常见语言(包括OCaml)的标准规则以及一个模板ocaml-make(前身为OCamlMakefile),提供GNU make
的标准规则。
这些工具中有没有一种现代化的首选方式来管理OCaml构建?
项目文件最佳结构是什么样的?
如何包含和管理第三方库依赖项?是将它们安装在系统级别上更好,还是有一种管理它们的标准简单方法,可以使其局限于项目本身?我更喜欢使用尽可能自包含的项目模型。
ocamlfind
使用ocamlc
、ocamlopt
和ocamlmklib
是构建 OCaml 项目最不痛苦的方式。我在这里记录了我的发现 https://github.com/pacemkr/ocaml-scrypt/blob/master/Makefile 。我相信oasis
和myocamlbuild.ml
这两个工具可以解决实际问题。我真的尝试过,但是这两个工具都无法很好地抽象出底层复杂性。 - Nick Zalutskiyopam
并不真正关心构建系统,这是好事。ocamlfind
使得使用ocamlc
和其他工具更加容易。这两个工具已经让我足够接近目标了。最困难的部分是理解所有中间产物(cm*)以及它们来自哪里,以及cclib
和类似标志的间接性,它们如何与包一起传递,自定义运行时构建等等。 - Nick Zalutskiy