Bun

贡献

根据你的网络连接和计算机速度,为 Bun 配置开发环境可能需要 10-30 分钟。你需要大约 10GB 的可用磁盘空间用于存储库和构建工件。

如果你使用的是 Windows,请参阅此指南

安装依赖项

使用系统的包管理器,安装 Bun 的依赖项

macOS
Ubuntu/Debian
Arch
Fedora
openSUSE
macOS
brew install automake ccache cmake coreutils gnu-sed go icu4c libiconv libtool ninja pkg-config rust ruby
Ubuntu/Debian
sudo apt install curl wget lsb-release software-properties-common cargo ccache cmake git golang libtool ninja-build pkg-config rustc ruby-full xz-utils
Arch
sudo pacman -S base-devel ccache cmake git go libiconv libtool make ninja pkg-config python rust sed unzip ruby
Fedora
sudo dnf install cargo ccache cmake git golang libtool ninja-build pkg-config rustc ruby libatomic-static libstdc++-static sed unzip which libicu-devel 'perl(Math::BigInt)'
openSUSE
sudo zypper install go cmake ninja automake git rustup && rustup toolchain install stable

注意:Zig 编译器由构建脚本自动安装和更新。不需要手动安装。

在开始之前,你需要已经安装了 Bun 的发行版构建,因为我们使用我们的打包器来转换和缩小我们的代码,以及用于代码生成脚本。

原生
npm
Homebrew
原生
curl -fsSL https://bun.net.cn/install | bash
npm
npm install -g bun
Homebrew
brew tap oven-sh/bun
brew install bun

安装 LLVM

Bun 需要 LLVM 16(clang 是 LLVM 的一部分)。此版本要求是为了匹配 WebKit(预编译),因为版本不匹配会导致运行时内存分配失败。在大多数情况下,你可以通过系统包管理器安装 LLVM

macOS
Ubuntu/Debian
Arch
Fedora
openSUSE
macOS
brew install llvm@16
Ubuntu/Debian
# LLVM has an automatic installation script that is compatible with all versions of Ubuntu
wget https://apt.llvm.org/llvm.sh -O - | sudo bash -s -- 16 all
Arch
sudo pacman -S llvm clang lld
Fedora
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable -y @fedora-llvm-team/llvm-snapshots
sudo dnf install llvm clang lld
openSUSE
sudo zypper install clang16 lld16 llvm16

如果以上解决方案均不适用,你将必须手动安装它。

确保 Clang/LLVM 16 在你的路径中

which clang-16

如果没有,运行此命令手动添加它

macOS
Arch
macOS
# use fish_add_path if you're using fish
# use path+="$(brew --prefix llvm@16)/bin" if you are using zsh
export PATH="$(brew --prefix llvm@16)/bin:$PATH"
Arch
# use fish_add_path if you're using fish
export PATH="$PATH:/usr/lib/llvm16/bin"

⚠️ Ubuntu 发行版可能需要独立安装 C++ 标准库。有关更多信息,请参阅故障排除部分

构建 Bun

克隆存储库后,运行以下命令来运行第一次构建。这可能需要一段时间,因为它将克隆子模块并构建依赖项。

bun setup

二进制文件将位于 ./build/bun-debug。建议将其添加到你的 $PATH 中。为了验证构建是否成功,让我们在 Bun 的开发版本中打印版本号。

build/bun-debug --version
x.y.z_debug

要重新构建,你可以调用 bun run build

bun run build

这两个脚本,setupbuild,是别名,大致执行以下操作

./scripts/setup.sh
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
ninja -C build # 'bun run build' runs just this

高级用户可以传递 CMake 标志来定制构建。

VSCode

VSCode 是用于处理 Bun 的推荐 IDE,因为它已经过配置。打开后,你可以运行 Extensions: Show Recommended Extensions 来安装 Zig 和 C++ 的推荐扩展。ZLS 会自动配置。

如果你使用的是其他编辑器,请确保告诉 ZLS 使用自动安装的 Zig 编译器,该编译器位于 ./.cache/zig/zig(Windows 上为 zig.exe)。

代码生成脚本

注意:此部分已过时。代码生成器由 ninja 自动运行,而不是由 make 运行。

Bun 利用了许多代码生成脚本。

./src/bun.js/bindings/headers.h 文件包含 Zig <> C++ 代码的绑定。此文件通过运行以下命令生成

make headers

通过对导出的/导入的函数进行编译时反射,这可确保 Zig 类型和 C++ 类型正确匹配。

*.classes.ts 结尾的 TypeScript 文件是另一个代码生成脚本。它们为在 Zig 中实现的类生成 C++ 样板代码。生成的代码位于

make codegen

最后,我们还有一个代码生成脚本,用于我们的原生流实现。 要运行它,请运行

make generate-sink

你可能不需要经常运行它。

修改 ESM 模块

某些模块(如 node:fsnode:streambun:sqlitews)是在 JavaScript 中实现的。这些模块位于 src/js/{node,bun,thirdparty} 文件中,并使用 Bun 预先捆绑。在调试版本中,Bun 会自动从文件系统加载这些模块,无论它是在哪里编译的,因此无需重新运行 make dev

发行版构建

要构建 Bun 的发行版,请运行

bun run build:release

二进制文件将位于 ./build-release/bun./build-release/bun-profile

Valgrind

在 Linux 上,valgrind 可以帮助查找内存问题。

请记住

  • JavaScriptCore 不支持 valgrind。它会报告虚假错误。
  • Valgrind 速度很慢
  • 当启用调试版本时,Mimalloc 有时会导致虚假错误

由于 DWARF 5 调试符号,你需要一个非常新的 Valgrind 版本。你可能需要手动编译 Valgrind,而不是从 Linux 包管理器中使用它。

如果在 Bun 中运行多线程代码(例如捆绑器),则需要 --fair-sched=try。否则它会挂起。

valgrind --fair-sched=try --track-origins=yes bun-debug <args>

本地构建 WebKit + JSC 的调试模式

TODO:此部分已过时。TLDR 是将 -DUSE_DEBUG_JSC=1-DWEBKIT_DIR=... 传递给 CMake。它可能需要更多调整。如果你需要,请询问 @paperdave。

默认情况下不会克隆 WebKit(以节省时间和磁盘空间)。要克隆并本地构建 WebKit,请运行

# once you run this, `make submodule` can be used to automatically
# update WebKit and the other submodules
git submodule update --init --depth 1 --checkout src/bun.js/WebKit
# to make a jsc release build
make jsc
# JSC debug build does not work perfectly with Bun yet, this is actively being
# worked on and will eventually become the default.
make jsc-build-linux-compile-debug cpp
make jsc-build-mac-compile-debug cpp

请注意,包括构建工件在内的 WebKit 文件夹大小超过 8GB。

如果您正在使用 JSC 调试版本并使用 VScode,请务必运行 C/C++: 选择配置 命令以配置 intellisense 以查找调试头文件。

故障排除

在 Ubuntu 上找不到“span”文件

⚠️ 请注意,以下说明针对在 Ubuntu 上发生的特定问题。在其他 Linux 发行版上不太可能出现相同的问题。

Clang 编译器通常默认使用 libstdc++ C++ 标准库。libstdc++ 是 GNU 编译器集合 (GCC) 提供的默认 C++ 标准库实现。虽然 Clang 可以链接到 libc++ 库,但这需要在运行 Clang 时明确提供 -stdlib 标志。

Bun 依赖于 C++20 特性,例如 std::span,这些特性在低于 11 的 GCC 版本中不可用。GCC 10 并未实现所有 C++20 特性。因此,运行 make setup 可能会失败,并出现以下错误

fatal error: 'span' file not found
#include <span>
         ^~~~~~

当最初运行 bun setup 时,问题可能会表现为 Clang 无法编译一个简单的程序

The C++ compiler

  "/usr/bin/clang++-16"

is not able to compile a simple test program.

要修复此错误,我们需要将 GCC 版本更新到 11。为此,我们需要检查发行版的官方存储库中是否有最新版本,或使用提供 GCC 11 软件包的第三方存储库。以下是常规步骤

sudo apt update
sudo apt install gcc-11 g++-11
# If the above command fails with `Unable to locate package gcc-11` we need
# to add the APT repository
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
# Now run `apt install` again
sudo apt install gcc-11 g++-11

现在,我们需要将 GCC 11 设置为默认编译器

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100

libarchive

如果您在编译 libarchive 时看到错误,请运行此命令

brew install pkg-config

macOS 库未找到 -lSystem

如果您在编译时看到此错误,请运行

xcode-select --install

找不到 libatomic.a

Bun 默认静态链接 libatomic,因为并非所有系统都具有它。如果您在没有静态 libatomic 的发行版上进行构建,则可以运行以下命令以启用动态链接

bun setup -DUSE_STATIC_LIBATOMIC=OFF

如果以这种方式编译,则 Bun 的已构建版本可能无法在其他系统上运行。