1. 程式人生 > >Windows上檢出並編譯Chromium

Windows上檢出並編譯Chromium

Checking out and Building Chromium for Windows

其它平臺的嚮導,請移步get the code頁面。

Google員工

如果你是Google員工,請參考go/building-chrome-win

系統需求

  • 一臺英特爾機器,記憶體至少8GB。建議配備16GB以上的記憶體。
  • 至少100GB以上以NTFS格式化的硬碟空間。不支援FAT32格式化的硬碟,因為有一些Git包檔案大小超過4GB。
  • 合適的 Visual Studio 版本,下面會詳述。
  • Windows 7 或以上系統。

構建Windows編譯環境

Visual Studio

從2017年9月起(R503915),編譯Chromium需要Visual Studio 2017 update 3.2 15063(Creators Update)的Windows SDK或更新版本的環境。你必須安裝“Desktop development with C++” 元件及它下面的“MFC and ATL support” 元件。可以將以下命令列引數提供給Visual Studio的安裝包來完成:

--add Microsoft.VisualStudio.Workload.NativeDesktop
    --add Microsoft.VisualStudio
.Component.VC.ATLMFC --includeRecommended

你必須安裝Windows 10 SDK,10.0.15063或更新的版本。10.0.15063 SDK開始有一些錯誤,但10.0.15063.468版本執行穩定。大部分Visual Studio都會安裝它。
如果Windows 10 SDK是通過Visual Studio包安裝的話,Debugging Tools可以通過以下步驟安裝:控制面板→程式和功能→找到“Windows Software Development Kit”→右鍵“更改”→選擇“Change”→選中“Debugging Tools For Windows”→Change。或者,你可以下載單獨的SDK包來安裝Debugging Tools。

安裝depot_tools

下載depot_tools並解壓。

Warning: 不要從資源管理器中直接拖放或複製貼上,這樣壓縮包裡的“.git”隱藏資料夾將不會被提取出來,此資料夾是保證depot_tools自動更新的。你可以從右鍵選單中選擇“提取所有檔案…”。

將depot_tools的路徑新增到PATH環境變數中(必須放在其它Python環境路徑的前面)。假設你將壓縮包解壓到了C:\src\depot_tools
開啟:
控制面板→系統和安全→系統→高階系統設定
如果你有管理員訪問許可權,修改系統環境變數PATH並將C:\src\depot_tools放到最前面(或者至少放到其它存在Python和Git環境路徑的前面)。
如果你沒有管理員許可權,你可以將C:\src\depot_tools放到使用者環境變數PATH的最前面,如果系統環境變數PATH中有其它的Python環境路徑,你就倒黴了。
還有,以同樣的方式,將DEPOT_TOOLS_WIN_TOOLCHAIN新增到系統環境變數中,值設為0。它會告訴depot_tools使用本地安裝的Visual Studio版本(預設情況下,depot_tools將使用google-internal版本)。
開啟cmd shell,輸入命令gclient(不帶引數)。第一次執行時,gclient會安裝指定位數(與系統匹配)的軟體來處理Chromium程式碼,這些軟體包括 msysgit 和 python。

  • 如果你在一個 non-cmd shell中執行gclient(比如cygwin,PowerShell),它可能看似正確運行了,但是msysgit,python等其它工具可能沒有正確安裝。
  • 如果第一次執行gclient的時候出現奇怪的關於檔案系統的錯誤,,你可能需要參考disable Windows Indexing

等gclient執行結束,新開一個cmd命令列視窗,輸入where python回車,並確定depot_tools中的python.bat出現在所有python.exe副本的前面。如果不能保證,這將導致使用gn時會構建過多-參考crbug.com/611087

獲取程式碼

首先,配置Git:

$ git config --global user.name "My Name"
$ git config --global user.email "[email protected]"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global branch.autosetuprebase always

建立一個chromium目錄用來檢出程式碼,並切換到其中(你可以任意命名,只要你開心,也可以將放在任意路徑,只需保證全路徑中沒空格字元):

$ mkdir chromium && cd chromium

執行depot_tools中的fetch工具來檢出程式碼及其依賴項:

$ fetch chromium

如果你不需要完整的倉庫歷史,你可以通過新增--no-history引數,這會節省一大筆時間。
在一個高速的網路環境中預計會花30分鐘,網速低的情況下可能需要幾個小時。
fetch完成後,會在當前目錄下建立一個.gclient的檔案和一個src的資料夾。在接下來的說明中,假設你已經切換到src目錄中:

$ cd src

Optional: You can also install API keys if you want your build to talk to some Google services, but this is not necessary for most development and testing purposes.

配置編譯環境

