Attach arm issues with C++ exception unwinding
[termux-packages] / build-package.sh
index 54a32d1..e502b17 100755 (executable)
@@ -91,7 +91,7 @@ termux_setup_golang() {
 # Utility function for cmake-built packages to setup a current cmake.
 termux_setup_cmake() {
        local TERMUX_CMAKE_MAJORVESION=3.9
-       local TERMUX_CMAKE_MINORVERSION="0-rc6"
+       local TERMUX_CMAKE_MINORVERSION="0"
        local TERMUX_CMAKE_VERSION=$TERMUX_CMAKE_MAJORVESION.$TERMUX_CMAKE_MINORVERSION
        local TERMUX_CMAKE_TARNAME=cmake-${TERMUX_CMAKE_VERSION}-Linux-x86_64.tar.gz
        local TERMUX_CMAKE_TARFILE=$TERMUX_PKG_TMPDIR/$TERMUX_CMAKE_TARNAME
@@ -99,7 +99,7 @@ termux_setup_cmake() {
        if [ ! -d "$TERMUX_CMAKE_FOLDER" ]; then
                termux_download https://cmake.org/files/v$TERMUX_CMAKE_MAJORVESION/$TERMUX_CMAKE_TARNAME \
                                "$TERMUX_CMAKE_TARFILE" \
-                               68456efed8207381c7724411558e7a3ed6503932f8f3127a3ba640e624026b1a
+                               e714ddd55ab9be7ec5e4d30ca1ceee5e23406d7d3bf14457a67180cf54d9834a
                rm -Rf "$TERMUX_PKG_TMPDIR/cmake-${TERMUX_CMAKE_VERSION}-Linux-x86_64"
                tar xf "$TERMUX_CMAKE_TARFILE" -C "$TERMUX_PKG_TMPDIR"
                mv "$TERMUX_PKG_TMPDIR/cmake-${TERMUX_CMAKE_VERSION}-Linux-x86_64" \
@@ -295,7 +295,7 @@ termux_step_start_build() {
        TERMUX_STANDALONE_TOOLCHAIN="$TERMUX_TOPDIR/_lib/${TERMUX_NDK_VERSION}-${TERMUX_ARCH}-${TERMUX_PKG_API_LEVEL}"
        # Bump the below version if a change is made in toolchain setup to ensure
        # that everyone gets an updated toolchain:
-       TERMUX_STANDALONE_TOOLCHAIN+="-v9"
+       TERMUX_STANDALONE_TOOLCHAIN+="-v11"
 
        if [ -n "${TERMUX_PKG_BLACKLISTED_ARCHES:=""}" ] && [ "$TERMUX_PKG_BLACKLISTED_ARCHES" != "${TERMUX_PKG_BLACKLISTED_ARCHES/$TERMUX_ARCH/}" ]; then
                echo "Skipping building $TERMUX_PKG_NAME for arch $TERMUX_ARCH"
@@ -308,21 +308,6 @@ termux_step_start_build() {
                for p in $TERMUX_ALL_DEPS; do
                        if [ "$p" != "$TERMUX_PKG_NAME" ]; then
                                echo "Building dependency $p if necessary..."
-                               # TODO use apt and dpkg to install instead of building
-                               # Add apt repository and key, update
-                               # TODO move this install to Dockerfile
-                               sudo apt-get update && sudo apt-get install -y software-properties-common
-                               sudo add-apt-repository "deb [arch=all,$TERMUX_ARCH] http://termux.net stable main"
-                               cat $TERMUX_SCRIPTDIR/packages/apt/trusted.gpg | sudo apt-key add -
-                               sudo apt-get update && sudo dpkg --add-architecture $TERMUX_ARCH
-                               sudo apt-get -d install ${p}:${TERMUX_ARCH}
-                               # TODO delete debug info
-                               echo "SGROAT DEBUG"
-                               ls -lah /var/cache/apt/archives
-                               echo "SGROAT DEBUG"
-                               # TODO figure out what the root is?
-                               sudo dpkg --root $TERMUX_PREFIX --configure -a
-                               sudo dpkg --root $TERMUX_PREFIX -i /var/cache/apt/archives/${p}_*_${TERMUX_ARCH}.deb
                                ./build-package.sh -a $TERMUX_ARCH -s "$p"
                        fi
                done
@@ -501,7 +486,7 @@ termux_step_setup_toolchain() {
                # "We recommend using the -mthumb compiler flag to force the generation of 16-bit Thumb-2 instructions".
                # With r13 of the ndk ruby 2.4.0 segfaults when built on arm with clang without -mthumb.
                CFLAGS+=" -march=armv7-a -mfpu=neon -mfloat-abi=softfp -mthumb"
-               LDFLAGS+=" -march=armv7-a -Wl,--fix-cortex-a8"
+               LDFLAGS+=" -march=armv7-a"
        elif [ "$TERMUX_ARCH" = "i686" ]; then
                # From $NDK/docs/CPU-ARCH-ABIS.html:
                CFLAGS+=" -march=i686 -msse3 -mstackrealign -mfpmath=sse"
@@ -577,6 +562,22 @@ termux_step_setup_toolchain() {
                           $_TERMUX_TOOLCHAIN_TMPDIR/aarch64-linux-android/bin/ld
                fi
 
+               if [ "$TERMUX_ARCH" = "arm" ]; then
+                       # Linker wrapper script to add '--exclude-libs libgcc.a', see
+                       # https://github.com/android-ndk/ndk/issues/379
+                       # https://android-review.googlesource.com/#/c/389852/
+                       local linker
+                       for linker in ld ld.bfd ld.gold; do
+                               local wrap_linker=$_TERMUX_TOOLCHAIN_TMPDIR/$TERMUX_HOST_PLATFORM/bin/$linker
+                               local real_linker=$_TERMUX_TOOLCHAIN_TMPDIR/$TERMUX_HOST_PLATFORM/bin/$linker.real
+                               cp $wrap_linker $real_linker
+                               echo '#!/bin/bash' > $wrap_linker
+                               echo -n '`dirname $0`/' >> $wrap_linker
+                               echo -n $linker.real >> $wrap_linker
+                               echo ' --exclude-libs libgcc.a "$@"' >> $wrap_linker
+                       done
+               fi
+
                cd $_TERMUX_TOOLCHAIN_TMPDIR/sysroot
 
                for f in $TERMUX_SCRIPTDIR/ndk-patches/*.patch; do
@@ -607,13 +608,14 @@ termux_step_setup_toolchain() {
                                https://raw.githubusercontent.com/madler/zlib/v1.2.8/$file
                done
                unset file
-
+               cd $_TERMUX_TOOLCHAIN_TMPDIR/include/c++/4.9.x
+                sed "s%\@TERMUX_HOST_PLATFORM\@%${TERMUX_HOST_PLATFORM}%g" $TERMUX_SCRIPTDIR/ndk-patches/*.cpppatch | patch -p1
                mv $_TERMUX_TOOLCHAIN_TMPDIR $TERMUX_STANDALONE_TOOLCHAIN
        fi
 
        local _STL_LIBFILE_NAME=libc++_shared.so
-       if [ ! -f $TERMUX_PREFIX/lib/libstdc++.so ] || [ `readlink $TERMUX_PREFIX/lib/libstdc++.so` != $_STL_LIBFILE_NAME ]; then
-               # Setup libgnustl_shared.so in $PREFIX/lib and libstdc++.so as a symlink to it,
+       if [ ! -f $TERMUX_PREFIX/lib/libstdc++.so ]; then
+               # Setup libgnustl_shared.so in $PREFIX/lib and libstdc++.so as a link to it,
                # so that other C++ using packages links to it instead of the default android
                # C++ library which does not support exceptions or STL:
                # https://developer.android.com/ndk/guides/cpp-support.html
@@ -636,7 +638,12 @@ termux_step_setup_toolchain() {
                cp "$_STL_LIBFILE" .
                $STRIP --strip-unneeded $_STL_LIBFILE_NAME
                $TERMUX_ELF_CLEANER $_STL_LIBFILE_NAME
-               ln -f -s $_STL_LIBFILE_NAME libstdc++.so
+               if [ $TERMUX_ARCH = "arm" ]; then
+                       # Use a linker script to get libunwind.a.
+                       echo 'INPUT(-lunwind -lc++_shared)' > libstdc++.so
+               else
+                       ln -f $_STL_LIBFILE_NAME libstdc++.so
+               fi
        fi
 
        export PKG_CONFIG_LIBDIR="$TERMUX_PKG_CONFIG_LIBDIR"
@@ -856,7 +863,9 @@ termux_step_extract_into_massagedir() {
 
        # Build diff tar with what has changed during the build:
        cd $TERMUX_PREFIX
-       tar -N "$TERMUX_BUILD_TS_FILE" -czf "$TARBALL_ORIG" .
+       tar -N "$TERMUX_BUILD_TS_FILE" \
+               --exclude='lib/libc++_shared.so' --exclude='lib/libstdc++.so' \
+               -czf "$TARBALL_ORIG" .
 
        # Extract tar in order to massage it
        mkdir -p "$TERMUX_PKG_MASSAGEDIR/$TERMUX_PREFIX"