
Rust 編譯器快速上手從克隆倉庫到構建、測試 rustc 的完整實戰指南【免費下載鏈接】rustEmpowering everyone to build reliable and efficient software.項目地址: https://gitcode.com/GitHub_Trending/ru/rust本指南面向想要參與 rustc 開發或自建編譯器的開發者以rustc-dev-guide中的 Quickstart 為主線完整演示從克隆rust-lang/rust倉庫、生成bootstrap.toml配置、調用x構建工具鏈到鏈接 rustup 工具鏈、運行 UI 測試套件的全流程。讀完本文你將掌握./x setup、./x build、./x check、./x test等核心命令的用法與加速技巧并理解 stage0/stage1/stage2 分級構建背后的原理可以立即上手對編譯器進行修改與驗證。一、準備工作獲取 rustc 源碼構建 Rust 編譯器的第一步是獲取源碼。主倉庫同時包含編譯器rustc、標準庫core、alloc、test、proc_macro等以及一系列工具rustdoc、bootstrap 基礎設施等因此一次克隆即可獲得完整的開發環境git clone https://github.com/rust-lang/rust.git cd rust注意在 Windows 上殺毒軟件的全盤掃描會明顯拖慢大倉庫的 Git 與構建命令。如果遇到這種情況可考慮僅將 Rust 檢出目錄加入 Windows 安全中心的排除列表避免過寬的排除范圍。克隆方式的選擇由于倉庫體積龐大、歷史記錄完整在較慢的網絡下完整克隆耗時長、占磁盤大。rustc-dev-guide提供了兩種替代方案Partial clone推薦只拉取當前文件內容歷史內容在需要時按需自動獲取。所有 Git 命令照常可用代價是訪問未加載的歷史節點時需要聯網git clone --filterblob:none https://github.com/rust-lang/rust.git cd rustShallow clone淺克隆使用--depth N只保留最近 N 次提交--depth 1即只取main分支的最新一次提交適合瀏覽源碼或快速構建git clone --depth 1 https://github.com/rust-lang/rust.git cd rust但淺克隆會限制部分 Git 命令git bisect和git blame依賴完整提交歷史因此如果打算參與編譯器開發并貢獻代碼建議使用完整克隆或 partial clone。另外請預留足夠的磁盤空間構建編譯器需要相對較大的存儲文檔建議至少預留 10~15 GB而完整的多階段構建尤其超過 stage 1 時可能占用接近 100 GB 的空間。二、認識 x構建 rust 倉庫的統一入口構建 rustc 時不直接使用cargo而是使用一個名為 x 的包裝器通過./x調用。x 的底層是倉庫中的 bootstrap 構建系統位于 src/bootstrap它負責構建文檔、運行測試、構建編譯器和標準庫。./x是 bootstrap 的推薦入口但根據操作系統與 Shell 的不同還有多種等價形式參見 how-to-build-and-run.md./x subcommand [flags] # Unix shell 或配置好的 Windows PowerShell ./x.ps1 subcommand [flags] # Windows NuShell x.py subcommand [flags] # Windows 命令提示符需 .py 關聯 Python python x.py subcommand [flags] # 手動調用 Python ./x.py subcommand [flags] # 僅有 python3 且 sh 不支持 local 的環境如 Solaris倉庫根目錄下實際存在 x、x.ps1、x.py 三個入口文件對應上述調用方式。在 Windows PowerShell 中直接運行./x可能報錯File ... x.ps1 cannot be loaded because running scripts is disabled on this system可執行以下命令允許運行本地腳本Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser如果想要更方便地在倉庫任意子目錄中運行x還可以安裝系統級的x二進制源碼位于 src/tools/x它會自動查找合適的 Python 版本不依賴當前 Shellcargo install --locked --path src/tools/x三、生成構建配置./x setup 與 bootstrap.toml克隆完成后需要為構建創建配置文件。運行./x setup會執行初始化并生成一份帶合理默認值的bootstrap.toml./x setup交互式設置會詢問你選擇哪種默認配置profile常見選項對應 src/bootstrap/defaults 下的模板文件compilerbootstrap.compiler.toml面向編譯器貢獻者啟用debug-logging、debug-assertions、incremental、backtrace-on-ice等開發友好選項并從 CI 下載預編譯 LLVMdownload-ci-llvm truelibrarybootstrap.library.toml面向標準庫與文檔貢獻者test-stage 1、bench-stage 1避免構建編譯器本身toolsbootstrap.tools.toml面向 rustdoc、cargo、clippy 等工具貢獻者download-rustc if-unchanged且默認test-stage 2distbootstrap.dist.toml面向從源碼安裝的用戶與發行版維護者默認完整的 stage 2 構建build-stage 2、extended true。例如 compiler profile 會設置[rust]下的incremental true顯著加快增量重建、lto off以約 20% 運行時性能為代價換取更快的構建、frame-pointers true便于性能分析等這些配置共同定義了面向開發、而非面向發布的構建形態。也可以手寫bootstrap.toml倉庫根目錄的 bootstrap.example.toml 列出了全部可用配置項及其說明src/bootstrap/defaults 則給出了常見的組合。如果你已經構建過 rustc 后修改了與 LLVM 相關的配置可能需要執行./x clean --all才能讓后續配置變更生效注意./x clean不會觸發 LLVM 重建。多配置管理config extensions不同任務可能需要切換不同的 bootstrap 配置。與其手工復制粘貼配置值bootstrap.toml支持通過include引入配置擴展且擴展可以遞歸嵌套# cross.toml [build] build x86_64-unknown-linux-gnu host [i686-unknown-linux-gnu] target [i686-unknown-linux-gnu] [llvm] download-ci-llvm false [target.x86_64-unknown-linux-gnu] llvm-config /path/to/llvm-19/bin/llvm-config# bootstrap.toml include [cross.toml]注意include的覆蓋邏輯為從右到左——include [a.toml, b.toml]中b.toml覆蓋a.toml且父級擴展總是覆蓋內層擴展。四、構建編譯器./x build 與 ./x check配置就緒后即可開始構建。最常用的黃金命令是構建標準庫同時也會用 stage0 編譯器構建 rustc再用新構建的 stage1 編譯器構建標準庫并組裝出可用的 stage1 sysroot./x build library該命令的完整執行鏈條為用 stage0 編譯器下載的預發布編譯器和 stage0 標準庫構建 rustc用剛構建出的 stage1 編譯器構建library標準庫組裝出包含 stage1 編譯器與 stage1 標準庫的 stage1 sysroot。最終產物stage1 編譯器 用它構建的庫就是編譯普通 Rust 程序所需的一切除非程序使用#![no_std]或#![no_core]。快速入門文檔 quickstart.md 中推薦的做法是./x setup ./x build./x build會構建編譯器、標準庫以及少量工具如果只想快速驗證代碼能否編譯可以改用./x check。兩類命令都支持指定組件或路徑作為參數例如./x check compiler只檢查編譯器部分。常用 x 命令速查命令適用場景./x check快速檢查大部分代碼能否編譯重構類型更改時首選rust-analyzer 可自動執行./x build構建rustc、std和rustdoc./x test運行全部測試./x fmt格式化所有代碼x還支持compiler、library與src/tools目錄的各種路徑后綴簡寫例如x test tidy等價于x test src/tools/tidyx build std等價于x build library/std。構建特定組件如果只改標準庫無需構建全部默認組件./x build --stage 1 library選擇 library profile 時--stage 1是默認值可省略。構建某個工具則直接給出其路徑./x build src/tools/cargo交叉編譯需要構建支持其他目標的編譯器時向x build傳入任意數量的--target標志./x build --target x86_64-unknown-linux-gnu,wasm32-wasip1若要讓編譯器能構建包含 proc macro 或 build script 的 crate必須顯式包含宿主平臺目標。也可以在bootstrap.toml的[build]段中固化目標列表[build] target [x86_64-unknown-linux-gnu, wasm32-wasip1]避免 std 重復構建--keep-stage-std 1構建 stage1 標準庫往往是整個流程的瓶頸。當修改不改變標準庫的編譯方式例如僅修改錯誤信息文案時可以跳過 std 的重編./x build library --keep-stage-std1該標志會假設舊的標準庫可以復用——因為編譯器代碼沒有被改動時這通常是成立的。但要注意如果修改的是影響元數據編碼的部分例如 rlib 中類型編碼、MIR 的定義等復用的 std 可能與新編譯器不兼容導致奇怪的 ICE 或 panic。遇到此類異常時去掉--keep-stage-std1重新構建即可。測試同樣可以使用該技巧./x test tests/ui --keep-stage-std1清理構建目錄需要完全重新開始時運行./x clean雖然rm -rf build也能達到目的但會丟失已編譯的 LLVM 緩存重建 LLVM 即使在較快的機器上也非常耗時因此通常建議使用./x clean。五、鏈接 rustup 工具鏈并使用自建編譯器構建完成后build目錄下會生成一系列產物。推薦用 rustup 將產物鏈接為自定義工具鏈以便隨時調用rustup toolchain link stage1 build/host/stage1特別注意如果使用./x setup tools默認 stage 會是 2 而非 1鏈接命令需相應調整rustup toolchain link stage2 build/host/stage2之后即可通過stage1選擇器使用自建編譯器rustc stage1 testfile.rs運行rustc stage1 -vV可以驗證版本號以-dev結尾表明來自本地構建$ rustc stage1 -vV rustc 1.48.0-dev binary: rustc commit-hash: unknown commit-date: unknown host: x86_64-unknown-linux-gnu release: 1.48.0-dev LLVM version: 11.0rustup 工具鏈指向的是build目錄中的產物因此每次運行x build或x test后工具鏈會自動指向最新構建結果。需要注意的是自建工具鏈不包含 cargorustup 會按 nightly → beta → stable 的順序回退使用已安裝工具鏈的 cargo如果需要不穩定的 cargo 標志請先rustup install nightlyrust-analyzer 與 IntelliJ Rust 插件依賴rust-analyzer-proc-macro-srv組件處理 proc macro若要通過rustup override set stage1在項目中使用自定義工具鏈可額外構建./x build proc-macro-srv-cli六、運行測試./x test 與 UI 測試套件完成修改后用./x test運行測試套件。但完整測試套件很慢通常并非所需對編譯器修改而言./x test tests/ui才是最常用的命令——它運行所有 UI 測試對每個特定測試文件調用編譯器并核對編譯器輸出。./x test tests/uiUI 測試位于 tests/ui本質上是一個編譯器輸出快照測試體系compiletest 用rustc編譯測試文件將輸出與同目錄下的.stderr/.stdout文件比對。測試文件內還會用//~ ERROR之類的注釋標注預期的診斷信息。當你修改了編譯器導致輸出變化后需要更新.stderr快照./x test tests/ui --bless--bless會用新輸出自動重寫.stderr/.stdout文件之后務必人工檢查快照內容是否符合預期——這正是 UI 測試保證診斷輸出穩定性的核心機制。其他常用的測試命令還包括./x test library/std # 運行 std 的單元與集成測試 ./x test tests/ui/const-generics # 運行 ui 套件下某子目錄的測試 ./x test tests/ui/const-generics/const-types.rs # 運行單個測試文件加快測試循環增量編譯./x test tests/ui --incremental --test-args issue-1234可加快后續重建也可以在bootstrap.toml中固化[rust] incremental true注意增量編譯會占用更多磁盤空間磁盤緊張時應定期檢查build目錄體積。精細優化將optimize false會讓編譯器慢到無法測試若想縮短重建周期可只對高頻重建的 crate 關閉優化在根目錄 Cargo.toml 中[profile.release.package.rustc_mir_build] opt-level 0 [profile.release.package.rustc_driver] opt-level 0rust-analyzer 自動檢查配置完成后rust-analyzer 可在每次保存文件時自動運行./x check詳見下一節。七、提升開發效率的常用工作流重構期多用 ./x check進行類型化重構如重命名方法、修改函數簽名時./x check比./x build快得多足夠驗證編譯器能否構建。可以持續執行./x check積累重構提交稍后再集中運行測試并借助git bisect精確定位出問題的提交。這樣留下的細粒度提交既全部可構建、又便于審查。安裝 pre-push 鉤子CI 會要求代碼通過tidy倉庫內置的代碼質量檢查工具。可以安裝 Git 鉤子讓每次 push 自動運行./x test tidy若鉤子失敗運行./x test tidy --bless并提交修復。倉庫已提供現成鉤子腳本 src/etc/pre-push.sh復制到.git/hooks并去掉.sh后綴即可./x setup交互流程中也提供安裝鉤子的選項。配置 rust-analyzer./x setup會詢問是否為 VSCode、Vim、Emacs、Helix 或 Zed 設置編輯器配置也可通過./x setup editor單獨觸發VSCode生成 .vscode/settings.json 風格的推薦配置若希望保存時手動觸發檢查可改用 Build Task如 .vscode/tasks.json 同目錄的配置思路將./x check注冊為構建任務Emacs選擇emacs生成.dir-locals.el推薦配置見 src/etc/rust_analyzer_eglot.elHelix選擇helix生成languages.toml推薦配置見 src/etc/rust_analyzer_helix.tomlZed選擇zed生成.zed/settings.json推薦配置見 src/etc/rust_analyzer_zed.json。rust-analyzer 默認運行cargo check與rustfmt對 rustc 倉庫應覆蓋為./x check與 stage0 rustfmt。若只關注編譯器部分可將檢查命令限制為x check compiler --json-output以節省時間可用x check --help --verbose查看可選部分。另外rust-analyzer 默認使用獨立構建目錄如需共享build目錄以節省磁盤可以覆蓋生成配置但這會導致命令行構建與后臺檢查互相鎖定構建目錄官方并不推薦。使用 nightly 工具鏈bootstrap 的部分環節如 rustfmt使用固定的 nightly 版本。要讓倉庫內的cargo fmt正常工作cd rustc 倉庫路徑 rustup override set nightly注意這并不會讓你能用 cargo 直接構建 rustc編譯器與標準庫的開發仍須通過x此操作只是讓cargo fmt等工具可用。如需固定版本可參考 src/stage0 中的 pinned nightly 版本。并行開發多個分支git worktree在不同分支并行開發時構建產物與增量緩存會互相覆蓋。與其維護多個克隆重復存儲 Git 元數據不如使用 Git worktree——多個工作樹共享同一 Git 數據庫git worktree add ../rust2 # 新建工作樹 git worktree add -b my-feature ../rust2 main # 基于 main 創建新分支的工作樹唯一需要注意的是子模塊不會共享仍會被多次克隆。Shell 補全./x的自動補全腳本位于 src/etc/completions覆蓋 Bash、Zsh、Fish、PowerShell。例如 Bash/Zsh/Fish 可執行source ./src/etc/completions/x.extensionPowerShell 執行 .\src\etc\completions\x.ps1將其加入 Shell 啟動腳本即可自動加載。八、常見問題速查問題解決辦法Windows PowerShell 報腳本執行被禁用Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser修改 LLVM 相關配置后構建不生效執行./x clean --all不會觸發 LLVM 重建--keep-stage-std1構建出奇怪的 ICE去掉該標志重新構建磁盤空間不足清理build/目錄、獨立的build-rust-analyzer/目錄或用rustup toolchain list卸載不用的工具鏈使用download-rustc true時./x test library/std失敗臨時以./x test library/std --set rust.download-rustcfalse關閉download-rustc或在bootstrap.toml中設置rust.download-rustc false代價是需要構建 stage1 編譯器相關修復正在推進中結語從git clone、./x setup生成配置到./x build產出可用的 stage1 工具鏈、rustup toolchain link接入系統、./x test tests/ui --bless維護診斷快照這一套流程就是 rustc 貢獻者最核心的日常工作閉環。深入閱讀 how-to-build-and-run.md 與 suggested.md 可以獲得更多細節如果仍有疑問可以在 Zulip 的t-compiler/help頻道向社區求助。現在你可以放心地對編譯器做出第一處修改了。【免費下載鏈接】rustEmpowering everyone to build reliable and efficient software.項目地址: https://gitcode.com/GitHub_Trending/ru/rust創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考