Skip to content

Building from Source

Quadstronaut edited this page Jun 7, 2026 · 1 revision

Building from Source

QuadClicker is a monorepo. Each platform lives in its own subdirectory with its own build toolchain.

QuadClicker/
├── windows/   — WPF / C# / .NET 10
├── macos/     — SwiftUI / Swift (Xcode project)
└── linux/     — Qt6 / C++ (CMake + Ninja)

Windows

Requirements:

  • .NET 10 SDK
  • Windows 10 22H2 or later

Build:

dotnet build windows/QuadClicker.csproj -c Release

Run tests:

dotnet test windows/Tests/QuadClicker.Tests.csproj

The test suite covers: ClickRateParserTests, ClickSessionTests, CliArgumentTests, AppSettingsMigrationTests, UpdateCheckerTests, UpdaterTests.

Publish self-contained single-file EXE (matches the release artifact):

dotnet publish windows/QuadClicker.csproj `
  -c Release `
  -r win-x64 `
  --self-contained true `
  -p:PublishSingleFile=true `
  -p:IncludeNativeLibrariesForSelfExtract=true `
  -p:EnableCompressionInSingleFile=true `
  -o artifacts/windows

No .NET runtime is required to run the resulting QuadClicker.exe.


macOS

Status: code-complete, unverified. The Swift source is present but has never been compiled. These instructions are sourced from the project files; they have not been exercised.

Requirements:

  • macOS 13 Ventura or later
  • Xcode 15 or later
  • Apple Developer account (for distribution signing/notarization — see CODE_SIGNING.md)

Open in Xcode:

open macos/QuadClicker.xcodeproj

Command-line build:

xcodebuild -project macos/QuadClicker.xcodeproj \
           -scheme QuadClicker \
           -configuration Release \
           -derivedDataPath artifacts/macos

Run tests:

xcodebuild test -project macos/QuadClicker.xcodeproj \
                -scheme QuadClickerTests \
                -destination 'platform=macOS'

CGEventPost and global hotkeys require Accessibility permission. Grant it in System Settings → Privacy & Security → Accessibility before hotkeys will work.


Linux

Verified on: Ubuntu 24.04 LTS (Qt 6.4.2, GCC 13.3), including WSL2 with WSLg.

Requirements:

  • Qt 6.2 or later
  • CMake 3.20 or later
  • GCC 11+ or Clang 13+
  • libXtst, libXss, libX11 (X11 input injection and hotkeys)
  • libdbus-1 (D-Bus for Wayland idle detection)

Install dependencies (Ubuntu/Debian):

sudo apt install build-essential cmake ninja-build pkg-config \
                 qt6-base-dev qt6-base-dev-tools qt6-tools-dev \
                 libqt6svg6-dev libxtst-dev libxss-dev libx11-dev \
                 libdbus-1-dev

libdbus-1-dev is usually pulled in transitively by qt6-base-dev — CI builds succeed without it. Include it explicitly if your distro packages Qt6 without the D-Bus dependency.

Configure and build:

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release linux/
cmake --build build

Run tests:

ctest --test-dir build --output-on-failure

The test suite covers: ClickRateParserTests, ClickSessionTests, CliArgumentTests.

Install:

sudo cmake --install build

CLI smoke test:

./build/quadclicker --version
./build/quadclicker --rate 100ms --stop-after-clicks 5 --location 800,500

WSL2 / WSLg

WSL2 with WSLg (DISPLAY=:0, WAYLAND_DISPLAY=wayland-0) builds and runs correctly. The GUI renders through XWayland. Note that uinput (Wayland click injection path) is unavailable in WSL — exercise that path on a real Linux desktop session. See Hotkeys-and-Platform-Notes for more on WSLg behavior.

Wayland injection note

On a real Wayland session, click injection uses the uinput kernel interface. This requires /dev/uinput to exist and usually requires membership in the input group or a udev rule:

sudo usermod -aG input $USER
# Log out and back in for the group membership to take effect

Clone this wiki locally