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