X-Git-Url: https://git.distorted.org.uk/~mdw/termux-packages/blobdiff_plain/1b11c6fa66441b6b254bf96ac97e868019c1a8b6..8788d3c8fb6091297e52b417b24561d17122ca39:/build-package.sh diff --git a/build-package.sh b/build-package.sh index 34e91818..bed59bbc 100755 --- a/build-package.sh +++ b/build-package.sh @@ -17,8 +17,8 @@ test -f $HOME/.termuxrc && . $HOME/.termuxrc : ${TERMUX_DEBUG:=""} : ${TERMUX_PROCESS_DEB:=""} : ${TERMUX_API_LEVEL:="21"} -: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="23.0.3"} -: ${TERMUX_NDK_VERSION:="11"} +: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="24.0.1"} +: ${TERMUX_NDK_VERSION:="12"} # Handle command-line arguments: show_usage () { @@ -51,12 +51,16 @@ else fi # Compute standalone toolchain dir, bitness of arch and name of host platform: -TERMUX_STANDALONE_TOOLCHAIN="$TERMUX_TOPDIR/_lib/android-standalone-toolchain-${TERMUX_ARCH}-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 @@ -90,25 +94,25 @@ if [ $TERMUX_ARCH = 'all' ]; then 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 @@ -150,7 +154,7 @@ elif [ $TERMUX_ARCH = "aarch64" ]; then 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 @@ -184,13 +188,19 @@ if [ ! -d $TERMUX_STANDALONE_TOOLCHAIN ]; then 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. 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" | \ @@ -198,7 +208,29 @@ if [ ! -d $TERMUX_STANDALONE_TOOLCHAIN ]; then 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" @@ -228,14 +260,16 @@ TERMUX_PKG_KEEP_STATIC_LIBRARIES="false" 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 " # 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 @@ -268,13 +302,13 @@ termux_download() { 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 @@ -344,8 +378,7 @@ termux_step_extract_package () { 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 @@ -354,7 +387,7 @@ termux_step_extract_package () { fi rm -Rf $folder if [ ${file##*.} = zip ]; then - unzip $file + unzip -q $file else $TERMUX_TAR xf $file fi @@ -528,7 +561,7 @@ termux_step_massage () { 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 @@ -537,7 +570,7 @@ termux_step_massage () { 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 @@ -550,7 +583,11 @@ termux_step_massage () { _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 @@ -669,6 +706,14 @@ termux_setup_golang () { 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 @@ -793,6 +838,7 @@ HERE 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