#! /bin/sh
#
# Set the $TRIPLE environment variable to your system's triple before
# running this script.  If you set $CXX, that will be used to compile
# the library.  Otherwise we'll use clang++.

set -e

if [ `basename $(pwd)` != "lib" ]
then
    echo "current directory must be lib"
    exit 1
fi

if [ -z "$CXX" ]
then
    CXX=clang++
fi

if [ -z "$CC" ]
then
    CC=clang
fi

if [ -z $MACOSX_DEPLOYMENT_TARGET ]
then
    if [ -z $IPHONEOS_DEPLOYMENT_TARGET ]
    then
        MACOSX_DEPLOYMENT_TARGET=10.7
    fi
fi

if [ -z $RC_ProjectSourceVersion ]
then
  RC_ProjectSourceVersion=1
fi

EXTRA_FLAGS="-std=c++0x -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \
             -Wnewline-eof -Wpadded -Wmissing-prototypes -Wstrict-aliasing=2 \
             -Wstrict-overflow=4"

case $TRIPLE in
  *-apple-*)
    if [ -z $RC_XBS ]
    then
      RC_CFLAGS="-arch i386 -arch x86_64"
    fi
    SOEXT=dylib
    if [ "$MACOSX_DEPLOYMENT_TARGET" == "10.6" ]
    then
        EXTRA_FLAGS="-std=c++0x -U__STRICT_ANSI__"
        LDSHARED_FLAGS="-o libc++.1.dylib \
            -dynamiclib -nodefaultlibs -current_version 1 \
            -compatibility_version 1 \
            -install_name /usr/lib/libc++.1.dylib \
            -Wl,-reexport_library,/usr/lib/libc++abi.dylib \
            -Wl,-unexported_symbols_list,libc++unexp.exp  \
            /usr/lib/libSystem.B.dylib"
    else
        if [ -n "$SDKROOT" ]
        then
            EXTRA_FLAGS+="-isysroot ${SDKROOT}"
            if echo "${RC_ARCHS}" | grep -q "armv7"  
            then
                RE_EXPORT_LINE="${SDKROOT}/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++sjlj-abi.exp"
            else
                RE_EXPORT_LINE="-Wl,-reexport_library,${SDKROOT}/usr/lib/libc++abi.dylib"
            fi
            CXX=`xcrun -sdk "${SDKROOT}"  -find clang++`
            CC=`xcrun -sdk "${SDKROOT}"  -find clang`
        else
            # Check if we have _LIBCPPABI_VERSION, to determine the reexport list to use.
            if (echo "#include <cxxabi.h>" | $CXX -E -dM -x c++ - | \
                grep _LIBCPPABI_VERSION > /dev/null)
            then
                RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi2.exp"
            else
                RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi.exp"
            fi
        fi
        LDSHARED_FLAGS="-o libc++.1.dylib \
            -dynamiclib -nodefaultlibs  \
            -current_version ${RC_ProjectSourceVersion} \
            -compatibility_version 1 \
            -install_name /usr/lib/libc++.1.dylib \
            -lSystem  \
            -Wl,-unexported_symbols_list,libc++unexp.exp  \
            ${RE_EXPORT_LINE}  \
            -Wl,-force_symbols_not_weak_list,notweak.exp \
            -Wl,-force_symbols_weak_list,weak.exp"
    fi
    ;;
  *-*-mingw*)
    # FIXME: removing libgcc and libsupc++ dependencies means porting libcxxrt and LLVM/compiler-rt
    SOEXT=dll
    LDSHARED_FLAGS="-o libc++.dll \
        -shared -nodefaultlibs -Wl,--export-all-symbols -Wl,--allow-multiple-definition -Wl,--out-implib,libc++.dll.a \
        -lsupc++ -lpthread -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcr100 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt"
    ;;
  *)
    RC_CFLAGS="-fPIC"
    SOEXT=so
    LDSHARED_FLAGS="-o libc++.so.1.0 \
        -shared -nodefaultlibs -Wl,-soname,libc++.so.1 \
        -lpthread -lrt -lc -lstdc++"
    ;;
esac

if [ -z $RC_XBS ]
then
    rm -f libc++.1.$SOEXT*
fi

set -x

for FILE in ../src/*.cpp; do
    $CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -nostdinc++ -I../include $FILE
done
case $TRIPLE in
  *-*-mingw*)
  for FILE in ../src/support/win32/*.cpp; do
    $CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -nostdinc++ -I../include $FILE
  done
  ;;
esac
$CC *.o $RC_CFLAGS $LDSHARED_FLAGS $EXTRA_FLAGS

#libtool -static -o libc++.a *.o

# Create the link for the final library name, so that we can use this directory
# as a link target for the tests.
case $TRIPLE in
    *-apple-*)
        rm -f libc++.dylib
        ln -s libc++.1.dylib libc++.dylib
        ;;
    *-*-mingw*)
        ;;
    *)
        rm -f libc++.so
        ln -s libc++.so.1 libc++.so
        ;;
esac

if [ -z $RC_XBS ]
then
    rm *.o
fi
