#! /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="-nostdinc++ -std=c++11 -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \
             -Wpadded -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="-nostdinc++ -std=c++11 -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+="-nostdinc++ -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"
    ;;
  *-ibm-*)
    hostOS=`uname`
    hostOS=`echo $hostOS | sed -e "s/\s+$//"`
    hostOS=`echo $hostOS | tr '[A-Z]' '[a-z]'`

    if [ $hostOS == "linux" ]
    then
      LDSHARED_FLAGS="-o libc++.so.1 \
        -qmkshrobj -Wl,-soname,libc++.so.1 \
        -lpthread -lrt -lc -lstdc++"
      EXTRA_FLAGS="-qlanglvl=extended0x -D__GLIBCXX__=1"
    else
      LDSHARED_FLAGS="-o shr.o -qmkshrobj -lpthread -bnoquiet"
      EXTRA_FLAGS="-qlanglvl=extended0x"
    fi
    RC_CFLAGS="-qpic=large"
    ;;
  *)
    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 -I../include $FILE
done
case $TRIPLE in
  *-*-mingw*)
  for FILE in ../src/support/win32/*.cpp; do
    $CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -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*)
        ;;
    *-ibm-*)
        if [ $hostOS == "linux" ]
        then
           rm -f libc++.so
           ln -s libc++.so.1 libc++.so
        else #AIX
           rm -f libc++.a
           ar r libc++.a shr.o
        fi
        ;;
    *)
        rm -f libc++.so
        ln -s libc++.so.1 libc++.so
        ;;
esac

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