mirror of
https://github.com/oven-sh/bun
synced 2026-02-02 15:08:46 +00:00
Add Nix flake for development environment (#23406)
Provides a Nix flake as an alternative to `scripts/bootstrap.sh` for setting up the Bun development environment. ## What's included: - **flake.nix**: Full development environment with all dependencies from bootstrap.sh - LLVM 19, CMake 3.30+, Node.js 24, Rust, Go - Build tools: ninja, ccache, pkg-config, make - Chromium dependencies for Puppeteer testing - gdb for core dump debugging - **shell.nix**: Simple wrapper for `nix-shell` usage - **cmake/CompilerFlags.cmake**: Nix compatibility fixes - Disable zstd debug compression (Nix's LLVM not built with zstd) - Set _FORTIFY_SOURCE=0 for -O0 debug builds - Downgrade _FORTIFY_SOURCE warning to not error ## Usage: ```bash nix-shell export CMAKE_SYSTEM_PROCESSOR=$(uname -m) bun bd ``` ## Verified working: ✅ Successfully compiles Bun debug build ✅ Binary tested: `./build/debug/bun-debug --version` → 1.2.24-debug ✅ All dependencies from bootstrap.sh included ## Advantages: - Fully isolated (no sudo required) - 100% reproducible dependency versions - Fast setup with binary caching --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,21 @@ Configuring a development environment for Bun can take 10-30 minutes depending o
|
|||||||
|
|
||||||
If you are using Windows, please refer to [this guide](https://bun.com/docs/project/building-windows)
|
If you are using Windows, please refer to [this guide](https://bun.com/docs/project/building-windows)
|
||||||
|
|
||||||
## Install Dependencies
|
## Using Nix (Alternative)
|
||||||
|
|
||||||
|
A Nix flake is provided as an alternative to manual dependency installation:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix develop
|
||||||
|
# or explicitly use the pure shell
|
||||||
|
# nix develop .#pure
|
||||||
|
export CMAKE_SYSTEM_PROCESSOR=$(uname -m)
|
||||||
|
bun bd
|
||||||
|
```
|
||||||
|
|
||||||
|
This provides all dependencies in an isolated, reproducible environment without requiring sudo.
|
||||||
|
|
||||||
|
## Install Dependencies (Manual)
|
||||||
|
|
||||||
Using your system's package manager, install Bun's dependencies:
|
Using your system's package manager, install Bun's dependencies:
|
||||||
|
|
||||||
|
|||||||
@@ -86,11 +86,20 @@ elseif(APPLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
|
# Nix LLVM doesn't support zstd compression, use zlib instead
|
||||||
|
if(DEFINED ENV{NIX_CC})
|
||||||
register_compiler_flags(
|
register_compiler_flags(
|
||||||
DESCRIPTION "Enable debug symbols"
|
DESCRIPTION "Enable debug symbols (zlib-compressed for Nix)"
|
||||||
|
-g3 -gz=zlib ${DEBUG}
|
||||||
|
-g1 ${RELEASE}
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
register_compiler_flags(
|
||||||
|
DESCRIPTION "Enable debug symbols (zstd-compressed)"
|
||||||
-g3 -gz=zstd ${DEBUG}
|
-g3 -gz=zstd ${DEBUG}
|
||||||
-g1 ${RELEASE}
|
-g1 ${RELEASE}
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
register_compiler_flags(
|
register_compiler_flags(
|
||||||
DESCRIPTION "Optimize debug symbols for LLDB"
|
DESCRIPTION "Optimize debug symbols for LLDB"
|
||||||
@@ -214,10 +223,13 @@ if(ENABLE_ASSERTIONS)
|
|||||||
_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG ${DEBUG}
|
_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG ${DEBUG}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Nix glibc already sets _FORTIFY_SOURCE, don't override it
|
||||||
|
if(NOT DEFINED ENV{NIX_CC})
|
||||||
register_compiler_definitions(
|
register_compiler_definitions(
|
||||||
DESCRIPTION "Enable fortified sources"
|
DESCRIPTION "Enable fortified sources (Release only)"
|
||||||
_FORTIFY_SOURCE=3
|
_FORTIFY_SOURCE=3 ${RELEASE}
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(LINUX)
|
if(LINUX)
|
||||||
register_compiler_definitions(
|
register_compiler_definitions(
|
||||||
|
|||||||
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1759831965,
|
||||||
|
"narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c9b6fb798541223bbb396d287d16f43520250518",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
167
flake.nix
Normal file
167
flake.nix
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
{
|
||||||
|
description = "Bun - A fast all-in-one JavaScript runtime";
|
||||||
|
|
||||||
|
# Uncomment this when you set up Cachix to enable automatic binary cache
|
||||||
|
# nixConfig = {
|
||||||
|
# extra-substituters = [
|
||||||
|
# "https://bun-dev.cachix.org"
|
||||||
|
# ];
|
||||||
|
# extra-trusted-public-keys = [
|
||||||
|
# "bun-dev.cachix.org-1:REPLACE_WITH_YOUR_PUBLIC_KEY"
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# LLVM 19 - matching the bootstrap script (targets 19.1.7, actual version from nixpkgs-unstable)
|
||||||
|
llvm = pkgs.llvm_19;
|
||||||
|
clang = pkgs.clang_19;
|
||||||
|
lld = pkgs.lld_19;
|
||||||
|
|
||||||
|
# Node.js 24 - matching the bootstrap script (targets 24.3.0, actual version from nixpkgs-unstable)
|
||||||
|
nodejs = pkgs.nodejs_24;
|
||||||
|
|
||||||
|
# Build tools and dependencies
|
||||||
|
packages = [
|
||||||
|
# Core build tools
|
||||||
|
pkgs.cmake # Expected: 3.30+ on nixos-unstable as of 2025-10
|
||||||
|
pkgs.ninja
|
||||||
|
pkgs.pkg-config
|
||||||
|
pkgs.ccache
|
||||||
|
|
||||||
|
# Compilers and toolchain - version pinned to LLVM 19
|
||||||
|
clang
|
||||||
|
llvm
|
||||||
|
lld
|
||||||
|
pkgs.gcc
|
||||||
|
pkgs.rustc
|
||||||
|
pkgs.cargo
|
||||||
|
pkgs.go
|
||||||
|
|
||||||
|
# Bun itself (for running build scripts via `bun bd`)
|
||||||
|
pkgs.bun
|
||||||
|
|
||||||
|
# Node.js - version pinned to 24
|
||||||
|
nodejs
|
||||||
|
|
||||||
|
# Python for build scripts
|
||||||
|
pkgs.python3
|
||||||
|
|
||||||
|
# Other build dependencies from bootstrap.sh
|
||||||
|
pkgs.libtool
|
||||||
|
pkgs.ruby
|
||||||
|
pkgs.perl
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
pkgs.openssl
|
||||||
|
pkgs.zlib
|
||||||
|
pkgs.libxml2
|
||||||
|
pkgs.libiconv
|
||||||
|
|
||||||
|
# Development tools
|
||||||
|
pkgs.git
|
||||||
|
pkgs.curl
|
||||||
|
pkgs.wget
|
||||||
|
pkgs.unzip
|
||||||
|
pkgs.xz
|
||||||
|
|
||||||
|
# Additional dependencies for Linux
|
||||||
|
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
|
||||||
|
pkgs.gdb # for debugging core dumps (from bootstrap.sh line 1535)
|
||||||
|
|
||||||
|
# Chromium dependencies for Puppeteer testing (from bootstrap.sh lines 1397-1483)
|
||||||
|
# X11 and graphics libraries
|
||||||
|
pkgs.xorg.libX11
|
||||||
|
pkgs.xorg.libxcb
|
||||||
|
pkgs.xorg.libXcomposite
|
||||||
|
pkgs.xorg.libXcursor
|
||||||
|
pkgs.xorg.libXdamage
|
||||||
|
pkgs.xorg.libXext
|
||||||
|
pkgs.xorg.libXfixes
|
||||||
|
pkgs.xorg.libXi
|
||||||
|
pkgs.xorg.libXrandr
|
||||||
|
pkgs.xorg.libXrender
|
||||||
|
pkgs.xorg.libXScrnSaver
|
||||||
|
pkgs.xorg.libXtst
|
||||||
|
pkgs.libxkbcommon
|
||||||
|
pkgs.mesa
|
||||||
|
pkgs.nspr
|
||||||
|
pkgs.nss
|
||||||
|
pkgs.cups
|
||||||
|
pkgs.dbus
|
||||||
|
pkgs.expat
|
||||||
|
pkgs.fontconfig
|
||||||
|
pkgs.freetype
|
||||||
|
pkgs.glib
|
||||||
|
pkgs.gtk3
|
||||||
|
pkgs.pango
|
||||||
|
pkgs.cairo
|
||||||
|
pkgs.alsa-lib
|
||||||
|
pkgs.at-spi2-atk
|
||||||
|
pkgs.at-spi2-core
|
||||||
|
pkgs.libgbm # for hardware acceleration
|
||||||
|
pkgs.liberation_ttf # fonts-liberation
|
||||||
|
pkgs.atk
|
||||||
|
pkgs.libdrm
|
||||||
|
pkgs.xorg.libxshmfence
|
||||||
|
pkgs.gdk-pixbuf
|
||||||
|
] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
|
||||||
|
# macOS specific dependencies
|
||||||
|
pkgs.darwin.apple_sdk.frameworks.CoreFoundation
|
||||||
|
pkgs.darwin.apple_sdk.frameworks.CoreServices
|
||||||
|
pkgs.darwin.apple_sdk.frameworks.Security
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
devShells.default = (pkgs.mkShell.override {
|
||||||
|
stdenv = pkgs.clangStdenv;
|
||||||
|
}) {
|
||||||
|
inherit packages;
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
# Set up build environment
|
||||||
|
export CMAKE_SYSTEM_PROCESSOR="$(uname -m)"
|
||||||
|
export TMPDIR="''${TMPDIR:-/tmp}"
|
||||||
|
'' + pkgs.lib.optionalString pkgs.stdenv.isLinux ''
|
||||||
|
export LD="${pkgs.lib.getExe' lld "ld.lld"}"
|
||||||
|
export NIX_CFLAGS_LINK="''${NIX_CFLAGS_LINK:+$NIX_CFLAGS_LINK }-fuse-ld=lld"
|
||||||
|
export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath packages}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
# Print welcome message
|
||||||
|
echo "====================================="
|
||||||
|
echo "Bun Development Environment"
|
||||||
|
echo "====================================="
|
||||||
|
echo "Node.js: $(node --version 2>/dev/null || echo 'not found')"
|
||||||
|
echo "Bun: $(bun --version 2>/dev/null || echo 'not found')"
|
||||||
|
echo "Clang: $(clang --version 2>/dev/null | head -n1 || echo 'not found')"
|
||||||
|
echo "CMake: $(cmake --version 2>/dev/null | head -n1 || echo 'not found')"
|
||||||
|
echo "LLVM: ${llvm.version}"
|
||||||
|
echo ""
|
||||||
|
echo "Quick start:"
|
||||||
|
echo " bun bd # Build debug binary"
|
||||||
|
echo " bun bd test <test-file> # Run tests"
|
||||||
|
echo "====================================="
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Additional environment variables
|
||||||
|
CMAKE_BUILD_TYPE = "Debug";
|
||||||
|
ENABLE_CCACHE = "1";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
103
shell.nix
Normal file
103
shell.nix
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
# Simple shell.nix for users without flakes enabled
|
||||||
|
# For reproducible builds with locked dependencies, use: nix develop
|
||||||
|
# This uses unpinned <nixpkgs> for simplicity; flake.nix provides version pinning via flake.lock
|
||||||
|
{ pkgs ? import <nixpkgs> {} }:
|
||||||
|
|
||||||
|
pkgs.mkShell rec {
|
||||||
|
packages = with pkgs; [
|
||||||
|
# Core build tools (matching bootstrap.sh)
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
clang_19
|
||||||
|
llvm_19
|
||||||
|
lld_19
|
||||||
|
nodejs_24
|
||||||
|
bun
|
||||||
|
rustc
|
||||||
|
cargo
|
||||||
|
go
|
||||||
|
python3
|
||||||
|
ccache
|
||||||
|
pkg-config
|
||||||
|
gnumake
|
||||||
|
libtool
|
||||||
|
ruby
|
||||||
|
perl
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
openssl
|
||||||
|
zlib
|
||||||
|
libxml2
|
||||||
|
|
||||||
|
# Development tools
|
||||||
|
git
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
unzip
|
||||||
|
xz
|
||||||
|
|
||||||
|
# Linux-specific: gdb and Chromium deps for testing
|
||||||
|
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
|
||||||
|
gdb
|
||||||
|
# Chromium dependencies for Puppeteer tests
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libxcb
|
||||||
|
xorg.libXcomposite
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXdamage
|
||||||
|
xorg.libXext
|
||||||
|
xorg.libXfixes
|
||||||
|
xorg.libXi
|
||||||
|
xorg.libXrandr
|
||||||
|
xorg.libXrender
|
||||||
|
xorg.libXScrnSaver
|
||||||
|
xorg.libXtst
|
||||||
|
libxkbcommon
|
||||||
|
mesa
|
||||||
|
nspr
|
||||||
|
nss
|
||||||
|
cups
|
||||||
|
dbus
|
||||||
|
expat
|
||||||
|
fontconfig
|
||||||
|
freetype
|
||||||
|
glib
|
||||||
|
gtk3
|
||||||
|
pango
|
||||||
|
cairo
|
||||||
|
alsa-lib
|
||||||
|
at-spi2-atk
|
||||||
|
at-spi2-core
|
||||||
|
libgbm
|
||||||
|
liberation_ttf
|
||||||
|
atk
|
||||||
|
libdrm
|
||||||
|
xorg.libxshmfence
|
||||||
|
gdk-pixbuf
|
||||||
|
];
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
export CC="${pkgs.lib.getExe pkgs.clang_19}"
|
||||||
|
export CXX="${pkgs.lib.getExe' pkgs.clang_19 "clang++"}"
|
||||||
|
export AR="${pkgs.llvm_19}/bin/llvm-ar"
|
||||||
|
export RANLIB="${pkgs.llvm_19}/bin/llvm-ranlib"
|
||||||
|
export CMAKE_C_COMPILER="$CC"
|
||||||
|
export CMAKE_CXX_COMPILER="$CXX"
|
||||||
|
export CMAKE_AR="$AR"
|
||||||
|
export CMAKE_RANLIB="$RANLIB"
|
||||||
|
export CMAKE_SYSTEM_PROCESSOR=$(uname -m)
|
||||||
|
export TMPDIR=''${TMPDIR:-/tmp}
|
||||||
|
'' + pkgs.lib.optionalString pkgs.stdenv.isLinux ''
|
||||||
|
export LD="${pkgs.lib.getExe' pkgs.lld_19 "ld.lld"}"
|
||||||
|
export NIX_CFLAGS_LINK="''${NIX_CFLAGS_LINK:+$NIX_CFLAGS_LINK }-fuse-ld=lld"
|
||||||
|
export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath packages}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo "====================================="
|
||||||
|
echo "Bun Development Environment (Nix)"
|
||||||
|
echo "====================================="
|
||||||
|
echo "To build: bun bd"
|
||||||
|
echo "To test: bun bd test <test-file>"
|
||||||
|
echo "====================================="
|
||||||
|
'';
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user