Skip to content

AIB Stability & Library Evolution

Austin edited this page Oct 31, 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, all new variables are stored through a ivar that is added to each class and a private ivar with the form void *_evolution_ProductName_className_. This will always be set to an instantiated class of similar name that will contain the ivar. When the parent class is released, it will automatically destroy that object to prevent data leaks.

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