在 Meson 中使用 Rust

避免使用 extern crate

由于 Rust 源代码中 extern crate 语句导致 rustc 链接的箱子,Meson 无法跟踪依赖项信息。如果您的箱子依赖项在 Meson 中得到正确表达,那么只要您使用 Rust 2018 版本或更高版本,就不需要在 Rust 代码中使用 extern crate 语句,这意味着将 rust_std=2018(或更高版本)添加到 project(default_options) 参数中。

extern crate 问题的一个例子是,如果您从 Meson 构建文件中删除了一个箱子,其他使用 extern crate 依赖该箱子的箱子可能会继续链接到已删除箱子的剩余 rlib,而不是构建失败,直到构建目录被清除。

此限制可以通过未来的 rustc 改进来解决,例如,如果 -Z binary-dep-depinfo 功能稳定。

混合 Rust 和非 Rust 源代码

Meson 目前不支持创建包含 Rust 和非 Rust 源代码的单个目标,因此必须编译多个库并链接它们。

rust_lib = static_library(
    'rust_lib',
    sources : 'lib.rs',
    ...
)

c_lib = static_library(
    'c_lib',
    sources : 'lib.c',
    link_with : rust_lib,
)

这是 Meson 的实现细节,将来可能会更改。

混合生成的和静态源代码

注意 此功能在 0.62 中添加。

您可以为此使用 structured_src。结构化源是将目录字符串映射到源或源列表的字典。使用结构化源时,所有输入 *必须* 列出,因为 Meson 可能将源从源树复制到构建树。

在不使用生成源时,通常不需要结构化输入。

作为实现细节,Meson 会尝试在配置时确定它是否需要复制文件,如果可以,它将跳过复制。复制在构建时完成(如果需要),以避免在源代码更改时重新配置。

executable(
    'rust_exe',
    structured_sources(
        'main.rs',
        {
            'foo' : ['bar.rs', 'foo/lib.rs', generated_rs],
            'foo/bar' : [...],
            'other' : [...],
        }
    )
)

与 rust-analyzer 一起使用

自 0.64.0 起。

如果项目中存在任何 rust 目标,Meson 将在构建目录的根目录中生成一个 rust-project.json 文件。大多数 IDE 需要配置为使用该文件,因为它不在源代码根目录中(Meson 不会将文件写入源代码目录)。请参阅上游文档,以获取有关如何配置它的更多信息。

链接标准库

Meson 将静态链接 Rust 标准库(例如 libstd),除非目标是 proc macro 或 dylib,或者它依赖于 dylib,在这种情况下,-C prefer-dynamic 将传递给 Rust 编译器,并且标准库将被动态链接。

搜索结果是