66个版本
1.0.0-beta.5 | 2023年1月21日 |
---|---|
1.0.0-beta.4 | 2022年10月24日 |
1.0.0-beta.3 | 2022年8月7日 |
1.0.0-beta.1 | 2022年7月29日 |
0.3.9 | 2018年3月11日 |
#49 in FFI
4,650 每月下载量
在 3 crate 中使用
145KB
3.5K SLoC
ocaml-rs - Rust中的OCaml扩展
ocaml-rs
允许直接在Rust中编写OCaml扩展,无需C存根。它最初是从 raml 分叉而来,但由于 OCaml软件基金会 的支持,几乎完全重写。
支持OCaml版本 4.08.0
及更高版本
请在 github 上报告任何问题
注意:虽然 ocaml-rs
可以安全使用,但它不能防止广泛的潜在错误或错误。应将其视为现有C API的Rust实现。可以使用 ocaml-interop 来执行安全的OCaml/Rust互操作。ocaml-rs
在幕后使用 ocaml-interop
与垃圾收集器交互。ocaml-rs
还导出了一个 interop
模块,它是 ocaml_interop
的别名,如果需要,可以将两个接口结合使用。
文档
入门指南
ocaml-rust-starter 是一个基本示例,可以帮助您开始使用 ocaml-rs
。
在Rust方面,您需要将以下内容添加到您的 Cargo.toml
ocaml = "*"
或
ocaml = {git = "https://github.com/zshipko/ocaml-rs"}
对于macOS,您还需要将以下内容添加到项目中的.cargo/config
文件中
[build]
rustflags = ["-C", "link-args=-Wl,-undefined,dynamic_lookup"]
这是因为macOS默认不允许动态库中存在未定义的符号。
此外,如果您计划发布到opam,您需要将Rust依赖项 vendored,以避免在构建阶段进行网络请求,因为访问crates.io/github将会被opam沙盒阻止。为此,您应该运行
cargo vendor
然后按照编辑.cargo/config
的说明进行操作
构建选项
默认情况下,构建ocaml-sys
将调用ocamlopt
命令以确定OCaml编译器的版本和位置。有几个环境变量可以控制这一点。
OCAMLOPT
(默认:ocamlopt
)是调用ocamlopt
的命令OCAML_VERSION
(默认:$OCAMLOPT -version
的结果)是目标运行时OCaml版本。OCAML_WHERE_PATH
(默认:$OCAMLOPT -where
的结果)是OCaml标准库的路径。OCAML_INTEROP_NO_CAML_STARTUP
(默认:未设置)可以在将ocaml-rs
库加载到OCaml字节码运行时(如utop
)时设置,以避免与caml_startup
链接问题
如果同时设置了OCAML_VERSION
和OCAML_WHERE_PATH
,则它们的值将被使用,而无需调用ocamlopt
。如果这两个环境变量中的任何一个未定义,则ocamlopt
将被调用以获取这两个值。
定义OCAML_VERSION
和OCAML_WHERE_PATH
变量对于在不需要OCaml安装的CI环境中节省时间很有用(例如运行clippy
)。
功能
derive
- 默认启用,添加了
#[ocaml::func]
和相关实现,以及derive
实现用于FromValue
和ToValue
- 默认启用,添加了
link
- 链接原生OCaml运行时,这仅在不需要静态链接OCaml代码时使用
no-std
- 允许在
#![no_std]
环境(如MirageOS)中使用ocaml
- 允许在
依赖项
~0.2–1MB
~19K SLoC