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

必须准备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 之类的命令要在当前路径。

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

下图已经下载,且切换好了对应历史提交。

如何切换到历史版本

比如: 要查找 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 "5455945@gmail.com"
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 分支,不要runhooksfetch --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()] = settingenv[var.upper()] = setting.replace('10.0.22000.0', '10.0.14393.0')

本机安装了很多sdk版本。

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 <algorithm>

03.07 运行错误

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

删除临时目录 %localappdata%\chromium

04 运行效果

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()] = settingenv[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 46 编译chromium老版本流程相关推荐

  1. windows下编译chromium浏览器的15个流程整理

    阅读目录 编译chromium 15个编译流程: 参考: 注意: 回到顶部 编译chromium 系统为windows, 国内在windows上编译chromium的资料比较少, 我这篇文章只能作为参 ...

  2. chromium android分析,Chromium Android工程迁移编译过程

    本文从Chromium编译的中间产物入手深入分析.学习Chromium Android版本的工程化定制流程.初始工作依赖于Chromium的ninja.GYP构建系统,在构建完成后基于编译中间产物,迁 ...

  3. Chromium Android编译指南

    先决条件 需要有一台装有Linux操作系统环境的主机来做编译,这个环境的搭建配置方法可以参考Linux-specific build instructions.目前还不支持在其它(Mac/Window ...

  4. chromium OS编译过程

    安装下面的依赖: #sudo apt-get install subversion pkg-config python perl g++ g++-multilib bison  flex gperf ...

  5. Window使用代理下载编译Chromium(Visual Stadio 2019版)

    下载源码 参考Checking out and Building Chromium for Windows (googlesource.com)官方流程. 安装visual studio与相应开发工具 ...

  6. windows下载编译chromium源码

    前言 chromium 源码的下载编译,真的就是如各位前辈说的一样,参考再完整的教程,还是会遇到各种各样的问题.因为每个人的开发环境是不一样的,网络环境也不一样. 一路参考各路大神的教程开始踩坑填坑的 ...

  7. Android编译chromium

    一.申请云服务器 在Windows或者Mac下编译Android客户端是不支持的,官方推荐的是使用Ubuntu来进行编译,因此我们的编译采用的是Ubuntu服务器,事实证明镜像必须是ubuntu,如果 ...

  8. Windows编译chromium

    chromium版本更新特别快,建议参考官方教程:https://chromium.googlesource.com/chromium/src/+/HEAD/docs/windows_build_in ...

  9. 编译chromium笔记

    有效参考: https://www.cnblogs.com/kanego/p/4086686.html https://blog.csdn.net/longji/article/details/809 ...

最新文章

  1. iOS架构设计-URL缓存(下)
  2. asp.net中GridView传多个值到其它页面的方法
  3. [linux]在使用rsync时需要注意的小细节
  4. ZOJ-1610-Count the Colors
  5. ASP.NET Core应用程序的参数配置及使用
  6. 数据结构与算法-ADT-Array
  7. 机智的ensemble
  8. 【codevs2800】送外卖,状态压缩DP练习
  9. python 教材为什么喜欢用spam举例_斯坦福大学教授列举出的python入门最容易犯的错误,你中招了吗?...
  10. struts2中的值栈对象ValueStack
  11. css美化滚动条样式,css3美化滚动条样式
  12. ExMobi移动应用平台 烽火星空引领企业移动信息化
  13. 无线路由器桥接、中继、电力猫组网方法分享
  14. css文字闪光特效,利用js css3实现文字闪光滑过动画特效
  15. NI ELVIS III模拟电子电路课程实验解决方案
  16. c语言程序设计 滴水视频,编程达人滴水中级班视频教程
  17. CCF201409-1相邻数对(C语言)
  18. Paypal支付/回调/退款
  19. nginx【nginx跨域、nginx开启gizp压缩、nginx服务器部署项目】
  20. DOTA2人机决战:2:0!OpenAI击败世界冠军OG

热门文章

  1. 【Unity3D】Unity 组件 ④ ( 摄像机 | 调整摄像机 | 手工调整 | 3D 视图对齐 Align with View 调整摄像机 )
  2. Java项目:SSH高校科研管理系统平台
  3. 2019零基础学Android第0课——零基础怎么学Android?
  4. 简单明了强烈推荐办公神器
  5. 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介---- 汉语分词领域主要分词算法、组件、服务(下)
  6. python语言的标准库有哪些,python标准库函数有哪些
  7. Percona(MySQL)安装
  8. 12306订票候补是个坑_12306的候补购票功能是好还是坏?
  9. C专家编程(Expert C Programming)1
  10. 【软件测试教程】Jmeter接口测试+压力测试