忽略OCaml与OCamlbuild的接口

时间:2016-01-30 06:48:06

标签: ocaml ocamlbuild

我有一个大型库,我想创建一个包装所有模块的目标,但忽略源目录中存在的.mli文件。有没有一种简单的方法可以通过插件或ocamlbuild的特殊集合来使用_tags来轻松实现此目的。

我能想到的一个可能的解决方案是插件中新的OCaml编译规则,并将它们设置为优先于规则中的构建。

谢谢。

1 个答案:

答案 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 ()
    | _ -> ())