Skip to content

Install it on a machine that has nothing, nightly - #11

Merged
tamnd merged 1 commit into
mainfrom
install-clean
Aug 23, 2026
Merged

tamnd merged 1 commit into
mainfrom
install-clean

Conversation

@tamnd

@tamnd tamnd commented Aug 23, 2026

Copy link
Copy Markdown
Owner

The install item on zu-c's scorecard: a clean-machine install test, nightly, in a container holding the language runtime and nothing else.

CI runs on a machine that has everything. The install job this repository already had installs into a prefix and builds cmake/consumer against it, which is worth having and is still not what a user does: the whole thing happens inside a checkout on a runner where every tool is already present, so it cannot tell you whether the install is self-sufficient.

The rows

Image Given Installs by
gcc:15-bookworm cmake find_package(zu-cpp)
debian:13-slim g++, cmake, make find_package(zu-cpp)
debian:13-slim g++ the include path and one -l

The third row is the only honest way to check the claim the README makes for a project that would rather not use CMake, because it is on an image with no CMake on it at all.

Each row installs the wrapper, takes both programs off the README, builds them against the install, runs each in a directory of its own since both write social.zu1 beside themselves, and diffs what they print against the block under them on the page. The C program is in there because it needs nothing out of this repository, which is the point: it says the SDK a user was handed is enough on its own.

The image is checked rather than believed. The day a base image starts shipping a Rust toolchain is the day this job quietly stops being about anything, so the absent list is asserted, and so is the absence of a zu.h, a zu.hpp, a libzu and a pkg-config entry for one.

The half that is usually left out

A job that only ever passes is a job nobody has seen fail. So each row runs again with a piece taken out of the install, after the install rather than out of the source, and the build has to stop:

  • without zu.hpp in the prefix, the compile has to fail
  • without the CMake package in the prefix, find_package has to fail
  • without the engine, the link has to fail

If any of them still worked, the compiler found something on the image and every pass above meant nothing.

Checked

On a Linux box with docker rather than reasoned about. Three rows green, all eight break runs failing, each for the reason it was supposed to:

=== a gcc image, given cmake
installed in cmake mode and ran both programs on the page
  without the header: failed, as it must
  without the package: failed, as it must
  without the sdk: failed, as it must
=== a bare machine, given a compiler and cmake
installed in cmake mode and ran both programs on the page
  without the header: failed, as it must
  without the package: failed, as it must
  without the sdk: failed, as it must
=== a bare machine with no cmake at all
installed in header mode and ran both programs on the page
  without the header: failed, as it must
  without the sdk: failed, as it must

And the header break fails at #include <zu.hpp>, which is the message a user would get.

The engine arrives as an SDK laid out on disk, since there is no release yet, in the layout ZU_ROOT documents and a release archive unpacks to. What that leaves out is the download and the signature, and those arrive on the day the first tag does.

CI runs on a machine that has everything: a compiler, a linker, a CMake
an action put there, a Rust toolchain, and whatever the last job left in
a cache. The install job it already had installs into a prefix and
builds cmake/consumer against it, which is worth having and is still not
what a user does, because the whole thing happens inside a checkout on a
runner where every tool is already present.

So this installs it the way a person with nothing gets it, in a
container holding a compiler and nothing else, every night rather than
on every push, because what breaks an install is usually somebody else's
release and not a commit here.

Three rows. A gcc image given cmake, which is most of the people who
would install this. A bare debian given a compiler and cmake, which is
the row where the absent list means something because every tool on it
had to be named. And a bare debian with no cmake on it at all, which is
the only honest way to check the claim the README makes for a project
that would rather not use CMake: the wrapper is header only, so it needs
the include path and nothing else.

What each row does is install the wrapper, take both programs off the
README, build them against the install, run each in a directory of its
own since both write social.zu1 beside themselves, and diff what they
print against the block under them on the page. The C program is there
because it needs nothing out of this repository, which is the point: it
says the SDK a user was handed is enough on its own.

The image is checked rather than believed. The day a base image starts
shipping a Rust toolchain is the day this job quietly stops being about
anything, so the absent list is asserted, and so is the absence of a
zu.h, a zu.hpp, a libzu and a pkg-config entry for one.

And it is run again with a piece taken out of the install, which is the
half a job like this usually leaves out. A job that only ever passes is
a job nobody has seen fail. Take the header out and the build has to
stop; take the CMake package out and find_package has to stop; take the
engine out and the link has to stop. If any of them still worked, the
compiler found something on the image and every pass meant nothing.

The engine arrives as an SDK laid out on disk, since there is no release
yet, in the layout ZU_ROOT documents and a release archive unpacks to.

Checked on a Linux box with docker: three rows green, and all eight
break runs failing, each for the reason it was supposed to. The header
one fails at "#include <zu.hpp>", which is the message a user would get.
@tamnd
tamnd merged commit 032b1e7 into main Aug 23, 2026
6 of 11 checks passed
@tamnd
tamnd deleted the install-clean branch August 23, 2026 04:47
tamnd added a commit to tamnd/zu that referenced this pull request Aug 23, 2026
tamnd/zu-c#11 installs the kit in a container holding a compiler and
nothing else, nightly, and runs both programs off the README against
what it installed.

Three rows, and the third is the one worth having: a machine with no
CMake on it at all, which is the only honest way to check the claim that
a header-only wrapper needs the include path and nothing else.

Each row runs again with a piece taken out of the install, after the
install rather than out of the source. Without the header the compile
has to fail, without the CMake package find_package has to fail, without
the engine the link has to fail. A build that still worked would be a
build that found something on the image, and every pass would have meant
nothing.

Practice goes 78 to 89 over a denominator of 90. stability is the last
item on the card and it is the one that keeps zu-c off the threshold.
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