Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Miscellaneous confusion about Xcode build settings (64/32 bits, SDK version, etc)

When I create a new OS X application project, I noticed many target options those confuse me quite a lot:


(1) The top-left setting of Xcode window: Top-left


(2) The "Base SDK": Base SDK


(3) "Deployment Target": Deployment Target


(4) Architectures: Architectures


Here comes my questions:

For (2) and (3), I think it was clearer to understand. These are what I comprehend:
(2) This identifies what I develop with.
(3) This identifies what OS version my application will be used on.
Please tell me whether I am right...

But I could not understand (1). I just know that if I select 32-bit here, I could not use ARC.

Neither with (4), what are they? Are they represent the bit-width of the CPU? What was the difference between (1) and (4)?

like image 668
Andrew Chang Avatar asked Jan 11 '23 17:01

Andrew Chang


1 Answers

I'll explain your items out of order.

The Base SDK

This defines the largest set of APIs you can use. You can use anything that existed as of the version number identified here. For example, if you use the 10.8 SDK, you can use -[NSColor CGColor] (introduced in 10.8), but not -[NSData base64EncodedDataWithOptions:] (first public in 10.9).

(Of course, you can also use anything older than that version.)

Accordingly, the SDK version is also known as the “max[imum] allowed” version in the Availability macros.

The SDK version also sometimes becomes important when Apple changes the behavior of an API. When they do that, they sometimes keep the old behavior around for applications linked with older SDKs. This is called an “on-or-after check”, as in “checks whether you're on 10.8 [SDK] or later”. (The concept and term pre-date Xcode having SDKs for each OS version. It used to just go by whatever OS you were running Xcode and building on.)

The Deployment Target

This is the minimum OS version you require. If something was removed in a prior version (rare, but it happens), you can't use it.

This tends to affect link-time and run-time things more than compile-time things. For example, ARC won't work if your deployment target is 10.5 or earlier.

Accordingly, the Deployment Target is also known as the “min[imum] required” version in the Availability macros.

The Info.plist can also specify a minimum OS version. Nowadays, this is set by default and it's set by macro expansion to the Deployment Target.

The Architectures build setting

Different CPUs have different architectures. Essentially, they fit into broad categories, such as:

  • PowerPC 32-bit (ppc)
  • PowerPC 64-bit (ppc64)
  • Intel 32-bit (i386)
  • Intel 64-bit (x86_64)
  • ARM 32-bit
  • ARM 64-bit

(PowerPC architectures aren't supported anymore. You can add them to the Architectures list, as ppc and ppc64, but Xcode will just ignore them.)

Macs nowadays have Intel processors. Almost all Intel Macs have 64-bit processors. You only need to worry about 32-bit Intel if you want to support Macs all the way back to 2006. That's probably more hassle than it's worth.

iOS devices run ARM processors, and most are still 32-bit. The A7 (iPhone 5S, iPad Air, iPad Mini with Retina Display) is 64-bit. But, if you run on an iOS Simulator, it's running on your Mac (it's a Simulator, not an emulator), so it'll target an Intel architecture (formerly always i386, but probably can now be x86_64 if needed).

The “top-left setting of Xcode window”

This is the build scheme and run destination. (Yes, it's two separate things in one pop-up menu. Actually, it's two separate pop-up menus in one control. Try it.)

“My Mac 64-bit” is the run destination. You'll be running the 64-bit version of your app on your Mac, not in an iOS Simulator or on an iOS device. Your choice for a Mac app is merely which architecture you want to run, and they should behave the same (this is, obviously, something you sometimes need to test).

iOS apps have more choices here. Some apps are iPhone-only, some are iPad-only, some are universal, and some may be set to build for both 32-bit and 64-bit architectures. You'll have a Simulator offered for each combination of form factor and architecture (e.g., iPhone Simulator 64-bit) you can run on. You'll also have the option to run your app on any iOS device that's connected and enabled for development (you get this prompt when you plug in the device in Xcode's sight).

TL;DR

  • Deployment Target is the lowest OS version your app will run on.
  • Base SDK is the highest OS version you can use stuff from. If it didn't exist yet, it doesn't exist at all for you.
  • Architectures are the set of hardware your app will run on.
  • Run Destination is the hardware you're going to run it on from within Xcode.
like image 139
Peter Hosey Avatar answered Jan 30 '23 02:01

Peter Hosey