我有一个很大的库,我想创建一个包含所有模块的目标,但忽略源目录中存在的.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 ()
    | _ -> ())

关于ocaml - 忽略OCaml与OCamlbuild的接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35098936/

10-10 10:22