diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b5ff50b2d4..487e0d4888 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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) -## 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: diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake index 9f97e31dc1..b9ae804f06 100644 --- a/cmake/CompilerFlags.cmake +++ b/cmake/CompilerFlags.cmake @@ -86,11 +86,20 @@ elseif(APPLE) endif() if(UNIX) - register_compiler_flags( - DESCRIPTION "Enable debug symbols" - -g3 -gz=zstd ${DEBUG} - -g1 ${RELEASE} - ) + # Nix LLVM doesn't support zstd compression, use zlib instead + if(DEFINED ENV{NIX_CC}) + register_compiler_flags( + 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} + -g1 ${RELEASE} + ) + endif() register_compiler_flags( DESCRIPTION "Optimize debug symbols for LLDB" @@ -214,10 +223,13 @@ if(ENABLE_ASSERTIONS) _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG ${DEBUG} ) - register_compiler_definitions( - DESCRIPTION "Enable fortified sources" - _FORTIFY_SOURCE=3 - ) + # Nix glibc already sets _FORTIFY_SOURCE, don't override it + if(NOT DEFINED ENV{NIX_CC}) + register_compiler_definitions( + DESCRIPTION "Enable fortified sources (Release only)" + _FORTIFY_SOURCE=3 ${RELEASE} + ) + endif() if(LINUX) register_compiler_definitions( diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..31fe637959 --- /dev/null +++ b/flake.lock @@ -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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..8b230d50d6 --- /dev/null +++ b/flake.nix @@ -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 # Run tests" + echo "=====================================" + ''; + + # Additional environment variables + CMAKE_BUILD_TYPE = "Debug"; + ENABLE_CCACHE = "1"; + }; + } + ); +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000000..571c66d176 --- /dev/null +++ b/shell.nix @@ -0,0 +1,103 @@ +# Simple shell.nix for users without flakes enabled +# For reproducible builds with locked dependencies, use: nix develop +# This uses unpinned for simplicity; flake.nix provides version pinning via flake.lock +{ pkgs ? import {} }: + +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 " + echo "=====================================" + ''; +}