A package requiring a newer R than the slot's primary is never built for any minor #215

Closed
opened 2026-09-13 09:21:53 +00:00 by pat-s · 0 comments
Owner

Summary

A package whose current CRAN version requires a newer R than the slot's primary build R is never built for that slot, on any R minor, including the minors that could build it.
The source fallback then publishes CRAN's source tarball under the binary key, and the record is carried into every per-minor index.
On the 4.4 index those records carry Depends: R (>= 4.5.0), so available.packages() filters them out and the package is simply unavailable.

Evidence

arules 1.7.15 (Depends: Matrix (>= 1.4-0), R (>= 4.5.0)), amd64, checked against the live CDN:

slot primary build R 4.5 object 4.6 object
noble 4.4.3 none none
alpine323 4.5.3 binary none
rhel10 4.5.3 binary none

On noble there is no binary at any minor, only a source tarball in the flat slot.
Confirmed by fetching it: no Meta/package.rds.

Its record in noble's 4.4 index:

Package: arules
Version: 1.7.15
Depends: Matrix (>= 1.4-0), R (>= 4.5.0)
NeedsCompilation: yes
File: arules_1.7.15.tar.gz

No Built, correctly, because #131 clears the stamp on a source fallback.
No Path, so it resolves to the flat object.
R 4.4 applies the R_version filter and reports the package as unavailable.

Scale

Records in each slot's 4.4 index that require R >= 4.5 and carry no Built, amd64:

4.4-primary slots            4.5-primary slots
  noble      122               resolute    37
  jammy      122               rhel10      32
  rhel9      122               alpine323   32
  rhel8       66               alpine324   31

The split follows the primary build R exactly, rhel8 aside, which is lower for unrelated reasons.
A 4.4-primary slot carries roughly 90 more unusable records than a 4.5-primary one.

Mechanism

A package is built once, under the slot's primary R, into the generic slot.
Per-minor builds only happen for packages classified ABI-sensitive.
So for a package that is not ABI-sensitive and requires a newer R than the primary, there is no build path at all: the primary build fails the R requirement, and nothing else ever tries.

This is also why the residual "missing from 4.4" column is made up entirely of packages requiring R >= 4.5 (arules, BoomSpikeSlab, praznik, RSiena, stelfi) and their dependents (arulesSequences, bsts, dtametaTMB, glmmTMB, hmmTMB, tramME, phylosem).

Options

  1. Build under the newest installed R that satisfies the package's Depends: R, rather than only the slot's primary. arules would then get 4.5 and 4.6 binaries on noble, matching what alpine323 already produces for 4.5. Largest change, best outcome.
  2. Publish the last CRAN version that supports the slot's minor, from Meta/archive.rds, instead of the current one. An R 4.4 user gets a working older arules rather than nothing.
  3. Leave the record out of the index whose R minor it cannot satisfy. Smallest change, no behavioural gain for the user, but stops the index advertising something no client on that minor can use and stops it inflating gap measurements.

1 and 2 are not exclusive: 1 fixes the minors that can build it, 2 covers the minor that cannot.

Not urgent

Nothing here is a regression and nothing is broken for a client.
An R 4.4 user gets the same "not available for this version of R" that CRAN itself gives for the current version.
The cost is that a binary repository could do better, plus ~90 dead records per 4.4-primary index.

## Summary A package whose current CRAN version requires a newer R than the slot's **primary** build R is never built for that slot, on **any** R minor, including the minors that could build it. The source fallback then publishes CRAN's source tarball under the binary key, and the record is carried into every per-minor index. On the 4.4 index those records carry `Depends: R (>= 4.5.0)`, so `available.packages()` filters them out and the package is simply unavailable. ## Evidence `arules 1.7.15` (`Depends: Matrix (>= 1.4-0), R (>= 4.5.0)`), amd64, checked against the live CDN: | slot | primary build R | 4.5 object | 4.6 object | |---|---|---|---| | `noble` | 4.4.3 | none | none | | `alpine323` | 4.5.3 | **binary** | none | | `rhel10` | 4.5.3 | **binary** | none | On `noble` there is no binary at any minor, only a source tarball in the flat slot. Confirmed by fetching it: no `Meta/package.rds`. Its record in `noble`'s 4.4 index: ``` Package: arules Version: 1.7.15 Depends: Matrix (>= 1.4-0), R (>= 4.5.0) NeedsCompilation: yes File: arules_1.7.15.tar.gz ``` No `Built`, correctly, because #131 clears the stamp on a source fallback. No `Path`, so it resolves to the flat object. R 4.4 applies the `R_version` filter and reports the package as unavailable. ## Scale Records in each slot's **4.4** index that require R >= 4.5 and carry no `Built`, amd64: ``` 4.4-primary slots 4.5-primary slots noble 122 resolute 37 jammy 122 rhel10 32 rhel9 122 alpine323 32 rhel8 66 alpine324 31 ``` The split follows the primary build R exactly, `rhel8` aside, which is lower for unrelated reasons. A 4.4-primary slot carries roughly **90 more** unusable records than a 4.5-primary one. ## Mechanism A package is built once, under the slot's primary R, into the generic slot. Per-minor builds only happen for packages classified ABI-sensitive. So for a package that is **not** ABI-sensitive and requires a newer R than the primary, there is no build path at all: the primary build fails the R requirement, and nothing else ever tries. This is also why the residual "missing from 4.4" column is made up entirely of packages requiring R >= 4.5 (`arules`, `BoomSpikeSlab`, `praznik`, `RSiena`, `stelfi`) and their dependents (`arulesSequences`, `bsts`, `dtametaTMB`, `glmmTMB`, `hmmTMB`, `tramME`, `phylosem`). ## Options 1. **Build under the newest installed R that satisfies the package's `Depends: R`**, rather than only the slot's primary. `arules` would then get 4.5 and 4.6 binaries on `noble`, matching what `alpine323` already produces for 4.5. Largest change, best outcome. 2. **Publish the last CRAN version that supports the slot's minor**, from `Meta/archive.rds`, instead of the current one. An R 4.4 user gets a working older `arules` rather than nothing. 3. **Leave the record out of the index whose R minor it cannot satisfy.** Smallest change, no behavioural gain for the user, but stops the index advertising something no client on that minor can use and stops it inflating gap measurements. 1 and 2 are not exclusive: 1 fixes the minors that can build it, 2 covers the minor that cannot. ## Not urgent Nothing here is a regression and nothing is broken for a client. An R 4.4 user gets the same "not available for this version of R" that CRAN itself gives for the current version. The cost is that a binary repository could do better, plus ~90 dead records per 4.4-primary index.
pat-s closed this issue 2026-09-13 09:35:51 +00:00
Sign in to join this conversation.
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
devxy/build-cran-binaries#215
No description provided.