Skip to content

Add an Ubuntu 26.04 build target - #6738

Merged
oitel merged 20 commits into
masterfrom
fedr/ubuntu26-target
Sep 2, 2026
Merged

Add an Ubuntu 26.04 build target#6738
oitel merged 20 commits into
masterfrom
fedr/ubuntu26-target

Conversation

@Fedr

@Fedr Fedr commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Why

Ubuntu 26.04 LTS (Resolute Raccoon) shipped in April 2026 and no CI leg builds for it. The ubuntu24 deb is not a substitute: it installs on 26.04 — Depends is only the unversioned -dev names from requirements/ubuntu.txt, all of which still exist there, so apt is satisfied by the new sonames — and then dies at load time. Measured in a throwaway probe run:

MeshViewer: error while loading shared libraries: libjsoncpp.so.25: cannot open shared object file

24.04 ships libjsoncpp25, 26.04 ships libjsoncpp26. Boost 1.83, OCCT 7.6 and libpython3.12.so.1.0 queue up behind it, and 26.04's default Python is 3.14, so mrmeshpy.so (CPython 3.12 ABI) can never import there either. A separately built package is the only fix.

The image

docker/ubuntu26Dockerfile is ubuntu24Dockerfile with six lines changed — FROM ubuntu:26.04, the two Suites: lines switched to resolute, and one GCC instead of two:

  • GCC 15.2 is Resolute's default (gccgcc-15), so the ppa:ubuntu-toolchain-r/test line is gone — the PPA has no resolute series anyway.
  • The strip --strip-debug .../16/{cc1,cc1plus,lto1} line goes with it.
  • No CLANG_GCC_PIN is needed in build-test-ubuntu-x64.yml: that pin exists because clang takes the newest GCC install dir in the image, which on ubuntu24 is 16 while the deb is built with 13 (CI: pin Clang to GCC 13 when building the Ubuntu 24 bindings #6724). Here the newest and the deb's GCC are both 15, so the existing matrix.os == 'ubuntu24' condition correctly leaves ubuntu26 alone.

Everything else is unchanged and verified to exist on Resolute: libstdc++-15-dev, clang-21, and every entry of requirements/ubuntu.txt I could reasonably doubt (libturbojpeg0-dev, libhpdf-dev, libexpected-dev). The deadsnakes PPA does publish resolute and carries 3.7–3.13, with 3.14 coming from main, so python_versions.txt (3.8–3.14) is fully satisfiable and the multi-python step stays.

CUDA

The NVIDIA repo for ubuntu2604 exists but starts at CUDA 13.3 — there is no cuda-minimal-build-12-6 there, which is what install_apt_cuda.sh hardcoded for every non-2004 distro. It now selects 13-3 for ubuntu2604 via a case. ConfigureCuda.cmake already has a CUDAToolkit_VERSION >= 13 architecture list (75-real 86-real 89-real 120), so this path is anticipated; the leg keeps build_mrcuda: ON. If nvcc 13.3 turns out not to accept GCC 15 as host compiler, the fallback is flipping that one matrix value to OFF.

Matrices

  • minimal (every PR): one leg — ubuntu26 / Release / GCC 15 / CUDA ON / upload_release: ON.
  • full (scheduled, full-ci): the ubuntu24 set minus its second GCC — Clang Release+Debug, GCC 15 Release+Debug.
  • docker-images-linux.json gains ubuntu26/x64, and prepare-images.yml gains the matching disable_ubuntu_x64 exclude the comment there asks for. sync_docker_image_tags.sh and docker_image_source_checksum.sh are data-driven off that file, so the new image is detected as absent and built once.
  • test-distribution.yml installs the new deb in an ubuntu:26.04 container. libstdc++-10-dev (jammy+noble only) and clang-18 don't exist on Resolute, so those two literals became matrix keys — the 22.04 and 24.04 rows keep their current values.

Notes

  • The matrix-builder parity fixtures were regenerated (snapshot + the four goldens where x64 is not disabled); the other four are byte-identical, which cross-checks the regeneration. engine.test.js's copy of the exclude rules is updated to match prepare-images.yml, as its comment requires. Those tests only run in CI on Dependabot PRs and Node isn't installed on my machine, so they are unrun here — the goldens were produced by an independent implementation of the same subset-match semantics, not by the engine itself.
  • One doc sentence in CppSetupGuide.dox / CSetupGuide.dox said "both declare the same dependencies" about the release-vs-release deb mixup; with three targets that becomes "the builds all".
  • Labels: upload-binaries so the deb is published and test-distribution can install it, and the platforms this doesn't touch disabled.

Expected first-run cost

This builds a new Docker image from scratch (~75 min timeout on that job) before the ubuntu26 leg can start.

Ubuntu 26.04 LTS shipped in April 2026 and nothing in CI builds for it, so
a released 24.04 deb is all a Resolute user can install - and it does not
run there: apt is satisfied by the unversioned -dev names in
requirements/ubuntu.txt, then MeshViewer dies on libjsoncpp.so.25 (26.04
ships libjsoncpp26).

docker/ubuntu26Dockerfile is ubuntu24Dockerfile with the suites switched to
resolute and one GCC instead of two: 15.2 is the distro default, so the
ubuntu-toolchain-r PPA and the gcc-16 debug-info strip both go away, and
the bindings need no --gcc-install-dir pin because clang's newest GCC is
now the same one the deb is built with.

The NVIDIA repo for ubuntu2604 starts at CUDA 13.3, so install_apt_cuda.sh
picks that version there; ConfigureCuda.cmake already has the >= 13
architecture list.

The x64 configs get one GCC 15 Release leg (minimal) and the ubuntu24 set
minus the second GCC (full). test-distribution installs the new deb in an
ubuntu:26.04 container; libstdc++-10-dev and clang-18 do not exist on
Resolute, so both become matrix keys.
Fedr and others added 4 commits September 1, 2026 12:11
The ubuntu26 image build died configuring mrbind-pybind11: FindPythonLibsNew
asks FindPythonInterp for >= 3.8 and it settled on the deadsnakes
/usr/bin/python3.8, whose `from distutils import sysconfig` resolves to
Resolute's setuptools in /usr/lib/python3/dist-packages (that directory is on
every Debian python3.x path) and dies with `'type' object is not
subscriptable` on a `tuple[str]` annotation.

Pinning PYTHON_EXECUTABLE to the distro python3 takes the >= 3.10 branch of
pybind11's probe, which uses sysconfig and never imports distutils. Guarded
to Linux non-emscripten so the macOS and wasm paths keep their current
detection.
Remain the file for the MeshInspector CI, delete after updating it.
@oitel oitel changed the title Add an Ubuntu 26.04 x64 build target Add an Ubuntu 26.04 build target Sep 1, 2026
oitel and others added 5 commits September 1, 2026 16:40
Ubuntu 26.04 has a kind of a issue: installing build-essential and
libopenmpi-dev (an indirect dependency of libocct-data-exchange-dev)
results in installing two versions of libstdc++, 15 and 16, which
in turn causes building errors. The most simple solution (explicit
installation of gfortran-15) can be applied to CI but is not suitable
for end users. This change overcomes the libopenmpi-dev installation
by replacing some development packages with runtime ones for end-user
.deb packages.
ubuntu24 and ubuntu26 both remove it after dpkg -i; ubuntu22 left it in
/usr/local/lib/meshlib-thirdparty-lib/.
@oitel
oitel merged commit b23ffb3 into master Sep 2, 2026
16 checks passed
@oitel
oitel deleted the fedr/ubuntu26-target branch September 2, 2026 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants