【发布时间】:2016-06-23 11:11:30
【问题描述】:
我有一个名为 sundialsml 的包,我想在其中加载一个稍微不同的 .cm(x)a 文件,具体取决于是否加载了名为 no_sens 的子包。很有希望的是,findlib 1.6.2 reference manual 描述了一个“包谓词”功能:
[...] 每个包都有包谓词,最后是 选择。 [它们] 具有“pkg_”形式加上包的名称 (完全合格)。
所以我写了这个 META 文件,其中 archive 在子包的包谓词上分支:
version = "2.6.2"
description = "OCaml interface to Sundials"
requires = "bigarray"
archive(byte) = "sundials.cma"
archive(byte,pkg_sundialsml.no_sens) = "sundials_no_sens.cma"
archive(native) = "sundials.cmxa"
archive(native,pkg_sundialsml.no_sens) = "sundials_no_sens.cmxa"
package "no_sens" (
version = "2.6.2"
description = "Sundials/ML without sensitivity analysis (CVODE, IDA, KINSOL)"
requires = "sundialsml"
)
但是findlib加载sundials.cma不管子包no_sens是否加载,例如:
# #use "topfind";;
- : unit = ()
Findlib has been successfully loaded. Additional directives:
#require "package";; to load a package
#list;; to list the available packages
#camlp4o;; to load camlp4 (standard syntax)
#camlp4r;; to load camlp4 (revised syntax)
#predicates "p,q,...";; to set these predicates
Topfind.reset();; to force that packages will be reloaded
#thread;; to enable threads
- : unit = ()
# #require "sundialsml.no_sens";;
/home/jun/.opam/4.01.0/lib/ocaml/unix.cma: loaded
/home/jun/.opam/4.01.0/lib/ocaml/bigarray.cma: loaded
/home/jun/.opam/4.01.0/lib/sundialsml: added to search path
/home/jun/.opam/4.01.0/lib/sundialsml/sundials.cma: loaded
如果我尝试在顶级包上进行分支,例如ao,也会发生同样的情况。事实上,据我所知,pkg_foo 形式的谓词从未定义过(当然,除非我们说 #predicates "pkg_foo";;)。
我是否错误地使用了包谓词?还是它们没有真正实施?如果是这样,有没有其他方法可以根据子包的存在/不存在选择不同的存档?
请注意这里的重点是计算用户选择的子包集合中的存档。所以“你为什么不使用#predicates”不是我正在寻找的解决方案。
【问题讨论】: