在 Windows 上进行 Servo 黑客攻击和贡献

像许多跨平台的开源项目一样,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 上使用 msysmingw 的难以理解的设置说明。尽管 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`

在这里,您应该设置一个新的环境变量 VisualStudioVersion15.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 中并设置断点。再次单击“开始”,程序应该会在该点停止。然后,您可以逐步进入和退出函数,或者使用继续和断点来检查程序的执行过程。您还可以看到堆栈跟踪和底部范围内定义的变量!

如果一切按计划进行,您应该会看到类似以下内容。

Visual Studio loading Servo

贡献

您想贡献,但不知道从哪里开始?

https://starters.servo.org/ 提供了一些很棒的第一个 PR 问题单,此外还有不少 简单的问题单 尚未解决。

关于 Jason Williams

Jason 是英国广播公司 (BBC) 的首席开发人员和技术主管

更多 Jason Williams 的文章…


10 条评论

  1. Ahmed Charles

    这里的说明似乎无法正常工作,因为 servo 目前不支持 MSVC 2017。我认为,如果这套说明经过测试,则是因为已安装 MSVC 2015。mach.bat 寻找 %VS140COMNTOOLS%,即 MSVC 2015。

    注意,可以通过执行适当的 vcvarsall.bat 来解决此问题。(我无法在 powershell 下使其正常工作,并且它似乎比始终使用 cmd 更复杂。)

    然而,还有一个错误,那就是 MSVC 2017 的 vcvarsall.bat 将 %PLATFORM% 设置为 'x64' 而不是 'X64',而 util.host_triple() 期望的是 'X64',因此无法找到合适的 Rust 下载文件。

    第三个问题是,如果路径中没有最新版本的 cmake,它会下载 3.6.1,而 3.6.1 不支持 MSVC 2017。

    第四个问题,我还没有找到解决办法,那就是 “\servo\target\debug\build\mozjs_sys-b75999929c5a0ce6\out\dist\include\js\TraceKind.h” 在 MSVC 2017 下由于语法错误而无法编译: (176): error C2760: syntax error: expected ‘)’ not ‘…’

    在我看来,这应该是有效的 C++ 代码,但我搞不懂发生了什么。

    也许应该将说明更改为安装 MSVC 2015,直到解决 2017 的问题?感谢你在 2015 上让它工作了。 :)

    2017 年 4 月 7 日 上午 1:43

    1. Lars Bergstrom

      Ahmed,

      感谢你的详细调查!我会在 Servo 方面为此信息创建一个问题,并将说明更新为暂时指向 2015。
      – Lars

      2017 年 4 月 7 日 上午 10:12

    2. Lars Bergstrom

      Ahmed,

      现在应该可以工作了!我们一位优秀的社区贡献者完成了 https://github.com/servo/servo/pull/16307,其中添加了对 Visual Studio 2017 的支持。
      – Lars

      2017 年 4 月 12 日 下午 5:29

  2. Volker

    为什么不使用像 MXE 这样的 MinGW 工具链进行交叉编译? (http://mxe.cc/)

    这样,你甚至不需要 Windows 或者任何其他专有操作系统来构建你的端口。

    2017 年 4 月 7 日 上午 4:32

    1. Lars Bergstrom

      Volker,

      我们最初使用 MinGW,它是一款非常适合早期 Unix 应用程序移植的优秀产品。不幸的是,许多依赖项(字体库等)没有使用原生 Windows API 编写,也没有针对 Windows 进行优化,导致 Windows 上的 Servo 性能严重下降。此外,调试体验(Windows 上的 gdb)没有与工具集成,并且经验表明,它比 Rust 和 LLVM 中早期 MSVC 调试支持的成熟度和实用性都要低得多。

      我们继续测试使用 MinGW 构建 Servo,以满足需要此类工具链的用户需求,但我们不会向用户发布此类构建,也不会鼓励开发人员在该平台上工作,除非他们有业务需求。

      希望这有帮助!
      – Lars

      2017 年 4 月 7 日 上午 10:11

    2. Michael “notriddle” Howell

      Servo 仍然需要一台 Windows 机器来运行测试套件,因此从 Linux 交叉编译到 Windows 不会带来太多好处……

      2017 年 4 月 13 日 上午 8:43

  3. Kamal

    这是个好消息,我们会看到这个页面更新吗?-

    https://download.servo.org/

    包含 Windows 安装程序吗?

    2017 年 4 月 9 日 下午 8:54

    1. Lars Bergstrom

      Kamal,

      我们只有一个与键盘输入相关的 Windows 阻塞问题。我们有一个跟踪问题记录了使下载公开可用的剩余工作
      https://github.com/servo/servo/issues/12125

      抱歉,它还没有准备好发布!
      – Lars

      2017 年 4 月 10 日 上午 11:13

    2. Lars Bergstrom

      Kamal,

      现在已经上线了!
      https://blog.servo.org/2017/04/13/windows/
      – Lars

      2017 年 4 月 14 日 上午 6:42

  4. Elahn Ientile

    很棒的文章,感谢!

    小细节:VS 构建工具路径末尾有一个不需要的反引号。

    2017 年 4 月 13 日 下午 4:06

本文评论已关闭。