66个版本

1.0.0-beta.52023年1月21日
1.0.0-beta.42022年10月24日
1.0.0-beta.32022年8月7日
1.0.0-beta.12022年7月29日
0.3.9 2018年3月11日

#49 in FFI

Download history 2181/week @ 2024-04-20 2762/week @ 2024-04-27 3245/week @ 2024-05-04 9008/week @ 2024-05-11 5692/week @ 2024-05-18 7473/week @ 2024-05-25 3504/week @ 2024-06-01 1220/week @ 2024-06-08 1327/week @ 2024-06-15 1253/week @ 2024-06-22 550/week @ 2024-06-29 662/week @ 2024-07-06 1003/week @ 2024-07-13 1190/week @ 2024-07-20 1310/week @ 2024-07-27 994/week @ 2024-08-03

4,650 每月下载量
3 crate 中使用

ISC 许可证

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_VERSIONOCAML_WHERE_PATH,则它们的值将被使用,而无需调用ocamlopt。如果这两个环境变量中的任何一个未定义,则ocamlopt将被调用以获取这两个值。

定义OCAML_VERSIONOCAML_WHERE_PATH变量对于在不需要OCaml安装的CI环境中节省时间很有用(例如运行clippy)。

功能

  • derive
    • 默认启用,添加了#[ocaml::func]和相关实现,以及derive实现用于FromValueToValue
  • link
    • 链接原生OCaml运行时,这仅在不需要静态链接OCaml代码时使用
  • no-std
    • 允许在#![no_std]环境(如MirageOS)中使用ocaml

依赖项

~0.2–1MB
~19K SLoC