我正在迁移到最新版本的OCaml (以及Jane Street的核心模块),但希望我的代码继续使用旧版本进行编译。为此,我想创建一个模块,该模块具有可移植的函数,根据版本的不同映射到旧的或新的接口。查询OCaml版本和Jane Street版本都是可行的。
我们如何在运行时查找编译器或Jane Street的版本?我知道我可以通过构建系统传递ocamlopt --version的输出,但理想情况下,我不应该以一种特殊的方式调用我的程序。
发布于 2022-02-07 01:55:48
发布于 2022-02-07 09:12:02
抱歉,回答一个稍微不同的问题,但这可能是XY问题:如果您想构建一个兼容性包,那么在运行时确定包的版本并不会有帮助,因为如下所示
let f = if Sys.ocaml_version > ... then new_function else compat_function 要求new_function独立于Sys.ocaml_version的运行时值存在。
兼容性包的一个常见解决方案是在构建时早期使用cppo检测版本,例如使用一些代码生成,例如https://github.com/janestreet/result或https://github.com/ocaml/stdlib-shims。
发布于 2022-02-07 07:07:03
您可以使用来自Compiler_libs的Compiler_libs,如这里所记录的https://ocaml.org/api/compilerlibref/Config.html。
注意事项来自Compiler_libs的警告:
这个库是内部OCaml编译器API的一部分,不是语言标准库。版本之间没有兼容性保证,因此针对这些模块编写的代码必须愿意依赖于特定的OCaml编译器版本。
https://stackoverflow.com/questions/71012423
复制相似问题