英文原帖地址:Web Sprocket(s) | Lesson 1 - First steps
欢迎学习关于如何编译 Web 浏览器的第一课!
我们假定您已阅读了导言,也设置好了 Chromium 资源库。如需更多帮助来设置 Chromium,请参见此处的操作方法(创建本指南时,Chromium 版本为 47.0.2526.73)。
$ # with depot tools in the PATH
$ fetch chromium
$ cd src
$ git fetch origin 47.0.2526.73
$ git reset --hard 47.0.2526.73
$ gclient sync --with_branch_heads
在我们进入详细信息之前,需要先明确一些重要事项。
首先,我们将一切从头开始(创建 git 资源库、提交补丁等),而且我们的变更以 git diff 形式保存于在本课程附件(见底部)中。所以,您无需自己键入任何内容。
另外,您还可以查看我们的课程git 资源库,从中可查找和重新使用我们的指导。在课程资源库中,每个分支都是一节课,所以可以只check out一个分支,并从该位置继续。
让我们首先从本地资源库来跟踪您的进度:
## Change your current directory to chromium/src
$ mkdir sprocket
$ cd sprocket
$ git init
现在,我们有一个空资源库。建议向资源库中添加一些基本文件,例如 gitginore、license、readme 等。如果将 diff 文件存储在资源库中,我们建议在 .gitignore 文件中忽略它们。
此处的 diff 文件已经包含以上修改。
以下命令显示了使用 diff 文件的通用形式:
$ git apply <lesson_file>.diff
完成后,则可以进行初次提交。在 sprocket 文件夹中,执行以下命令:
$ git add --all
$ git commit -m “Initial commit”
## if you have an online repository, you can push it or leave it as it is
Content API 是存在于content/public文件夹中的一组抽象类。通过实现这些类,可利用此API。在此项目中,我们遵循Content API 的样式建议(例如其目录结构的命名约定:app、browser、renderer 等)。
我们的第一个源文件为 C++ 文件,包含主函数:app/main.cc。第一步是加入内容 API 的主头文件。
#include "content/public/app/content_main.h"
然后创建应用程序的入口点:
int main(int argc, const char** argv) {
content::ContentMainParams params(NULL);
// pass through the command line arguments
params.argc = argc;
params.argv = argv;
return content::ContentMain(params);
}
Content API 的主函数是 ContentMain,其初始化参数通过一个结构体传递。
我们现在即可编译自己的第一个浏览器!
Chromium 的编译系统以 gyp 和 ninja 工具为基础。编译文件使用 gyp(Generate Your Project,生成您的项目)生成,而 ninja 负责调用生成的命令。gyp 文件包含一个 python 字典,其中包括具体的编译选项。要阅读有关 gyp 和 ninja 的更多内容,请点击上面两个链接。gyp 文件定义编译目标及其依赖项、环境变量和源文件。要将我们新建的主文件连接到 Chromium 编译系统的其余部分,需要创建一个新 gyp 文件(我们称其为 sprocket.gyp):
'targets': [
{
'target_name': 'sprocket',
'type': 'executable',
'dependencies': [
'sprocket_lib',
],
'sources': [
'app/main.cc',
]
它只是完整 gyp 文件的一部分,整个文件可从此处或资源库中获得。
切记,应将您想要编译的每个新源文件都添加到 gyp 文件中!每节课的 diff 文件也都包含与 gyp 相关的行。
这时,您应可以编译和运行我们的示例。第一次编译所需的时间可能较长,但之后通过增量编译可缩短编译时间。
$ ./build/gyp_chromium sprocket/sprocket.gyp
$ ninja -C out/Release sprocket
$ ./out/Release/sprocket
运行可执行文件时,屏幕上将不显示任何内容。这符合预期,因为我们没有在应用程序中创建任何视图。在后面课程中,我们将为您介绍如何利用内容 API 创建视图。
现在,我们的第一课已经结束,希望您喜欢这一课。下次,我们将开始处理应用程序的窗口。
敬请期待下一课!
第一课的资源仓库在此。
附件:Init, Main