Chromium使用Ninja作為它的編譯工具,並配套使用一個叫GN的工具來生成.ninja檔案。你可以用不同的配置引數建立任意數量的編譯目錄。建立編譯目錄:

$ gn gen out/Default

使用 Visual Studio IDE

如果你想要使用Visual Studio IDE,需要在生成輸出目錄時在gn gen後面新增--ide引數(就像get the code中描述的那樣):

$ gn gen --ide=vs out\Default
$ devenv out\Default\all.sln

GN會在編譯目錄中生成一個all.sln的檔案。它在內部使用Ninja來編譯,但仍可以使用IDE的大部分功能(沒有原生的Visual Studio編譯模式)。如果你再次執行gen,你還是需要提供這個引數,但是通常編譯的時候,GN會自動更新編譯和IDE檔案。
生成的解決方案會包含幾千個專案,並且載入起來會很慢。使用--filters引數來限制生成專案檔案,選擇只生成你感興趣的程式碼,儘管在管理器中看不到這些檔案。有一個最小的方案讓你在IDE中編譯,執行Chrome且不顯示任何原始碼:

$ gn gen --ide=vs --filters=//chrome out\Default

還有其它選項可以控制如何生成解決方案,可以執行gn help gen參考。

快速編譯指南

  • 減少檔案系統的開銷。排除反病毒軟體和索引軟體對編譯目錄的操作。
  • 將編譯相關目錄儲存在一個快速的磁碟上(最好是SSD)。
  • 更多核的CPU會更好(20+不算多),更多的記憶體(64GB不算多)。

有幾個gn引數的設定可以提高編譯速度。建立輸出目錄時(gn args out/Default),你可以在彈出的文字編輯器中輸入這些,也可以直接在gn gen 命令列中輸入(gn gen out/Default --args="is_component_build = true is_debug = true")。
一些有用的設定提供參考:

  • use_jumbo_build = true - 一些實驗性的Jumbo/unity編譯。
  • is_component_build = true - 使用最多,更小Dlls,連結時自增。
  • enable_nacl = false - 禁用Native Client,本地編譯通常不需要。
  • target_cpu = "x86" - x86編譯比x64編譯稍微快一些並且支援連結時自增。設定此項時如果沒有設定enable_nacl = false,編譯時間可能會更糟。
  • remove_webcore_debug_symbols = true - 關閉blink程式碼層的除錯功能來減少編譯時間,如果你不打算除錯blink,此項設定正合適。

此外,Google員工應該考慮使用goma,一個分散式的編譯系統。內部有goma詳細的資訊,相關的gn引數為:

  • use_goma = true
  • symbol_level = 2 - 預設goma編譯時將symbol_level由2改為1,目的是禁用source-level除錯。此項將它還原。這實際上會增加編譯時間,但可以使goma可用。
  • is_win_fastlink = true - 啟用goma並且symbol_level為2時,必須設定此項。

Note that debugging of is_win_fastlink built binaries is unreliable prior to VS 2017 Update 3 and may crash Visual Studio.

To get any benefit from goma it is important to pass a large -j value to ninja. A good default is 10*numCores to 20*numCores. If you run autoninja.bat then it will pass an appropriate -j value to ninja for goma or not, automatically.

When invoking ninja specify ‘chrome’ as the target to avoid building all test binaries as well.

Still, builds will take many hours on many machines.

編譯Chromium

編譯Chromium(the “chrome” target),使用Ninja:

$ ninja -C out\Default chrome

在命令列執行gn ls out/Default,你可以得到一個所有編譯目標的列表資訊。需要單獨編譯某一個時,先去掉GN標籤中前面的”//”,然後將剩下的標籤傳給Ninja(比如 //chrome/test:unit_tests,使用`ninja -C out/Default chrome/test:unit_tests“)。

執行Chromium

一旦編譯成功,你可以這樣執行:

$ out\Default\chrome.exe

(”.exe”的字尾名是可選的)。

執行tests目標

你可以用同樣的方式執行tests。你也可以使用--gtest_filter引數限制執行某些tests,比如:

$ out\Default\unit_tests.exe --gtest_filter="PushClientTest.*"

你可以在GitHub page找到更多關於GoogleTest的測試。

更新你的檢出

為了更新一個已經存在的檢出,你可以執行

$ git rebase-update
$ gclient sync

The first command updates the primary Chromium source repository and rebases any of your local branches on top of tip-of-tree (aka the Git branch origin/master). If you don’t want to use this script, you can also just use git pull or other common Git commands to update the repo.
The second command syncs the subrepositories to the appropriate versions and re-runs the hooks as needed.


2017-11-07