像许多跨平台的开源项目一样,Servo,这个用 Rust 编写的性能卓越的浏览器引擎项目,一直以来在 Windows 上构建和运行都比较困难。幸运的是,感谢 Rust 团队和 Servo 社区的努力,大多数问题都已解决,现在我们只需要 PowerShell,以及一套完整的 Windows 原生库和工具即可启动它。
为什么花了这么长时间才实现这一点呢?
简短的历史..
早在 2013 年 Servo 开发开始时,它只在 Linux 系统和 OSX 上运行。这主要是因为 Servo 的开发者使用的是这些操作系统。
作为副产品,Servo 最终使用了许多基于 Linux 的依赖项(make、gcc 等),构建系统会对 /bin/:/usr/bin/[etc]
进行硬编码调用。将这些迁移到跨平台需要时间。Servo 工程师 Lars Bergstrom 解释说
“当然,字体支持和构建系统方面的工作花费了最多的精力。总的来说,确保 Servo 依赖项图中数百个板条箱不仅能够在 Windows 上构建,还能正常工作,需要花费大量的精力。
很多东西(包括 Servo)在 MinGW 上很容易获得“类 Unix”的 Windows 体验,但使用 MSVC 获得真正的原生 Windows 体验却花了更长的时间。“
一年后,在 Windows 上运行 Servo 的快速简单解决方案是模拟 Linux 环境,因此导致在 Windows 上使用 msys
和 mingw
的难以理解的设置说明。尽管 Servo 可以构建,但它更像是一种临时的解决方案。
创建了一个 Servo 的 Windows 分支,随着时间的推移,许多构建步骤得到修复;并且仅使用 Linux 组件的模块被屏蔽掉。我们一个接一个地解决了 不兼容性。
我们中的几个人一直在努力推动 使用,并得到了 Vlad 的大力帮助,使 Servo 在 Windows 上正常构建,并使用 Microsoft Visual C++ 编译器 (MSVC) 已经有一段时间了。我们终于做到了!
那么如何开始开发呢?在这些示例中,我将使用 Windows 10 x64。
让我们开始吧
您不必在这里进行编辑,但 Visual Studio (VS) 允许我们实际调试二进制文件。我们可以在任何时候暂停并编辑断点(稍后会详细介绍)。
让我们访问 https://www.visualstudio.com/downloads/ 并下载“Visual Studio 2017 Community”。
下载完成后,您将看到一些选项,导航到“单个组件”选项卡并选择
- C++/CLI 支持
- 性能分析工具
- 适用于 Cmake 的 Visual C++ 工具
- VC++ 2017 v141 工具集
我们需要将 VS 提供给我们的构建工具添加到系统路径中。
导航到环境变量,并将以下内容添加到 Path 变量中
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64`
在这里,您应该设置一个新的环境变量 VisualStudioVersion
为 15.0
(是的,即使是 VS 2017,也是 15.0)。这将使使用 cmake 的板条箱(libssh2-sys 等)能够构建。
现在,我们完成了这一步。
rustup
rustup 将管理我们的 Rust 安装,让我们在发行版之间切换,以及 nightly 和 stable 分支。这使得更新变得非常容易。我们稍后将需要 nightly,因此 rustup 是最好的起点。
访问 rustup.rs 并下载安装程序,它会提到安装 Visual C++ 构建工具,但 VS 应该已经从前面给了我们这些东西,所以只需继续即可。
按 1 键并遵循默认安装。
安装 rust-src
打开 PowerShell:您现在应该已经安装了 Rust,您可以使用以下命令尝试它
$ rustc --version
我们的下一个任务是安装 rust-src,这将帮助 VS 找到它要查找的源代码。(这也是 racer 支持的有用步骤。)
但在我们继续之前,我们应该切换到 nightly。Nightly 为我们提供了 Natvis。
$ rustup default nightly
$ rustup component add rust-src
您现在将有一些文件位于
C:\Users\[User]\.multirust\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src
虽然现在没有用,但您将需要这个路径,以供稍后在“可选:进入标准库”中使用。
添加适用于 Rust 的 Natvis
Natvis 文件提供了 Visual Studio 友好的 Rust 原生对象的可视化效果。Rust 团队添加了 Vec、LinkedList、VecDeque、String、Option 以及许多其他 Natvis 可视化效果。
以下是如何使用它们
C:\Users\[User]\.multirust\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\etc\natvis
将 .natvis 文件复制到此处,并将其放置在
C:\Users\[User]\Documents\Visual Studio 2017\Visualizers
如果“Visualizers”不存在,不要担心,您可以创建这个目录。
构建 Servo
我不会在这里过多介绍设置 Servo 的方法,因为在以下位置已有所介绍:https://github.com/servo/servo/#on-windows-msvc–mingw
使用 --dev
构建最新版本,我只是在
$ mach.bat build --dev
此处运行 PowerShell。重要的是使用 --dev
选项,因为没有它,调试将无法正常工作。
回到 Visual Studio
现在我们已经构建了 Servo,让我们运行它。
您可以打开 Visual Studio,选择“文件”>“打开”>“项目/解决方案”,将“所有项目文件”更改为“Exe 项目文件”,并导航到您的 servo.exe 二进制文件,通常位于 target/debug/servo.exe
。
如果您需要传入参数,可以在右侧的解决方案资源管理器中右键单击 Servo。准备就绪后,您可以单击顶部的“开始”。
这将加载 Servo,您可能会在 VS 的后台看到一些精美的内存分析信息。您可以在任何时候暂停,它应该会停留在暂停的代码行上。如果这种情况没有发生,请确保“线程:”设置为“主线程”。
例如,如果浏览器处于空闲状态并且我们暂停,我们可能会停留在以下这行代码上
self.window.events_receiver.recv().ok()
可选:进入标准库
还记得我们之前安装的 rust-src 吗?好吧,如果我们想查看标准库在做什么,这一点很有用,否则调试器在您单击 std::* 函数时可能会发出抱怨。因此,为了告诉 VS 有关 Rust 源代码的信息,我们可以在右侧的“解决方案”名称上右键单击“解决方案 ‘servo’”并选择“属性”,然后在“通用属性/调试源文件”内将该路径添加到顶部窗口中。
设置断点
这也很简单,您可以将任何 Rust 文件从项目拖放到 VS 中并设置断点。再次单击“开始”,程序应该会在该点停止。然后,您可以逐步进入和退出函数,或者使用继续和断点来检查程序的执行过程。您还可以看到堆栈跟踪和底部范围内定义的变量!
如果一切按计划进行,您应该会看到类似以下内容。
贡献
您想贡献,但不知道从哪里开始?
https://starters.servo.org/ 提供了一些很棒的第一个 PR 问题单,此外还有不少 简单的问题单 尚未解决。
关于 Jason Williams
Jason 是英国广播公司 (BBC) 的首席开发人员和技术主管
10 条评论