Pages

Wednesday, November 18, 2020

Going Universal

I thought I'd jot down a brief history of going universal with Curio...

PowerPC → Intel

Apple shifted from PowerPC to Intel on January 10, 2006 with the Mac OS X Tiger 10.4.4 release. This also introduced the concept of universal binaries to the Mac audience, where a single app contained native code for both PowerPC and Intel architectures.

I remember purchasing a first generation Intel MacBook Pro immediately after that announcement to work on Curio 3's universal transition. We released the Curio 3.1 PowerPC+Intel universal build on March 29, 2006. 

A relatively quick code transition process, although mainly complicated due to the "endian" differences between the two architectures impacting some low-level code, and because the tools back then were not so robust.

Apple continued supporting PowerPC through Leopard (10.5) but dropped it with Snow Leopard (10.6) which came out August 28, 2009. 

Curio continued supporting Leopard and therefore PowerPC chips, all the way until Curio 8.0 released on October 11, 2012 when we made macOS Lion (10.7) our minimum requirement.

Intel → Apple Silicon

And now we're going universal again with Curio 14.4 with support for Intel and Apple silicon architectures on macOS 11 Big Sur (11.0). This means Curio 14 natively supports Apple's new generation of Macs using their astounding M1 chip, while still supporting Intel Macs.

Given that Curio 14 has a 3x larger codebase than our earlier universal transition, with a coding timeline that stretches back 18 years, this was, shockingly, a much faster process I believe for several key reasons:

  1. With every major release of Curio and Xcode, we do our best to tackle any new compiler warnings and to keep up with Apple's aggressive annual deprecation strategy, where they drop support for prior frameworks, classes, and technologies and promote newer techniques. We document many of these changes at the bottom of our release notes (see 141312, ...). Often these behind-the-scenes code refactorings can take weeks and can be a frustrating experience as previously working code is rewritten for a new technique or class. However, while these changes don't bring new features to our customers, they presumably make our code more resilient to major Apple transitions like this.
  2. Apple's much-improved tools. Xcode and its many code analyzers, runtime sanitizers, thread checkers, and performance profilers are a tremendous help in making sure our code is clean.
  3. We were fortunately eligible for Apple's Developer Transition Kit which allowed us to compile, test, and release our universal builds before Apple's new M1 Macs started shipping.
  4. And, of course, Apple did an outstanding job making sure their Apple silicon-based macOS was rock solid, even in its initial release. A huge shout-out to that team!

As I write this, we have an M1 MacBook Air on order, hopefully arriving within a few days. We'll continue testing on this shipping hardware to make sure Curio 14 is shipshape on this new architecture!

One Build

It's exciting to release a single build of Curio that supports so many significant macOS releases and architectures:

  • Mojave (10.14) on Intel, which is the last one that supports 32-bit apps which many customers may still need,
  • Catalina (10.15) on Intel, which is the most popular macOS currently,
  • Big Sur (11.0) on Intel and Apple silicon, which is the beginning of the macOS 11 era.

It's also exciting to see the Mac itself go through so many transitions, from Motorola, to PowerPC, to Intel, and now to custom Apple chips. These evolutionary steps, plus the transition to macOS 11, gives the Mac ecosystem a new thrill and excitement that has been missing the past few years.

Go Macintosh!

PS: If you're a current customer still on an older version of Curio, purchase a discounted upgrade to Curio 14 and you'll be ready for both macOS 11 and the Apple silicon generation!

PPS: Curiota is universal as well!