Mac OS X cross toolchain for Linux, FreeBSD, OpenBSD and Android (Termux)
Go to file
TheAssassin 46231a35cf Fixing shebang on dependency installation script.
The script assumes bash isn't installed which means it shouldn't be run with it.
2014-05-12 20:12:14 +02:00
oclang new compiler wrapper written in C++ 2014-04-06 22:27:59 +02:00
patches fix compiling ld64 with libc++ 2014-05-10 17:30:13 +02:00
tarballs cctools 855 + ld64 236.3 2014-05-10 16:17:16 +02:00
tools Fixing shebang on dependency installation script. 2014-05-12 20:12:14 +02:00
wrapper fix finding intrinsic headers on freebsd 2014-05-08 23:07:42 +02:00
.gitignore new compiler wrapper written in C++ 2014-04-06 22:27:59 +02:00
AUTHORS update AUTHORS 2014-03-26 20:39:20 +01:00
build_gcc.sh get libstdc++ mutex header working with clang + -oc-use-gcc-libs + -mmacosx-version-min= < 10.7 2014-04-23 19:31:49 +02:00
build.sh fix compiling ld64 with libc++ 2014-05-10 17:30:13 +02:00
CHANGELOG cctools 855 + ld64 236.3 2014-05-10 16:17:16 +02:00
cleanup.sh initial commit 2014-03-26 20:28:13 +01:00
LICENSE initial commit 2014-03-26 20:28:13 +01:00
package.sh update package.sh 2014-04-14 22:11:10 +02:00
README.md cctools 855 + ld64 236.3 2014-05-10 16:17:16 +02:00
TODO add libc++ build script 2014-03-26 20:32:55 +01:00

OS X Cross toolchain for Linux, FreeBSD and NetBSD

WHAT IS THE GOAL OF OSXCROSS?

The goal of OSXCross is to provide a well working OS X cross toolchain for Linux, FreeBSD and NetBSD.

HOW DOES IT WORK?

Clang/LLVM is a cross compiler by default and is now available on nearly every Linux distribution,
so we just need a proper port of the cctools (ld, lipo, ...) and the OS X SDK.

If you want, then you can build an up-to-date vanilla GCC as well.

WHAT IS NOT WORKING (YET)?

WHAT CAN I BUILD WITH IT?

Basically everything you can build on OS X with clang/gcc should build with this cross toolchain as well.

INSTALLATION:

Move your packaged SDK to the tarball/ directory.

Then ensure you have the following installed on your Linux/FreeBSD box:

Clang 3.2+, llvm-devel, automake, autogen, libtool, patch,
libxml2-devel (<=10.5 only), uuid-devel, openssl-devel and the bash shell.

Hint 1: You can run 'sudo tools/get_dependencies.sh' to get these automatically.
Hint 2: On Ubuntu 12.04 LTS you can use llvm.org/apt to get a newer version of clang.

Then run ./build.sh to build the cross toolchain.
(It will search 'tarballs' for your SDK and then build in its own directory.)

Don't forget to add the printed `<path>/osxcross-env` to your ~/.profile or ~/.bashrc.
Then either run source ~/.profile or restart your shell session.

That's it. See usage examples below.

Building GCC:

If you want to build GCC as well, then you can do this by running ./build_gcc.sh.
But before you do this, make sure you have got the GCC build depedencies installed on your system,
on debian like systems you can run apt-get install libmpc-dev libmpfr-dev libgmp-dev to install them.

PACKAGING THE SDK:

  1. Boot into OS X
  2. [Download Xcode (used 5.1)]
  3. [Mount Xcode.dmg (Open With -> DiskImageMounter)]
  4. Run: ./tools/gen_sdk_package.sh (from the OSXCross package)
  5. Copy the packaged SDK (*.tar.* or *.pkg) on a USB Stick
  6. Reboot back into Linux
  7. Copy or move the SDK into the tarball/ directory of OSXCross

Step 2. and 3. can be skipped if you have Xcode installed.

USAGE EXAMPLES:

Let's say you want to compile a file called test.cpp, then you can do this by running:
  • Clang:

    • 32 bit: o32-clang++ test.cpp -O3 -o test OR i386-apple-darwinXX-clang++ test.cpp -O3 -o test
    • 64 bit: o64-clang++ test.cpp -O3 -o test OR x86_64-apple-darwinXX-clang++ test.cpp -O3 -o test
  • GCC:

    • 32 bit: o32-g++ test.cpp -O3 -o test OR i386-apple-darwinXX-g++ test.cpp -O3 -o test
    • 64 bit: o64-g++ test.cpp -O3 -o test OR x86_64-apple-darwinXX-g++ test.cpp -O3 -o test

XX= the target version, you can find it out by running osxcross-conf and then see TARGET.

You can use the shortcut o32-... or i386-apple-darwin... what ever you like more.

I'll continue from now on with o32-clang, but remember, you can simply replace it with o32-gcc or i386-apple-darwin....

Building Makefile based projects:
  • make CC=o32-clang CXX=o32-clang++
Building automake based projects:
  • CC=o32-clang CXX=o32-clang++ ./configure --host=i386-apple-darwinXX
Building test.cpp with libc++:

Note: libc++ requires Mac OS X 10.7 or newer! If you really need C++11 for
an older OS X version, then you can do the following:

  1. Build GCC so you have an up-to-date libstdc++
  2. Build your source code with GCC or with clang and '-oc-use-gcc-libs'

Usage Examples:

  • Clang:

    • C++98: o32-clang++ -stdlib=libc++ test.cpp -o test
    • C++11: o32-clang++ -stdlib=libc++ -std=c++11 tes1.cpp -o test
    • C++1y: o32-clang++ -stdlib=libc++ -std=c++1y test1.cpp -o test
  • Clang (shortcut):

    • C++98: o32-clang++-libc++ test.cpp -o test
    • C++11: o32-clang++-libc++ -std=c++11 test.cpp -o test
    • C++1y: o32-clang++-libc++ -std=c++1y test.cpp -o test
  • GCC (defaults to C++11 with libc++)

    • C++11: o32-g++-libc++ test.cpp
    • C++1y: o32-g++-libc++ -std=c++1y test.cpp -o test
  • build the first object file: o32-clang++ test1.cpp -O3 -flto -c
  • build the second object file: o32-clang++ test2.cpp -O3 -flto -c
  • link them with LTO: o32-clang++ -O3 -flto test1.o test2.o -o test
Building a universal binary:
  • Clang:
    • o64-clang++ test.cpp -O3 -arch i386 -arch x86_64 -o test
  • GCC:
    • build the 32 bit binary: o32-g++ test.cpp -O3 -o test.i386
    • build the 64 bit binary: o64-g++ test.cpp -O3 -o test.x86_64
    • use lipo to generate the universal binary: x86_64-apple darwinXX-lipo -create test.i386 test.x86_64 -output test

DEPLOYMENT TARGET:

The default deployment target is Mac OS X 10.5.

However, there are several ways to override the default value:

  1. by passing OSX_VERSION_MIN=10.x to ./build.sh
  2. by passing -mmacosx-version-min=10.x to the compiler
  3. by setting the MACOSX_DEPLOYMENT_TARGET environment variable

>= 10.9 also defaults to libc++ instead of libstdc++, this behavior
can be overriden by explicitly passing -stdlib=libstdc++ to clang.

LICENSE:

  • scripts/wrapper: GPLv2
  • cctools/ld64: APSL 2.0
  • xar: New BSD
  • bc: GPLv3

CREDITS: