+# Setup a standalone Android NDK toolchain. Not to be overridden by packages.
+termux_step_setup_toolchain() {
+ # We put this after system PATH to avoid picking up toolchain stripped python
+ export PATH=$PATH:$TERMUX_STANDALONE_TOOLCHAIN/bin
+
+ export CFLAGS=""
+ export LDFLAGS="-L${TERMUX_PREFIX}/lib"
+
+ if [ "$TERMUX_PKG_CLANG" = "no" ]; then
+ export AS=${TERMUX_HOST_PLATFORM}-gcc
+ export CC=$TERMUX_HOST_PLATFORM-gcc
+ export CXX=$TERMUX_HOST_PLATFORM-g++
+ LDFLAGS+=" -specs=$TERMUX_SCRIPTDIR/termux.spec"
+ CFLAGS+=" -specs=$TERMUX_SCRIPTDIR/termux.spec"
+ else
+ export AS=${TERMUX_HOST_PLATFORM}-clang
+ export CC=$TERMUX_HOST_PLATFORM-clang
+ export CXX=$TERMUX_HOST_PLATFORM-clang++
+ fi
+
+ export AR=$TERMUX_HOST_PLATFORM-ar
+ export CPP=${TERMUX_HOST_PLATFORM}-cpp
+ export CC_FOR_BUILD=gcc
+ export LD=$TERMUX_HOST_PLATFORM-ld
+ export OBJDUMP=$TERMUX_HOST_PLATFORM-objdump
+ # Setup pkg-config for cross-compiling:
+ export PKG_CONFIG=$TERMUX_STANDALONE_TOOLCHAIN/bin/${TERMUX_HOST_PLATFORM}-pkg-config
+ export RANLIB=$TERMUX_HOST_PLATFORM-ranlib
+ export READELF=$TERMUX_HOST_PLATFORM-readelf
+ export STRIP=$TERMUX_HOST_PLATFORM-strip
+
+ # Android 7 started to support DT_RUNPATH (but not DT_RPATH), so we may want
+ # LDFLAGS+="-Wl,-rpath=$TERMUX_PREFIX/lib -Wl,--enable-new-dtags"
+ # and no longer remove DT_RUNPATH in termux-elf-cleaner.
+
+ if [ "$TERMUX_ARCH" = "arm" ]; then
+ # https://developer.android.com/ndk/guides/standalone_toolchain.html#abi_compatibility:
+ # "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"
+ elif [ "$TERMUX_ARCH" = "i686" ]; then
+ # From $NDK/docs/CPU-ARCH-ABIS.html:
+ CFLAGS+=" -march=i686 -msse3 -mstackrealign -mfpmath=sse"
+ elif [ "$TERMUX_ARCH" = "aarch64" ]; then
+ :
+ elif [ "$TERMUX_ARCH" = "x86_64" ]; then
+ :
+ else
+ termux_error_exit "Invalid arch '$TERMUX_ARCH' - support arches are 'arm', 'i686', 'aarch64', 'x86_64'"
+ fi
+
+ if [ -n "$TERMUX_DEBUG" ]; then
+ CFLAGS+=" -g3 -O1 -fstack-protector --param ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
+ else
+ if [ "$TERMUX_PKG_CLANG" = "no" ]; then
+ CFLAGS+=" -Os"
+ else
+ if [ "$TERMUX_PKG_NAME" = "ruby" -a "$TERMUX_ARCH" = arm ]; then
+ # This exception is to avoid a broken ruby on 32-bit arm
+ # with NDK r15c and ruby 2.4.2 - see #1520.
+ CFLAGS+=" -O1"
+ else
+ # -Oz seems good for clang, see https://github.com/android-ndk/ndk/issues/133
+ CFLAGS+=" -Oz"
+ fi
+ fi
+ fi
+
+ export CXXFLAGS="$CFLAGS"
+ export CPPFLAGS="-I${TERMUX_PREFIX}/include"
+
+ if [ "$TERMUX_PKG_DEPENDS" != "${TERMUX_PKG_DEPENDS/libandroid-support/}" ]; then
+ # If using the android support library, link to it and include its headers as system headers:
+ CPPFLAGS+=" -isystem $TERMUX_PREFIX/include/libandroid-support"
+ LDFLAGS+=" -landroid-support"
+ fi
+
+ export ac_cv_func_getpwent=no
+ export ac_cv_func_getpwnam=no
+ export ac_cv_func_getpwuid=no
+ export ac_cv_func_sigsetmask=no
+
+ if [ ! -d $TERMUX_STANDALONE_TOOLCHAIN ]; then
+ # Do not put toolchain in place until we are done with setup, to avoid having a half setup
+ # toolchain left in place if something goes wrong (or process is just aborted):
+ local _TERMUX_TOOLCHAIN_TMPDIR=${TERMUX_STANDALONE_TOOLCHAIN}-tmp
+ rm -Rf $_TERMUX_TOOLCHAIN_TMPDIR
+
+ local _NDK_ARCHNAME=$TERMUX_ARCH
+ if [ "$TERMUX_ARCH" = "aarch64" ]; then
+ _NDK_ARCHNAME=arm64
+ elif [ "$TERMUX_ARCH" = "i686" ]; then
+ _NDK_ARCHNAME=x86
+ fi
+
+ "$NDK/build/tools/make_standalone_toolchain.py" \
+ --api "$TERMUX_PKG_API_LEVEL" \
+ --arch $_NDK_ARCHNAME \
+ --stl=libc++ \
+ --install-dir $_TERMUX_TOOLCHAIN_TMPDIR
+
+ # Remove android-support header wrapping not needed on android-21:
+ rm -Rf $_TERMUX_TOOLCHAIN_TMPDIR/sysroot/usr/local
+
+ local wrapped plusplus CLANG_TARGET=$TERMUX_HOST_PLATFORM
+ if [ $TERMUX_ARCH = arm ]; then CLANG_TARGET=${CLANG_TARGET/arm-/armv7a-}; fi
+ for wrapped in ${TERMUX_HOST_PLATFORM}-clang clang; do
+ for plusplus in "" "++"; do
+ local FILE_TO_REPLACE=$_TERMUX_TOOLCHAIN_TMPDIR/bin/${wrapped}${plusplus}
+ if [ ! -f $FILE_TO_REPLACE ]; then
+ termux_error_exit "No toolchain file to override: $FILE_TO_REPLACE"
+ fi
+ cp "$TERMUX_SCRIPTDIR/scripts/clang-pie-wrapper" $FILE_TO_REPLACE
+ sed -i "s/COMPILER/clang50$plusplus/" $FILE_TO_REPLACE
+ sed -i "s/CLANG_TARGET/$CLANG_TARGET/" $FILE_TO_REPLACE
+ done
+ done
+
+ if [ "$TERMUX_ARCH" = "aarch64" ]; then
+ # Use gold by default to work around https://github.com/android-ndk/ndk/issues/148
+ cp $_TERMUX_TOOLCHAIN_TMPDIR/bin/aarch64-linux-android-ld.gold \
+ $_TERMUX_TOOLCHAIN_TMPDIR/bin/aarch64-linux-android-ld
+ cp $_TERMUX_TOOLCHAIN_TMPDIR/aarch64-linux-android/bin/ld.gold \
+ $_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
+ sed "s%\@TERMUX_PREFIX\@%${TERMUX_PREFIX}%g" "$f" | \
+ sed "s%\@TERMUX_HOME\@%${TERMUX_ANDROID_HOME}%g" | \
+ patch --silent -p1;
+ done
+ # elf.h: Taken from glibc since the elf.h in the NDK is lacking.
+ # ifaddrs.h: Added in android-24 unified headers, use a inline implementation for now.
+ cp "$TERMUX_SCRIPTDIR"/ndk-patches/{elf.h,ifaddrs.h,libintl.h} usr/include
+
+ # Remove <sys/shm.h> from the NDK in favour of that from the libandroid-shmem.
+ # Remove <sys/sem.h> as it doesn't work for non-root.
+ # Remove <iconv.h> as we currently provide it from libandroid-support.
+ # Remove <glob.h> as we currently provide it from libandroid-glob.
+ # Remove <spawn.h> as it's only for future (later than android-27).
+ rm usr/include/sys/{shm.h,sem.h} usr/include/{iconv.h,glob.h,spawn.h}
+
+ sed -i "s/define __ANDROID_API__ __ANDROID_API_FUTURE__/define __ANDROID_API__ $TERMUX_PKG_API_LEVEL/" \
+ usr/include/android/api-level.h
+
+ local _LIBDIR=usr/lib
+ if [ $TERMUX_ARCH = x86_64 ]; then _LIBDIR+=64; fi
+ $TERMUX_ELF_CLEANER $_LIBDIR/*.so
+
+ # zlib is really version 1.2.8 in the Android platform (at least
+ # starting from Android 5), not older as the NDK headers claim.
+ for file in zconf.h zlib.h; do
+ curl -o usr/include/$file \
+ 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 ]; then
+ # Setup libc++_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
+ # We do however want to avoid installing this, to avoid problems where e.g.
+ # libm.so on some i686 devices links against libstdc++.so.
+ # The libc++_shared.so library will be packaged in the libc++ package
+ # which is part of the base Termux installation.
+ mkdir -p "$TERMUX_PREFIX/lib"
+ cd "$TERMUX_PREFIX/lib"
+
+ local _STL_LIBFILE=
+ if [ "$TERMUX_ARCH" = arm ]; then
+ local _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib/armv7-a/$_STL_LIBFILE_NAME
+ elif [ "$TERMUX_ARCH" = x86_64 ]; then
+ local _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib64/$_STL_LIBFILE_NAME
+ else
+ local _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib/$_STL_LIBFILE_NAME
+ fi
+
+ cp "$_STL_LIBFILE" .
+ $STRIP --strip-unneeded $_STL_LIBFILE_NAME
+ $TERMUX_ELF_CLEANER $_STL_LIBFILE_NAME
+ 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"
+ # Create a pkg-config wrapper. We use path to host pkg-config to
+ # avoid picking up a cross-compiled pkg-config later on.
+ local _HOST_PKGCONFIG
+ _HOST_PKGCONFIG=$(which pkg-config)
+ mkdir -p $TERMUX_STANDALONE_TOOLCHAIN/bin "$PKG_CONFIG_LIBDIR"
+ cat > "$PKG_CONFIG" <<-HERE
+ #!/bin/sh
+ export PKG_CONFIG_DIR=
+ export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR
+ exec $_HOST_PKGCONFIG "\$@"
+ HERE
+ chmod +x "$PKG_CONFIG"
+}
+
+# Apply all *.patch files for the package. Not to be overridden by packages.
+termux_step_patch_package() {
+ cd "$TERMUX_PKG_SRCDIR"