Difference between revisions of "Cross compiling OSX on Linux"

From Lazarus wiki
Jump to navigationJump to search
(category)
(fix syntaxhighlight)
Line 21: Line 21:
 
recommend MacMac OS X10.5.sdk (compatible with Leopard) but it depends on how far back you want to be compatible. MacMac OS X10.5.sdk is located in /Developer/SDKs on the Mac.
 
recommend MacMac OS X10.5.sdk (compatible with Leopard) but it depends on how far back you want to be compatible. MacMac OS X10.5.sdk is located in /Developer/SDKs on the Mac.
 
I put mine at /opt/MacMac OS X10.5.sdk on my Debian box. Example using ssh from your Linux box to copy over the files:
 
I put mine at /opt/MacMac OS X10.5.sdk on my Debian box. Example using ssh from your Linux box to copy over the files:
<bash>
+
<syntaxhighlight lang="bash">
 
su - #become root
 
su - #become root
 
cd /opt
 
cd /opt
 
# all users should have read access to /Developer/SDKs...
 
# all users should have read access to /Developer/SDKs...
 
ssh appleuser@applehostname "cd /Developer/SDKs && tar cz MacOSX10.5.sdk" | tar xz
 
ssh appleuser@applehostname "cd /Developer/SDKs && tar cz MacOSX10.5.sdk" | tar xz
</bash>
+
</syntaxhighlight>
  
 
=== Get odcctools ===
 
=== Get odcctools ===
Line 35: Line 35:
 
CC="gcc -m32" CXX="g++ -m32" ./configure blah blah blah
 
CC="gcc -m32" CXX="g++ -m32" ./configure blah blah blah
  
<bash>
+
<syntaxhighlight lang="bash">
 
aptitude install subversion #if it is not installed already
 
aptitude install subversion #if it is not installed already
 
mkdir ~/svn #store our repositories here, change according to taste
 
mkdir ~/svn #store our repositories here, change according to taste
 
cd ~/svn
 
cd ~/svn
 
svn checkout http://svn.macosforge.org/repository/odcctools/trunk/ odcctools
 
svn checkout http://svn.macosforge.org/repository/odcctools/trunk/ odcctools
</bash>
+
</syntaxhighlight>
 
and build it as
 
and build it as
<bash>
+
<syntaxhighlight lang="bash">
 
cd ~/svn/odcctools
 
cd ~/svn/odcctools
 
bash extract.sh #this creates ~/svn/odcctools/odcctools. Fun, right?
 
bash extract.sh #this creates ~/svn/odcctools/odcctools. Fun, right?
Line 53: Line 53:
 
#compile and install if succesful:
 
#compile and install if succesful:
 
make && make install
 
make && make install
</bash>
+
</syntaxhighlight>
 
This installs the tools in /opt/odcctools.
 
This installs the tools in /opt/odcctools.
 
I've specified gcc 4.4 but it should be okay with other versions.
 
I've specified gcc 4.4 but it should be okay with other versions.
Line 59: Line 59:
 
=== Rebuild FPC ===
 
=== Rebuild FPC ===
 
STEP 3: rebuild FPC (my sources are in ~/hg/pascal)
 
STEP 3: rebuild FPC (my sources are in ~/hg/pascal)
<bash>
+
<syntaxhighlight lang="bash">
 
cd ~/hg/pascal  
 
cd ~/hg/pascal  
 
#if you use hg/mercurial you can see release version:
 
#if you use hg/mercurial you can see release version:
Line 69: Line 69:
 
  INSTALL_PREFIX=/opt/cross \
 
  INSTALL_PREFIX=/opt/cross \
 
  OPT="-gl -gw -godwarfsets -XX -CX -Xd -Fl/opt/MacOSX10.5.sdk/usr/lib"
 
  OPT="-gl -gw -godwarfsets -XX -CX -Xd -Fl/opt/MacOSX10.5.sdk/usr/lib"
</bash>
+
</syntaxhighlight>
 
Note that the options (OPT) as shown are vital, especially -gw.
 
Note that the options (OPT) as shown are vital, especially -gw.
  

Revision as of 09:13, 18 May 2012

Cross compiling for Mac OS X on Linux

Requirements

What you'll need:

[1] an Intel Mac running Leopard, Snow Leopard, or Lion

