# MeshMC Build Guide This document explains how to build MeshMC from source on all supported platforms. ## Table of Contents - [Requirements](#requirements) - [Quick Start (Bootstrap)](#quick-start-bootstrap) - [Dependencies](#dependencies) - [Cloning the Repository](#cloning-the-repository) - [CMake Presets](#cmake-presets) - [Building on Linux](#building-on-linux) - [Building on macOS](#building-on-macos) - [Building on Windows](#building-on-windows) - [Building with Nix](#building-with-nix) - [Building with Container (Podman/Docker)](#building-with-container-podmandocker) - [Running Tests](#running-tests) - [CMake Options](#cmake-options) - [Troubleshooting](#troubleshooting) ## Requirements - **CMake** >= 3.28 - **Ninja** (recommended generator) - **C++ compiler** with C++23 support (GCC >= 13, Clang >= 17, MSVC >= 19.36) - **Qt 6** (Core, Widgets, Concurrent, Network, NetworkAuth, Test, Xml) - **Java Development Kit** (JDK 17) — for building Java launcher components - **Git** — for submodule management ## Quick Start (Bootstrap) The fastest way to get started is to use the bootstrap script. It automatically detects your platform, installs missing dependencies, initializes submodules, and sets up lefthook git hooks. ### Linux / macOS ```bash ../bootstrap.sh ``` Supported distributions: Debian, Ubuntu, Fedora, RHEL/CentOS, openSUSE, Arch Linux, macOS (via Homebrew). ### Windows ```cmd ..\bootstrap.cmd ``` Uses [Scoop](https://scoop.sh) for CLI tools and [vcpkg](https://github.com/microsoft/vcpkg) for C/C++ libraries. ## Dependencies ### Build Dependencies | Dependency | Purpose | pkg-config name | |------------------------|---------------------------------|--------------------| | Qt 6 (Base) | GUI framework | `Qt6Core` | | Qt 6 NetworkAuth | OAuth2 authentication | — | | QuaZip (Qt6) | ZIP archive support | `quazip1-qt6` | | zlib | Compression | `zlib` | | Extra CMake Modules | KDE CMake utilities | `ECM` | | cmark | Markdown rendering | — | | tomlplusplus | TOML parsing | — | | libarchive | Archive extraction | — | | libqrencode | QR code generation | — | | scdoc | Man page generation (optional) | — | ### Distro-Specific Package Names
Debian / Ubuntu ```bash sudo apt-get install \ cmake ninja-build extra-cmake-modules pkg-config \ qt6-base-dev libquazip1-qt6-dev zlib1g-dev \ libcmark-dev libarchive-dev libqrencode-dev libtomlplusplus-dev \ scdoc ```
Fedora ```bash sudo dnf install \ cmake ninja-build extra-cmake-modules pkgconf \ qt6-qtbase-devel quazip-qt6-devel zlib-devel \ cmark-devel libarchive-devel qrencode-devel tomlplusplus-devel \ scdoc ```
Arch Linux ```bash sudo pacman -S --needed \ cmake ninja extra-cmake-modules pkgconf \ qt6-base quazip-qt6 zlib \ cmark libarchive qrencode tomlplusplus \ scdoc ```
openSUSE ```bash sudo zypper install \ cmake ninja extra-cmake-modules pkg-config \ qt6-base-devel quazip-qt6-devel zlib-devel \ cmark-devel libarchive-devel qrencode-devel tomlplusplus-devel \ scdoc ```
macOS (Homebrew) ```bash brew install \ cmake ninja extra-cmake-modules \ qt@6 quazip zlib \ cmark libarchive qrencode tomlplusplus \ scdoc ```
### Developer Tooling (Optional) These are **not required** to build, but are used for development: | Tool | Purpose | |------------|-------------------------------| | npm | Frontend tooling | | Go | Installing lefthook | | lefthook | Git hooks manager | | reuse | REUSE license compliance | | clang-format | Code formatting | | clang-tidy | Static analysis | ## Cloning the Repository MeshMC uses git submodules. Make sure to clone recursively: ```bash git clone --recursive https://github.com/Project-Tick/MeshMC.git cd MeshMC ``` If you already cloned without `--recursive`, initialize submodules manually: ```bash git submodule update --init --recursive ``` ## CMake Presets MeshMC ships a `CMakePresets.json` with pre-configured presets for each platform. All presets use the **Ninja Multi-Config** generator and output to the `build/` directory with install prefix `install/`. ### Configure Presets | Preset | Platform | Notes | |--------------------|---------------------------|--------------------------------------------| | `linux` | Linux | Available only on Linux hosts | | `macos` | macOS | Uses vcpkg toolchain (`$VCPKG_ROOT`) | | `macos_universal` | macOS (Universal Binary) | Builds for both x86_64 and arm64 | | `windows_mingw` | Windows (MinGW) | Available only on Windows hosts | | `windows_msvc` | Windows (MSVC) | Uses vcpkg toolchain (`$VCPKG_ROOT`) | All presets inherit from a hidden `base` preset which sets: - **Generator:** `Ninja Multi-Config` - **Build directory:** `build/` - **Install directory:** `install/` - **LTO:** Enabled by default ### Build Presets Each configure preset has a matching build preset with the same name: | Preset | Configure Preset | |--------------------|--------------------| | `linux` | `linux` | | `macos` | `macos` | | `macos_universal` | `macos_universal` | | `windows_mingw` | `windows_mingw` | | `windows_msvc` | `windows_msvc` | ### Test Presets Test presets share the same names. They are configured with verbose output on failure and exclude example tests. ### Environment Variables Some presets reference environment variables: | Variable | Used By | Purpose | |-------------------|--------------------------------|-----------------------------------| | `VCPKG_ROOT` | `macos`, `macos_universal`, `windows_msvc` | Path to vcpkg installation | | `ARTIFACT_NAME` | All (via `base`) | Updater artifact identifier | | `BUILD_PLATFORM` | All (via `base`) | Platform identifier string | ## Building on Linux ### Configure ```bash cmake --preset linux ``` ### Build ```bash cmake --build --preset linux --config Release ``` For a debug build: ```bash cmake --build --preset linux --config Debug ``` Since the generator is `Ninja Multi-Config`, you can switch between `Debug`, `Release`, `RelWithDebInfo`, and `MinSizeRel` without re-configuring. ### Install ```bash cmake --install build --config Release --prefix /usr/local ``` ### Full One-Liner ```bash cmake --preset linux && cmake --build --preset linux --config Release ``` ## Building on macOS ### Prerequisites Make sure `VCPKG_ROOT` is set: ```bash export VCPKG_ROOT="$HOME/vcpkg" ``` ### Standard Build (Native Architecture) ```bash cmake --preset macos cmake --build --preset macos --config Release ``` ### Universal Binary (x86_64 + arm64) ```bash cmake --preset macos_universal cmake --build --preset macos_universal --config Release ``` This produces a fat binary supporting both Intel and Apple Silicon Macs. ### Install ```bash cmake --install build --config Release ``` ## Building on Windows ### Using MSVC Requires Visual Studio with C++ workload and vcpkg: ```cmd set VCPKG_ROOT=C:\path\to\vcpkg cmake --preset windows_msvc cmake --build --preset windows_msvc --config Release ``` ### Using MinGW ```cmd cmake --preset windows_mingw cmake --build --preset windows_mingw --config Release ``` ### Install ```cmd cmake --install build --config Release ``` ## Building with Nix MeshMC provides a Nix flake for reproducible builds. ### Using the Nix Flake ```bash # Build the package nix build .#meshmc # Enter the development shell nix develop # Inside the dev shell: cd "$cmakeBuildDir" ninjaBuildPhase ninjaInstallPhase ``` ### Without Flakes ```bash nix-build # or nix-shell ``` ### Binary Cache A binary cache is available to speed up builds: ``` https://meshmc.cachix.org ``` The public key is: ``` meshmc.cachix.org-1:6ZNLcfqjVDKmN9/XNWGV3kcjBTL51v1v2V+cvanMkZA= ``` These are already configured in the flake's `nixConfig`. ## Building with Container (Podman/Docker) A `Containerfile` (Debian-based) is provided for CI and reproducible builds. ### Build the Container Image ```bash podman build -t meshmc-build . ``` ### Run a Build Inside the Container ```bash podman run --rm -it -v "$(pwd):/work:z" meshmc-build # Inside the container: git submodule update --init --recursive cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build ``` The container comes with Qt 6.10.2 (installed via `aqtinstall`), Clang, LLD, Ninja, CMake, and all required dependencies pre-installed. ## Running Tests ### Using CTest Presets ```bash # Configure first (if not done) cmake --preset linux # Build including test targets cmake --build --preset linux --config Debug # Run tests ctest --preset linux --build-config Debug ``` ### Running Tests Directly ```bash cd build ctest --output-on-failure ``` ### Available Test Binaries After building, individual test binaries are available in `build/`: - `DownloadTask_test` - `FileSystem_test` - `GradleSpecifier_test` - `GZip_test` - `Index_test` - `INIFile_test` - `JavaVersion_test` - `Library_test` - `ModFolderModel_test` - `MojangVersionFormat_test` - `ParseUtils_test` - `UpdateChecker_test` - `sys_test` ## CMake Options These options can be set during configuration with `-D