#! /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 "$CXX_LANG" ]
then
    CXX_LANG=c++11
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=${CXX_LANG} -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+="-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
