Skip to content

Releases: mcpp-community/mcpp-plugins

0.5.2 — a namespace segment is derived by path arithmetic

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 08 Sep 17:31
45a0443

The island fixture, run on windows-2022 for the first time, failed to compile with no member named 'image' in namespace 'island_interface::kernels'. The same fixture passes on Linux and macOS.

namespace_of trimmed the base directory off a file's directory as a string. On Windows the two spellings differ even when the paths are the same: a caller states a root with forward slashes, directory_iterator appends with the preferred separator, so the leftover was \image rather than image. Iterating that yields the root directory as its first component, the sanitiser turns it into _, and the entry point landed in island_interface::kernels::_::image.

lexically_relative compares components, so the separator a caller happened to write is not part of the question.

The shader lane had this too. namespace_of is shared by both lanes since 0.5.0, and rules-spirv's Windows fixture keeps every payload in one directory, so a namespace segment was never derived there.

The island fixture now builds and asserts its namespaces on macOS and Windows as well as Linux, and a step asserts that the derivation exists once so that run keeps protecting both lanes.

The floor does not move: mcpp 2026.9.8.1.

0.5.1 — roots that overlap are refused

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 08 Sep 16:49
a402220

Completes the design record 0.5.0 implements.

Overlapping roots are refused. roots = { "src/kernels", "src" } was accepted: a file reachable from both has two namespace paths, and which one it got depended on the order of the list. It was also read twice and merged with itself, so the entry looked like two implementations agreeing rather than one file counted twice. A misconfiguration that produces a plausible result is worse than one that stops.

A file root globs nothing beside it. The re-run glob was registered from a root's base directory, which for a single-file root is that file's parent, so an unrelated file beside it became an input to the build program. The glob is now registered only for a directory root, and a root that is the package root itself no longer produces a ./**/* pattern.

The floor does not move: mcpp 2026.9.8.1.

0.5.0 — an island's entry points arrive in the module's own namespace

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 08 Sep 16:19
992a1b4

docs/42 states one rule for both lanes: the module name and the namespace are one identifier path. The shader lane followed it; mcpp.tools.island did not, and emitted every entry point at global scope, so import app.kernels bought a file name and nothing else.

The names

A root's directories extend the namespace exactly as a payload tree's do:

src/backends/cuda/image/blur.cu   myapp_blur   ->  myapp::kernels::image::myapp_blur
src/backends/cuda/saxpy.cu        myapp_saxpy  ->  myapp::kernels::myapp_saxpy

One import, one flat header. The header keeps no namespace: it is read by a C or a device compiler.

The check that makes them honest

A namespace over a flat symbol is a lookup alias. Measured with clang++ (DPC++ 7.1.0), -std=c++23: two modules re-exporting one extern "C" name into two namespaces give two spellings of one entity, &a::f == &b::f. So one name declared twice in one root is refused, naming both files and saying that two implementations of one entry point belong in two roots.

Roots, not a file list

options::roots names the directories implementations live under; options::layout_root names the one whose structure decides where entry points live and defaults to the first. Every other root only has to define the same names, so a fallback tree may be one flat file and may be reorganised without renaming anything a consumer wrote.

A file list's common ancestor moves when a file is added. Roots must also not come from mcpp::device_sources(), which accel narrows to nothing under --no-accel.

scan registers every file it reads and each root as a glob, so adding a file re-runs the build program.

options::strip_prefix

Emits a short spelling beside the authored name, which stays canonical. A constexpr function pointer costs the artifact nothing: the pair is one symbol.

One sanitiser

common_base_dir and namespace_of had been written in rules/spirv.cppm and again in rules/slang.cppm. They move to mcpp::plugins::names with the identifier sanitiser, so a directory named default or 2d gets one answer.

Compatibility

Breaking. A consumer writes app::kernels::saxpy_device(...) where it wrote saxpy_device(...). The floor does not move: this changes what the package generates, not what it asks the engine for. Requires mcpp 2026.9.8.1.

mcpp:plugins 0.2.1

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 06 Sep 05:10
d5a2ae3

rules-sycl names the C library. See the PR for the measurement.

mcpp:plugins 0.2.0

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 05 Sep 22:40
56d9da2

Two new rule packages and a route that had no payload behind it.

mcpp.rules.sycl (feature rules-sycl, mcpp >= 2026.9.6.1) drives the
xim:dpcpp payload over .sycl translation units. It submits one compile
action per source and one that consumes their outputs, because a SYCL object
carries its device image and nothing registers it until -fsycl-link emits a
wrapper.

mcpp.rules.hip (feature rules-hip, mcpp >= 2026.9.5.2) compiles .hip
units on the NVIDIA platform, where HIP is a header layer over the CUDA
runtime: the compiler is the project's own clang and there is no ROCm on the
machine. The AMD platform is refused by name with the reason.

mcpp.rules.spirv gains the glslc route. Its own source used to say the route
was unsupported "because nothing in this ecosystem publishes it, and a route
with no payload behind it is a claim rather than a feature". xim:shaderc now
publishes one.

Measured on an RTX 4080: both new lanes answer 12 24 36 48 on the device and
again under --no-accel, with no host C++ standard library on any device
compile.

mcpp:plugins 0.1.1

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 05 Sep 17:22
f1bec00

The first member of the tools half, mcpp.tools.embed, which writes a data file into a header the program compiles in. It is selected by the feature tools-embed and needs mcpp 2026.9.5.4, whose fast path compares a declared file input.

The rule sources also lose the decorative markers the rest of the project removed.

0.1.0

Choose a tag to compare

@Sunrisepeak Sunrisepeak released this 05 Sep 12:42
be6d7ce

The official mcpp build plugin collection, selected by features: mcpp.rules.cuda (feature rules-cuda, mcpp >= 2026.9.5.2) and mcpp.rules.spirv (feature rules-spirv, mcpp >= 2026.9.5.3). The index descriptor names this tag's source archive; the same bytes are mirrored to gitcode.com/mcpp-res/mcpp-plugins.