e5d9db7ed0
port changes: - misc fixes - add '-L/usr/pkg/lib' for NetBSD - update libobjc2 to r37977 - silence / fix libobjc2 warnings - remove freebsd ifdef in favor of '-isystem /usr/local' - add installhdrs target (cctools-port/issues/2) - prefer glibtoolize over libtoolize - add support for OS X and iOS as host system (cctools-port/issues/1) - add a workaround for a glibc 2.20 bug - link with -rpath to ease finding libLTO - check for __cxa_demangle in -lstdc++ - use std=c++0x instead of -std=gnu++0x - fix ld64 to compile with libstdc++ - fix automake warnings - ld64: enable all architectures This also gets rid of the automake dependency. |
||
---|---|---|
oclang | ||
patches | ||
tarballs | ||
tools | ||
wrapper | ||
.gitignore | ||
AUTHORS | ||
build_clang.sh | ||
build_gcc.sh | ||
build.sh | ||
CHANGELOG | ||
cleanup.sh | ||
LICENSE | ||
package.sh | ||
README.md | ||
TODO |
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 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 tarballs/ directory.
Then ensure you have the following installed on your Linux/BSD box:
Clang 3.2+
, llvm-devel
, patch
, libxml2-devel
(<=10.5 only),
uuid-devel
, openssl-devel
and the bash shell
.
--
You can run 'sudo tools/get_dependencies.sh' to get these automatically.
'[INSTALLPREFIX=...] ./build_clang.sh' can be used to build a recent clang version
from source (requires gcc and g++).
On debian like systems you can also use llvm.org/apt to get a newer version of clang.
But be careful, that repository is known to cause troubles.
--
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:
[GCC_VERSION=4.9.1] [ENABLE_FORTRAN=1] ./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:
[sudo] apt-get install gcc g++ zlib1g-dev libmpc-dev libmpfr-dev libgmp-dev
to install them.
PACKAGING THE SDK:
If you need a recent SDK, then you must do the SDK packaging on OS X.
Recent Xcode images are compressed, but the Linux kernel does not
support HFS+ compression.
Packaging the SDK on an OS X machine:
- [Download Xcode **]
- [Mount Xcode.dmg (Open With -> DiskImageMounter) ***]
- Run: ./tools/gen_sdk_package.sh (from the OSXCross package)
- Copy the packaged SDK (*.tar.* or *.pkg) on a USB Stick
- (On Linux/BSD) Copy or move the SDK into the tarballs/ directory of OSXCross
** Xcode 4.6, 5.0+, 6.0, and the 6.1 Betas are known to work.
*** If you get a dialog with a crossed circle, ignore it, you don't need to install Xcode.
Step 1. and 2. can be skipped if you have Xcode installed.
Packing the SDK on a Linux machine (does NOT work with Xcode 4.3 or later!):
- Download Xcode 4.2 for Snow Leopard **
- Ensure you are downloading the "Snow Leopard" version
- Install
dmg2img
- Run (as root): ./tools/mount_xcode_image.sh /path/to/xcode.dmg
- Follow the instructions printed by ./tools/mount_xcode_image.sh
- Copy or move the SDK into the tarballs/ directory
** SHA1 Sum: 1a06882638996dfbff65ea6b4c6625842903ead3.
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
ORi386-apple-darwinXX-clang++ test.cpp -O3 -o test
- 64 bit:
o64-clang++ test.cpp -O3 -o test
ORx86_64-apple-darwinXX-clang++ test.cpp -O3 -o test
- 32 bit:
-
GCC:
- 32 bit:
o32-g++ test.cpp -O3 -o test
ORi386-apple-darwinXX-g++ test.cpp -O3 -o test
- 64 bit:
o64-g++ test.cpp -O3 -o test
ORx86_64-apple-darwinXX-g++ test.cpp -O3 -o test
- 32 bit:
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:
- Build GCC so you have an up-to-date libstdc++
- 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
- C++98:
-
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
- C++98:
-
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
- C++11:
Building test1.cpp and test2.cpp with LTO (Link Time Optimization):
- 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
- build the 32 bit binary:
DEPLOYMENT TARGET:
The default deployment target is Mac OS X 10.5
.
However, there are several ways to override the default value:
- by passing
OSX_VERSION_MIN=10.x
to./build.sh
- by passing
-mmacosx-version-min=10.x
to the compiler - 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.
x86_64h defaults to Mac OS X 10.8
and requires clang 3.5+.
x86_64h = x86_64 with optimizations for the Intel Haswell Architecture.
LICENSE:
- scripts/wrapper: GPLv2
- cctools/ld64: APSL 2.0
- xar: New BSD