编译 OCaml 时不要 Link 所有标准库模块
Don't Link all Standard Library Modules when Compiling OCaml
我正在为 CS class 整理一个介绍性 OCaml 项目,其中一部分涉及实现列表操作。我希望他们能够使用 Pervasives,但不能使用 List 或任何其他标准库模块。有没有办法设置 ocamlbuild,使其仅链接到标准库中的 Pervasives?
您可以使用编译器的 -nostdlib
选项,但这会隐藏 Pervasives
和 List
。
你想要的很难实现,因为两个编译单元都是同一个库存档的一部分,即 stdlib.cma
。
您可以尝试编译您自己的 Pervasives
副本并使用上面的标志。
我看到两个机会:要么直接从 OCaml 标准库中删除模块,要么通过重载具有不同(可能为空)签名的模块来隐藏它们。
第一个变体需要编辑 OCaml 分发 Makefile。使用 opam 并没有那么可怕,实际上,因为您可以很容易地修补 OCaml 并将每个修补的 OCaml 作为单独的编译器分发。要从 stdlib 存档中删除模块,您需要编辑 stdlib/Makefile.shared
、stdlib/StdlibModules
和 stdlib.mllib
。删除不需要的模块后,您可以:
./configure
make world.opt
make install
另一种选择是(ab)使用 ocamlc
的 -open
命令行参数。当这个选项指定了一个模块的名称时,这个模块将在编译的程序中自动打开。例如,您可以在具有以下接口 (minimal.mli
) 的标准库上编写自己的叠加层:
module List = sig end (* or whatever you want to expose *)
然后你可以用 ocamlc -open minimal ...
编译,或者用 ocamlbuild
编译: ocamlbuild -cflags -open,minimal ...
(你也可以使用 _tags
文件来传递打开标志,或者编写一个 ocamlbuild 插件)。
我正在为 CS class 整理一个介绍性 OCaml 项目,其中一部分涉及实现列表操作。我希望他们能够使用 Pervasives,但不能使用 List 或任何其他标准库模块。有没有办法设置 ocamlbuild,使其仅链接到标准库中的 Pervasives?
您可以使用编译器的 -nostdlib
选项,但这会隐藏 Pervasives
和 List
。
你想要的很难实现,因为两个编译单元都是同一个库存档的一部分,即 stdlib.cma
。
您可以尝试编译您自己的 Pervasives
副本并使用上面的标志。
我看到两个机会:要么直接从 OCaml 标准库中删除模块,要么通过重载具有不同(可能为空)签名的模块来隐藏它们。
第一个变体需要编辑 OCaml 分发 Makefile。使用 opam 并没有那么可怕,实际上,因为您可以很容易地修补 OCaml 并将每个修补的 OCaml 作为单独的编译器分发。要从 stdlib 存档中删除模块,您需要编辑 stdlib/Makefile.shared
、stdlib/StdlibModules
和 stdlib.mllib
。删除不需要的模块后,您可以:
./configure
make world.opt
make install
另一种选择是(ab)使用 ocamlc
的 -open
命令行参数。当这个选项指定了一个模块的名称时,这个模块将在编译的程序中自动打开。例如,您可以在具有以下接口 (minimal.mli
) 的标准库上编写自己的叠加层:
module List = sig end (* or whatever you want to expose *)
然后你可以用 ocamlc -open minimal ...
编译,或者用 ocamlbuild
编译: ocamlbuild -cflags -open,minimal ...
(你也可以使用 _tags
文件来传递打开标志,或者编写一个 ocamlbuild 插件)。