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