+ notes: '2 Linux wheels upstream (abi: py3); no riscv64 on PyPI or pypi.riseproject.dev. FEASIBLE and ported - PR https://github.com/riseproject-dev/python-wheels/pull/2180 open (draft, branch squawk-cli). Not a vendored-prebuilt-binary case (gotcha 35/524/529): this is gotcha 117''s third shape, a maturin `bindings = "bin"` project compiled from source. The released manylinux_2_28_x86_64 wheel holds exactly four entries - METADATA, WHEEL (Generator: maturin (1.7.1)), RECORD and a 21.6 MB squawk_cli-2.63.0.data/scripts/squawk - no .so, no importable module, so the py3-none-<platform> tag is real and there is no interpreter matrix on the build job. Upstream publishes a complete sdist (1,105 files, root Cargo.toml + Cargo.lock + 13 workspace crates), and in the git checkout the pyproject.toml lives at crates/squawk/pyproject.toml (maturin sdist hoists it to the root and adds manifest-path), so the build uses maturin-action''s working-directory: crates/squawk rather than taplo''s write-a-pyproject step. Feasibility evidence on this x86_64 host: `cargo metadata --filter-platform riscv64gc-unknown-linux-gnu --locked` resolves 306 packages; only 34 have build scripts and openssl-sys is the single one with a `links` key - no bindgen, no clang-sys, no ring/aws-lc, and no build.rs anywhere in the squawk workspace itself; `cargo check --locked --target riscv64gc-unknown-linux-gnu` over squawk-parser/-syntax/-linter/-ide/-fmt/-lexer/-line-index/-thread/-server (everything except the reqwest-using squawk-github) is clean in 24 s. The one native piece is the vendored OpenSSL that reqwest''s native-tls-vendored feature pulls in: openssl-src 300.5.2+3.5.2 maps riscv64gc-unknown-linux-gnu to linux64-riscv64 in its own target table, and a cross attempt got as far as ''Configuring OpenSSL version 3.5.2 for target linux64-riscv64'' before dying only on this host''s missing riscv64-linux-gnu-gcc, which the native riscv64 runner supplies. Rust side is fine too: rust-toolchain.toml pins stable 1.94 (not nightly, so gotcha 238 does not bite) and rust-1.94.0-riscv64gc-unknown-linux-gnu.tar.gz exists. Workflow mirrors the `linux` job of upstream''s python.yml with three deliberate deviations. (1) maturin-version deliberately left unset: upstream pins v1.7.1 and maturin-riscv64gc-unknown-linux-gnu.tar.gz 404s for that tag (1.9.5 is 200), i.e. exactly gotcha 344''s gzip: stdin: not in gzip format failure; the pyproject''s own requires is the range maturin>=1.7,<2.0, which findReleaseFromManifest resolves against the live release list, so no explicit override is needed. (2) before-script-linux installs perl-core instead of upstream''s yum perl-IPC-Cmd, per gotcha 46 - Rocky 10 also lacks FindBin, which OpenSSL''s Configure needs - alongside the usual git safe.directory line. (3) upstream''s clang/llvm/llvm-devel and `python3 -m ensurepip` are dropped, since nothing in the riscv64 graph binds C headers and a bin wheel needs no pip in the container. timeout-minutes 1440 per gotcha 365 (tokio + hyper + h2 + vendored OpenSSL + an LSP server is the exact shape that stalled there). No patches; license is Apache-2.0 OR MIT with LICENSE-APACHE/LICENSE-MIT at the upstream root and nothing third-party vendored into the binary beyond statically-linked OpenSSL. Testing: upstream packages no wheel-level suite (its Rust/insta tests are not in the wheel) and the wheel carries no importable module, so there is no `python -m squawk` (gotchas 187/224); the test job drives the installed console script instead - --version, --help, upload-to-github --help (the subcommand behind the OpenSSL dependency), an ELF check, a clean file exiting 0, an ALTER TABLE ... ADD COLUMN ... NOT NULL migration exiting 1 with 5 rules, and --exclude removing exactly prefer-bigint-over-int from the JSON reporter. Worth knowing: squawk exits 1 on violations under EVERY reporter including --reporter json, so each lint call needs `|| rc=$?` under set -e. That whole test step was extracted from the YAML and run byte-for-byte against upstream''s own published 2.63.0 x86_64 binary on this host before pushing (exit 0). No docker daemon in this session, so no QEMU rehearsal of the riscv64 build itself - the real runner is the first end-to-end proof. CI: not yet concluded at the time of this note.'
0 commit comments