Chromium Chronicle #7:預先處理來源

第 7 集:作者:華盛頓州西雅圖 Bruce Dawson (2019 年 10 月)
上集節目

有時候,您可以手動編譯單一 Chromium 來源檔案,也許可以嘗試使用編譯器最佳化選項、預先處理為單一檔案,藉此瞭解一些細微巨集細節,或盡可能減少編譯器錯誤。

Chromium 開發人員可以藉由幾個技巧,尋找並執行編譯特定來源檔案的指令,並視需要修改。

首先,前往輸出目錄,並使用 Autoninja (或 ninja) 使用 ^ 後置字串編譯興趣檔案 (以及任何依附元件)。這個後置字串會指示 Ninja 在此範例中建構指定 file—version.o 的輸出內容。接著輕觸檔案,並使用 -v (詳細資訊) 標記再次編譯檔案 (而且僅限檔案) 至 ninja:

Linux 或 OSX:

autoninja ../../base/version.cc^
touch ../../base/version.cc
autoninja -v ../../base/version.cc^

在 Windows cmd 殼層中 ^ 是特殊字元,必須逸出:

C:\> autoninja ../../base/version.cc^^
C:\> touch ../../base/version.cc
C:\> autoninja -v ../../base/version.cc^^

autoninja -v 指令的一般輸出內容如下所示 (大幅剪輯):

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo /showIncludes -imsvc ...

這個指令可讓您編譯所需的檔案。如要取得預先處理的輸出內容,請按照下列步驟操作:

在 Linux 或 OSX 上,移除結尾的 -o obj/base/base/version.o 區塊,並新增 -E。這會指示編譯器將預先處理的檔案列印至 stdout。

將輸出內容重新導向至一個檔案,如下所示:

../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD ... -E >version.i

在 Windows 中,從一開始移除 /showIncludes 選項 (每個 #include 都會輸出一行輸出內容),然後新增 /P 以便預先處理檔案,而不是編譯檔案。結果會儲存在 version.i 目前的目錄中:

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo -imsvc ... /P

您現在可以檢查預先處理的檔案,瞭解巨集的實際執行情況,或對編譯器切換開關進行變更,然後重新編譯,看看會發生什麼事。

其他資源

  • Fast Chrome Builds:查看更多建構最佳化提示 (著重於 Windows)。
  • ETW:閱讀 ETW (也稱為 Xperf) 文件,瞭解如何在 Chrome 或版本中找出 Windows 效能問題。