Ninja is yet another build system. It takes as input theinterdependencies of files (typically source code and outputexecutables) and orchestrates building them, quickly.

Ninja joins a sea of other build systems. Its distinguishing goal isto be fast. It is born frommywork on the Chromium browser project, which has over 30,000 sourcefiles and whose other build systems (including one built from customnon-recursive Makefiles) would take ten seconds to start buildingafter changing one file. Ninja is under a second.

Mac OS X, on the other hand, never went through this same 'we must be all things to all developers' evolution. It based its OS on a tried-and-true platform, the Berkeley Source Distribution BSD. Rebooting your Mac is often a helpful step to take, too, as doing so can sometimes flush the baddies out. Or just for the heck of it. And if you want to be thorough. Ctrl+Left and Ctrl+Right: Hitting Ctrl and the left or right arrow keys jumps between arguments in your command. So, if you had a typo in the middle of the command, you could jump to it quickly.

Where other build systems are high-level languages, Ninja aims to bean assembler.

Build systems get slow when they need to make decisions. When you arein a edit-compile cycle you want it to be as fast as possible — youwant the build system to do the minimum work necessary to figure outwhat needs to be built immediately.

Ninja contains the barest functionality necessary to describearbitrary dependency graphs. Its lack of syntax makes it impossibleto express complex decisions.

Instead, Ninja is intended to be used with a separate programgenerating its input files. The generator program (like the./configure found in autotools projects) can analyze systemdependencies and make as many decisions as possible up front so thatincremental builds stay fast. Going beyond autotools, even build-timedecisions like 'which compiler flags should I use?' or 'should Ibuild a debug or release-mode binary?' belong in the .ninja filegenerator.

Here are the design goals of Ninja:

  • very fast (i.e., instant) incremental builds, even for very large projects.
  • very little policy about how code is built. Different projects and higher-level build systems have different opinions about how code should be built; for example, should built objects live alongside the sources or should all build output go into a separate directory? Is there a 'package' rule that builds a distributable package of the project? Sidestep these decisions by trying to allow either to be implemented, rather than choosing, even if that results in more verbosity.
  • get dependencies correct, and in particular situations that are difficult to get right with Makefiles (e.g. outputs need an implicit dependency on the command line used to generate them; to build C source code you need to use gcc’s -M flags for header dependencies).
  • when convenience and speed are in conflict, prefer speed.

Some explicit non-goals:

  • convenient syntax for writing build files by hand. You should generate your ninja files using another program. This is how we can sidestep many policy decisions.
  • built-in rules. Out of the box, Ninja has no rules for e.g. compiling C code.
  • build-time customization of the build. Options belong in the program that generates the ninja files.
  • build-time decision-making ability such as conditionals or search paths. Making decisions is slow.

Bullet Heck (ninja) Mac Os X

To restate, Ninja is faster than other build systems because it ispainfully simple. You must tell Ninja exactly what to do when youcreate your project’s .ninja files.

Bullet Heck (ninja) Mac Os Update

Ninja is closest in spirit and functionality to Make, relying onsimple dependencies between file timestamps.

But fundamentally, make has a lot of features: suffix rules,functions, built-in rules that e.g. search for RCS files when buildingsource. Make’s language was designed to be written by humans. Manyprojects find make alone adequate for their build problems.

Bullet heck (ninja) mac os update

In contrast, Ninja has almost no features; just those necessary to getbuilds correct while punting most complexity to generation of theninja input files. Ninja by itself is unlikely to be useful for mostprojects.

Here are some of the features Ninja adds to Make. (These sorts offeatures can often be implemented using more complicated Makefiles,but they are not part of make itself.)

  • Ninja has special support for discovering extra dependencies at build time, making it easy to get header dependencies correct for C/C++ code.
  • A build edge may have multiple outputs.
  • Outputs implicitly depend on the command line that was used to generate them, which means that changing e.g. compilation flags will cause the outputs to rebuild.
  • Output directories are always implicitly created before running the command that relies on them.
  • Rules can provide shorter descriptions of the command being run, so you can print e.g. CC foo.o instead of a long command line while building.
  • Builds are always run in parallel, based by default on the number of CPUs your system has. Underspecified build dependencies will result in incorrect builds.
  • Command output is always buffered. This means commands running in parallel don’t interleave their output, and when a command fails we can print its failure output next to the full command line that produced the failure.

In June of 2004, during the WWDC keynote address, Steve Jobs revealed Mac OS X 10.4 Tiger to developers and the public for the first time. When the finished product arrived in April of 2005, Tiger was the biggest, most important, most feature-packed release in the history of Mac OS X by a wide margin. Apple's marketing campaign reflected this, touting 'over 150 new features.'

All those new features took time. Since its introduction in 2001, there had been at least one major release of Mac OS X each year. Tiger took over a year and a half to arrive. At the time, it definitely seemed worth the wait. Tiger was a hit with users and developers. Apple took the lesson to heart and quickly set expectations for the next major release of Mac OS X, Leopard. Through various channels, Apple communicated its intention to move from a 12-month to an 18-month release cycle for Mac OS X. Leopard was officially scheduled for 'spring 2007.'

As the date approached, Apple's marketing machine trod a predictable path.

Bullet Heck (ninja) Mac Os Catalina

