osxcross/oclang/oclang
2014-03-26 20:32:56 +01:00

141 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
pushd "${0%/*}" &>/dev/null
eval `./osxcross-env`
eval `./osxcross-conf`
popd &>/dev/null
type=`basename $0`
if [[ $type == *o64* ]] || [[ $type == *x86_64* ]]; then
ARCH1="x86_64"
ARCH2=$ARCH1
else
if [[ $type == *o32* ]] || [[ $type == *i386* ]]; then
ARCH1="i386"
ARCH2="i686"
else
echo "unknown arch"
exit 1
fi
fi
if [[ $type == *++* ]]; then
COMPILER="clang++"
else
COMPILER="clang"
fi
if [ $COMPILER == "clang++" ] && [[ $type == *libc++* ]]; then
USE_LIBCXX=1
else
USE_LIBCXX=0
fi
TARGET=$ARCH1-apple-$OSXCROSS_TARGET
OSX_VERSION_MIN=$OSXCROSS_OSX_VERSION_MIN
if [ $# -gt 0 ]; then
for p in "$@"
do
if [[ "$p" == -mmacosx-version-min=* ]]; then
OSXCROSS_OSX_VERSION_MIN="default"
OSX_VERSION_MIN=`echo "$p" | tr '=' ' ' | awk '{print $2}'`
continue
fi
if [ "$p" == "-stdlib=libc++" ]; then
USE_LIBCXX=2
continue
fi
if [ "$p" == "-v" ] || [ "$p" == "--version" ]; then
if [ $# -eq 1 ]; then
$COMPILER $OSXCROSS_TARGET_OPTION $TARGET $p
exit $?
fi
fi
done
else
$COMPILER $OSXCROSS_TARGET_OPTION $TARGET
exit $?
fi
if [ $OSXCROSS_OSX_VERSION_MIN != "default" ]; then
OSX_VERSION_MIN_OPT="-mmacosx-version-min=$OSXCROSS_OSX_VERSION_MIN"
else
OSX_VERSION_MIN_OPT=""
fi
export COMPILER_PATH="$OSXCROSS_CCTOOLS_PATH:$COMPILER_PATH"
STDINC=$OSXCROSS_SDK/usr/include
if [ -n "$BUILD_LIBCXX" ]; then
if [ $BUILD_LIBCXX -eq 1 ]; then
# TODO: Write a fake libc++ library (without any symbols)
# once libstdc++ disappears from the SDK.
# Newer versions of clang default to libc++ for >= 10.9,
# so configuring libc++ fails because of the hardcoded
# -lc++ ... (at least with cmake).
OSXCROSS_OPT_ARGS="$OSXCROSS_OPT_ARGS -stdlib=libstdc++"
fi
USE_LIBCXX=0
else
if [ $USE_LIBCXX -eq 0 ]; then
MIN_TARGET_VERSION=`echo "$OSX_VERSION_MIN" | tr '.' ' ' | awk '{printf "%d %d", $1, $2}'`
MIN_TARGET_VERSION_MAJOR=`echo $MIN_TARGET_VERSION | awk '{print $1}'`
MIN_TARGET_VERSION_MINOR=`echo $MIN_TARGET_VERSION | awk '{print $2}'`
if [ $MIN_TARGET_VERSION_MAJOR -ge 10 ] && [ $MIN_TARGET_VERSION_MINOR -ge 9 ]; then
# default to libc++ on >= 10.9
USE_LIBCXX=1
fi
fi
fi
if [ $USE_LIBCXX -ne 0 ]; then
if [ ! -f "$OSXCROSS_SDK/../libcxx_$OSXCROSS_SDK_VERSION/lib/libc++.a" ]; then
echo -e "\e[1mosxcross \e[31merror:\e[0m\e[1m you must build libc++ before you can use it (./build_libcxx.sh)\e[0m" 1>&2
exit 1
fi
CXXINC="-nostdinc++ -cxx-isystem $OSXCROSS_SDK/../libcxx_$OSXCROSS_SDK_VERSION/include/c++/v1"
if [ $USE_LIBCXX -eq 1 ]; then
CXXINC="$CXXINC -stdlib=libc++"
fi
REGEX="\-o\s*[^ ]+\.gch"
if [[ ! "$@" =~ $REGEX ]]; then
if [[ $COMPILER == *clang++* ]]; then
CXXINC="$CXXINC -Qunused-arguments -lc++abi"
fi
CXXINC="$CXXINC -L$OSXCROSS_SDK/../libcxx_$OSXCROSS_SDK_VERSION/lib"
fi
else
CXXINC="-cxx-isystem $OSXCROSS_SDK/usr/lib/gcc/i686-apple-$OSXCROSS_TARGET/4.2.1/include"
CXXINC="$CXXINC -cxx-isystem $OSXCROSS_SDK/usr/include/c++/4.0.0 "
CXXINC="$CXXINC -cxx-isystem $OSXCROSS_SDK/usr/include/c++/4.0.0/$ARCH2-apple-darwin9 "
fi
XMMINTRIN=`readlink "$STDINC/xmmintrin.h"`
if [ $? -eq 0 ] && [ ! -f "$XMMINTRIN" ]; then
pushd "${0%/*}" &>/dev/null
if [ -f "osxcross-fix-intrinsic-headers" ]; then
echo -e "\e[1mosxcross:\e[0m\e[35m fixing intrinsic symlinks...\e[0m" 1>&2
./osxcross-fix-intrinsic-headers $OSXCROSS_SDK || { echo -e "\e[31mfailed.\e[0m" 1>&2 && exit 1; }
echo -e "\e[1mdone.\e[0m" 1>&2
else
echo -e "\e[1mosxcross \e[31merror:\e[0m\e[1m dead intrinsic link found - please re-run ./build.sh\e[0m" 1>&2
exit 1
fi
fi
$COMPILER \
$OSXCROSS_TARGET_OPTION $TARGET -isysroot $OSXCROSS_SDK \
$CXXINC $OSX_VERSION_MIN_OPT -mlinker-version=$OSXCROSS_LINKER_VERSION \
$OSXCROSS_OPT_ARGS ${1+"$@"}
exit $?