This guide will walk you through the process of building Waterfox from source code.
- RAM: At least 16GB (32GB recommended)
- Disk Space: At least 40GB free space
- CPU: Modern multi-core processor (8+ cores recommended)
Waterfox can be built on:
- Linux: Ubuntu 22.04 or newer recommended
- macOS: macOS 15 Sonoma (ideally always the latest version)
- Windows: We strongly recommend using WSL2 (Windows Subsystem for Linux) with Ubuntu 24.04 instead of native Windows building
Before starting, understand there are two main build types:
Purpose: Quick iteration, testing, and debugging
- Uses simpler configurations with fewer optimizations
- Faster build times
- Suitable for testing code changes and features
Purpose: Creating optimized, release-quality builds
- Uses aggressive optimizations (LTO, PGO)
- Much slower build times but produces faster executables
- Requires specific toolchain versions
- Uses the same process as our official releases
- Git: For checking out the source code
- Rust: Install via rustup
- Python 3: Required for the build system
# Install build dependencies
sudo apt update
sudo apt install git python3 python3-pip nasm patchelf
# Set up Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env# Install Homebrew if not already installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install dependencies
brew install python3 nasm
# Set up Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env-
Install WSL2 with Ubuntu:
wsl --install ubuntu -
Open the Ubuntu terminal and install dependencies:
sudo apt update sudo apt install git python3 python3-pip nasm # Set up Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env
# Clone the repository
git clone https://github.com/BrowserWorks/Waterfox.git --recursive
cd Waterfox
# If you forgot the --recursive flag when cloning:
git submodule update --initWaterfox uses Mozilla's bootstrap system which automatically downloads toolchain components. This is important to understand:
- The bootstrap system handles downloading compilers and tools
- For development builds, it downloads everything automatically
- For production builds, some components need manual installation
To manually bootstrap dependencies:
# Install browser build dependencies
./mach bootstrap --application-choice=browserFor quick development builds, use the default .mozconfig:
# Start the build
./mach buildThis will:
- Download necessary toolchains via bootstrap
- Build Waterfox with basic optimizations
- Create a development-oriented build
After building, run your development build:
./mach runProduction builds require more setup and time, but produce optimized executables like our official releases.
When building production versions of Waterfox, the LLVM version used by Clang must match the LLVM version used by Rust. This is not optional - mismatched versions will cause build failures during Link Time Optimization (LTO).
Typical error with mismatched versions:
lld: error: Invalid attribute group entry
This happens because:
- LTO requires compatible LLVM IR from both C/C++ (Clang) and Rust code
- Each Rust version is built with a specific LLVM version
- When these don't match, the linker cannot properly optimize across languages
As of this writing:
- Rust 1.82-1.86: Uses LLVM 19, requiring Clang 19
- Rust 1.87+: Will use LLVM 20, requiring Clang 20
This is why we specify exact Clang versions in the production build instructions rather than using system-provided compilers.
For development builds, this alignment isn't necessary because we disable LTO to improve build times.
Production builds require specific LLVM/Clang versions:
# Download Mozilla's Clang 19 (pick appropriate platform)
mkdir -p $HOME/.mozbuild
# For Linux:
curl -L https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.cache.level-3.toolchains.v3.linux64-clang-19.latest/artifacts/public/build/clang.tar.zst -o clang.tar.zst
tar -xvf clang.tar.zst -C $HOME/.mozbuild
# For macOS Intel:
# curl -L https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.cache.level-3.toolchains.v3.macosx64-clang-19.latest/artifacts/public/build/clang.tar.zst -o clang.tar.zst
# tar -xvf clang.tar.zst -C $HOME/.mozbuild
# For macOS ARM:
# curl -L https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.cache.level-3.toolchains.v3.macosx64-aarch64-clang-19.latest/artifacts/public/build/clang.tar.zst -o clang.tar.zst
# tar -xvf clang.tar.zst -C $HOME/.mozbuildLink the configuration for your platform:
# For Linux:
ln -sf .mozconfig-x86_64-pc-linux-gnu .mozconfig
# For macOS Intel:
# ln -sf .mozconfig-x86_64-apple-darwin .mozconfig
# For macOS ARM64:
# ln -sf .mozconfig-aarch64-apple-darwin .mozconfig
# For Windows (in WSL):
# ln -sf .mozconfig-x86_64-pc-windows-msvc .mozconfigDecide if you're building a release or beta version:
# For a stable release build:
export WFX_RELEASE=1
# For a beta/pre-release build:
# export WFX_PRE_RELEASE=1PGO creates faster executables by optimizing based on actual usage patterns. This is a two-stage process:
# Stage 1: Generate instrumented build
export GEN_PGO=1
./mach build
./mach package
# Run profile collection
./mach python build/pgo/profileserver.py --binary ./obj-*/dist/waterfox/waterfox
# Stage 2: Build with collected profile data
./mach clobber
unset GEN_PGO
export USE_PGO=1
./mach build
./mach packageThe final package will be in the obj-*/dist/ directory.
./mach packageWaterfox includes several platform-specific config files:
.mozconfig: Simple version for development builds.mozconfig-x86_64-pc-linux-gnu: Linux x64 production build.mozconfig-x86_64-apple-darwin: macOS Intel production build.mozconfig-aarch64-apple-darwin: macOS ARM64 production build.mozconfig-x86_64-pc-windows-msvc: Windows x64 production build
-
Compiler optimization levels:
- Development:
-Os -w(size optimization) - Production:
-O3 -wwith CPU-specific tuning flags
- Development:
-
Link Time Optimization (LTO):
- Development: Disabled for faster build times
- Production: Enabled with
--enable-lto=full
-
Rust optimization:
- Development: Default level
- Production: Maximum (
RUSTC_OPT_LEVEL=3)
-
Profile-Guided Optimization:
- Development: Not used
- Production: Two-stage process as described above
-
Bootstrap settings:
- Development: Full bootstrap (
--enable-bootstrap) - Production: Partial bootstrap (
--enable-bootstrap=-clang,-sccache)
- Development: Full bootstrap (
-
Mozilla official flags:
- Development: Not set
- Production: Sets
MOZILLA_OFFICIAL=1
To build with multiple language packs:
./mach package-multi-locale --locales ar cs da de el en-GB en-US es-ES es-MX fr hu id it ja ko lt nl nn-NO pl pt-BR pt-PT ru sv-SE th vi zh-CN zh-TWTo set a custom version for display:
echo "My Custom Version" > browser/config/version_display.txtTo enable compiler caching (reduces rebuild times):
cargo install sccache
# Make sure your .mozconfig includes:
# ac_add_options --with-ccache=sccache- Bootstrap failures: Check internet connection and try
./mach bootstrapagain - Out of memory errors: Increase available RAM or reduce parallel jobs
- Rust errors: Run
rustup updateand add required targets - Slow builds: Enable sccache and ensure adequate disk space
- Signature verification failures: Set
MOZ_REQUIRE_SIGNING=0
If you encounter issues not covered here:
- Check our GitHub issues