Rev 406 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/bin/bash
set -o pipefail
#
# Set the following paths according to your installation.
#
QT_VERSION="6.6.1"
QT_VERSION_MAJOR=6
QT_PATH="/opt/Qt"
QT_ABI="x86_64"
QT_HOST="gcc_64"
QTBASE="${QT_PATH}/$QT_VERSION"
QTDIR="${QTBASE}/android_${QT_ABI}"
ANDROID_HOME="$HOME/Android/Sdk"
ANDROID_NDK_PLATFORM="30"
ANDROID_NDK_ROOT="${ANDROID_HOME}/ndk/25.2.9519653"
ANDROID_SDK_ROOT="${ANDROID_HOME}"
ANDROID_PLATFORM="android-$ANDROID_NDK_PLATFORM"
if [ ! -z $OSTYPE ] && [[ "$OSTYPE" == *darwin* ]]
then
QTMACROS="${QT_PATH}/Qt?Creator.app/Contents/Resources/package-manager"
else
QTMACROS="${QT_PATH}/Tools/QtCreator/share/qtcreator/package-manager"
fi
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export PATH="${QT_PATH}/Tools/Ninja:${QT_PATH}/Tools/CMake/bin:${QTDIR}/bin:$PATH"
ANDROID_TOOLCHAIN="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake"
KEYSTORE="$HOME/projects/tpanel/src/android/android_release.keystore"
KEYALIAS="tpanel"
PASSFILE="$HOME/.keypass"
LOGFILE="`pwd`/build.log"
BUILDDIR="tpanel-6-build"
export EXT_LIB_PATH="$HOME/Android/distribution"
export EXTRA_PATH="$HOME/Android/extras"
export SSL_PATH="$HOME/Android/openssl"
#export ANDROID_ABIS="arm64-v8a armeabi-v7a x86_64 x86"
# This programs must be taken from the Qt framework
QMAKE="$QTDIR/bin/qmake"
ANDROIDDEPLOYQT="$QTBASE/${QT_HOST}/bin/androiddeployqt"
if [ ! -z $OSTYPE ] && [[ "$OSTYPE" == *darwin* ]]
then
CMAKE="${QT_PATH}/Tools/CMake/CMake.app/Contents/bin/cmake"
C_COMPILER_CLANG="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang"
CXX_COMPILER_CLANG="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++"
else
CMAKE="${QT_PATH}/Tools/CMake/bin/cmake"
fi
GREP="/usr/bin/grep"
SED="/usr/bin/sed"
#------------------------------------------------------------------------------
# DO NOT CHANGE ANYTHING BEYOND THIS LINE UNLESS YOU KNOW WHAT YOU'RE DOING!!
#------------------------------------------------------------------------------
# Getting the current directory
CURDIR=`pwd`
#
# The following statement determines the number of CPUs. This is used for the
# cmake command to let run the compiler in parallel.
#
CPUS=2
type nproc > /dev/null 2>&1
if [ $? -eq 0 ]
then
CPUS=`nproc`
fi
function usage() {
echo "build_android.sh [clean] [debug] [deploy] [sign] [list-avds] [help|--help|-h]"
echo " clean Delete old build, if there is one, and start a new clean build."
echo " debug Create a binary with debugging enabled."
echo " deploy Deploy the binary to an Android emulator."
echo " sign Sign the resulting APK file. This requires a file named"
echo " \"\$HOME/.keypass\" containing the password and has read"
echo " permissions for the owner only (0400 or 0600). If this file"
echo " is missing, the script asks for the password."
echo " verbose | --verbose | -v"
echo " Prints the commands used to create the target file."
echo " list-avds List all available AVDs and exit."
echo
echo " help | --help | -h Displays this help screen and exit."
echo
echo "Without parameters the source is compiled, if there were changes, and then"
echo "an Android package is created. This package will be an unsigned release APK."
}
function log() {
echo "$@"
echo "$@" >> ${LOGFILE}
}
> ${LOGFILE}
# Test command line for parameters and set options
OPT_CLEAN=0
OPT_DEBUG=0
OPT_DEPLOY=0
OPT_SIGN=0
OPT_VERBOSE=0
for par in "$@"
do
if [ "$par" == "clean" ]
then
OPT_CLEAN=1
elif [ "$par" == "debug" ]
then
OPT_DEBUG=1
elif [ "$par" == "deploy" ]
then
OPT_DEPLOY=1
elif [ "$par" == "sign" ]
then
OPT_SIGN=1
elif [ "$par" == "list-avds" ] || [ "$par" == "-list-avds" ]
then
${ANDROID_SDK_ROOT}/tools/emulator -list-avds
exit 0
elif [ "$par" == "--verbose" ] || [ "$par" == "-v" ] || [ "$par" == "verbose" ]
then
OPT_VERBOSE=1
elif [ "$par" == "help" ] || [ "$par" == "--help" ] || [ "$par" == "-h" ]
then
usage
exit 0
fi
done
if [ $OPT_DEBUG -eq 1 ] && [ $OPT_SIGN -eq 1 ]
then
log "You can't sign a debugging version!"
exit 1
fi
if [ $OPT_CLEAN -eq 1 ]
then
log "Starting a clean build by deleting a maybe existing old build ..."
rm -rf "$BUILDDIR"
fi
if [ ! -d "$BUILDDIR" ] || [ ! -f "$BUILDDIR/build.ninja" ]
then
if [ ! -d "$BUILDDIR" ]
then
log "Crating new build directory \"$BUILDDIR\" ..."
mkdir "${BUILDDIR}" > /dev/null 2>&1
mkdir -p "${BUILDDIR}/src/.qtc/package-manager" > /dev/null 2>&1
if [ $? -ne 0 ]
then
log "Error creating a directory!"
exit 1
fi
log "Copying cmake macros from $QTMACROS ..."
cp ${QTMACROS}/* ${BUILDDIR}/src/.qtc/package-manager > /dev/null 2>&1
if [ $? -ne 0 ]
then
log "Error copiing cmake macros!"
exit 1
fi
fi
log "Changing into build directory \"$BUILDDIR\" ..."
cd "$BUILDDIR"
log "Creating Makefile ..."
_dbg=""
if [ $OPT_DEBUG -eq 1 ]
then
_dbg="-DCMAKE_BUILD_TYPE:STRING=Debug"
else
_dbg="-DCMAKE_BUILD_TYPE:STRING=Release"
fi
if [ $OPT_VERBOSE -eq 1 ]
then
echo "${CMAKE} -S ${CURDIR} -B ${CURDIR}/${BUILDDIR} -DCMAKE_GENERATOR:STRING=Ninja ${_dbg} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=${CURDIR}/${BUILDDIR}/src/.qtc/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:FILEPATH=${QMAKE} -DCMAKE_PREFIX_PATH:PATH=${QTDIR} -DCMAKE_C_COMPILER:FILEPATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -DCMAKE_CXX_COMPILER:FILEPATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -DANDROID_PLATFORM:STRING=${ANDROID_PLATFORM} -DANDROID_NDK:PATH=${ANDROID_NDK_ROOT} -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${ANDROID_TOOLCHAIN} -DANDROID_USE_LEGACY_TOOLCHAIN_FILE:BOOL=OFF -DANDROID_ABI:STRING=${QT_ABI} -DANDROID_STL:STRING=c++_shared -DCMAKE_FIND_ROOT_PATH:PATH=${QTDIR} -DQT_NO_GLOBAL_APK_TARGET_PART_OF_ALL:BOOL=ON -DQT_HOST_PATH:PATH=${QTBASE}/gcc_64 -DANDROID_SDK_ROOT:PATH=${ANDROID_HOME} -DQT_ANDROID_BUILD_ALL_ABIS:BOOL=ON -DQT_ANDROID_ABIS:STRING=\"arm64-v8a
;armeabi-v7a;x86;x86_64\""
fi
${CMAKE} -S ${CURDIR} -B ${CURDIR}/${BUILDDIR} \
-DCMAKE_GENERATOR:STRING=Ninja ${_dbg} \
-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=${CURDIR}/${BUILDDIR}/src/.qtc/package-manager/auto-setup.cmake \
-DQT_QMAKE_EXECUTABLE:FILEPATH=${QMAKE} \
-DCMAKE_PREFIX_PATH:PATH=${QTDIR} \
-DCMAKE_C_COMPILER:FILEPATH=${C_COMPILER_CLANG} \
-DCMAKE_CXX_COMPILER:FILEPATH=${CXX_COMPILER_CLANG} \
-DANDROID_PLATFORM:STRING=${ANDROID_PLATFORM} \
-DANDROID_NDK:PATH=${ANDROID_NDK_ROOT} \
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${ANDROID_TOOLCHAIN} \
-DANDROID_USE_LEGACY_TOOLCHAIN_FILE:BOOL=OFF \
-DANDROID_ABI:STRING=${QT_ABI} \
-DANDROID_STL:STRING=c++_shared \
-DCMAKE_FIND_ROOT_PATH:PATH=${QTDIR} \
-DQT_NO_GLOBAL_APK_TARGET_PART_OF_ALL:BOOL=ON \
-DQT_HOST_PATH:PATH=${QTBASE}/${QT_HOST} \
-DANDROID_SDK_ROOT:PATH=${ANDROID_HOME} \
-DQT_ANDROID_BUILD_ALL_ABIS:BOOL=ON \
-DQT_ANDROID_ABIS:STRING="arm64-v8a;armeabi-v7a;x86;x86_64" \
2>&1 | tee -a ${LOGFILE}
if [ $? -ne 0 ]
then
log "Error creating a Makefile!"
exit 1
fi
else
log "Changing into build directory \"$BUILDDIR\" ..."
cd "$BUILDDIR"
fi
log "Compiling the source and using ${CPUS} cpus..."
if [ $OPT_VERBOSE -eq 1 ]
then
echo "${CMAKE} --build "${CURDIR}/${BUILDDIR}" --target all -j${CPUS}"
fi
${CMAKE} --build "${CURDIR}/${BUILDDIR}" --target all -j${CPUS} 2>&1 | tee -a ${LOGFILE}
if [ $? -ne 0 ]
then
log "Error compiling the code!"
exit 1
fi
log "Creating an Android binary (apk) file ..."
_install=""
_pass=""
if [ $OPT_DEPLOY -eq 1 ]
then
_install="--reinstall"
fi
if [ $OPT_DEBUG -eq 0 ] && [ $OPT_SIGN -eq 1 ]
then
if [ -f "$HOME/.keypass" ]
then
_perm=`stat -c %a "$HOME/.keypass"`
if [ $_perm -ne 400 ] && [ $_perm -ne 600 ]
then
echo "The file \"$HOME/.keypass\" must have permission 0400 or 0600. Ignoring file!"
read -s -p "Password of Android keystore: " _pass
else
_pass=`cat $HOME/.keypass`
fi
else
read -s -p "Password of Android keystore: " _pass
fi
_verbose=""
if [ $OPT_VERBOSE -eq 1 ]
then
echo "${ANDROIDDEPLOYQT} --input ${CURDIR}/${BUILDDIR}/src/android-tpanel-deployment-settings.json --output ${CURDIR}/${BUILDDIR}/src/android-build --android-platform ${ANDROID_PLATFORM} --jdk ${JAVA_HOME} --gradle --release --verbose --sign ${KEYSTORE} ${KEYALIAS} --storepass "${_pass}" ${_install}"
_verbose="--verbose"
fi
${ANDROIDDEPLOYQT} --input ${CURDIR}/${BUILDDIR}/src/android-tpanel-deployment-settings.json \
--output ${CURDIR}/${BUILDDIR}/src/android-build \
--android-platform ${ANDROID_PLATFORM} \
--jdk ${JAVA_HOME} \
--gradle --release ${_verbose} \
--sign ${KEYSTORE} ${KEYALIAS} \
--storepass "${_pass}" ${_install} 2>&1 | tee -a ${LOGFILE}
else
_verbose=""
if [ $OPT_VERBOSE -eq 1 ]
then
echo "${ANDROIDDEPLOYQT} --input ${CURDIR}/${BUILDDIR}/src/android-tpanel-deployment-settings.json --output ${CURDIR}/${BUILDDIR}/src/android-build --android-platform ${ANDROID_PLATFORM} --jdk ${JAVA_HOME} --gradle --verbose ${_install}"
_verbose="--verbose"
fi
${ANDROIDDEPLOYQT} --input ${CURDIR}/${BUILDDIR}/src/android-tpanel-deployment-settings.json \
--output ${CURDIR}/${BUILDDIR}/src/android-build \
--android-platform ${ANDROID_PLATFORM} \
--jdk ${JAVA_HOME} \
--gradle ${_verbose} ${_install} 2>&1 | tee -a ${LOGFILE}
fi
if [ $? -ne 0 ]
then
log "Error building an Android binary file!"
exit 1
fi
exit 0