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、不使用alloccrate,亦沒有外部 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 官方儲存庫