编译OCaml时不要链接所有标准库模块

时间:2017-02-13 05:06:20

标签: ocaml ocamlbuild

我正在为CS类组合一个介绍OCaml项目,其中一部分涉及实现列表操作。我希望他们能够使用Pervasives,但不能使用List或任何其他标准库模块。有没有办法设置ocamlbuild所以它只链接标准库中的Pervasives?

2 个答案:

答案 0 :(得分:2)

您可以使用编译器的-nostdlib选项,但这会隐藏PervasivesList

您想要的是很难实现的,因为两个编译单元都属于同一个库归档stdlib.cma

您可以尝试编译自己的Pervasives副本并使用上面的标记。

答案 1 :(得分:1)

我看到两个机会:直接从OCaml标准库中删除模块,或者通过使用具有不同(可能为空)签名的模块重载来隐藏它们。

第一个变体需要编辑OCaml分发Makefile。实际上,使用opam并不是那么可怕,因为您可以非常轻松地修补OCaml并将每个修补的OCaml作为单独的编译器进行分发。要从stdlib存档中删除模块,您需要修改stdlib/Makefile.sharedstdlib/StdlibModulesstdlib.mllib。删除不必要的模块后,您可以执行以下操作:

./configure
make world.opt
make install

另一种选择是(ab)使用-open ocamlc命令行参数。如果使用模块名称指定此选项,则将在编译的程序中自动打开此模块。例如,您可以在标准库上编写自己的叠加层,该库具有以下接口(minimal.mli):

module List = sig end (* or whatever you want to expose *)

然后您可以使用ocamlc -open minimal ...进行编译,或者使用ocamlbuild进行编译:{{1​​}}(您也可以使用ocamlbuild -cflags -open,minimal ...文件来传递打开标记,或者编写ocamlbuild插件)。