忽略 OCaml 与 OCamlbuild 的接口

Ignore OCaml interfaces with OCamlbuild

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

我能想到的一个潜在解决方案是插件中的新 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 ()
    | _ -> ())