: ${TERMUX_DEBUG:=""}
: ${TERMUX_PROCESS_DEB:=""}
: ${TERMUX_API_LEVEL:="21"}
-: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="23.0.3"}
+: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="24.0.1"}
: ${TERMUX_NDK_VERSION:="12"}
# Handle command-line arguments:
fi
# Compute standalone toolchain dir, bitness of arch and name of host platform:
-TERMUX_STANDALONE_TOOLCHAIN="$TERMUX_TOPDIR/_lib/android-standalone-toolchain-${TERMUX_ARCH}-ndk${TERMUX_NDK_VERSION}-api${TERMUX_API_LEVEL}-"
+TERMUX_STANDALONE_TOOLCHAIN="$TERMUX_TOPDIR/_lib/toolchain-${TERMUX_ARCH}-ndk${TERMUX_NDK_VERSION}-api${TERMUX_API_LEVEL}-"
if [ "$TERMUX_CLANG" = "" ]; then
TERMUX_STANDALONE_TOOLCHAIN+="gcc4.9"
else
TERMUX_STANDALONE_TOOLCHAIN+="clang38"
fi
+# Bump the below version if a change is made in toolchain setup, to ensure
+# that everyone gets an updated toolchain:
+TERMUX_STANDALONE_TOOLCHAIN+="-v1"
+
if [ "x86_64" = $TERMUX_ARCH -o "aarch64" = $TERMUX_ARCH ]; then
TERMUX_ARCH_BITS=64
else
exit
fi
-echo "termux - building $1 for arch $TERMUX_ARCH..."
-test -t 1 && printf "\033]0;$1...\007"
-
# We do not put all of build-tools/$TERMUX_ANDROID_BUILD_TOOLS_VERSION/ into PATH
# to avoid stuff like arm-linux-androideabi-ld there to conflict with ones from
# the standalone toolchain.
TERMUX_DX=$ANDROID_HOME/build-tools/$TERMUX_ANDROID_BUILD_TOOLS_VERSION/dx
+TERMUX_JACK=$ANDROID_HOME/build-tools/$TERMUX_ANDROID_BUILD_TOOLS_VERSION/jack.jar
+TERMUX_JILL=$ANDROID_HOME/build-tools/$TERMUX_ANDROID_BUILD_TOOLS_VERSION/jill.jar
# We put this after system PATH to avoid picking up toolchain stripped python
export PATH=$PATH:$TERMUX_STANDALONE_TOOLCHAIN/bin
# Make $TERMUX_TAR and $TERMUX_TOUCH point at gnu versions:
export TERMUX_TAR="tar"
-test `uname` = "Darwin" && TERMUX_TAR=gnutar
+test `uname` = "Darwin" && TERMUX_TAR=gtar
export TERMUX_TOUCH="touch"
test `uname` = "Darwin" && TERMUX_TOUCH=gtouch
export prefix=${TERMUX_PREFIX} # prefix is used by some makefiles
-#export ACLOCAL="aclocal -I $TERMUX_PREFIX/share/aclocal"
+export PREFIX=${TERMUX_PREFIX} # PREFIX is used by some makefiles
+
export AR=$TERMUX_HOST_PLATFORM-ar
if [ "$TERMUX_CLANG" = "" ]; then
export AS=${TERMUX_HOST_PLATFORM}-gcc
LDFLAGS+=" -Wl,-rpath-link,$TERMUX_PREFIX/lib"
LDFLAGS+=" -Wl,-rpath-link,$TERMUX_STANDALONE_TOOLCHAIN/sysroot/usr/lib"
elif [ $TERMUX_ARCH = "x86_64" ]; then
- continue
+ :
else
echo "Error: Invalid arch '$TERMUX_ARCH' - support arches are 'arm', 'i686', 'aarch64', 'x86_64'"
exit 1
else
_TERMUX_TOOLCHAIN="${_TERMUX_NDK_TOOLCHAIN_NAME}-clang"
fi
+
+ # 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):
+ _TERMUX_TOOLCHAIN_TMPDIR=${TERMUX_STANDALONE_TOOLCHAIN}-tmp
+ rm -Rf $_TERMUX_TOOLCHAIN_TMPDIR
+
bash $NDK/build/tools/make-standalone-toolchain.sh --platform=android-$TERMUX_API_LEVEL --toolchain=${_TERMUX_TOOLCHAIN} \
- --install-dir=$TERMUX_STANDALONE_TOOLCHAIN
+ --install-dir=$_TERMUX_TOOLCHAIN_TMPDIR
if [ "arm" = $TERMUX_ARCH ]; then
# Fix to allow e.g. <bits/c++config.h> to be included:
- cp $TERMUX_STANDALONE_TOOLCHAIN/include/c++/4.9/arm-linux-androideabi/armv7-a/bits/* $TERMUX_STANDALONE_TOOLCHAIN/include/c++/4.9/bits
+ cp $_TERMUX_TOOLCHAIN_TMPDIR/include/c++/4.9.x/arm-linux-androideabi/armv7-a/bits/* $_TERMUX_TOOLCHAIN_TMPDIR/include/c++/4.9.x/bits
fi
- cd $TERMUX_STANDALONE_TOOLCHAIN/sysroot
+ 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" | \
done
# elf.h is taken from glibc since the elf.h in the NDK is lacking.
# sysexits.h is header-only and used by a few programs.
- cp $TERMUX_SCRIPTDIR/ndk_patches/{elf.h,sysexits.h} $TERMUX_STANDALONE_TOOLCHAIN/sysroot/usr/include
+ cp $TERMUX_SCRIPTDIR/ndk_patches/{elf.h,sysexits.h} $_TERMUX_TOOLCHAIN_TMPDIR/sysroot/usr/include
+ mv $_TERMUX_TOOLCHAIN_TMPDIR $TERMUX_STANDALONE_TOOLCHAIN
+fi
+
+if [ ! -f $TERMUX_PREFIX/lib/libstdc++.so ]; then
+ # Setup libgnustl_shared.so in $PREFIX/lib and libstdc++.so as a symlink 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 libgnustl_shared.so library will be packaged in the libgnustl package
+ # which is part of the base Termux installation.
+ mkdir -p $TERMUX_PREFIX/lib
+ cd $TERMUX_PREFIX/lib
+ _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib/libgnustl_shared.so
+ if [ $TERMUX_ARCH = arm ]; then
+ _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib/armv7-a/libgnustl_shared.so
+ elif [ $TERMUX_ARCH = x86_64 ]; then
+ _STL_LIBFILE=$TERMUX_STANDALONE_TOOLCHAIN/${TERMUX_HOST_PLATFORM}/lib64/libgnustl_shared.so
+ fi
+ cp $_STL_LIBFILE .
+ ln -f -s libgnustl_shared.so libstdc++.so
fi
export TERMUX_COMMON_CACHEDIR="$TERMUX_TOPDIR/_cache"
TERMUX_PKG_KEEP_HEADER_FILES="false"
TERMUX_PKG_ESSENTIAL=""
TERMUX_PKG_CONFLICTS="" # https://www.debian.org/doc/debian-policy/ch-relationships.html#s-conflicts
+TERMUX_PKG_REPLACES=""
TERMUX_PKG_CONFFILES=""
TERMUX_PKG_INCLUDE_IN_DEVPACKAGE=""
+TERMUX_PKG_DEVPACKAGE_DEPENDS=""
# Set if a host build should be done in TERMUX_PKG_HOSTBUILD_DIR:
TERMUX_PKG_HOSTBUILD=""
TERMUX_PKG_MAINTAINER="Fredrik Fornwall <fredrik@fornwall.net>"
# Cleanup old state
-rm -Rf $TERMUX_PKG_BUILDDIR $TERMUX_PKG_PACKAGEDIR $TERMUX_PKG_SRCDIR $TERMUX_PKG_TMPDIR $TERMUX_PKG_MASSAGEDIR
+rm -Rf $TERMUX_PKG_BUILDDIR $TERMUX_PKG_PACKAGEDIR $TERMUX_PKG_SRCDIR $TERMUX_PKG_TMPDIR $TERMUX_PKG_MASSAGEDIR
# If $TERMUX_PREFIX already exists, it may have been built for a different arch
TERMUX_ARCH_FILE=/data/TERMUX_ARCH
DESTINATION="$2"
TMPFILE=`mktemp $TERMUX_PKG_TMPDIR/download.XXXXXXXXX`
- for i in 1 2 3; do
+ for i in 1 2 3 4 5 6; do
if curl -L --fail --retry 2 -o "$TMPFILE" "$URL"; then
mv "$TMPFILE" "$DESTINATION"
return
else
echo "Download of $1 failed (attempt $i/3)" 1>&2
- sleep 6
+ sleep 45
fi
done
echo "Failed to download $1 - exiting" 1>&2
cd $TERMUX_PKG_TMPDIR
filename=`basename $TERMUX_PKG_SRCURL`
file=$TERMUX_PKG_CACHEDIR/$filename
- # Set "TERMUX_PKG_NO_SRC_CACHE=yes" in package to never cache packages, such as in git builds:
- test -n ${TERMUX_PKG_NO_SRC_CACHE-""} -o ! -f $file && termux_download $TERMUX_PKG_SRCURL $file
+ test ! -f $file && termux_download $TERMUX_PKG_SRCURL $file
if [ "x$TERMUX_PKG_FOLDERNAME" = "x" ]; then
folder=`basename $filename .tar.bz2` && folder=`basename $folder .tar.gz` && folder=`basename $folder .tar.xz` && folder=`basename $folder .tar.lz` && folder=`basename $folder .tgz` && folder=`basename $folder .zip`
folder=`echo $folder | sed 's/_/-/'` # dpkg uses _ in tar filename, but - in folder
fi
rm -Rf $folder
if [ ${file##*.} = zip ]; then
- unzip $file
+ unzip -q $file
else
$TERMUX_TAR xf $file
fi
find . -exec chmod u+w,o-rwx \{\} \;
# .. strip binaries (setting them as writeable first)
if [ "$TERMUX_DEBUG" = "" ]; then
- find . -type f | xargs file | grep -E "(executable|shared object)" | grep ELF | cut -f 1 -d : | xargs $STRIP --strip-unneeded --preserve-dates -R '.gnu.version*'
+ find . -type f | xargs -r file | grep -E "(executable|shared object)" | grep ELF | cut -f 1 -d : | xargs -r $STRIP --strip-unneeded --preserve-dates -R '.gnu.version*'
fi
# Fix shebang paths:
for file in `find -L . -type f`; do
set -e -o pipefail
# Remove DT_ entries which the android 5.1 linker warns about:
if [ "$TERMUX_DEBUG" = "" ]; then
- find . -type f -print0 | xargs -0 $TERMUX_ELF_CLEANER
+ find . -type f -print0 | xargs -r -0 $TERMUX_ELF_CLEANER
fi
test ! -z "$TERMUX_PKG_RM_AFTER_INSTALL" && rm -Rf $TERMUX_PKG_RM_AFTER_INSTALL
_DEVEL_SUBPACKAGE_FILE=$TERMUX_PKG_TMPDIR/${TERMUX_PKG_NAME}-dev.subpackage.sh
echo TERMUX_SUBPKG_INCLUDE=\"include share/man/man3 lib/pkgconfig share/aclocal $TERMUX_PKG_INCLUDE_IN_DEVPACKAGE\" > $_DEVEL_SUBPACKAGE_FILE
echo TERMUX_SUBPKG_DESCRIPTION=\"Development files for ${TERMUX_PKG_NAME}\" >> $_DEVEL_SUBPACKAGE_FILE
- echo TERMUX_SUBPKG_DEPENDS=\"$TERMUX_PKG_NAME\" >> $_DEVEL_SUBPACKAGE_FILE
+ if [ -n "$TERMUX_PKG_DEVPACKAGE_DEPENDS" ]; then
+ echo TERMUX_SUBPKG_DEPENDS=\"$TERMUX_PKG_NAME,$TERMUX_PKG_DEVPACKAGE_DEPENDS\" >> $_DEVEL_SUBPACKAGE_FILE
+ else
+ echo TERMUX_SUBPKG_DEPENDS=\"$TERMUX_PKG_NAME\" >> $_DEVEL_SUBPACKAGE_FILE
+ fi
if [ x$TERMUX_PKG_CONFLICTS != x ]; then
# Assume that dev packages conflicts as well.
echo "TERMUX_SUBPKG_CONFLICTS=${TERMUX_PKG_CONFLICTS}-dev" >> $_DEVEL_SUBPACKAGE_FILE
source $TERMUX_PKG_BUILDER_SCRIPT
+if [ -n "${TERMUX_PKG_BLACKLISTED_ARCHES:=""}" -a "$TERMUX_PKG_BLACKLISTED_ARCHES" != "${TERMUX_PKG_BLACKLISTED_ARCHES/$TERMUX_ARCH/}" ]; then
+ echo "Skipping building $TERMUX_PKG_NAME for arch $TERMUX_ARCH"
+ exit 0
+fi
+
+echo "termux - building $1 for arch $TERMUX_ARCH..."
+test -t 1 && printf "\033]0;$1...\007"
+
# Compute full version:
TERMUX_PKG_FULLVERSION=$TERMUX_PKG_VERSION
if [ "$TERMUX_PKG_BUILD_REVISION" != "0" -o "$TERMUX_PKG_FULLVERSION" != "${TERMUX_PKG_FULLVERSION/-/}" ]; then
test ! -z "$TERMUX_PKG_DEPENDS" && echo "Depends: $TERMUX_PKG_DEPENDS" >> DEBIAN/control
test ! -z "$TERMUX_PKG_ESSENTIAL" && echo "Essential: yes" >> DEBIAN/control
test ! -z "$TERMUX_PKG_CONFLICTS" && echo "Conflicts: $TERMUX_PKG_CONFLICTS" >> DEBIAN/control
+test ! -z "$TERMUX_PKG_REPLACES" && echo "Replaces: $TERMUX_PKG_REPLACES" >> DEBIAN/control
# Create DEBIAN/conffiles (see https://www.debian.org/doc/debian-policy/ap-pkg-conffiles.html):
for f in $TERMUX_PKG_CONFFILES; do echo $TERMUX_PREFIX/$f >> DEBIAN/conffiles; done