我有一个大型库,我想创建一个打包所有模块但忽略.mli
源目录中存在的文件的目标。ocamlbuild
有没有一种通过插件或特殊集合使用的简单方法_tags
可以轻松完成此操作。
我能想到的一种潜在解决方案是OCaml
插件中的新编译规则,并将它们设置为比内置规则具有更高的优先级。
谢谢你。
我有一个大型库,我想创建一个打包所有模块但忽略.mli
源目录中存在的文件的目标。ocamlbuild
有没有一种通过插件或特殊集合使用的简单方法_tags
可以轻松完成此操作。
我能想到的一种潜在解决方案是OCaml
插件中的新编译规则,并将它们设置为比内置规则具有更高的优先级。
谢谢你。
默认情况下ocamlbuild
会首先尝试使用它mli
来编译cmi
文件。如果它找不到mli
文件,那么它将使该规则无效并尝试下一个。该ocamlbuild -documentation
命令将准确显示规则的顺序。如果适用多个规则,则选择第一个。不幸的是,没有界面可以更改规则的顺序或删除规则(除了删除所有规则)。但是我们可以将我们自己的规则添加到列表的顶部,这将覆盖违规规则。为此,我们需要编写以下myocamlbuild.ml
插件:
open Ocamlbuild_plugin
module Compiler = Ocamlbuild_pack.Ocaml_compiler
let override () =
rule "ocaml-override: ml -> cmo & cmi"
~insert:`top
~prods:["%.cmo"; "%.cmi"]
~deps:["%.ml"; "%.ml.depends"]
~doc:"This rule disables mli files."
(Compiler.byte_compile_ocaml_implem "%.ml" "%.cmo")
let () = dispatch (function
| After_rules -> override ()
| _ -> ())