X-Git-Url: https://git.distorted.org.uk/~mdw/termux-packages/blobdiff_plain/f37532bb8d4feace63ef29eb14c0b7ed57864c39..01e91d614618d0bb1dc1446b32c08ba6011a301e:/build-package.sh diff --git a/build-package.sh b/build-package.sh index ae140402..5c513186 100755 --- a/build-package.sh +++ b/build-package.sh @@ -29,7 +29,7 @@ test -f $HOME/.termuxrc && . $HOME/.termuxrc if [ ! -d "$NDK" ]; then echo 'ERROR: $NDK not defined as pointing at a directory - define it pointing at a android NDK installation!'; exit 1; fi : ${TERMUX_MAKE_PROCESSES:='4'} : ${TERMUX_TOPDIR:="$HOME/termux"} -: ${TERMUX_ARCH:="arm"} # (arm|aarch64|i686|x86_64) - the 64 bit variants do not work yet +: ${TERMUX_ARCH:="arm"} # (arm|aarch64|i686|x86_64) - the x86_64 arch is not yet used or tested. TERMUX_ARCH_BITS="32" if [ "x86_64" = $TERMUX_ARCH -o "aarch64" = $TERMUX_ARCH ]; then TERMUX_ARCH_BITS="64" @@ -47,7 +47,7 @@ if [ "$TERMUX_CLANG" = "" ]; then else : ${TERMUX_STANDALONE_TOOLCHAIN:="$HOME/lib/android-standalone-toolchain-${TERMUX_ARCH}-api${TERMUX_API_LEVEL}-clang38"} fi -: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="23.0.2"} +: ${TERMUX_ANDROID_BUILD_TOOLS_VERSION:="23.0.3"} # 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. @@ -80,7 +80,7 @@ if [ "$TERMUX_CLANG" = "" ]; then export CXX=$TERMUX_HOST_PLATFORM-g++ _SPECSFLAG="-specs=$TERMUX_SCRIPTDIR/termux.spec" else - export AS=${TERMUX_HOST_PLATFORM}-clang + export AS=${TERMUX_HOST_PLATFORM}-gcc export CC=$TERMUX_HOST_PLATFORM-clang export CXX=$TERMUX_HOST_PLATFORM-clang++ # TODO: clang does not have specs file, how to ensure pie @@ -102,19 +102,11 @@ export CFLAGS="$_SPECSFLAG" export LDFLAGS="$_SPECSFLAG -L${TERMUX_PREFIX}/lib" if [ "$TERMUX_ARCH" = "arm" ]; then - # For hard support: http://blog.alexrp.com/2014/02/18/android-hard-float-support/ - # "First, to utilize the hard float ABI, you must either compile every last component of your application - # as hard float (the -mhard-float GCC/Clang switch), or mark individual functions with the appropriate - # __attribute__ to indicate the desired ABI. For example, to mark a function so that it’s called with the - # soft float ABI, stick __attribute__((pcs("aapcs"))) on it. - # Note that the NDK will link to a libm which uses the aforementioned attribute on all of its functions. - # This means that if you use libm functions a lot, you’re not likely to get much of a boost in those places. - # The way to fix this is to add -mhard-float -D_NDK_MATH_NO_SOFTFP=1 to your GCC/Clang command line. Then - # add -lm_hard to your linker command line (or -Wl,-lm_hard if you just invoke GCC/Clang to link). This will - # make your application link statically to a libm compiled for the hard float ABI. The only downside of this - # is that your application will increase somewhat in size." - CFLAGS+=" -march=armv7-a -mfpu=neon -mhard-float -Wl,--no-warn-mismatch" - LDFLAGS+=" -march=armv7-a -Wl,--no-warn-mismatch" + CFLAGS+=" -march=armv7-a -mfpu=neon -mfloat-abi=softfp" + # "first flag instructs the linker to pick libgcc.a, libgcov.a, and + # crt*.o, which are tailored for armv7-a" + # - https://developer.android.com/ndk/guides/standalone_toolchain.html + LDFLAGS+=" -march=armv7-a -Wl,--fix-cortex-a8" elif [ $TERMUX_ARCH = "i686" ]; then # From $NDK/docs/CPU-ARCH-ABIS.html: CFLAGS+=" -march=i686 -msse3 -mstackrealign -mfpmath=sse" @@ -164,10 +156,9 @@ if [ ! -d $TERMUX_STANDALONE_TOOLCHAIN ]; then patch -p1; echo "PATCHING FILE $f done!" done - # sha1.h was removed from android ndk for platforms above 19, but needed by the aapt package - # JNIHelp.h is also used by aapt - # sysexits.h is header-only and used by some unix code - cp $TERMUX_SCRIPTDIR/ndk_patches/{sha1.h,sysexits.h,JNIHelp.h} $TERMUX_STANDALONE_TOOLCHAIN/sysroot/usr/include + # 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 fi export TERMUX_COMMON_CACHEDIR="$TERMUX_TOPDIR/_cache" @@ -175,7 +166,12 @@ export TERMUX_COMMON_DEBDIR="$TERMUX_TOPDIR/_deb" mkdir -p $TERMUX_COMMON_CACHEDIR $TERMUX_COMMON_DEBDIR # Get fresh versions of config.sub and config.guess -for f in config.sub config.guess; do test ! -f $TERMUX_COMMON_CACHEDIR/$f && curl "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=${f};hb=HEAD" > $TERMUX_COMMON_CACHEDIR/$f; done +for f in config.sub config.guess; do + if [ ! -f $TERMUX_COMMON_CACHEDIR/$f ]; then + termux_download "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=${f};hb=HEAD" $TERMUX_COMMON_CACHEDIR/$f + fi +done + # Have a debian-binary file ready for deb packaging: test ! -f $TERMUX_COMMON_CACHEDIR/debian-binary && echo "2.0" > $TERMUX_COMMON_CACHEDIR/debian-binary # The host tuple that may be given to --host configure flag, but normally autodetected so not needed explicitly @@ -273,7 +269,7 @@ HERE fi TERMUX_ELF_CLEANER=$TERMUX_COMMON_CACHEDIR/termux-elf-cleaner -TERMUX_ELF_CLEANER_SRC=$TERMUX_SCRIPTDIR/packages/termux-tools/termux-elf-cleaner.cpp +TERMUX_ELF_CLEANER_SRC=$TERMUX_SCRIPTDIR/packages/termux-elf-cleaner/termux-elf-cleaner.cpp if [ $TERMUX_ELF_CLEANER_SRC -nt $TERMUX_ELF_CLEANER ]; then g++ -std=c++11 -Wall -Wextra -pedantic -Os $TERMUX_ELF_CLEANER_SRC -o $TERMUX_ELF_CLEANER fi @@ -294,7 +290,7 @@ termux_step_extract_package () { 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 && curl --retry 3 -o $file -L $TERMUX_PKG_SRCURL + test -n ${TERMUX_PKG_NO_SRC_CACHE-""} -o ! -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 @@ -326,7 +322,9 @@ termux_step_patch_package () { cd $TERMUX_PKG_SRCDIR # Suffix patch with ".patch32" or ".patch64" to only apply for these bitnesses: for patch in $TERMUX_PKG_BUILDER_DIR/*.patch{$TERMUX_ARCH_BITS,}; do - test -f $patch && sed "s%\@TERMUX_PREFIX\@%${TERMUX_PREFIX}%g" $patch | patch -p1 + test -f $patch && sed "s%\@TERMUX_PREFIX\@%${TERMUX_PREFIX}%g" $patch | \ + sed "s%\@TERMUX_HOME\@%${TERMUX_ANDROID_HOME}%g" | \ + patch -p1 done find . -name config.sub -exec chmod u+w '{}' \; -exec cp $TERMUX_COMMON_CACHEDIR/config.sub '{}' \; @@ -448,13 +446,22 @@ termux_step_massage () { # Remove lib/charset.alias which is installed by gettext-using packages: rm -f lib/charset.alias + # Remove non-english man pages: test -d share/man && (cd share/man; for f in `ls | grep -v man`; do rm -Rf $f; done ) - # Remove info pages and other docs: - rm -Rf share/info share/doc share/locale + + if [ -z ${TERMUX_PKG_KEEP_INFOPAGES+x} ]; then + # Remove info pages: + rm -Rf share/info + fi + + # Remove other docs: + rm -Rf share/doc share/locale + # Remove old kept libraries (readline): find . -name '*.old' -delete - # .. remove static libraries: + + # Remove static libraries: if [ $TERMUX_PKG_KEEP_STATIC_LIBRARIES = "false" ]; then find . -name '*.a' -delete find . -name '*.la' -delete @@ -517,7 +524,8 @@ termux_step_massage () { for includeset in $TERMUX_SUBPKG_INCLUDE; do _INCLUDE_DIRSET=`dirname $includeset` test "$_INCLUDE_DIRSET" = "." && _INCLUDE_DIRSET="" - if [ -e $includeset ]; then + if [ -e $includeset -o -L $includeset ]; then + # Add the -L clause to handle relative symbolic links: mkdir -p $SUB_PKG_MASSAGE_DIR/$_INCLUDE_DIRSET mv $includeset $SUB_PKG_MASSAGE_DIR/$_INCLUDE_DIRSET fi @@ -573,6 +581,24 @@ termux_step_create_debscripts () { return } +termux_download() { + URL="$1" + DESTINATION="$2" + + TMPFILE=`mktemp $TERMUX_PKG_TMPDIR/download.XXXXXXXXX` + for i in 1 2 3; 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 + fi + done + echo "Failed to download $1 - exiting" 1>&2 + exit 1 +} + termux_setup_golang () { export GOOS=android export CGO_ENABLED=1 @@ -592,7 +618,7 @@ termux_setup_golang () { exit 1 fi - local TERMUX_GO_VERSION=go1.6 + local TERMUX_GO_VERSION=go1.6.2 local TERMUX_GO_PLATFORM=linux-amd64 test `uname` = "Darwin" && TERMUX_GO_PLATFORM=darwin-amd64 @@ -604,7 +630,7 @@ termux_setup_golang () { local TERMUX_BUILDGO_TAR=$TERMUX_COMMON_CACHEDIR/${TERMUX_GO_VERSION}.${TERMUX_GO_PLATFORM}.tar.gz rm -Rf $TERMUX_COMMON_CACHEDIR/go $TERMUX_BUILDGO_FOLDER - curl -o $TERMUX_BUILDGO_TAR https://storage.googleapis.com/golang/${TERMUX_GO_VERSION}.${TERMUX_GO_PLATFORM}.tar.gz + termux_download https://storage.googleapis.com/golang/${TERMUX_GO_VERSION}.${TERMUX_GO_PLATFORM}.tar.gz $TERMUX_BUILDGO_TAR ( cd $TERMUX_COMMON_CACHEDIR; tar xf $TERMUX_BUILDGO_TAR; mv go $TERMUX_BUILDGO_FOLDER; rm $TERMUX_BUILDGO_TAR ) }