Skip to content

AIB Stability & Library Evolution

Austin edited this page Nov 3, 2026 · 2 revisions

This project aims to produce ABI compliant Frameworks and Services that can function as fully drop in replacements under Mac OS X Server 1.2v3 and Rhapsody OS.

This is done through #if defined(…) statements throughout the source code.

This project defines several of these

  • -DDistributionRhapsodyOS
  • -DDistributionRhapsodiOS
  • -DDistributionOpenNext (eqiv to DDistributionRhapsodiOS)

When new features are added to our Frameworks, they have to be done in such a way that are ABI compatible. New classes and methods are not considered ABI breaking changes to a framework, but changing ivar (adding, removing or reordering) are ABI breaking.

RhapsosyOS ivar Solution

On RhapsodyOS, ivars are never removed or reordered; however, new ivars are implemented using a global variable NSMapTable. When an object is deinited, it must clean up its entry in that map.

OpenNext & RhapsodiOS Library Resilience

When building for RhapsodiOS or OpenNext, classes get an ivar whose type is a pointer void *_evolution_ProductName_className_ to a private brother class which ultimately stores the variables. We may switch to using a structure in the future, but for now it will be a class. The public class must be sure to release the brother class when it is released.

In Source

Source code will use #if defined(DistributionRhapsodyOS) and #if defined(DistributionRhapsodiOS) || defined(DistributionOpenNext) to decide how this is implemented.

Unavoidable ABI Breaking Changes

If a feature requires an ABI breaking change, we only implement it for RhapsodiOS and OpenNext.

Clone this wiki locally