Skip to content

a per-target declaration that stays falsifiable - #454

Merged
Sunrisepeak merged 2 commits into
mainfrom
a-declared-absence-that-stays-falsifiable
Sep 20, 2026
Merged

Sunrisepeak merged 2 commits into
mainfrom
a-declared-absence-that-stays-falsifiable

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

[excluded] is whole-member, and some members are neither measured-and-broken
nor excludable. cmp-module RUNS on x86_64-windows-gnu and cannot build on
x86_64-linux-gnu: asio's detail/config.hpp:899 includes
<linux/version.h> whenever __linux__ is defined, OUTSIDE every
ASIO_DISABLE_* guard, so no configuration macro prevents it. openkal runs on
the Linux kernel, so __linux__ is correct; the uapi headers glibc's
userspace installs beside it are not part of what openkal presents. Excluding
the member outright would discard a result that is true in order to hide one
that is also true.

[not-portable.<member>] declares one target of one member, with the reason
and the evidence.

THE BAR IS THAT NO MANIFEST KEY REACHES IT. Upstream source asking in the
preprocessor qualifies. A generated configuration header this index writes
does not: curl's linux/tcp.h is #define HAVE_LINUX_TCP_H 1 inside
#if defined(__linux__) in pkgs/c/compat.curl.lua, which reads a correct
fact about the kernel as a claim about which userspace headers are installed.
That is a recipe defect, the same shape as expat's arc4random_buf, and it
belongs in the recipe. The two were one item in the plan; they are not one
thing.

THE DECLARATION STAYS FALSIFIABLE. The cell is measured anyway and
compat.py check FAILS when a declared cell builds:

contradicted declaration: cmp-module on x86_64-linux-gnu:
  declared not-portable and recorded runs -- remove the declaration

Measured both ways before it was committed: red on a synthetic result
recording runs, green on one recording fails. A declaration that removes a
cell from the figure on the strength of a sentence, and that nothing can
contradict, is a permanent excuse; the cost of keeping it honest is a build
that was already being paid for.

selftest gains three legs pinning that the table is read per (member,
target) and not per member --- reading it per member is exactly the mistake
that would take cmp-module's working Windows cell out of the figure.

`[excluded]` is whole-member, and some members are neither measured-and-broken
nor excludable. `cmp-module` RUNS on `x86_64-windows-gnu` and cannot build on
`x86_64-linux-gnu`: asio's `detail/config.hpp:899` includes
`<linux/version.h>` whenever `__linux__` is defined, OUTSIDE every
`ASIO_DISABLE_*` guard, so no configuration macro prevents it. openkal runs on
the Linux kernel, so `__linux__` is correct; the uapi headers glibc's
userspace installs beside it are not part of what openkal presents. Excluding
the member outright would discard a result that is true in order to hide one
that is also true.

`[not-portable.<member>]` declares one target of one member, with the reason
and the evidence.

THE BAR IS THAT NO MANIFEST KEY REACHES IT. Upstream source asking in the
preprocessor qualifies. A generated configuration header this index writes
does not: `curl`'s `linux/tcp.h` is `#define HAVE_LINUX_TCP_H 1` inside
`#if defined(__linux__)` in `pkgs/c/compat.curl.lua`, which reads a correct
fact about the kernel as a claim about which userspace headers are installed.
That is a recipe defect, the same shape as expat's `arc4random_buf`, and it
belongs in the recipe. The two were one item in the plan; they are not one
thing.

THE DECLARATION STAYS FALSIFIABLE. The cell is measured anyway and
`compat.py check` FAILS when a declared cell builds:

    contradicted declaration: cmp-module on x86_64-linux-gnu:
      declared not-portable and recorded runs -- remove the declaration

Measured both ways before it was committed: red on a synthetic result
recording `runs`, green on one recording `fails`. A declaration that removes a
cell from the figure on the strength of a sentence, and that nothing can
contradict, is a permanent excuse; the cost of keeping it honest is a build
that was already being paid for.

`selftest` gains three legs pinning that the table is read per (member,
target) and not per member --- reading it per member is exactly the mistake
that would take `cmp-module`'s working Windows cell out of the figure.
…bility

Both are recipe defects.

  linux    `#define HAVE_LINUX_TCP_H 1` inside `#if defined(__linux__)`.
           The kernel IS Linux, so the predicate is right; reading it as
           "glibc's userspace headers are installed" is not. The honest test
           is `__has_include(<linux/tcp.h>)`. The same block also asserts
           `HAVE_GLIBC_STRERROR_R`, false over musl.

  windows  the recipe's `windows` branch omits HAVE_CONFIG_H so curl_setup.h
           reaches the checked-in `lib/config-win32.h`, and links `-lws2_32`
           with Schannel. Over openkal that target presents POSIX and is
           LP64; config-win32.h is written for LLP64 and the Win32 API.

THE SECOND IS THE INTERESTING ONE: the recipe branches on the PLATFORM where
the question is about the C ENVIRONMENT. Those two agreed on every target this
index had until openkal presented POSIX on Windows, and mcpp has the predicate
for the question actually being asked --- `cfg(c-abi = "musl")`. Recorded
rather than fixed here: it also needs this index's OpenSSL over the same
environment, so it is a larger change than the first.
@Sunrisepeak
Sunrisepeak merged commit 15da11a into main Sep 20, 2026
10 checks passed
@Sunrisepeak
Sunrisepeak deleted the a-declared-absence-that-stays-falsifiable branch September 20, 2026 20:52
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