是否实现了ocamlfind包谓词?

是否实现了ocamlfind包谓词?,ocaml,ocamlfind,Ocaml,Ocamlfind,我有一个名为sundialsml的包,我想在其中加载一个稍有不同的.cmxa文件,具体取决于是否加载了名为no_sens的子包。令人鼓舞的是,描述了一个包谓词特性: […]对于最终生成的每个包,都有包谓词 挑选出来的。[他们]的形式为包裹加上包裹名称 完全合格 所以我编写了这个元文件,其中归档在子包的包谓词上分支: version = "2.6.2" description = "OCaml interface to Sundials" requires = "bigarray" archive

我有一个名为sundialsml的包,我想在其中加载一个稍有不同的.cmxa文件,具体取决于是否加载了名为no_sens的子包。令人鼓舞的是,描述了一个包谓词特性:

[…]对于最终生成的每个包,都有包谓词 挑选出来的。[他们]的形式为包裹加上包裹名称 完全合格

所以我编写了这个元文件,其中归档在子包的包谓词上分支:

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的谓词从未定义过,除非我们说谓词pkg_foo;;当然

我是否错误地使用了包谓词?或者它们没有真正实施?如果是,是否有其他方法根据是否存在子包来选择不同的存档

请注意,这里的要点是根据用户选择的一组子包计算存档。因此,为什么不使用谓词并不是我要寻找的解决方案。

似乎根本没有为require指令实现pkg_uu谓词。当然,我可能是错的,因为我只是通过将代码变灰并进行实验来推断这一点。事实上,它只在前端实现,因此如果有人使用库接口,它也不可用,因此它不会在ocamlbuild中开箱即用。此外,pkg_uuo谓词仅为选定的软件包设置,而不是为已安装的软件包设置。如果选择,则表示包位于依赖项集中

这里有一个例子。我们使用以下元数据定义包ttt:

现在我们可以验证它是否有效:

$ ocamlfind c -only-show -linkpkg -package "ttt.bar" main.ml 
ocamlc.opt -I opam/lib/ttt opam/lib/ttt/bar.cma main.ml
注意:我使用了opam而不是ocaml安装的实际路径,以缩短输出以提高可读性

$ ocamlfind c -only-show -linkpkg -package "ttt.foo" main.ml 
ocamlc.opt -I opam/lib/ttt opam/lib/ttt/foo.cma main.ml
所以,当我们使用前端时,一切都正常。但如果我们从顶层尝试:

# #require "ttt.foo";;
opam/lib/ttt: added to search path
然后什么都没有加载

我们还可以尝试使用ocamlbuild:

所以没有任何东西是链接的,它不起作用。但如果您使用-use-ocamlfind选项,它将起作用,因为该选项规定ocamlbuild使用ocamlfind-fronted

$ ocamlbuild -use-ocamlfind -classic-display -package ttt.foo main.byte
ocamlfind ocamldep -package ttt.foo -modules main.ml > main.ml.depends
ocamlfind ocamlc -c -package ttt.foo -o main.cmo main.ml
ocamlfind ocamlc -linkpkg -package ttt.foo main.cmo -o main.byte
因此,总而言之,这个想法很好,在理论上可以工作,但最好不要使用它,因为实现还不完整

看起来好像根本没有为require指令实现pkg_uu谓词。当然,我可能是错的,因为我只是通过将代码变灰并进行实验来推断这一点。事实上,它只在前端实现,因此如果有人使用库接口,它也不可用,因此它不会在ocamlbuild中开箱即用。此外,pkg_uuo谓词仅为选定的软件包设置,而不是为已安装的软件包设置。如果选择,则表示包位于依赖项集中

这里有一个例子。我们使用以下元数据定义包ttt:

现在我们可以验证它是否有效:

$ ocamlfind c -only-show -linkpkg -package "ttt.bar" main.ml 
ocamlc.opt -I opam/lib/ttt opam/lib/ttt/bar.cma main.ml
注意:我使用了opam而不是ocaml安装的实际路径,以缩短输出以提高可读性

$ ocamlfind c -only-show -linkpkg -package "ttt.foo" main.ml 
ocamlc.opt -I opam/lib/ttt opam/lib/ttt/foo.cma main.ml
所以,当我们使用前端时,一切都正常。但如果我们从顶层尝试:

# #require "ttt.foo";;
opam/lib/ttt: added to search path
然后什么都没有加载

我们还可以尝试使用ocamlbuild:

所以没有任何东西是链接的,它不起作用。但如果您使用-use-ocamlfind选项,它将起作用,因为该选项规定ocamlbuild使用ocamlfind-fronted

$ ocamlbuild -use-ocamlfind -classic-display -package ttt.foo main.byte
ocamlfind ocamldep -package ttt.foo -modules main.ml > main.ml.depends
ocamlfind ocamlc -c -package ttt.foo -o main.cmo main.ml
ocamlfind ocamlc -linkpkg -package ttt.foo main.cmo -o main.byte

因此,总而言之,这个想法很好,在理论上可以工作,但最好不要使用它,因为实现还不完整

我的天啊。谁也想不到如何获得findlib会带来不同!谢谢,我可能会申请一个功能。哦,天哪。谁也想不到如何获得findlib会带来不同!谢谢,我可能会提出一个功能要求。