轉自:http://blog.csdn.net/kuerjinjin/article/details/23563059
從12年那會兒開始獲取源碼和構建chromium項目都是按照那時候的官方要求用win7+vs2010,相對來說也比較簡單,按照步驟來也很快能編譯出來。
1.官網的編譯配置介紹:http://www.chromium.org/developers/how-tos/build-instructions-windows
2.編譯需要的工具:vs2010/sp1,win8sdk,DXSDK,depot_tools
我用的工具都是在這里了:2010CompilerToolsForChrome
depot_tools也可以從官方獲取:depot_tools (命令行下執行 gclient 它會自動下載安裝構建項目解決方案所需要的工具 python, git 和 svn ),下載下來之后找個地方解壓出來,比如我是解壓到E:盤下。


- <span style="font-size:18px;"><PropertyGroup>
- <IncludePath>$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
- <LibraryPath>$(DXSDK_DIR)\Lib\x86;$(LibraryPath)</LibraryPath>
- </PropertyGroup>
- <PropertyGroup>
- <IncludePath>$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
- <LibraryPath>$(DXSDK_DIR)\Lib\x64;$(LibraryPath)</LibraryPath>
- </PropertyGroup> </span>
- <span style="font-size:18px;">>e:
- >cd chromium30
- >gclient config http://src.chromium.org/svn/releases/30.0.1559.0/ </span>
- <span style="font-size:18px;">solutions = [ { "name" : "30.0.1559.0",
- "url" : "http://src.chromium.org/svn/releases/30.0.1559.0",
- "deps_file" : "DEPS",
- "managed" : True,
- "custom_deps" : {
- "src/webkit/data/layout_tests/LayoutTests": None,
- "src/third_party/WebKit/LayoutTests": None,
- "src/chrome/tools/test/reference_build/chrome": None,
- "src/chrome_frame/tools/test/reference_build/chrome": None,
- "src/chrome/tools/test/reference_build/chrome_linux": None,
- "src/chrome/tools/test/reference_build/chrome_mac": None,
- },
- "safesync_url": "",
- },
- ]</span>
關於系統版本只支持Windows 7 x64或更高版本, x86的操作系統已經不再支持。
從chromium r254340(chromium33)之后的版本,默認的調試工具唯一指定為Visual Studio 2013,
所以如果使用最近的源碼進行構建,需要安裝VS2013並修改 GYP_MSVS_VERSION=2013
而構建工具除了之前一直在使用的 depot_tools ,還增加了 ninja 工具的配合(ninja也是整合在了depot_tools中)。
所以一直在使用舊版本depot_tools的開發者們,需要先更新 depot_tools (之前也就300M左右,更新后約1.86G)了。
另外一個就是要獲取VS2013的工具鏈腳本(toolchain script)
該工具鏈腳本不會修改系統環境,所以使用VS13或者之前的VS10都木有問題。
下載后的工具鏈腳本存放在 depot_tools \ win_toolchain \ vs2013_files
如果系統中安裝了VS2013,你可以用它來編輯和調試,ninja 將仍然使用depot_tools來構建版本。
- <span style="font-size:18px;">python src\tools\win\toolchain\toolchain.py
- win_toolchain\env.bat</span>
- <span style="font-size:18px;">>e:
- >cd E:\chromium35
- E:\chromium35>gclient config http://src.chromium.org/svn/releases/35.0.1900.0
- E:\chromium35>gclient sync --force(以往這一步會強制同步代碼后生成解決方案,現在則會在同步一部分后出現找不到文件的錯誤)
- E:\chromium35>cd src
- E:\chromium35>gclient sync(確保源碼同步完成)
- 構建方式有兩種,一個是使用 ninja 構建
- E:\chromium35\src>ninja -C out\Debug chrome
- 然后在 out/Debug 下就能看到編譯出來的文件。
- 另一種就是使用我們熟悉的VS來構建,需要設置一個環境變量
- GYP_GENERATORS=msvs-ninja,ninja
- 然后直接
- E:\chromium35\src>gclient runhooks
- 然后就能在 src/chrome/下找到chrome.sln的解決方案,調試方式就跟以前一樣了。</span>
1. depot_tools工具,下載后解壓配置環境變量。
dev開發版:每2星期發布,相對穩定,新功能和新特性都有。
beta測試版:每周更新,6周大版本更新。比較穩定了,比dev版小1個版本,基本是發布的候選,比stable版本早進化一個月。
stable穩定版:比dev版本小2個版本,2到3周次版本跟新,6周主版本跟新。經過了充分的測試,我比較推薦這個版本。
- cd src #需要切換到src下才能使用git倉庫管理
- git checkout 40.0.2209.0
- gclient sync --nohooks --with_branch_heads --with_tags --output-json="log.json"
- git checkout -b -newbranch [<start_point>]
b代表branch的意思,newbranch 是新分支的名稱,
- git checkout -b your_release_branch 40.0.2209.0
- gclient config https://chromium.googlesource.com/chromium/src.git
比如 F:\0ChromiumCodes
2.WINDOWS下是直接下載depot_tools的壓縮包,並解壓到F:\0ChromiumCodes\depot_tools
這個壓縮包的地址是: depot_tools.zip
3.配置環境變量
計算機-右鍵“屬性”-左側欄“高級系統設置”-環境變量-系統變量下“Path”-編輯
在最開頭添加上 F:\0ChromiumCodes\depot_tools;
4.更新depot_tools
win+r - cmd 在命令行下輸入gclient(不帶參數)
- gclient #不帶參數
但是第一次運行gclient的時候它先下載git-1.9.0.chromium.5_bin
所以還需要再運行一次gclient
成功后可以運行一次gclient --version看看版本號,並注意一下有沒有錯誤提示。
一般只顯示一個如 gclient.py 0.7 等簡單的版本信息,沒有其他的什么客戶端太舊等的提示信息那就OK
5.引導配置
如果你從未使用過git,您將需要設置一些全球git 配置;
在下面命令中使用你自己的名字和電子郵件地址替換:
- git config --global user.name "JC" #名字自己改
- git config --global user.email "kuerjinjin@gmail.com" #郵箱自己改
- git config --global core.autocrlf false
- git config --global core.filemode false
7.新建個空文件夾,切換到該目錄下
- f:
- cd F:\0ChromiumCodes\ChromiumMaster
- fetch chromium
這個過程會先下載master分支下的最新源碼,開始的將近3G左右的源碼是在后台下載的,
命令行下只提示“still working on”所以看下只要下載量有就不要關閉窗口,源碼全部下載下來差不多要下載10多個G。
VPN下470k/s的速度差不多下載了7個多小時!
之后開始下載vs,win8sdk,wdk等配置win_toolchain
8.如果這個過程中失敗了,但是源碼已經下載了100%了,那么就不能繼續fetch chromium了,而是
- gclient sync
這塊操作的介紹可以找英文原文: 點擊打開鏈接
同步並構建一個 Release 的標簽(tag)!
-----------------------------------------
是一個通過git來獲得的有發行版本號Release 標簽(tag)
注意:您不能提交這個Release 標簽(tag)。這純粹是為了獲得該發布版本的源代碼。
- # 確保你能獲得你要簽出的所有release tag信息
- git fetch --tags
- # 然后簽出任何你想要的版本 (已知的版本可以通過命令 git show-ref --tags 來查看)
- git checkout -b your_release_branch 39.0.2171.71 # 或者更明確點兒這樣寫 tags/39.0.2171.71
- gclient sync --with_branch_heads --jobs 16
簽出一個 release 的分支
---------------------------------------
注:這塊是不能的同步並建立全部的release分支(即:third_party DEPS一致),請參閱該內部文檔。
以下說明如何檢查出一個為特定項目release分支(如src.git)
- # 首先確保你已切換到 src 目錄下.
- # 這部分應該只需要運行一次就可以了,不過多運行幾次也沒事兒。
- # 第一次運行時可能需要一段時間,因為它獲取額外的1/2 GB左右的分支提交。
- gclient sync --with_branch_heads
- git fetch
- # 簽出 src 樹下的分支.
- git checkout -b branch_$BRANCH branch-heads/$BRANCH
- # 簽出所有的DEPS修改的子模塊
- gclient sync --jobs 16
返回到 trunk:
---------------------------------------
- #首先確保你已切換到 src 目錄下.
- git checkout -f master
- gclient sync --jobs 16


