Binary compatibility between Bioconductor release and devel

Summary

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.

  • Bioconductor devel has 2,963 packages. Only 121 of them export an interface (S4 class, S4 generic, C function or C header) that another package depends on in its binary.
  • 36 packages changed, moved or removed part of their ABI between release and devel. Most of these changes are to interfaces that no other package uses.
  • Changes in 5 packages affect other packages: 13 dependents in total (affy, affyPLM, ChIPseeker, DelayedArray, epiSeeker, HiTC, IRanges, msa, oligo, R453Plus1Toolbox, S4Vectors, SCArray, ShortRead).

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.

Packages that changed their ABI

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

Changes that affect other packages

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.

Notes

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

Method

  • Data: the ABI records that r-universe stores for each package build in bioc-release and bioc, computed with abitools.
  • An S4 class’s hash covers its slots, superclasses and reference class fields. A C function’s hash covers its signature (argument and return types), and a header’s hash covers the contents of the package’s include directory. An S4 generic’s hash covers its arguments and the arguments it dispatches on.
  • A package imports an interface when it extends an S4 class of another package, defines methods for a generic of another package, or links to its C API (LinkingTo). The dependents of a change are the release packages whose binaries import the interface.
  • Coverage: a package only has an ABI record if it exports or imports any of these interfaces; packages without a record have no binary ties to other packages. 960 packages have a record in both release and devel, and these are compared. 34 packages have a record in only one of the two; no other package imports their exports, so this does not affect the results.