Add an Ubuntu 26.04 build target - #6738
Merged
Merged
Conversation
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.
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.
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/.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Ubuntu 26.04 LTS (Resolute Raccoon) shipped in April 2026 and no CI leg builds for it. The
ubuntu24deb is not a substitute: it installs on 26.04 —Dependsis only the unversioned-devnames fromrequirements/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:24.04 ships
libjsoncpp25, 26.04 shipslibjsoncpp26. Boost 1.83, OCCT 7.6 andlibpython3.12.so.1.0queue up behind it, and 26.04's default Python is 3.14, somrmeshpy.so(CPython 3.12 ABI) can never import there either. A separately built package is the only fix.The image
docker/ubuntu26Dockerfileisubuntu24Dockerfilewith six lines changed —FROM ubuntu:26.04, the twoSuites:lines switched toresolute, and one GCC instead of two:gcc→gcc-15), so theppa:ubuntu-toolchain-r/testline is gone — the PPA has no resolute series anyway.strip --strip-debug .../16/{cc1,cc1plus,lto1}line goes with it.CLANG_GCC_PINis needed inbuild-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 existingmatrix.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 ofrequirements/ubuntu.txtI 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, sopython_versions.txt(3.8–3.14) is fully satisfiable and the multi-python step stays.CUDA
The NVIDIA repo for
ubuntu2604exists but starts at CUDA 13.3 — there is nocuda-minimal-build-12-6there, which is whatinstall_apt_cuda.shhardcoded for every non-2004 distro. It now selects13-3forubuntu2604via acase.ConfigureCuda.cmakealready has aCUDAToolkit_VERSION >= 13architecture list (75-real 86-real 89-real 120), so this path is anticipated; the leg keepsbuild_mrcuda: ON. If nvcc 13.3 turns out not to accept GCC 15 as host compiler, the fallback is flipping that one matrix value toOFF.Matrices
ubuntu26/ Release / GCC 15 / CUDA ON /upload_release: ON.full-ci): the ubuntu24 set minus its second GCC — Clang Release+Debug, GCC 15 Release+Debug.docker-images-linux.jsongainsubuntu26/x64, andprepare-images.ymlgains the matchingdisable_ubuntu_x64exclude the comment there asks for.sync_docker_image_tags.shanddocker_image_source_checksum.share data-driven off that file, so the new image is detected as absent and built once.test-distribution.ymlinstalls the new deb in anubuntu:26.04container.libstdc++-10-dev(jammy+noble only) andclang-18don't exist on Resolute, so those two literals became matrix keys — the 22.04 and 24.04 rows keep their current values.Notes
engine.test.js's copy of the exclude rules is updated to matchprepare-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.CppSetupGuide.dox/CSetupGuide.doxsaid "both declare the same dependencies" about the release-vs-release deb mixup; with three targets that becomes "the builds all".upload-binariesso the deb is published andtest-distributioncan 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.