官网老版本获取流程:https://chromium.googlesource.com/chromium/src/+/main/docs/building_old_revisions.md
有些老项目,使用的是稍微老一点的chromium版本,为了做比较全面的对比和研究,处理官网下载历史版本外,有时,可能需要编译对应的老版本。这里以 57.0.2987.98 为例,描述 windows版本编译过程。
首先,需要安装 vs2015 update3
,winsdk,winwdk。
winsdk 版本号:10.0.14393.795
,但安装目录的版本号是 10.0.14393.0
winwdk 的安装目录是 C:\Users\soft\Downloads\Windows Kits\10\WDK
注意,windows上一定要按照wdk的。并且要安装全。
该步骤适合win10系统安装多个版本的vs、sdk的情况。
测试系统的win10 安装了 vs2005-vs2022 各个版本的vs,及多个版本的sdk。
必须准备
注意1,为了不影响系统环境,建议直接使用命令行设置环境变量,不要在系统环境变量中设置。尤其是系统有多种开发环境时。
注意2,如果系统安装了多个vs版本。要使用 vs 指定的vs的命令行环境。
A 用 vs2015的 VS2015 的 MSBuild 命令提示符
打开命令行(为了默认使用该版本的vs环境)
B 在命令行窗口设置环境变量
set GYP_MSVS_VERSION=2015
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio 14.0
set GYP_GENERATORS=ninja,msvs-ninja
set WDK_DIR=C:\Users\soft\Downloads\Windows Kits\10\WDK
set VS_CRT_ROOT=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt
set PATH=%cd%\depot_tools;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64;%PATH%
注意,一定要把 depot_tools 设置到path的最前面。并且,这样设置之后,要在当前目录下运行fetch命令,也就是 %cd% 代码是当前路径,否则,使用绝对路径。如果使用 %cd%,记得后面在运行 gclient sync,gclient runhooks 之类的命令要在当前路径。
depot_tools 需要和 chromum版本对应。
# 下载 depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
cd depot_tools
# 通过 chrome57 发布版本的时间,切换到大致时间的版本
git checkout 6db8ac7 -b 20170131
如何切换到历史版本
比如: 要查找 chromium57 版本,可以从 https://www.chromium.org/developers/calendar/
查到 chromium 57 版本的发布时间是 57 Jan 19th, 2017
,
则在 depto_tools 中用 git map 命令查找过滤,如下查找出3条记录,当然,也可以能查不到当天的,可以用更早一些的日志来查找。
git map | findstr 2017-01-19
* [31m[1m0fe50fc42f[39m[49m[0m [33m2017-01-19[39m[49m[0m ~ Roll recipe dependencies (trivial).
* [31m[1m06dba1b159[39m[49m[0m [33m2017-01-19[39m[49m[0m ~ Add JS to git cl format.
* [31m[1m833c94c6fb[39m[49m[0m [33m2017-01-19[39m[49m[0m ~ Create recipe_modules/gerrit to interact with gerrit REST API
在depot_tools
当前目录下运行 gclient --version
,来更新指定版本的 depot_tools
更新后,depot_tools
一般800MB+。更新成功的标志是没有显示错误,且正确显示版本号。
# 更新好 depot_tools 后,要设置一下git 参数
git config --global user.name "5455945"
git config --global user.email "[email protected]"
git config --global core.autocrlf false
git config --global core.filemode false
git config --global color.ui true
git config --global branch.autosetuprebase always
:: 这个配置要结合自己的实际内存
git config --global core.deltaBaseCacheLimit 2g
:: 下载 main 分支, 一般不编译main 分支,不要runhooks
fetch --nohooks --no-history chromium
:: 进入代码目录
cd src
:: 拉取指定tag(57.0.2987.98),(不带历史记录 --depth 1)
git fetch https://chromium.googlesource.com/chromium/src.git +refs/tags/57.0.2987.98:b57.0.2987.98 --depth 1
:: 切换到想要的分支或者tag
git checkout b57.0.2987.98
:: 在 src 目录外运行 gclient
cd ..
:: 下载完成,或者下载失败,已经有.gclient文件,可以用下面命令
:: gclient sync 使第三方库和主库同步(注意 -D 删除前面下载main的时候的多余第三方库)
gclient sync -D --nohooks --with_branch_heads --with_tags --output-json="log.json"
:: 查看是否有残留内容,非必须,也可遇到问题再尝试这个动作
cd src
git status
:: 如果有残留的内容,使用 git clean df(会清除多余的第三方库) 清理后,再同步一次,避免有误删除第三方库
git clern -df
cd ..
gclient sync -D --nohooks --with_branch_heads --with_tags --output-json="log.json"
:: 同步依赖工具,编译工具和必要的库
gclient runhooks # 或者 gclient runhooks --force
错误1 gclient sync | gclient runhooks 出错,删除 src/buildtools/win/gn.exe
后,再 gclient runhooks
即可。
主要是因为 脚本没有成功删除
src/buildtools/win/gn.exe
引起的。
Hook 'download_from_google_storage --no_resume --platform=win32 --no_auth --bucket chromium-gn -s src/buildtools/win/gn.exe.sha1' took 51.90 secs
生成 工程文件及编译
:: 生成DebugX64工程
gn gen out/DebugX64 --ide=vs2015 --winsdk=10.0.14393.0 --args="target_os=\"win\" target_cpu=\"x64\" is_component_build=true is_debug=true is_official_build=false google_api_key=false google_default_client_id=false google_default_client_secret=false proprietary_codecs=true media_use_ffmpeg=true ffmpeg_branding=\"Chrome\" remove_webcore_debug_symbols=false enable_nacl=false enable_mse_mpeg2ts_stream_parser=true enable_hls_sample_aes=true enable_ac3_eac3_audio_demuxing=true "
:: 编译DebugX64版本
ninja -C out\DebugX64 chrome
:: 生成 ReleaseX64 工程
gn gen out/ReleaseX64 --ide=vs2015 --winsdk=10.0.14393.0 --args="target_os=\"win\" target_cpu=\"x64\" is_component_build=false is_debug=false is_official_build=true google_api_key=false google_default_client_id=false google_default_client_secret=false proprietary_codecs=true media_use_ffmpeg=true ffmpeg_branding=\"Chrome\" remove_webcore_debug_symbols=true enable_nacl=false enable_mse_mpeg2ts_stream_parser=true enable_hls_sample_aes=true enable_ac3_eac3_audio_demuxing=true "
:: 编译ReleaseX64版本,且编译mini_installer.exe
ninja -C out\ReleaseX64 mini_installer
gclient sync | gclient runhooks
出错,删除 src/buildtools/win/gn.exe
后,再 gclient runhooks
即可。
错误现象:
Hook 'download_from_google_storage --no_resume --platform=win32 --no_auth --bucket chromium-gn -s src/buildtools/win/gn.exe.sha1' took 51.90 secs
ninja -C out\DebugX64 chrome
ninja: Entering directory `out\DebugX64'
ninja: error: '../../third_party/vulkan-validation-layers/src/loader/cJSON.c', needed by 'obj/third_party/angle/src/vulkan_support/vulkan_loader/cJSON.obj', missing and no known rule to make it
是因为依赖关系错误引起的,参见官网说明: https://bugs.chromium.org/p/chromium/issues/detail?id=685433&desc=2
代码修改位置: https://chromium.googlesource.com/chromium/src/+/57.0.2987.10/DEPS#1142
依赖关系搞错了,
chromium57\src\DEPS
中的 DEPS.chromium
和 src/third_party/angle
顺序调换一下即可。(调换之后,第三方依赖由76个变成81个。)
recursedeps = [
'src/buildtools',
'src/third_party/android_tools',
[
#'DEPS.chromium',
'src/third_party/angle',
'DEPS.chromium'
]
]
error C2220: 警告被视为错误
出现如下错误,需要警用警告,优先在 公共部分加,其次在发生问题的工程中加
e:\banma\chromium572\src\media\formats\mp2t\es_parser_h264.cc(93) : error C2220: 警告被视为错误 - 没有生成“object”文件
e:\banma\chromium572\src\media\formats\mp2t\es_parser_h264.cc(93) : warning C4706: 条件表达式内的赋值
[20/12700] CXX obj/third_party/WebKit/public/offs..._mojo_bindings/offscreen_canvas_surface.mojom.obj
ninja: build stopped: subcommand failed.
公共部分一般到 src\build\config\BUILD.gn
或者 src\build\config\win\BUILD.gn
下面设置。
工程的话,一般可以到项目目录的根目录查找,比如: src\media\BUILD.gn
在 cflags = [] 中加入 “/wd4706”,或者在设当的位置加入 cflags += [] 中加入 “/wd4706”。
这里直接在 src\media\BUILD.gn
的 cflags = []
中加入即可。cflags = ["/wd4706"]
删除 build/toolchain/win/BUILD.gn
文件中的 /showIncludes
主要是不要在编译时,显示过多的include信息
如果本地有多个sdk版本,并且 gn gen 的 winsdk 参数无效(–winsdk=10.0.14393.0),可以强制替换。
修改 build/toolchain/win/setup_toolchain.py
,替换 set
命令默认的 sdk 版本号(10.0.22000.0)为目标版本号(10.0.14393.0)
#env[var.upper()] = setting
env[var.upper()] = setting.replace('10.0.22000.0', '10.0.14393.0')
FAILED: obj/media/media/es_parser_adts.obj
ninja -t msvc -e environment.x64 -- "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64/cl.exe" /nologo /FC @obj/media/media/es_parser_adts.obj.rsp /c ../../media/formats/mp2t/es_parser_adts.cc /Foobj/media/media/es_parser_adts.obj /Fd"obj/media/media_cc.pdb"
e:\banma\chromium57\src\media\formats\mp2t\es_parser_adts.cc(257): error C2039: “min”: 不是“std”的成员
c:\program files (x86)\microsoft visual studio 14.0\vc\include\functional(945): note: 参见“std”的声明
e:\banma\chromium57\src\media\formats\mp2t\es_parser_adts.cc(257): error C3861: “min”: 找不到标识符
e:\banma\chromium57\src\media\formats\mp2t\es_parser_adts.cc(256): error C2789: “extended_samples_per_second”: 必须初 始化常量限定类型的对象
e:\banma\chromium57\src\media\formats\mp2t\es_parser_adts.cc(256): note: 参见“extended_samples_per_second”的声明
[13695/26972] CXX obj/media/media/mp2t_stream_parser.obj
ninja: build stopped: subcommand failed.
解决办法:在 src\media\formats\mp2t\es_parser_adts.cc
中,增加头文件
#include
如果debug运行错误,尝试 删除 chromium的临时目录。可能是因为本地有不同版本的chromium缓存,缓存结构不兼容导致的。
删除临时目录 %localappdata%\chromium
用以上方式编译后,用
vs2015
打开all.sln
,发现要加载很久,调试时,需要重新编译,后来查看out\DebugX64\
下面的 系统dll及vs 的dll,发现使用的是10.0.19041.1
版本的,所以做了如下调整。
10.0.19041.1 应该是实际启用版本号,而 10.0.19041.0 是对应目录。
如果本地有多个sdk版本,并且 gn gen 的 winsdk 参数无效(–winsdk=10.0.19041.0),可以强制替换。
修改 build/toolchain/win/setup_toolchain.py
,替换 set
命令默认的 sdk 版本号(10.0.22000.0)为目标版本号(10.0.19041.0)
#env[var.upper()] = setting
env[var.upper()] = setting.replace('10.0.22000.0', '10.0.19041.0')
生成 工程文件及编译
:: 生成DebugX64工程
gn gen out/DebugX64 --ide=vs2015 --winsdk=10.0.19041.0 --args="target_os=\"win\" target_cpu=\"x64\" is_component_build=true is_debug=true is_official_build=false remove_webcore_debug_symbols=false google_api_key=false google_default_client_id=false google_default_client_secret=false proprietary_codecs=true media_use_ffmpeg=true ffmpeg_branding=\"Chrome\" enable_nacl=false enable_mse_mpeg2ts_stream_parser=true enable_hls_sample_aes=true enable_ac3_eac3_audio_demuxing=true enable_hevc_demuxing=true enable_webrtc=true rtc_use_h264=true rtc_use_lto=true use_openh264=true enable_widevine=true media_use_libvpx=true "
:: 编译DebugX64版本
ninja -C out\DebugX64 chrome
:: 生成 ReleaseX64 工程
gn gen out/ReleaseX64 --ide=vs2015 --winsdk=10.0.19041.0 --args="target_os=\"win\" target_cpu=\"x64\" is_component_build=false is_debug=false is_official_build=true remove_webcore_debug_symbols=true google_api_key=false google_default_client_id=false google_default_client_secret=false proprietary_codecs=true media_use_ffmpeg=true ffmpeg_branding=\"Chrome\" enable_nacl=false enable_mse_mpeg2ts_stream_parser=true enable_hls_sample_aes=true enable_ac3_eac3_audio_demuxing=true enable_hevc_demuxing=true enable_webrtc=true rtc_use_h264=true rtc_use_lto=true use_openh264=true enable_widevine=true media_use_libvpx=true "
:: 编译ReleaseX64版本,且编译mini_installer.exe
ninja -C out\ReleaseX64 mini_installer
指定 sdk 版本为 10.0.19041.0
后,多出一个编译错误。
FAILED: obj/third_party/crashpad/crashpad/util/util/nt_internals.obj
ninja -t msvc -e environment.x64 -- "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64/cl.exe" /nologo /FC @obj/third_party/crashpad/crashpad/util/util/nt_internals.obj.rsp /c ../../third_party/crashpad/crashpad/util/win/nt_internals.cc /Foobj/third_party/crashpad/crashpad/util/util/nt_internals.obj /Fd"obj/third_party/crashpad/crashpad/util/util_cc.pdb"
e:\banma\chromium57\src\third_party\crashpad\crashpad\util\win\nt_internals.cc(22): error C2371: “CLIENT_ID”: 重定义;不同的基类型
c:\program files (x86)\windows kits\10\include\10.0.19041.0\um\winternl.h(83): note: 参见“CLIENT_ID”的声明
[4834/26906] CXX obj/third_party/angle/src/vulkan_support/VkLayer_core_validation/core_validation.obj
ninja: build stopped: subcommand failed.
注释掉 src\third_party\crashpad\crashpad\util\win\nt_internals.cc
中的 CLIENT_ID
声明
//line 22
//struct CLIENT_ID;
问题:对vs2015 的配置项做了适当优化后,用vs2015 update3 打开 all.sln 后,依然记载缓慢,并且特别容易崩溃。
后来直接改用vs2019(支持vs2015),打开后 all.sln 后,一切正常,调试比较顺畅。