在 Windows 上使用 Clang-cl 构建 Node.js
在 Windows 上使用 clang-cl 构建 Node.js
最近,Node.js 开始支持在 Windows 上使用 clang-cl
进行构建。我恰好有机会在本周尝试了一下,虽然在我的情况下仍然需要进行一些修复,但现在基本上运行良好。以下是一些相关记录。
背景
简单回顾一下 Node.js 如何走到今天:长期以来(或者说,自从我 2016 年开始为 Node.js 做出贡献以来),官方的 Windows 版 Node.js 发布版本都是用 MSVC 构建的,类似于 V8 过去使用的构建方式。在某个时间点,V8 追随 Chromium,完全切换到在所有平台上使用 clang-cl
,包括 Windows,同时接受来自 Node.js 这样的嵌入者的补丁,以使其至少可以用 MSVC 构建。去年九月,V8 再次追随 Chromium,从 V8 13.0 开始完全放弃了对 MSVC 的支持,这意味着不再接受上游的这种 MSVC 兼容性补丁,这也使得 Node.js 至少开始让 clang-cl
构建工作变得更加紧迫。
Node.js 之前已经有一些尝试切换到 clang-cl
,因为 V8 已经进行了切换,包括2020 年的这个 PR。 像 Node.js 中的大多数事情一样,这主要基于志愿者的努力,因此需要很长时间才能实现。 感谢包括 Michaël Zasso, Stefan Stojanovic 和 Daniel Lemire 等贡献者之间的合作,Node.js 的 clang-cl
构建在 2024 年底开始成形,并被添加到 Node.js 的 pull request CI 中。
本周,我恰好在帮助 Node.js 进行 V8 13.3 升级,这在 CI 中遇到了 clang-cl
的编译错误,以及其他问题。因此,我抓住机会在我不太常用的 Windows 机器上本地尝试了新的 clang-cl
构建。
安装工具链
安装 clang-cl
正如构建指南中所述,我们需要安装具有以下组件的 Visual Studio 2022 Community Edition:
- C++ Clang Compiler for Windows
- MSBuild support for LLVM (clang-cl) toolset
我之前已经安装了这些组件,但是由于某些原因,当我尝试使用 clang-cl
构建 Node.js 时,它并没有 直接工作,并且构建命令抱怨说上面提到的组件没有安装,即使当我打开 Visual Studio Installer 时,这些组件显然被列为已安装。所以我尝试了通用的魔术技巧 - 重新安装它们! :P 这确实解决了我的问题,我将列出我所做的:
- 打开 Visual Studio Installer。更新到最新版本的 Visual Studio 2022 Community Edition。(仅此一项并没有为我解决问题)。
- 更新后再次打开 Visual Studio Installer。单击 Visual Studio 2022 Community Edition 的“修改”,转到“单个组件”选项卡,搜索“clang”以找到上面提到的两个组件,然后取消选中它们。然后单击右下角的“修改”以卸载它们。
- 通过执行类似于步骤 2 的操作来重新安装这两个组件,只是这次它们被选中而不是被取消选中。
安装 ccache
感谢 Stefan,现在也有对 Windows 上 ccache 的支持。 要安装 ccache,我只是从 ccache 的下载页面 下载了 zip 文件,并将其解压缩到一个路径。
使用构建 Windows 版 Node.js 也需要的 Git Bash 工具:
cd C:\Users\joyeewget -O wget https://github.com/ccache/ccache/releases/download/v4.10.2/ccache-4.10.2-windows-x86_64.zip -O ccache.ziptar -xf ccache.zipmv ccache-4.10.2-windows-x86_64 ccacherm ccache.zipcd ccachecp ccache.exe clang-cl.exe
请注意,虽然ccache Visual Studio 安装指南建议将 ccache.exe
复制到 cl.exe
,但当我尝试在本地使用它构建 Node.js 时,命令提到他们找不到 clang-cl.exe
,所以我将其复制到该文件(这是一个副本,而不是一个符号链接,可能是因为在 Windows 上创建符号链接需要管理员权限,这有点麻烦。在任何情况下,复制也可以正常工作)。这可能与我使用的工具链版本有关,因为我在之前提到的完全更新之后使用了更最新的版本。
然后我只是通过控制面板将 C:\Users\joyee\ccache
添加到 Windows 上的 Path
环境变量。
使用 clang-cl 构建 Node.js
我在 C:\Users\joyee\node
中检出了 Node.js 存储库。 这就是我运行的内容:
cd C:\Users\joyee\node.\vcbuild.bat clang-cl ccache C:\Users\joyee\ccache\
它运行了 configure
脚本,该脚本显示我正在使用 clang-cl 19.1.1。 瞧,它构建得很好!
所以我实际上并没有重现我在 CI 中看到的错误,该错误使用了 clang-cl 18.1.8,尽管我仍然设法通过查看编译错误来弄清楚如何修复它。 但无论如何,这是一个很好的实验,可以弄清楚如何使用 clang-cl
构建它,并且当再次出现 Windows 问题时,这将非常有用 - 从现在开始,我可能会停止使用 MSVC 并在 Windows 上切换到使用 clang-cl
构建。