systemd 正式加入 Rust 支援:只限獨立程式、仍用 Meson 建構

systemd 專案於 2026 年 10 月 23 日合併了一個由 Christian Brauner 提交的提交(770c053),標題為「meson: add -Drust= for programs written in Rust」,正式為以 Rust 撰寫的程式加入可選支援,但強調「其他一切不變」。[1]

範圍與限制

提交訊息明確界定了適用範圍:[1]

  • libsystemd-shared、libsystemd 以及 NSS 與 PAM 模組繼續以 C 撰寫;以 Rust 寫的程式會像 C 程式一樣,動態連結 libsystemd-shared
  • Rust 程式只取得 core:不使用 std、不使用 alloc crate,亦沒有外部 crate
  • 選項是 Meson feature,預設為 auto
  • 需要 rustc 1.85 或以上與 bindgen 0.71.1 或以上(正是 Debian 13 所附帶的版本);1.85 是最低支援 Rust 版本(MSRV),並會傳給 bindgen,令產生的綁定永不需要比手寫程式更新的編譯器
  • bindgen 0.72.0 會被拒絕,因為它產生的程式碼無法編譯
  • 使用 auto 時,若找到工具鏈便會使用;-Drust=enabled 則在找不到時明確報錯
  • 需要 Meson 1.4.0 以支援 rust 模組的 bindgen() 整合;專案維持原本的 Meson 下限,而 -Drust=auto 在較舊 Meson 上會靜默關閉
  • 暫不支援交叉編譯,因為 bindgen 需要被告知目標平台

官方指出,HAVE_RUST 會告訴 unit、man page 與測試是否有建構 Rust 程式。[1]

為何要探測 libclang

提交訊息解釋,bindgen 在執行時載入 libclang,因此「找到執行檔」並不能證明可以產生綁定。專案會在 configure 階段以 tools/bindgen-probe.h 執行一次,報告 libclang 版本(並顯示於摘要),該檔案包含 bindgen = 22 時會處理錯誤的構造;因此壞掉的組合會被拒絕,或令 Rust 支援被停用,而不是在稍後建構時才失敗。[1]

程式碼規範

提交訊息列出了多項專案層級的 rustc 參數與 lint 規則:[1]

  • lint 集沿用內核的一套:unsafe 操作需要 unsafe 區塊;每個 unsafe 區塊需要 SAFETY 註解,每個 unsafe 函數需要 Safety 章節(透過 clippy 的 undocumented_unsafe_blocks 等強制);公開項目需要文件;指標轉型 lint 令原始指標處理保持明確
  • 所有建構類型都啟用溢位檢查:官方解釋 rustc 的預設取決於最佳化等級,而 Meson 總是傳 overflow-checks=no,但 Rust 程式不應在 C 程式會檢查的地方靜默回繞
  • 全部以 panic=abort 建構:官方指 unwinding 本來就無法跨越事件迴圈的 C frame,而且在沒有 std 的情況下亦沒有 unwinder
  • Meson 傳遞相對於建構目錄的來源路徑,因此 file!() 與 journal 中的 CODE_FILE= 會顯示該路徑;專案會像 C 的 PROJECT_FILE 一樣重映射前綴
  • rustfmt.toml 與 .clippy.toml 分別承載格式與 lint 設定;rustfmt 使用預設值但採用專案慣用的行長,clippy 取得 MSRV;整個專案使用 edition 2021,.editorconfig 亦認識 *.rs

首個 Rust 組件

據媒體報道,這個改動的起點是一個以 Rust 撰寫的新組件 systemd-keyring-setup,用於在開機過程中向內核的 dm-verity/fs-verity/BPF keyring 配置 keyring 並登記 X.509 憑證;報道亦指建構不使用 Cargo,而是經 Meson 以 C linkage 建構,而核心的 systemd 函式庫程式碼因未解決的阻礙,暫時仍未有 Rust 支援。[1][2]

參考資料

[1] systemd 官方儲存庫 — 提交 770c053:meson: add -Drust= for programs written in Rust(2026 年 10 月 23 日)

[2] systemd 官方儲存庫

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*