我有一个大型库,我想创建一个包装所有模块的目标,但忽略源目录中存在的.mli
文件。有没有一种简单的方法可以通过插件或ocamlbuild
的特殊集合来使用_tags
来轻松实现此目的。
我能想到的一个可能的解决方案是插件中新的OCaml
编译规则,并将它们设置为优先于规则中的构建。
谢谢。
答案 0 :(得分:2)
默认情况下,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 ()
| _ -> ())