1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
[]
= ["hatchling"]
= "hatchling.build"
[]
= "medius"
= "3.3.0"
= "Python bindings for the medius transparent mouse passthrough box"
= "README.md"
= ">=3.8"
= { = "MIT" }
= [{ = "medius" }]
= ["medius", "mouse", "hid", "serial", "makcu"]
= [
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Rust",
"Topic :: System :: Hardware",
]
[]
= "https://github.com/K4HVH/medius"
[]
= ["pytest"]
[]
= ["medius"]
# The bundled cdylib makes this platform-specific, but ctypes doesn't link the
# CPython ABI; the build hook tags the wheel py3-none-<platform>.
= false
# The cdylib is produced and copied in by the build hook below.
= [
"medius/libmedius_capi.so",
"medius/libmedius_capi.dylib",
"medius/medius_capi.dll",
]
# Global hook so it runs for both the wheel build (cargo + bundle + tag) and the
# sdist build (vendor the Rust sources under _rust/ for a self-contained build).
[]
= "hatch_build.py"
[]
# The build hook vendors the Rust workspace into the sdist under _rust/, so the
# sdist builds with no access to the rest of the repo (and cibuildwheel builds
# from it). These entries are the Python package itself.
= ["medius", "hatch_build.py", "pyproject.toml"]
# --- cibuildwheel ---
# Build from the self-contained sdist. Each wheel bundles its own cdylib, so
# `pip install medius` needs no Rust toolchain. The build hook runs
# `cargo build --release -p medius-capi` from the vendored sources, so the
# before-all step installs Rust into the build environment. Arch is whatever the
# runner is (the CI matrix runs one runner per arch).
[]
# The wheel is tagged py3-none-<platform>, so one interpreter per platform
# produces a wheel that installs on every supported Python 3.x. Build the five
# platforms that mirror the C ABI tarballs: glibc Linux x86_64/aarch64 (manylinux),
# macOS arm64 + x86_64, and 64-bit Windows. musllinux, win32, and 32-bit Linux
# (i686) are skipped (no toolchain set up); those users build from the sdist.
= "cp310-manylinux_* cp310-macosx_* cp310-win_amd64"
= "build"
# The bundled wheel has no mock feature, so only smoke-test the import here; the
# mock-backed pytest suite runs against a debug build in the python CI job.
= "python -c \"import medius; print(medius.abi_version(), medius.version_string())\""
[]
# 64-bit only: cibuildwheel's default Linux archs include i686, which we don't ship.
= "auto64"
# The cdylib links libudev (via serialport); the manylinux container lacks it and
# has no rust (the mac/windows runners already ship rust, so they skip this).
= "(yum install -y systemd-devel pkgconfig || dnf install -y systemd-devel pkgconfig) && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal"
= { = "$HOME/.cargo/bin:$PATH" }
[]
# Both arches: the arm64 runner cross-builds the x86_64 wheel (see hatch_build.py).
= "x86_64 arm64"
# rustc's macOS floor is 10.12 (x86_64) / 11.0 (arm64); cibuildwheel defaults
# x86_64 to 10.9, so the cross-built dylib (>=10.12) and the wheel disagree and
# delocate (which reads this env) rejects it. 11.0 satisfies both arches. This
# MUST be set here, not just in the build hook, so the repair step sees it too.
= { = "11.0" }
# The runner already ships rust; just add the cross target so the arm64 runner
# can also build the x86_64 wheel.
= "rustup target add x86_64-apple-darwin aarch64-apple-darwin"