[2] Xcode installed on your Mac or the original or retail Mac OS X DVD (for the SDK)

[3] a working linux setup (Debian Squeeze in my case)

[4] up to date source for FPC (2.4.x) and Lazarus (0.9.30)

[5] the Open Darwin cctools (odcctools)

Once set up, you won't need the Mac to compile your code.

Copy SDK

STEP 1: copy the SDK from your Mac. You need to install Xcode from your Mac OS X DVD if you've not already done so and copy the SDK to an appropriate location on your Linux box. I'd recommend MacMac OS X10.5.sdk (compatible with Leopard) but it depends on how far back you want to be compatible. MacMac OS X10.5.sdk is located in /Developer/SDKs on the Mac. I put mine at /opt/MacMac OS X10.5.sdk on my Debian box. Example using ssh from your Linux box to copy over the files:

su - #become root
cd /opt
# all users should have read access to /Developer/SDKs...
ssh appleuser@applehostname "cd /Developer/SDKs && tar cz MacOSX10.5.sdk" | tar xz

Get odcctools

STEP 2: grab odcctools from SVN. Odcctools apparently provide binutils for OSX/Darwin.

On 64 bit Linux environments, fpc mailing list users have problems with this step. Perhaps this StackOverflow question and answer can help: in the configure step, you'd apparently need to set CC="gcc -m32" CXX="g++ -m32" ./configure blah blah blah

aptitude install subversion #if it is not installed already
mkdir ~/svn #store our repositories here, change according to taste
cd ~/svn
svn checkout http://svn.macosforge.org/repository/odcctools/trunk/ odcctools

and build it as

cd ~/svn/odcctools
bash extract.sh #this creates ~/svn/odcctools/odcctools. Fun, right?
#if you do not run it in bash, it might run in a c shell and complain
#about pushd not being there, not applying patches, and all kinds of nastiness.
cd ~/svn/odcctools/odcctools
#configure:
CC=gcc-4.4 ./configure --target=i386-darwin \
 --prefix=/opt/odcctools --with-sysroot=/opt/MacOSX10.5.sdk
#compile and install if succesful:
make && make install

This installs the tools in /opt/odcctools. I've specified gcc 4.4 but it should be okay with other versions.

Rebuild FPC

STEP 3: rebuild FPC (my sources are in ~/hg/pascal)

cd ~/hg/pascal 
#if you use hg/mercurial you can see release version:
hg id -bint
 730fd5ffbeb1 16666 fixes_2_4 release_2_4_2
make distclean && FPC=ppc386 make crossall crossinstall \
 CPU_TARGET=i386 OS_TARGET=darwin \
 CROSSBINDIR=/opt/odcctools/bin BINUTILSPREFIX=i386-darwin- \
 INSTALL_PREFIX=/opt/cross \
 OPT="-gl -gw -godwarfsets -XX -CX -Xd -Fl/opt/MacOSX10.5.sdk/usr/lib"

Note that the options (OPT) as shown are vital, especially -gw.

STEP 4: add a darwin (cross-compile) clause to /etc/fpc.cfg

#IFDEF darwin
-Fu/opt/cross/lib/fpc/$fpcversion/units/i386-darwin/
-Fu/opt/cross/lib/fpc/$fpcversion/units/i386-darwin/*
-Fu/opt/cross/lib/fpc/$fpcversion/units/i386-darwin/rtl
-FD/opt/odcctools/bin
#ENDIF

Build Carbon LCL

STEP 5: build the Carbon LCL (in Lazarus)

Be sure to specify the Darwin OS target, i386 CPU target and, most importantly, add the -gw option. Perform a Clean+Build of the LCL and the Package Registration.

You should now be able to use Lazarus in Linux to build for Mac OS X.

Gotcha's

There are two more gotcha's when cross-compiling to OS X:

First, be sure to specify the -gw in your projects to avoid problems reported in (the unfixable) FPC bug #12001.

Second, be sure to specify the -XR option pointing to your SDK root, in my case -XR/opt/MacMac OS X10.5.sdk, or the Darwin linker will try to link to the wrong startup object (/usr/lib/crt1.o).

Source

Fpc Mailing list 6 August 2011 post by Bruce titled "Re: Cross Compiling from Linux to a Mac OS X 10.5 or 10.6 target. How? [SOLVED]" Adapted by BigChimp