首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否实现ocamlfind包谓词?

是否实现ocamlfind包谓词?
EN

Stack Overflow用户
提问于 2016-03-09 07:27:38
回答 1查看 174关注 0票数 1

我有一个名为sundialsml的包,在这个包中,我希望加载一个稍微不同的.cm(X)文件,这取决于是否加载了名为no_sens的子包。值得庆幸的是,findlib 1.6.2参考手册描述了“包谓词”特性:

..。对于最后选择的每个包,都有包谓词。它们有表单"pkg_“加上包的名称(完全限定)。

因此,我编写了这个元文件,其中archive分支于子包的包谓词:

代码语言:javascript
复制
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是否加载,例如:

代码语言:javascript
复制
# #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";; )。

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

请注意这里的要点是从用户选择的一组子包中计算存档。所以,“为什么不使用#谓词”不是我正在寻找的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-09 13:25:44

看起来,pkg_谓词根本没有为#require指令实现。当然,我可能错了,因为我只是通过修改代码和进行实验来推断这一点。事实上,它只是在前端实现的,所以如果有人正在使用库接口,它也是不可用的(因此它不会在ocamlbuild中开箱即用)。此外,只为选定的包设置pkg_谓词,而不是为已安装的包设置。选择的地方意味着包在依赖项的集合中。

下面是一个例子。我们用下面的ttt定义包META

代码语言:javascript
复制
archive(byte,pkg_ttt.foo) = "foo.cma"
archive(byte,pkg_ttt.bar) = "bar.cma"

package "foo" (
  requires = "ttt"
)

package "bar" (
  requires = "ttt"
)

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

代码语言:javascript
复制
$ 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安装的实际路径,以缩短输出以提高可读性。

代码语言:javascript
复制
$ ocamlfind c -only-show -linkpkg -package "ttt.foo" main.ml 
ocamlc.opt -I opam/lib/ttt opam/lib/ttt/foo.cma main.ml

所以,当我们使用前端时,一切都正常。但如果我们从托普莱尔开始:

代码语言:javascript
复制
# #require "ttt.foo";;
opam/lib/ttt: added to search path

那就什么都没装了。

我们也可以尝试使用ocamlbuild

代码语言:javascript
复制
$ ocamlbuild -classic-display -package ttt.foo main.byte
opam/bin/ocamldep.opt -modules main.ml > main.ml.depends
opam/bin/ocamlc.opt -c -I opam/lib/ttt -o main.cmo main.ml
opam/bin/ocamlc.opt -I opam/lib/ttt main.cmo -o main.byte

所以没有什么是联系在一起的,它不起作用。但是如果您要使用-use-ocamlfind选项,它就会起作用,因为这个选项规定ocamlbuild使用ocamlfind前端。

代码语言:javascript
复制
$ 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

因此,最后,这个想法是好的,理论上可以工作,但是最好不要使用它,因为实现还没有完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35885467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档