« c2 ac e2 80 a0 probably solved | Main | Why I don't want to live without the Dock Launch indicators »

Building true universal binaries - Intel and PPC - with Xcode 4 and gcc4.0

This entry is plagiarizing Meckis fine entry on StackOverflow, but doing it a little differently.

First I needed to install some Xcode3 stuff from the original distribution on my pristine Lion VM. I grabbed what I needed from my Snow Leopard DVD, which contained Xcode 3.2. There is a folder called Optional Installs, which contains a hidden folder Packages. I needed files contained in the following packages:

DeveloperTools.pkg// for one lousy PlugIn
DeveloperToolsCLI.pkg// assembler and linker
gcc4.0.pkg// the GCC 4.0 compiler
MacOSX10.4.Universal.pkg// the 10.4u SDK

I installed them in that order into a folder /Xcode3, I already had Xcode4 installed. These four packages do not overwrite anything outside of the destination folder, so the installation order doesn't matter if you install it like this.

cd /Volumes/Mac\ OS\ X\ Install/Optional\ Installs.localized/Packages
open DeveloperTools.pkg
open DeveloperToolsCLI.pkg
open gcc4.0.pkg
open MacOSX10.4.Universal.pkg
I have my Xcode4 installed in /Xcode4, because I am pretty sure there will be an Xcode5 in the future and I easily confuse. With this little shell script, running under sudo, I now do the necessary linking and patching. You can't copy paste these lines directly into a shell, it needs to run as a shell script.
#!/bin/sh
#
# coded by Nat!   Mulle kybernetiK
#
# mostly ripped off from Mecki 
# http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4
# 

XCODE3=${1:-/Xcode3}
shift
XCODE4=${1:-/Xcode4}
shift

cd "$XCODE4/SDKs"
ln -s "$XCODE3/SDKs/MacOSX10.4u.sdk"

#
# this is the only thing we need from DeveloperTools.pkg (!)
#
cd "$XCODE4/Library/Xcode/PrivatePlugIns"
cs "Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins"
ln -s "$XCODE3/Library/Xcode/Plug-ins/GCC 4.0.xcplugin"  

