111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#! /bin/sh
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Set the $TRIPLE environment variable to your system's triple before
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# running this script.  If you set $CXX, that will be used to compile
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# the library.  Otherwise we'll use clang++.
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertset -e
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ `basename $(pwd)` != "lib" ]
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    echo "current directory must be lib"
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    exit 1
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$CXX" ]
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    CXX=clang++
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$CXX_LANG" ]
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    CXX_LANG=c++11
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$CC" ]
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    CC=clang
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$MACOSX_DEPLOYMENT_TARGET" ]
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if [ -z "$IPHONEOS_DEPLOYMENT_TARGET" ]
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    then
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        MACOSX_DEPLOYMENT_TARGET=10.7
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    fi
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$RC_ProjectSourceVersion" ]
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  RC_ProjectSourceVersion=1
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertEXTRA_FLAGS="-nostdinc++ -std=${CXX_LANG} -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             -Wstrict-aliasing=2 -Wstrict-overflow=4 "
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcase $TRIPLE in
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *-apple-*)
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if [ -z $RC_XBS ]
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    then
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      RC_CFLAGS="-arch i386 -arch x86_64"
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    fi
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    SOEXT=dylib
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if [ "$MACOSX_DEPLOYMENT_TARGET" = "10.6" ]
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    then
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        EXTRA_FLAGS="-nostdinc++ -std=c++11 -U__STRICT_ANSI__"
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        LDSHARED_FLAGS="-o libc++.1.dylib \
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -dynamiclib -nodefaultlibs -current_version 1 \
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -compatibility_version 1 \
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -install_name /usr/lib/libc++.1.dylib \
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -Wl,-reexport_library,/usr/lib/libc++abi.dylib \
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -Wl,-unexported_symbols_list,libc++unexp.exp  \
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            /usr/lib/libSystem.B.dylib"
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        if [ -n "$SDKROOT" ]
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        then
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            EXTRA_FLAGS+="-isysroot ${SDKROOT} "
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            if echo "${RC_ARCHS}" | grep -q "armv7"  
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            then
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                RE_EXPORT_LINE="${SDKROOT}/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++sjlj-abi.exp"
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            else
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                RE_EXPORT_LINE="-Wl,-reexport_library,${SDKROOT}/usr/lib/libc++abi.dylib"
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            fi
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            CXX=`xcrun -sdk "${SDKROOT}"  -find clang++`
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            CC=`xcrun -sdk "${SDKROOT}"  -find clang`
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        else
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            # Check if we have _LIBCPPABI_VERSION, to determine the reexport list to use.
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            if (echo "#include <cxxabi.h>" | $CXX -E -dM -x c++ - | \
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                grep _LIBCPPABI_VERSION > /dev/null)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            then
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi2.exp"
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            else
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi.exp"
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            fi
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        fi
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        LDSHARED_FLAGS="-o libc++.1.dylib \
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -dynamiclib -nodefaultlibs  \
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -current_version ${RC_ProjectSourceVersion} \
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -compatibility_version 1 \
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -install_name /usr/lib/libc++.1.dylib \
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -lSystem  \
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -Wl,-unexported_symbols_list,libc++unexp.exp  \
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            ${RE_EXPORT_LINE}  \
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -Wl,-force_symbols_not_weak_list,notweak.exp \
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            -Wl,-force_symbols_weak_list,weak.exp"
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    fi
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ;;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *-*-mingw*)
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    # FIXME: removing libgcc and libsupc++ dependencies means porting libcxxrt and LLVM/compiler-rt
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    SOEXT=dll
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    LDSHARED_FLAGS="-o libc++.dll \
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -shared -nodefaultlibs -Wl,--export-all-symbols -Wl,--allow-multiple-definition -Wl,--out-implib,libc++.dll.a \
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -lsupc++ -lpthread -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcr100 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt"
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ;;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *-ibm-*)
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    hostOS=`uname`
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    hostOS=`echo $hostOS | sed -e "s/\s+$//"`
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    hostOS=`echo $hostOS | tr '[A-Z]' '[a-z]'`
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if [ $hostOS = "linux" ]
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    then
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      LDSHARED_FLAGS="-o libc++.so.1 \
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -qmkshrobj -Wl,-soname,libc++.so.1 \
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -lpthread -lrt -lc -lstdc++"
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      EXTRA_FLAGS="-qlanglvl=extended0x -D__GLIBCXX__=1"
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      LDSHARED_FLAGS="-o shr.o -qmkshrobj -lpthread -bnoquiet"
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      EXTRA_FLAGS="-qlanglvl=extended0x"
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    fi
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    RC_CFLAGS="-qpic=large"
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ;;
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *)
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    RC_CFLAGS="-fPIC"
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    SOEXT=so
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    LDSHARED_FLAGS="-o libc++.so.1.0 \
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -shared -nodefaultlibs -Wl,-soname,libc++.so.1 \
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        -lpthread -lrt -lc -lstdc++"
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ;;
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertesac
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$RC_XBS" ]
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    rm -f libc++.1.$SOEXT*
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertset -x
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfor FILE in ../src/*.cpp; do
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    $CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -I../include $FILE
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdone
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcase $TRIPLE in
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *-*-mingw*)
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  for FILE in ../src/support/win32/*.cpp; do
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    $CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -I../include $FILE
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  done
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ;;
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertesac
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert$CC *.o $RC_CFLAGS $LDSHARED_FLAGS $EXTRA_FLAGS
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#libtool -static -o libc++.a *.o
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Create the link for the final library name, so that we can use this directory
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# as a link target for the tests.
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertcase $TRIPLE in
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *-apple-*)
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        rm -f libc++.dylib
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ln -s libc++.1.dylib libc++.dylib
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ;;
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *-*-mingw*)
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ;;
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *-ibm-*)
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        if [ $hostOS = "linux" ]
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        then
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           rm -f libc++.so
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           ln -s libc++.so.1 libc++.so
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        else #AIX
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           rm -f libc++.a
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           ar r libc++.a shr.o
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        fi
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ;;
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *)
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        rm -f libc++.so
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ln -s libc++.so.1 libc++.so
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        ;;
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertesac
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif [ -z "$RC_XBS" ]
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertthen
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    rm *.o
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfi
180