在 Meson 中使用 Rust

避免使用 extern crate

Meson 無法追蹤 Rust 原始碼中因 extern crate 語句而連結的 crate 的相依性資訊。如果你的 crate 相依性已在 Meson 中正確表示,只要你使用 Rust 2018 版本或更新版本,就不需要在 Rust 程式碼中使用 extern crate 語句。這表示需要在 project(default_options) 引數中加入 rust_std=2018 (或更新版本)。

extern crate 的問題範例是,如果你從 Meson 建置檔案中刪除一個 crate,其他使用 extern crate 相依於該 crate 的 crate 可能會繼續與刪除的 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 編譯器,並且標準程式庫將會動態連結。

搜尋結果如下