#
# get the 4.0 stuff
#
cd "$XCODE4/usr/bin"
for SRC_FILE in $XCODE3/usr/bin/*4.0*; do ln -s "$SRC_FILE" ; done

#
# this is different from what Mecki on StackOverflow does
#
# install the old assembler _and_ the old linker
# for both Intel and PPC
# 
cd "$XCODE4/usr/libexec/gcc"
ln -s "$XCODE3/usr/libexec/gcc/powerpc-apple-darwin10"
ln -s "$XCODE3/usr/libexec/gcc/i686-apple-darwin10"

#
# (this actually changes stuff in Xcode3, but doesn't break it)
#
cd "$XCODE4/usr/libexec/gcc/powerpc-apple-darwin10/4.0.1/"
if [ ! -e as.old ]
then
	mv as as.old
	mv ld ld.old
fi
ln -s "$XCODE3/usr/bin/as"
ln -s "$XCODE3/usr/bin/ld"

cd "$XCODE4/usr/libexec/gcc/i686-apple-darwin10/4.0.1/"
if [ ! -e as.old ]
then
	mv as as.old
	mv ld ld.old
fi
ln -s "$XCODE3/usr/bin/as"
ln -s "$XCODE3/usr/bin/ld"


#
# now make it nicey, nicey and patch Xcode to show Universal build options
#
cd "$XCODE4/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications"
if [ ! -e MacOSX\ Architectures-apple.xcspec ]
then
   cp MacOSX\ Architectures.xcspec MacOSX\ Architectures-mulle.xcspec
   mv MacOSX\ Architectures.xcspec MacOSX\ Architectures-apple.xcspec
fi

ln -s MacOSX\ Architectures-mulle.xcspec MacOSX\ Architectures.xcspec

# you (or at least I) can't copy paste this into a shell so this is the 
# reason this is done as shell script

cat <<EOF | patch -N MacOSX\ Architectures-mulle.xcspec
--- MacOSX Architectures-apple.xcspec	2011-07-22 01:01:18.000000000 +0200
+++ MacOSX Architectures-mulle.xcspec	2011-07-22 00:57:54.000000000 +0200
@@ -21,7 +21,20 @@
 	},
 	{
 		Type = Architecture;
-		Identifier = Universal64bit;
+		Identifier = Universal;
+		Name = "32-bit Universal";
+		Description = "32-bit Mac OS X universal architectures";
+		ListInEnum = YES;
+		SortNumber = 7;
+		RealArchitectures = (
+			i386,
+			ppc,
+		);
+		ArchitectureSetting = "ARCHS_UNIVERSAL_32_BIT";
+	},
+	{
+		Type = Architecture;
+		Identifier = Standard64bit;
 		Name = "64-bit Intel";
 		Description = "64-bit Mac OS X architectures";
 		ListInEnum = YES;
@@ -33,7 +46,7 @@
 	},
 	{
 		Type = Architecture;
-		Identifier = "Universal32_64_Bit";
+		Identifier = "Standard32_64_Bit";
 		Name = "Standard (32/64-bit Intel)";
 		Description = "32- and 64-bit Mac OS X architectures";
 		ListInEnum = YES;
@@ -46,6 +59,20 @@
 	},
 	{
 		Type = Architecture;
+		Identifier = "Universal32_64_Bit";
+		Name = "Universal (32/64-bit)";
+		Description = "32- and 64-bit Mac OS X universal architectures";
+		ListInEnum = YES;
+		SortNumber = 8;
+		RealArchitectures = (
+			"x86_64",
+			i386,
+			ppc,
+		);
+		ArchitectureSetting = "ARCHS_UNIVERSAL_32_64_BIT";
+	},
+	{
+		Type = Architecture;
 		Identifier = Native;
 		Name = "Native Architecture of Build Machine";
 		Description = "Native 32- or 64-bit architecture of build machine";
@@ -73,4 +100,42 @@
 		ListInEnum = NO;
 		SortNumber = 106;
 	},
+	{
+		Type = Architecture;
+		Identifier = ppc;
+		Name = "Minimal (32-bit PowerPC only)";
+		Description = "32-bit PowerPC";
+		"PerArchBuildSettingName" = PowerPC;
+		ByteOrder = big;
+		ListInEnum = No;
+		SortNumber = 201;
+	},
+	{
+		Type = Architecture;
+		Identifier = ppc7400;
+		Name = "PowerPC G4";
+		Description = "32-bit PowerPC for G4 processor";
+		ByteOrder = big;
+		ListInEnum = NO;
+		SortNumber = 202;
+	},
+	{
+		Type = Architecture;
+		Identifier = ppc970;
+		Name = "PowerPC G5 32-bit";
+		Description = "32-bit PowerPC for G5 processor";
+		ByteOrder = big;
+		ListInEnum = NO;
+		SortNumber = 203;
+	},
+	{
+		Type = Architecture;
+		Identifier = ppc64;
+		Name = "PowerPC 64-bit";
+		Description = "64-bit PowerPC";
+		"PerArchBuildSettingName" = "PowerPC 64-bit";
+		ByteOrder = big;
+		ListInEnum = NO;
+		SortNumber = 204;
+	}
 )
EOF
In the end it looks like this in Xcode4, notice the different wording in Architectures. Because I am using additional identifiers, there may be backwards incompatibilities.

Xcode4 universal

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)

About

This page contains a single entry from the blog posted on July 22, 2011 1:48 AM.

The previous post in this blog was c2 ac e2 80 a0 probably solved.

The next post in this blog is Why I don't want to live without the Dock Launch indicators.

Many more can be found on the main index page or by looking through the archives.