At each Bioconductor release, every package gets a version bump, so that all binaries are rebuilt. This is intended to protect against packages breaking when a package they depend on changes its binary interface (ABI), but it rebuilds all packages, including the many that are not affected. We compared the ABI of every package in Bioconductor release with the same package in devel, to see how many of these changes actually affect other packages.
So instead of rebuilding all 2,963 packages, only 13 packages needed attention. These packages are found automatically, by comparing the hashes that each binary imports with the current exports of its dependencies.
| Package | Version | Changed | Moved | Removed | Added | Affected dependents |
|---|---|---|---|---|---|---|
| BiocGenerics | 0.58.1 → 0.59.12 | 1 | 0 | 0 | 9 | 4 |
| Biostrings | 2.80.2 → 2.81.9 | 0 | 3 | 11 | 1 | 3 |
| preprocessCore | 1.74.0 → 1.75.3 | 3 | 0 | 0 | 0 | 3 |
| enrichplot | 1.32.1 → 1.99.8 | 5 | 0 | 0 | 6 | 2 |
| DelayedArray | 0.38.2 → 0.39.8 | 0 | 1 | 0 | 0 | 1 |
| alabaster.matrix | 1.12.0 → 1.13.4 | 1 | 0 | 3 | 4 | 0 |
| ASpli | 2.22.0 → 2.23.1 | 2 | 0 | 8 | 0 | 0 |
| BgeeDB | 2.38.1 → 2.39.6 | 1 | 0 | 0 | 1 | 0 |
| Biobase | 2.72.0 → 2.73.2 | 0 | 0 | 3 | 0 | 0 |
| BiocCheck | 1.48.1 → 1.49.37 | 2 | 0 | 0 | 0 | 0 |
| CAGEr | 2.18.0 → 2.19.2 | 1 | 0 | 0 | 0 | 0 |
| Chromatograms | 1.2.0 → 1.3.5 | 0 | 0 | 1 | 4 | 0 |
| CrcBiomeScreen | 1.0.0 → 1.1.6 | 1 | 0 | 0 | 0 | 0 |
| gdsfmt | 1.48.2 → 1.49.11 | 1 | 0 | 0 | 0 | 0 |
| GSVA | 2.6.15 → 2.7.25 | 3 | 0 | 3 | 2 | 0 |
| Gviz | 1.56.0 → 1.57.4 | 1 | 1 | 0 | 0 | 0 |
| igvShiny | 1.8.3 → 1.9.51 | 1 | 0 | 0 | 0 | 0 |
| ImageArray | 1.0.0 → 1.1.7 | 2 | 1 | 0 | 19 | 0 |
| lcmsPlot | 1.0.0 → 1.1.25 | 2 | 0 | 12 | 8 | 0 |
| LipidTrend | 1.2.0 → 1.3.1 | 2 | 0 | 0 | 1 | 0 |
| MetMashR | 1.6.0 → 1.7.2 | 12 | 0 | 0 | 7 | 0 |
| msa | 1.44.1 → 1.45.6 | 3 | 0 | 0 | 0 | 0 |
| peakPantheR | 1.26.0 → 1.27.4 | 1 | 0 | 0 | 0 | 0 |
| phenomis | 1.14.0 → 1.15.10 | 1 | 0 | 1 | 1 | 0 |
| RnBeads | 2.30.0 → 2.31.3 | 1 | 0 | 0 | 0 | 0 |
| RVS | 1.34.0 → 1.35.0 | 2 | 0 | 0 | 0 | 0 |
| S4Vectors | 0.50.3 → 0.51.10 | 0 | 0 | 2 | 0 | 0 |
| SpaNorm | 1.6.0 → 1.7.16 | 2 | 0 | 0 | 1 | 0 |
| SpatialFeatureExperiment | 1.14.0 → 1.15.1 | 1 | 0 | 0 | 3 | 0 |
| spicyR | 1.24.1 → 1.99.47 | 1 | 0 | 0 | 0 | 0 |
| splatter | 1.36.0 → 1.37.1 | 0 | 0 | 1 | 0 | 0 |
| STADyUM | 1.2.0 → 1.3.2 | 2 | 0 | 0 | 7 | 0 |
| tidybulk | 2.2.0 → 2.3.3 | 3 | 0 | 0 | 3 | 0 |
| VisiumIO | 1.8.0 → 1.9.5 | 3 | 0 | 1 | 0 | 0 |
| VISTA | 1.0.0 → 1.1.7 | 4 | 0 | 0 | 0 | 0 |
| xcms | 4.10.1 → 4.11.5 | 0 | 2 | 0 | 2 | 0 |
Changed, moved and removed interfaces by type:
| changed | moved | removed | |
|---|---|---|---|
| S4 class | 33 | 0 | 17 |
| S4 generic | 28 | 8 | 29 |
| C function | 2 | 0 | 0 |
| C header | 2 | 0 | 0 |
| Provider | Interface | Type | Change | Dependents |
|---|---|---|---|---|
| BiocGenerics | BiocGenerics::generic:table | S4 generic | changed | DelayedArray, IRanges, R453Plus1Toolbox, S4Vectors |
| Biostrings | Biostrings::AAMultipleAlignment | S4 class | removed | msa |
| Biostrings | Biostrings::DNAMultipleAlignment | S4 class | removed | msa |
| Biostrings | Biostrings::generic:detail | S4 generic | moved to BiocGenerics | HiTC, ShortRead |
| Biostrings | Biostrings::MultipleAlignment | S4 class | removed | msa |
| Biostrings | Biostrings::RNAMultipleAlignment | S4 class | removed | msa |
| DelayedArray | DelayedArray::generic:scale | S4 generic | moved to BiocGenerics | SCArray |
| enrichplot | enrichplot::generic:upsetplot | S4 generic | changed | ChIPseeker, epiSeeker |
| preprocessCore | preprocessCore::plmrc_wfit() | C function | changed | affy, affyPLM, oligo |
| preprocessCore | preprocessCore::plmrr_wfit() | C function | changed | affy, affyPLM, oligo |
When an interface changed, rebuilding the dependents
fixes them. Not every change breaks the old binaries: for example,
methods keep working when a generic gets extra arguments. But the hashes
do not tell which changes are harmless, and a rebuild is cheap. When a
generic moved to another package, a rebuild fixes
dependents that import it through a package that still provides it
(e.g. import(DelayedArray)), but not dependents that import
it by name from the old package (importFrom()). When an
interface was removed, a rebuild can’t help: the
dependent needs a code change, which a version bump doesn’t provide
either.
What the changes above mean in practice, checked by hand (November 2026):
| Change | Dependents | Impact |
|---|---|---|
Biostrings: MultipleAlignment classes
moved to the new MultipleAlignment package |
msa | Real: needed a code change |
detail generic moved from Biostrings to
BiocGenerics |
ShortRead, HiTC | Real: ShortRead needed a code change
(importFrom(Biostrings, detail)); HiTC was removed from
devel |
scale generic moved from DelayedArray to
BiocGenerics |
SCArray | Real: a rebuild fixes it |
BiocGenerics::table dispatches on
x instead of ... |
S4Vectors, IRanges, DelayedArray, R453Plus1Toolbox | Probably real (old methods tables): a rebuild fixes it |
enrichplot::upsetplot gained
arguments |
ChIPseeker, epiSeeker | Probably harmless: extra arguments don’t break methods |
preprocessCore: plmrc_wfit() and
plmrr_wfit() |
affy, affyPLM, oligo | Not a real change: a typo in the declarations in
plmr.h was fixed, which changed the hash |
include directory. An S4 generic’s hash covers its
arguments and the arguments it dispatches on.LinkingTo). The dependents of a change
are the release packages whose binaries import the interface.