项目文件夹

文件
wehub-resource-sync 91e75e620b
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:19 +08:00

96 行
4.1 KiB
Nix

# Builds cua-driver (Rust MCP server binary) for Linux.
#
# The cua-driver binary speaks MCP JSON-RPC 2.0 over stdio and provides
# 40+ tools for screen capture, mouse/keyboard input, window management,
# and accessibility-based element interaction.
#
# Usage:
# cuaDriver = import ./package.nix { inherit pkgs; src = ./../../libs/cua-driver/rust; };
#
{
pkgs,
src,
...
}:
pkgs.rustPlatform.buildRustPackage {
pname = "cua-driver";
# Read the version from the single source of truth (the workspace manifest
# bumpversion edits) so it can never drift from Cargo.toml the way a
# hardcoded literal silently did across 0.5.3 -> 0.5.6.
version = (pkgs.lib.importTOML "${src}/Cargo.toml").workspace.package.version;
inherit src;
# Vendor straight from the committed Cargo.lock instead of a manual cargoHash.
# `importCargoLock` derives every dependency's fixed-output hash from the
# lockfile itself, so there is NO hash to hand-maintain: Cargo.lock can change
# (a version bump, a dependency update) and the build keeps working. The old
# cargoHash approach hashed the vendored lockfile, so any Cargo.lock change —
# even a workspace-version bump the release bump leaves behind — silently
# invalidated it and turned every nix job red until someone recomputed it.
# Every dependency here is a crates.io registry crate (the macOS-only
# apple-cf/apple-metal/objc2 crates included) and there are zero git deps, so
# importCargoLock needs no `outputHashes` overrides.
cargoLock.lockFile = "${src}/Cargo.lock";
# Build only the main binary crate. The workspace also contains
# platform-macos, platform-windows, and cua-driver-uia
# which are gated behind cfg(target_os) and won't compile on Linux.
# Using -p cua-driver ensures Cargo only resolves Linux dependencies.
#
# Enable both portal capabilities so the Nix build pulls the GNOME/KDE
# portal stack (PipeWire ScreenCast per-window capture + libei
# RemoteDesktop input). nixpkgs provides a recent enough
# PipeWire (>= 0.3.40 needed by libspa-sys) and libei, so this feature
# builds fine here. Release builds enable portal input as well; keeping
# capture explicit here validates both halves of the split feature contract.
cargoBuildFlags = [ "-p" "cua-driver" "--features" "portal-input,portal-capture" ];
cargoTestFlags = [ "-p" "cua-driver" "--features" "portal-input,portal-capture" ];
# Mostly pure Rust:
# x11rb -> RustConnection (no libxcb C binding)
# ureq -> rustls (no openssl)
# tiny-skia -> pure Rust 2D graphics
# ring -> compiles own C/asm via stdenv's cc
# The `x11` crate (raw Xlib FFI for MPX multi-cursor drags) needs
# libX11/libXi/libXtst via pkg-config. The Wayland-parity work
# (round 2/3 — wayland::portal_screencast / wayland::libei) adds:
# pipewire 0.8 -> needs libpipewire-0.3 + libspa headers via pkg-config
# + bindgen (clang) for SPA pod generation
# reis 0.7 -> pure Rust libei binding, but the workspace pulls
# libei-dev transitively through ashpd's tokio feature
nativeBuildInputs = with pkgs; [
pkg-config
# bindgen needs a libclang at build time for the libpipewire / libspa
# SPA pod codegen. rust-bindgen also picks up `stdbool.h` etc. from
# clang's resource dir, not glibc.
rustPlatform.bindgenHook
];
buildInputs = with pkgs; [
libx11
libxi
libxtst
libxext
# Wayland-parity additions: PipeWire is needed by the portal
# ScreenCast capture path (wayland::portal_screencast). pipewire
# already pulls libspa transitively in nixpkgs.
pipewire
# libei via reis — same as the ashpd RemoteDesktop+EIS flow.
libei
# reis links its keyboard support directly against libxkbcommon.
libxkbcommon
];
# Skip tests that require a running X11 display or AT-SPI bus
doCheck = false;
meta = with pkgs.lib; {
description = "Cross-platform MCP server for computer-use automation";
homepage = "https://github.com/trycua/cua";
license = licenses.mit;
mainProgram = "cua-driver";
platforms = platforms.linux;
};
}