编译工具-depot_tools
编译前置工作
depot_tools是个工具包(depot是仓库的意思),里面包含gclient、gcl、gn和ninja等工具,这些根据都是使用python写的。其主要的功能是对git的增强,让代码管理和编译更加简单;
要支持python 3,需要python 2.7或3.8。
下载地址:https://storage.googleapis.com/chrome-infra/depot_tools.zip
将depot_tools添加到你的PATH开头(必须在任何Python和或git的安装之前)。
执行gclient。它做一些初始化工作,与v8代码无关
gclient执行完毕,用where python查看depot_tools中的python.bat路径信息,确保python.bat在环境变量PATH中的位置在系统中原有(如果有)的python环境位置前面
如何拉取指定版本
有三种方法:
- 使用-r参数执行sync命令,指定.gclient中solution的引用版本为要使用的版本。
- 先使用--nohooks --with_tags --with_branch_heads拉取最新版本参数执行sync命令,然后手动checkout到指定的版本后,重新执行无参数的sync命令。
- 修改.gclient中solution的url,在仓库地址后加上@version,version可以是仓库的branch名或者tag名或者hash。
获取代码-fetch
fetch还有2个可选的参数:
–nohooks。这个参数表示获取代码完成之后不执行runhooks动作。也就仅仅获取代码。
–no-history。这个参数表示对代码仓库执行git shallow clones,就不会获得原仓库的全部历史提交,这样可以减少拷贝代码仓库的大小。按照Chromium文档的介绍,不加上这个参数大概会获取22GB大小的数据,而加上这个参数只会获取6.5GB大小的数据。之后可以对这个仓库再执行–unshallow操作 就会获得完整的历史记录。
fetch命令最后调用的是gclient sync来获取代码的
选择一个空目录并运行以下命令之一:
$ fetch chromium # Basic checkout for desktop Chromium
$ fetch android # Chromium checkout for Android platform
$ fetch ios # Chromium checkout for iOS platform
fetch chromium -no-history # 不下载全部的代码提交历史,推荐使用这个
fetch v8
中途要是网络中断的话输入gclient sync -v来重新下载代码。
当fetch完成,你的工作目录下:
.gclient # A configuration file for you source checkout
src/ # Top-level Chromium source checkout.
最后:
$ gclient sync
gclient命令
gclient是进行代码拉取、工具部署、代码管理的关键组件。一旦拥有了.gclient配置文件,那么之后的工作就都可以通过gclient完成,不再需要fetch了。
gclient命令其实对应着gclient.py脚本,它是用来管理多个模块源代码仓库的工具。它封装一些常用的git命令,对所有的模块生效。可以看到gclient的功能众多,如下总结一下:
- config。创建一个.gclient配置文件。
- diff。类似git的diff命令,用来比较所有模块提交代码的差异。
- help。显示命令的帮助。
- revert。revert一个提交。
- stauts。类似git status命令,用来显示所有模块代码的状态。
- sync。用来同步所有模块的代码。
- root 输出项目的根目录。
- runhooks 执行项目配置里的hooks。当你执行sync时使用了–nohooks参数时,就可以使用该命令来手动执行hooks。根据DEPS文件的描述执行hook任务。
- recurse 在项目中的每个依赖中都执行一条命令。
- fetch 拉取所有模块中的更新。
sync和runhooks命令比较重要,以下分别介绍一下。
gclient命令-sync
sync就是用来同步所有模块的代码。当我们把Chromium仓库的代码切换到某个版本,则必须也要运行gclient sync来同步对应依赖的其他仓库代码,否则就有可能代码编译失败。
sync命令主要依赖两个文件工作,所以在这里先讲解这两个文件格式
- .gclient 此文件一般通过fetch自动生成,也可以手动生成,其格式就是python语法。其中记录一个solution数组,每个solution表示一个项目的基础配置。其中最重要的是三个属性:
- name 项目名
- url 项目仓库地址
- deps_file 依赖配置文件
- DEPS 此文件就是上一节中的依赖配置文件,默认文件名称为DEP,也可以自定义。此文件存放在项目仓库的根目录下,其格式就是python语法。其中最重要的是4个属性
运行gclient sync的时候,会读取DEPS文件中描述的依赖的其他库的url和版本,然后把这些仓库切换到正确的版本。
- -n,–nohooks。检出代码之后不运行hooks里面的动作。
- -r,–revision。强制切换到某个代码的某个版本,后面可以使tag名如gclient sync -r 48.0.2564.74。或者提交id,如gclient sync -r f194a61f5ecd56f744273318100300045586d3dc。
- –with_branch_heads。Git在Clone代码仓库时也获取到每个分支的head。
- –with_tags。Git在Clone代码仓库时也获取tags。
- -R,–reset。重置本地的修改。
- -M,–merge。合并上游的修改。
- -A,–auto_rebase。等同于git pull –rebase。
- –upstream。让本地仓库状态匹配上游分支。
- –no-history。为了减小仓库大小,不检出提交历史。
- –shallow。对换成目录进行浅拷贝
gclient命令-runhooks
runhooks是在同步完代码之后执行的。根据DEPS的文件的描述,执行一些获取代码之后的工作,其中包括生成平台可编译的工程。至于执行了哪些任务,可以参考DEPS文件里面的hooks内容。
runhooks的最后调用src/build/gyp_chromium.py脚本来生成可编译的代码工程。所以如果改变了gyp文件,可以仅运行src/build/gyp_chromium.py脚本来重新生成工程