chromium 46 编译chromium老版本流程

01 基本信息

官网老版本获取流程: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的。并且要安装全。

02 代码下载步骤

该步骤适合win10系统安装多个版本的vs、sdk的情况。
测试系统的win10 安装了 vs2005-vs2022 各个版本的vs,及多个版本的sdk。

02.00 VPN

必须准备

02.01 设置环境变量

注意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 之类的命令要在当前路径。

chromium 46 编译chromium老版本流程_第1张图片

02.02 下载 depot_tools 并切换到历史版本

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

下图已经下载,且切换好了对应历史提交。
chromium 46 编译chromium老版本流程_第2张图片

如何切换到历史版本

比如: 要查找 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

02.03 更新 depot_tools

depot_tools当前目录下运行 gclient --version,来更新指定版本的 depot_tools
更新后,depot_tools一般800MB+。更新成功的标志是没有显示错误,且正确显示版本号。

02.04 设置git参数

# 更新好 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

02.05 下载指定版本

:: 下载 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

02.06 编译版本

生成 工程文件及编译

:: 生成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

03 相关错误及解决

03.01 错误1,runhooks 错误

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

03.02 错误2 编译是出现如下错误:

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.chromiumsrc/third_party/angle 顺序调换一下即可。(调换之后,第三方依赖由76个变成81个。)

recursedeps = [
  'src/buildtools',
  'src/third_party/android_tools',
  [
    #'DEPS.chromium',
    'src/third_party/angle',
    'DEPS.chromium'
  ]
]

03.03 错误3 消除 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.gncflags = [] 中加入即可。cflags = ["/wd4706"]

03.04 修正,删除 include 信息

删除 build/toolchain/win/BUILD.gn 文件中的 /showIncludes
主要是不要在编译时,显示过多的include信息

03.05 修正 指定本地 sdk 版本号

如果本地有多个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')

本机安装了很多sdk版本。
chromium 46 编译chromium老版本流程_第3张图片

03.06 错误6 出现如下错误:

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 

03.07 运行错误

如果debug运行错误,尝试 删除 chromium的临时目录。可能是因为本地有不同版本的chromium缓存,缓存结构不兼容导致的。

删除临时目录 %localappdata%\chromium

04 运行效果

chromium 46 编译chromium老版本流程_第4张图片

05 其它问题

用以上方式编译后,用 vs2015 打开 all.sln,发现要加载很久,调试时,需要重新编译,后来查看 out\DebugX64\ 下面的 系统dll及vs 的dll,发现使用的是 10.0.19041.1 版本的,所以做了如下调整。
10.0.19041.1 应该是实际启用版本号,而 10.0.19041.0 是对应目录。

05.01 修正 指定本地 sdk 版本号

如果本地有多个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')

05.02 编译版本

生成 工程文件及编译

:: 生成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

05.03 新问题及解决

指定 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;

06 弃用vs2015,改用vs2019

问题:对vs2015 的配置项做了适当优化后,用vs2015 update3 打开 all.sln 后,依然记载缓慢,并且特别容易崩溃。

后来直接改用vs2019(支持vs2015),打开后 all.sln 后,一切正常,调试比较顺畅。

你可能感兴趣的:(chromium,chromium)