3

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

我能想到的一种潜在解决方案是OCaml插件中的新编译规则,并将它们设置为比内置规则具有更高的优先级。

谢谢你。

4

1 回答 1

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 ()
    | _ -> ())
于 2016-02-02T12:38:16.780 回答