Skip to content

feat(compat.sycl-runtime): the OpenCL adapter the payload ships is served - #378

Merged
Sunrisepeak merged 1 commit into
mainfrom
feat/sycl-serves-the-opencl-adapter
Sep 9, 2026
Merged

feat(compat.sycl-runtime): the OpenCL adapter the payload ships is served#378
Sunrisepeak merged 1 commit into
mainfrom
feat/sycl-serves-the-opencl-adapter

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

Follow-up to #375, and a reversal of one decision it made.

What changed

compat:sycl-runtime declares compat:opencl, so libur_adapter_opencl.so.0 can load. #375 declared the opposite — that the package does not serve libOpenCL.so.1 — and that decision was made from a real measurement and was still wrong.

Why #375 declined it

Declaring the edge made the farm test pass with every member loading, and it also passed with libnvidia-ml.so.1 removed from the farm. compat:opencl depends on compat:opencl-runtime, whose farm mirrors the host's NVIDIA OpenCL family and therefore carries NVML, so the new dependency was satisfying the need the rest of that change exists to satisfy. The criterion could no longer fail, so the edge was withdrawn.

Why that reason expired

The masking was a property of a criterion that measured the process. tests/farm.cpp was rewritten in #375 — because of that very measurement — to read each member's DT_NEEDED against the farm alone. Once nothing on the search path can answer for the farm, the only objection left was the size of the surface, and a back end whose adapter the payload ships is not something a runtime adapter should leave permanently unreachable.

Measured with the edge declared:

members: 26 / walked: 26 → PASSED
note libur_adapter_opencl.so.0 needs libOpenCL.so.1, which a declared dependency of this package provides

and with NVML removed from the farm, on the same build:

FAIL libur_adapter_cuda.so.0 needs libnvidia-ml.so.1, which the farm does not carry → FAILED

The decision is reversible precisely because the criterion is no longer maskable.

The name stays in the test, with a different meaning

libOpenCL.so.1 is still listed — not as "this package does not serve it" but as "a declared dependency of this package provides it". mcpp deploys compat:opencl's shared library beside the consumer's executable and $ORIGIN finds it there. Everything not on that short list must be in the farm, which is what keeps the self-sufficiency assertion exact without reopening the process to answer for it.

Ecosystem note

mcpp's OpenCL support itself is unaffected and was measured on the same host through tests/examples/opencl: platform: NVIDIA CUDA (1 device(s)) / device: NVIDIA GeForce RTX 4080. The one stated gap there is Windows, where drivers are enumerated through the registry and this index does not model it yet.

…rved

The package declared it did not serve `libOpenCL.so.1`, and that decision was
made from a real measurement and was still wrong.

WHAT THE MEASUREMENT SAID. Declaring `compat:opencl` made the farm test pass
with every member loading -- and pass with `libnvidia-ml.so.1` REMOVED from the
farm. `compat:opencl` depends on `compat:opencl-runtime`, whose farm mirrors the
host's NVIDIA OpenCL family and therefore carries NVML, so the new dependency
was satisfying the need the rest of this change exists to satisfy, and the
criterion could no longer fail.

WHY THAT REASON EXPIRED. The masking was a property of a criterion that measured
the PROCESS. `tests/farm.cpp` was rewritten -- because of that very measurement
-- to read each member's DT_NEEDED against the farm alone. Once nothing on the
search path can answer for the farm, the only objection left was the size of the
surface, and a back end whose adapter the payload ships is not something a
runtime adapter should leave permanently unreachable.

Measured with the edge declared: the farm test passes, and with NVML removed it
still fails naming `libur_adapter_cuda.so.0`. The decision is reversible because
the criterion is no longer maskable.

`libOpenCL.so.1` stays named in the test with its meaning changed: not "this
package does not serve it" but "a declared dependency of this package provides
it". mcpp deploys `compat:opencl`'s shared library beside the consumer's
executable and `$ORIGIN` finds it there. Everything not on that short list must
be in the farm, which is what keeps the self-sufficiency assertion exact without
reopening the process to answer for it.
@Sunrisepeak
Sunrisepeak merged commit a589ca1 into main Sep 9, 2026
14 checks passed
Sunrisepeak pushed a commit to mcpp-community/mcpp that referenced this pull request Sep 9, 2026
R7 -- serving `libOpenCL.so.1` to the OpenCL adapter the SYCL payload ships --
was asserted by nothing. It was printed as a note, and a note does not fail: the
first run against the released 2026.9.10.2 passed while printing
`libur_adapter_opencl.so.0 needs libOpenCL.so.1`, which is R7 not working.

It was not working in that sandbox because the sandbox held an mcpp-index copy
from before mcpplibs/mcpp-index#378, whose `compat.sycl-runtime` read
`deps = {}`. The host reported no such finding for an unrelated reason: its own
`compat:opencl-runtime` farm mirrors a machine that has an ICD loader
installed, so the host could not tell R7 working from R7 being unnecessary
there. After `mcpp index update` in the sandbox the surface grows from 15
members to 37 and the finding is gone.

Section D now asserts a named set of two sonames and prints its size, refuted
against the record the earlier run published. The eleven remaining findings are
attributed to mcpplibs/mcpp-index#376 in the output rather than absorbed, and
the note text no longer carries a parenthetical from a draft that was reversed.

Recorded in section 8.7 of the design record.
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