Apple even went so far as to list all 300 new features on its website. As it turns out, 'spring' was a bit optimistic. Leopard actually shipped at the end of October 2007, nearly two and a half years after Tiger. Did Leopard really have twice as many new features as Tiger? That's debatable. What's certain is that Leopard included a solid crop of new features and technologies, many of which we now take for granted. (For example, have you had a discussion with a potential Mac user since the release of Leopard without mentioning Time Machine? I certainly haven't.)

Mac OS X appeared to be maturing. The progression was clear: longer release cycles, more features. What would Mac OS X 10.6 be like? Would it arrive three and a half years after Leopard? Would it and include 500 new features? A thousand?

At WWDC 2009, Bertrand Serlet announced a move that he described as 'unprecedented' in the PC industry.

That's right, the next major release of Mac OS X would have no new features. The product name reflected this: 'Snow Leopard.' Mac OS X 10.6 would merely be a variant of Leopard. Better, faster, more refined, more... uh... snowy.

Advertisement

Bullet Heck (ninja) Mac Os Download

This was a risky strategy for Apple. After the rapid-fire updates of 10.1, 10.2, and 10.3 followed by the riot of new features and APIs in 10.4 and 10.5, could Apple really get away with calling a 'time out?' I imagine Bertrand was really sweating this announcement up on the stage at WWDC in front of a live audience of Mac developers. Their reaction? Spontaneous applause. There were even a few hoots and whistles.

Many of these same developers applauded the '150+ new features' in Tiger and the '300 new features' in Leopard at past WWDCs. Now they were applauding zero new features for Snow Leopard? What explains this?

It probably helps to know that the '0 New Features' slide came at the end of an hour-long presentation detailing the major new APIs and technologies in Snow Leopard. It was also quickly followed by a back-pedaling ('well, there is one new feature...') slide describing the addition of Microsoft Exchange support. In isolation, 'no new features' may seem to imply stagnation. In context, however, it served as a developer-friendly affirmation.

The overall message from Apple to developers was something like this: 'We're adding a ton of new things to Mac OS X that will help you write better applications and make your existing code run faster, and we're going to make sure that all this new stuff is rock-solid and as bug-free as possible. We're not going to overextend ourselves adding a raft of new customer-facing, marketing-friendly features. Instead, we're going to concentrate 100% on the things that affect you, the developers.'

But if Snow Leopard is a love letter to developers, is it a Dear John letter to users? You know, those people that the marketing department might so crudely refer to as 'customers.' What's in it for them? Believe it or not, the sales pitch to users is actually quite similar. As exhausting as it has been for developers to keep up with Apple's seemingly never-ending stream of new APIs, it can be just as taxing for customers to stay on top of Mac OS X's features. Exposé, a new Finder, Spotlight, a new Dock, Time Machine, a new Finder again, a new iLife and iWorkalmost every year, and on and on. And as much as developers hate bugs in Apple's APIs, users who experience those bugs as application crashes have just as much reason to be annoyed.

Enter Snow Leopard: the release where we all get a break from the new-features/new-bugs treadmill of Mac OS X development. That's the pitch.

Bullet heck (ninja) mac os update

Uncomfortable realities

But wait a second, didn't I just mention an 'hour-long presentation' about Snow Leopard featuring 'major new APIs and technologies?' When speaking to developers, Apple's message of 'no new features' is another way of saying 'no new bugs.' Snow Leopard is supposed to fix old bugs without introducing new ones. But nothing says 'new bugs, coming right up' quite like major new APIs. So which is it?

Advertisement

Similarly, for users, 'no new features' connotes stability and reliability. But if Snow Leopard includes enough changes to the core OS to fill an hour-long overview session at WWDC more than a year before its release, can Apple really make good on this promise? Or will users end up with all the disadvantages of a feature-packed release like Tiger or Leopard—the inevitable 10.x.0 bugs, the unfamiliar, untried new functionality—but without any of the actual new features?

Yes, it's enough to make one quite cynical about Apple's real motivations. To throw some more fuel on the fire, have a look at the Mac OS X release timeline below. Next to each release, I've included a list of its most significant features.

That curve is taking on a decidedly droopy shape, as if it's being weighed down by the ever-increasing number of new features. (The releases are distributed uniformly on the Y axis.) Maybe you think it's reasonable for the time between releases to stretch out as each one brings a heavier load of goodies than the last, but keep in mind the logical consequence of such a curve over the longhorn haul.

And yeah, there's a little upwards kick at the end for 10.6, but remember, this is supposed to be the 'no new features' release. Version 10.1 had a similar no-frills focus but took a heck of a lot less time to arrive.

Looking at this graph, it's hard not to wonder if there's something siphoning resources from the Mac OS X development effort. Maybe, say, some project that's in the first two or three major releases of its life, still in that steep, early section of its own timeline graph. Yes, I'm talking about the iPhone, specifically iPhone OS. The iPhone business has exploded onto Apple's balance sheets like no other product before, even the iPod. It's also accruing developers at an alarming rate.

It's not a stretch to imagine that many of the artists and developers who piled on the user-visible features in Mac OS X 10.4 and 10.5 have been reassigned to iPhone OS (temporarily or otherwise). After all, Mac OS X and iPhone OS share the same core operating system, the same language for GUI development, and many of the same APIs. Some workforce migration seems inevitable.

And let's not forget the 'Mac OS X' technologies that we later learned were developed for the iPhone and just happened to be announced for the Mac first (because the iPhone was still a secret), like Core Animation and code signing. Such conspiracy theories certainly aren't helped by WWDC keynote snubs and other indignities suffered by Mac OS X and the Mac in general since the iPhone arrived on the scene. And so, on top of everything else, Snow Leopard is tasked with restoring some luster to Mac OS X.

Got all that? A nearly two-year development cycle, but no new features. Major new frameworks for developers, but few new bugs. Significant changes to the core OS, but more reliability. And a franchise rejuvenation with few user-visible changes.

It's enough to turn a leopard white.