Skip to content

passagemath-mcqd: Add version 10.8.13 - #4794

Open
luhenry wants to merge 5 commits into
mainfrom
passagemath-mcqd
Open

luhenry wants to merge 5 commits into
mainfrom
passagemath-mcqd

Conversation

@luhenry

@luhenry luhenry commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

Cython wrapper computing the maximum clique of a graph via mcqd. Upstream publishes no riscv64 wheel.

Mirrors build-passagemath-objects.yml's sdist-then-bdist shape, itself replaying upstream's own build/pkgs/sagemath_mcqd/spkg-src.

Differs from upstream

  • Clones gitlab.com/janezkonc/mcqd by pinned commit instead of build/pkgs/mcqd's release tarball - that tarball 404s on every mirror.

Testing

  • calls mcqd() on a minimal duck-typed graph - sagemath-repl/-graphs/-cliquer (the real test extras) are unported

License: Wheel bundles libmcqd (GPL-3.0-or-later); upstream ships no licence text for it or for the package's own GPL-2.0-or-later code, so the build adds both.

Patches

  • 0001-add-the-package-s-own-licence-file.patch - To upstream [not yet submitted]. passagemath-mcqd ships no LICENSE for its own declared licence; reproduces off riscv64.
  • 0002-add-the-vendored-mcqd-library-s-licence-text.patch - Inappropriate [dependency fetched at build time, not in upstream's sdist]. Nothing else carries mcqd's own licence text; reproduces off riscv64.

Split out of the passagemath/passagemath monorepo (a SageMath fork) at
pkgs/sagemath-mcqd, tagged passagemath-10.8.13, same shape as
build-passagemath-objects.yml. Vendors mcqd (GPL-3.0-or-later), a tiny
max-clique C++ library with no release tarball; build/pkgs/mcqd's own
checksums.ini pin (mcqd-1.0.p0.tar.bz2) 404s on every mirror tried, so
the build instead clones gitlab.com/janezkonc/mcqd and pins its one
real commit (9ab9717), verified against the pin before every build and
in a dedicated gpl_sources job that archives the source for the release.

The sdist is built by replaying build/pkgs/sagemath_mcqd/spkg-src
(./bootstrap renders pyproject.toml.m4, then python -m build --sdist
--no-isolation --skip-dependency-check against the real upstream
checkout). CIBW_BEFORE_ALL_LINUX replays build/pkgs/mcqd/spkg-install.in:
strip mcqd.h's verbose debug print, compile libmcqd.so, install it and
the header where the compiler already looks.

Neither passagemath-mcqd nor passagemath-objects ships a LICENSE file
for its own GPL-2.0-or-later code (0001, same gap/fix as objects); mcqd
itself is GPL-3.0-or-later and is fetched at build time rather than
vendored in the sdist, so nothing carries its licence text either
(0002, drops its COPYING as LICENSE.mcqd).

sagemath-repl/-graphs/-cliquer (the real test extras) are unported, so
CIBW_TEST_COMMAND calls mcqd() on a minimal duck-typed graph instead.
- sage_setup's recursive Cython-module discovery requires an
  all__sagemath_mcqd.py marker in EVERY package directory it walks
  (sage_setup.find.find_python_sources / is_package_or_sage_namespace_package_dir),
  not just at the sage/ root; without one in sage/graphs/ it silently
  found zero Cython modules and built a pure-Python wheel. Added it to
  the sparse-checkout (confirmed present at that exact path in the real
  published sdist on PyPI).
- ./bootstrap's own per-package pyproject.toml.m4 render runs through
  sage-package's xargs-parallelised, ~650-package sweep, which aborts a
  whole batch of 8 if any member fails; sage_conf's own bootstrap always
  fails on this sparse checkout (needs the top-level configure.ac), and
  landed in the same batch as sagemath_mcqd, so pyproject.toml was never
  written and the sdist built as an unnamed 'unknown-0.0.0'. Render this
  one package's pyproject.toml.m4 directly instead of trusting that sweep.
- musllinux (Alpine) has no /usr/lib64; g++ -shared failed outright
  ('cannot open output file'). Pick whichever of /usr/lib64 or /usr/lib
  actually exists, and don't hard-fail if ldconfig isn't present.
The build log's final link line for mcqd.abi3.so carries no "-lmcqd"
at all: mcqd.h's max-clique algorithm is template/header-only, so the
Cython extension compiles it straight in and never links the
libmcqd.so that CIBW_BEFORE_ALL_LINUX builds (that step only replays
spkg-install.in; nothing in the wheel actually depends on its
output). auditwheel therefore has nothing to vendor on manylinux, and
the post-build check's
`libs = [...]; assert any("mcqd" in n for n in libs)` fails because
passagemath_mcqd.libs/ never exists there.

The same check happened to pass on musllinux, but not because mcqd
was vendored: musllinux's auditwheel policy (unlike manylinux's)
doesn't allowlist libstdc++/libgcc_s, so it vendors the C++ runtime
into that same-named directory regardless (gotcha 409) - and
"passagemath_mcqd.libs/libstdc++-*.so.6" matches `"mcqd" in n` purely
because the directory name contains the package name. The check was
never actually exercising mcqd's own vendoring at all.

Drop it; the extension-exists and licence-text assertions already
cover what the licence actually requires for a dependency that is
compiled straight into the extension rather than linked.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant