subsurface/packaging/android/android-build-wrapper.sh

160 lines
5 KiB
Bash
Raw Normal View History

#!/bin/bash -eu
# run this in the top level folder you want to create Android binaries in
#
# it seems that with Qt5.7 (and later) and current cmake there is an odd bug where
# cmake fails reporting :No known features for CXX compiler "GNU". In that
# case simly comment out the "set(property(TARGET Qt5::Core PROPERTY...)"
# at line 101 of
# Qt/5.7/android_armv7/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake
# or at line 95 of
# Qt/5.8/android_armv7/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake
# or at line 105 of
# Qt/5.9/android_armv7/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake
# (this script tries to do this automatically)
exec 1> >(tee ./build.log) 2>&1
USE_X=$(case $- in *x*) echo "-x" ;; esac)
# deal with the command line arguments
while [[ $# -gt 0 ]] ; do
arg="$1"
case $arg in
-prep-only)
# only download the dependencies, don't build
PREP_ONLY="1"
;;
*)
echo "Unknown command line argument $arg"
echo "Usage: $0 [-prep-only]"
exit 1
;;
esac
shift
done
# these are the current versions for Qt, Android SDK & NDK:
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
source "$SCRIPTDIR"/variables.sh
PLATFORM=$(uname)
export SUBSURFACE_SOURCE="$SCRIPTDIR"/../..
if [ "$PLATFORM" = Linux ] ; then
QT_BINARIES=qt-opensource-linux-x64-${LATEST_QT}.run
NDK_BINARIES=${ANDROID_NDK}-linux-x86_64.zip
SDK_TOOLS=sdk-tools-linux-${SDK_VERSION}.zip
else
echo "only on Linux so far"
exit 1
fi
# make sure we have the required commands installed
MISSING=
for i in git cmake autoconf libtool java wget unzip; do
command -v $i >/dev/null ||
if [ $i = libtool ] ; then
MISSING="${MISSING}libtool-bin "
elif [ $i = java ] ; then
MISSING="${MISSING}openjdk-8-jdk "
else
MISSING="${MISSING}${i} "
fi
done
if [ "$MISSING" ] ; then
echo "The following packages are missing: $MISSING"
echo "Please install via your package manager."
exit 1
fi
# first we need to get the Android SDK and NDK
if [ ! -d "$ANDROID_NDK" ] ; then
if [ ! -f "$NDK_BINARIES" ] ; then
wget -q https://dl.google.com/android/repository/"$NDK_BINARIES"
fi
unzip -q "$NDK_BINARIES"
fi
if [ ! -d "$ANDROID_SDK"/build-tools/"${ANDROID_BUILDTOOLS_REVISION}" ] ; then
if [ ! -d "$ANDROID_SDK" ] ; then
if [ ! -f "$SDK_TOOLS" ] ; then
wget -q https://dl.google.com/android/repository/"$SDK_TOOLS"
fi
mkdir "$ANDROID_SDK"
pushd "$ANDROID_SDK"
unzip -q ../"$SDK_TOOLS"
yes | tools/bin/sdkmanager --licenses > /dev/null 2>&1 || echo "d56f5187479451eabf01fb78af6dfcb131a6481e" > licenses/android-sdk-license
cat licenses/android-sdk-license
tools/bin/sdkmanager tools platform-tools 'platforms;'"${ANDROID_PLATFORMS}" 'build-tools;'"${ANDROID_BUILDTOOLS_REVISION}"
echo ""
else
pushd "$ANDROID_SDK"
tools/bin/sdkmanager tools platform-tools 'platforms;'"${ANDROID_PLATFORMS}" 'build-tools;'"${ANDROID_BUILDTOOLS_REVISION}"
fi
popd
fi
# download the Qt installer including Android bits and unpack / install
QT_DOWNLOAD_URL=https://download.qt.io/archive/qt/${QT_VERSION}/${LATEST_QT}/${QT_BINARIES}
if [ ! -d Qt/"${LATEST_QT}"/android_armv7 ] ; then
if [ -d Qt ] ; then
# Over writing an exsisting installation stalls the installation script,
# rename the exsisting Qt folder and notify then user.
mv Qt Qt_OLD
echo "Qt installation found, backing it up to Qt_OLD."
fi
if [ ! -f "${QT_BINARIES}" ] ; then
wget -q "${QT_DOWNLOAD_URL}"
fi
chmod +x ./"${QT_BINARIES}"
./"${QT_BINARIES}" --platform minimal --script "$SCRIPTDIR"/qt-installer-noninteractive.qs --no-force-installations
fi
# patch the cmake / Qt5.7.1 incompatibility mentioned above
sed -i 's/set_property(TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)/# set_property(TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)/' Qt/"${LATEST_QT}"/android_armv7/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake
if [ ! -z ${PREP_ONLY+x} ] ; then
exit 0
fi
if [ ! -d subsurface/libdivecomputer/src ] ; then
pushd subsurface
git submodule init
git submodule update --recursive
popd
fi
# always reconfigure here
rm -f subsurface/libdivecomputer/configure
pushd subsurface/libdivecomputer
autoreconf --install --force
autoreconf --install --force
popd
# and now we need a monotonic build number...
if [ ! -f ./buildnr.dat ] ; then
BUILDNR=0
else
BUILDNR=$(cat ./buildnr.dat)
fi
BUILDNR=$((BUILDNR+1))
echo "${BUILDNR}" > ./buildnr.dat
echo "Building Subsurface-mobile for Android, build nr ${BUILDNR}"
rm -f ./subsurface-mobile-build-arm/build/outputs/apk/*.apk
rm -df ./subsurface-mobile-build-arm/AndroidManifest.xml
if [ "$USE_X" ] ; then
bash "$USE_X" "$SUBSURFACE_SOURCE"/packaging/android/build.sh -buildnr "$BUILDNR" arm "$@"
bash "$USE_X" "$SUBSURFACE_SOURCE"/packaging/android/build.sh -buildnr "$BUILDNR" arm64 "$@"
else
bash "$SUBSURFACE_SOURCE"/packaging/android/build.sh -buildnr "$BUILDNR" arm "$@"
bash "$SUBSURFACE_SOURCE"/packaging/android/build.sh -buildnr "$BUILDNR" arm64 "$@"
fi
ls -l ./subsurface-mobile-build-arm/build/outputs/apk/*.apk