-------------------------------------------------------------------------------------------------------------------
在這里再說一下幾個問題:
1.是使用VS10和VS13編譯項目的一些區別:如果是用的33之前的版本源碼生成的10的解決方案,那么vs2010/sp1,win8sdk,DXSDK,depot_tools這些都需要有的,如果是用的最近的源碼,只需要弄好最新版的depot_tools,再安裝個13就一切OK!(其實使用ninja+vs13混合編譯最終調用的vs13是depot_tools下的那個,而我們要再安裝個VS13不過是修改和查看代碼用而已)運行那個批處理設置一下直接用就行了!
2.一般的設置我們可以放在批處理中設置好,讓ninja知道我們要用的vs13,win8sdk等在我們下載好的depot_tools中!在src的同級目錄(或者說就是那個.gclient所在的目錄)新建一個批處理CreateBuild.bat 運行這個批處理文件可能會比較慢,耐心等待命令行窗口退出后再打開chrome.sln開始編譯!批處理的內容如下:
@echo off
for /f %%a in ('where gclient.bat') do set pwd=%%a
set pwd=%pwd:~0,-11%
set file=%pwd%win_toolchain\data.json
set pwd=%pwd:\=\\%
echo {"runtime_dirs": ["%pwd%win_toolchain\\vs2013_files\\sys64", "%pwd%win_toolchain\\vs2013_files\\sys32"], "path": "%pwd%win_toolchain\\vs2013_files", "version": "2013e", "wdk": "%pwd%win_toolchain\\vs2013_files\\wdk", "win8sdk": "%pwd%win_toolchain\\vs2013_files\\win8sdk"} > %file%
set DEPOT_TOOLS_WIN_TOOLCHAIN=1
set GYP_MSVS_VERSION=2013
set GYP_GENERATORS=msvs-ninja,ninja
set GYP_DEFINES=component=shared_library disable_nacl=1
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyCV9AOzytWwWCtNE8f7ZV56fP1u9yWwhVU' -Dgoogle_default_client_id='1039996407057.apps.googleusercontent.com' -Dgoogle_default_client_secret='mLT8XooDODav1OJG5G3bY61d'
這里要說一下,很多朋友是從網上其他地方下載的別人用的源碼包,可能他們的源碼包是用的本地環境,而我們使用的混合編譯,需要設置set DEPOT_TOOLS_WIN_TOOLCHAIN=1,設置為0則是讓gclient不要自動去構造環境,而是利用本機現有環境!很明顯的區別從打開的chrome.sln項目解決方案就能看出來,混合編譯的是沒有分類的虛擬文件夾的,但是設置為0的話就是用系統現有環境生成的也就是編譯使用你自己安裝的VS是有虛擬文件夾的,這個跟之前的10版本以前的都一樣!
GYP_MSVS_VERSION很明顯就不說了,GYP_GENERATORS配置編譯方式的,GYP_DEFINES一般是配置win8sdk位置的,如:set GYP_DEFINES=windows_sdk_path="C:\Program Files (x86)\Windows Kits\8.0"
如果你不知道這個批處理有沒有成功執行,你也看一下src\out\Debug(或者Release)下的build.ninja文件,看看開始那兩個路徑是不是就是你在path里設置的depot_tools所在的路徑。如果不是,而是原本的系統路徑下的,那么就是沒有成功執行。建議在cmd下執行批處理看看提示的錯誤是什么!
3.在最終的Release版本產品發布的時候,為了打包的需要可以把shared_library注釋掉rem set GYP_DEFINES=component=shared_library改為靜態編譯,這個時候的編譯會比較慢特別是是最后的連接chrome.dll !
4.由於ninja+vs13這種混合編譯模式調用的都是depot_tools下的,所以直接在打開vs13中添加文件是不會被編譯到的,所以如果有在項目中添加文件就需要修改項目對應的gyp或者gypi文件,將我們添加的文件目錄添加到sources節點下,然后重新運行上邊的批處理文件!
5.最后再說一點,那就是如果以前使用過vs2010編譯,在運行CreateBuild.bat 這個批處理之前要刪除“C:\Users\$(username)\AppData\Local\Microsoft\MSBuild\v4.0”下props文件中關於$(DXSDK_DIR)的內容。(重要)
6.最近有網友說新版本的chromium編譯總有些警告導致編譯不過,后來我們發現暫時可以這樣解決:在src\build\common.gypi 的msvs_disabled_warnings 節點里大約5325行左右,加上 4819,4996 排除兩個警告就能正常編譯通過!
7.對於想編譯64位chromium的同學,需要在批處理里面另外加一句命令:set GYP_DEFINES=target_arch=x64 不過輸出的是在Release_x64 或者Debug_x64下!
8.項目編譯成功后有人問那個谷歌API KEY信息欄提示的問題!很多人的做法是直接將提示這段信息欄的代碼注釋掉,個人覺得這么做並不太妥當!其實你點右側的那個連接也能看到怎么做,不過文章有點兒舊了。總的來說差不多也就這兩種方式:第一種就是在生成項目解決方案的時候直接加參數,比如:python src\build\gyp_chromium -Dgoogle_api_key='******' -Dgoogle_default_client_id='******** -Dgoogle_default_client_secret='******'而第二種方式就是我們在src\build\common.gypi中942行左右的'google_api_key%','google_default_client_id%','google_default_client_secret%'三個參數中直接添加也行,效果是一樣的!至於這些KEY值怎么獲得?這個自己去申請就行!如果你實在懶得去申請,也可以用我提供的下邊這幾個測試一下:
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyCV9AOzytWwWCtNE8f7ZV56fP1u9yWwhVU' -Dgoogle_default_client_id='1039996407057.apps.googleusercontent.com' -Dgoogle_default_client_secret='mLT8XooDODav1OJG5G3bY61d'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyCWBmUuxZW1VaZZHkIembF2nengp8asUEk' -Dgoogle_default_client_id='1038894449561-bjihbnffo05svbqcncq7clirvq9meh0c.apps.googleusercontent.com' -Dgoogle_default_client_secret='OeKyUMzNTZ1-hPPypa7GiW4x'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyBsp9n41JLW8jCokwn7vhoaMejDFRd1mp8' -Dgoogle_default_client_id='996322985003.apps.googleusercontent.com' -Dgoogle_default_client_secret='IR1za9-1VK0zZ0f_O8MVFicn'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyCcjKzcifha1m8P4RVxytpVsx3wNDIEHsY' -Dgoogle_default_client_id='985919302268.apps.googleusercontent.com' -Dgoogle_default_client_secret='vQKKl73QQk8_dgEF44vNTHmJ'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyBhWJ-j5RXyt5911BMuVen-WuS10mvOnrY' -Dgoogle_default_client_id='952820686433-mbp5sv9scfj78siq96jlvrem47qgvbi3.apps.googleusercontent.com' -Dgoogle_default_client_secret='XU4b-j0Ssy-XkTvSVmiFMvNY'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyCkfPOPZXDKNn8hhgu3JrA62wIgC93d44k' -Dgoogle_default_client_id='811574891467.apps.googleusercontent.com' -Dgoogle_default_client_secret='kdloedMFGdGla2P1zacGjAQh'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw' -Dgoogle_default_client_id='77185425430.apps.googleusercontent.com' -Dgoogle_default_client_secret='OTJgUOQcT7lO7GsGZq2G4IlT'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyD1tTgDbP-N6BGXKZ7VqSos_IU1QflGbyg' -Dgoogle_default_client_id='724288223830.apps.googleusercontent.com' -Dgoogle_default_client_secret='rHmKOPygcI6G-clFHb-RfuHb'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyAQfxPJiounkhOjODEO5ZieffeBv6yft2Q' -Dgoogle_default_client_id='424119844901.apps.googleusercontent.com' -Dgoogle_default_client_secret='AIienwDlGIIsHoKnNHmWGXyJ'
python src\build\gyp_chromium -Dgoogle_api_key='AIzaSyDwr302FpOSkGRpLlUpPThNTDPbXcIn_FM' -Dgoogle_default_client_id='413772536636.apps.googleusercontent.com' -Dgoogle_default_client_secret='0ZChLK6AxeA3Isu96MkwqDR4'
9.看評論里有朋友提到了NACL這塊,個人建議在編譯的時候最好是把這塊的編譯設置關掉(國內其他的定制瀏覽器也是這么干的)。這塊應該是還不太成熟,應用也很少!所以建議在配置編譯項的時候做一下修改
- set GYP_DEFINES=component=shared_library disable_nacl=1
- PrefService* prefs = profile_->GetPrefs();
- prefs->SetInteger(prefs::kRestoreOnStartup,4);
- ListValue* url_pref_list = new ListValue;
- url_pref_list->Set(0, Value::CreateStringValue("http://www.baidu.com"));
- prefs->SetDefaultPrefValue(prefs::kURLsToRestoreOnStartup, url_pref_list);
11.看評論里有朋友問這個chromium的優化問題,那么設置 set GYP_DEFINES=branding=Chromium buildtype=Official 以官方的構建方式來做會更好一些!官方的建立方式啟用了許多優化,例如:/Os(大小優化) ;禁用一些跟蹤 ;啟用PGO和LTCG ;去掉DLOG ;去掉CHECK消息;啟用其他的編譯/鏈接時優化等等~
12.再一個就是很多朋友看了common.gypi的配置后也跟着亂改配置項,比如fastbuild=1等;關於component=shared_library和fastbuild=1的區別建議大家看一下這篇文章再做修改!
13.很長時間沒來看看了,發現又積攢了很多很多問題,比如有人提到的這個‘ascii’的問題,具體錯誤提示如:UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 9: ordinal not in range(128)!這個問題在谷歌使用python27的時候(差不多是chromium31左右)就出現了,基本我們的解決辦法就是直接根據錯誤提示找到depot_tools\python276_bin\Lib\mimetypes.py文件,大約在249行左右注釋掉這幾行代碼就是了!
- try:
- ctype = ctype.encode(default_encoding) # omit in 3.x!
- except UnicodeEncodeError:
- pass
當然,官方也給出了一種方法:set your Windows system locale to English!詳細介紹見
14.另一個不得不提的問題就是如果你在下載編譯最新幾個版本的代碼比如40,41,42,43等,最好是設置set DEPOT_TOOLS_WIN_TOOLCHAIN=0,並下載安裝最新的VS2013的更新包Update4(You must build with Visual Studio 2013 Update 4, no other versions are supported.)要不然很可能會編譯不過;至於為什么,我來說一下這個問題是因為之前的chromium編譯我們使用混合編譯用的是win_toolchain下的免費版VS13,這個版本比較早是存在很多BUG的,很多在chrome論壇里提交的BUG都是指向VS13,就比如我們設置 set GYP_DEFINES=branding=Chromium buildtype=Official 編譯Release版本使用混合編譯基本是編譯不過的。VS13 update4里面就這些問題提交了修復,所以后期的代碼構建谷歌都是推薦使用VS13 Update4(Community版或者Professional版)。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
另外針對國內拉取chromium代碼很麻煩的問題,除了可以直接下載網友共享的源碼包之外,或者可以使用另一條方式就是設置http代理!這里提供一個方法供朋友們測試:
#配置http代理:(gclient 的 python腳本里的urllib2和其他幾個對象默認使用http代理)
set http_proxy=http://127.0.0.1:808(這里根據情況自己改,下同)
#如果http代理需要認證,那么要加上一下兩個命令
set http_proxy_user=<你的用戶名>
set http_proxy_pass=<你的密碼>
#配置winhttp代理,cscript 走代理
netsh winhttp set proxy 127.0.0.1:808
#配置gclient的git走http代理
git config --global http.proxy http://127.0.0.1:8080
#從代碼庫拿chromium
fetch --nohooks --no-history chromium --nosvn=True
gclient sync --force --nohooks
代碼同步完成后再使用那個批處理生成解決方案就OK! 至於VPN的話可以試試我上邊推薦的那個!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
待續......