File indexing completed on 2024-05-12 16:02:31

0001 #!/bin/bash -e
0002 #
0003 #  SPDX-License-Identifier: GPL-3.0-or-later
0004 #
0005 
0006 # Example: androidbuild.sh -p=all --src=/home/sh_zam/workspace/krita --build-type=Release --build-root=/home/sh_zam/workspace/test-kreeta --ndk-path=/home/sh_zam/Android/Sdk/ndk-bundle --sdk-path=/home/sh_zam/Android/Sdk --api-level=21 --android-abi=armeabi-v7a --qt-path=/home/sh_zam/Qt/5.12.1/android_armv7
0007 
0008 set -e
0009 set -x
0010 
0011 echoerr() { printf "ERROR: %s\n" "$*" >&2;  }
0012 
0013 print_usage() {
0014     printf "\nUsage: "$0" [-p=PACKAGE] [ARGUMENTS..]\n"
0015     printf "Packages: [all|krita-bin|apk|qt|3rdparty|plugins|boost|kf5]\n"
0016     printf "Arguments: \n"
0017     printf  "\t--src=PATH                  Source files\n"
0018     printf  "\t--build-type=TYPE          TYPE=[Debug|RelWithDebInfo|Release]\n"
0019     printf  "\t--build-root=PATH          Path to build folder\n"
0020     printf  "\t--qt-path=PATH             Path to qt libs(optional)\n"
0021     printf  "\t--ndk-path=PATH            Android NDK root path\n"
0022     printf  "\t--sdk-path=PATH            Android SDK root path\n"
0023     printf  "\t--api-level=NUMBER         API level >= 21\n"
0024     printf  "\t--android-abi=ABI          ABI=[armeabi-v7a|arm64-v8a|x86|x86_64]\n"
0025 }
0026 
0027 # check if the argument is passed
0028 check_exists() {
0029     if [[ ! -d ${!1} ]]; then
0030         echoerr "$1 not specified or does not exist"
0031         print_usage
0032         exit
0033     fi
0034 }
0035 
0036 setup_directories() {
0037     export DOWNLOADS_DIR=$BUILD_ROOT/d
0038     export DEPS_BUILD=$BUILD_ROOT/b
0039     export PLUGINS_BUILD=$BUILD_ROOT/p
0040     export THIRDPARTY_INSTALL=$BUILD_ROOT/i
0041 
0042     if [[ ! -d $DOWNLOADS_DIR ]]; then
0043         mkdir $DOWNLOADS_DIR -p
0044     fi
0045 
0046     if [[ ! -d $DEPS_BUILD ]]; then
0047         mkdir $DEPS_BUILD -p
0048     fi
0049 
0050     if [[ ! -d $PLUGINS_BUILD ]]; then
0051         mkdir $PLUGINS_BUILD -p
0052     fi
0053 
0054     if [[ ! -d $THIRDPARTY_INSTALL ]]; then
0055         mkdir $THIRDPARTY_INSTALL -p
0056     fi
0057 }
0058 
0059 configure_ext() {
0060     cd $DEPS_BUILD
0061     cmake $KRITA_ROOT/3rdparty                                                          \
0062         -DINSTALL_ROOT=$THIRDPARTY_INSTALL                                              \
0063         -DEXTERNALS_DOWNLOAD_DIR=$DOWNLOADS_DIR                                         \
0064         -DCMAKE_INSTALL_PREFIX=$THIRDPARTY_INSTALL                                      \
0065         -DCMAKE_TOOLCHAIN_FILE=$CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake   \
0066         -DANDROID_ABI=$ANDROID_ABI                                                      \
0067         -DANDROID_STL=c++_shared                                                        \
0068         -DANDROID_PLATFORM=$ANDROID_NATIVE_API_LEVEL                                    \
0069         -DANDROID_SDK_ROOT=$ANDROID_SDK_ROOT                                            \
0070         -DCMAKE_FIND_ROOT_PATH="$QT_ANDROID;$BUILD_ROOT/i"
0071     cd $BUILD_ROOT
0072 }
0073 
0074 configure_plugins() {
0075     cd $PLUGINS_BUILD
0076     cmake $KRITA_ROOT/3rdparty_plugins \
0077         -DINSTALL_ROOT=$INSTALL_PREFIX                                                  \
0078         -DEXTERNALS_DOWNLOAD_DIR=$DOWNLOADS_DIR                                         \
0079         -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX                                          \
0080         -DCMAKE_TOOLCHAIN_FILE=$CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake   \
0081         -DANDROID_ABI=$ANDROID_ABI                                                      \
0082         -DANDROID_STL=c++_shared                                                           \
0083         -DANDROID_PLATFORM=$ANDROID_NATIVE_API_LEVEL                                    \
0084         -DANDROID_SDK_ROOT=$ANDROID_SDK_ROOT                                            \
0085         -DCMAKE_FIND_ROOT_PATH="$QT_ANDROID;$BUILD_ROOT/i;$INSTALL_PREFIX"
0086     cd $BUILD_ROOT
0087 }
0088 
0089 PROC_COUNT=`grep processor /proc/cpuinfo | wc -l`
0090 
0091 build_qt() {
0092     if [[ ! -z $QT_ANDROID && -e $QT_ANDROID/lib/libQt5AndroidExtras.so ]]; then
0093         echo "Qt path provided; Skipping Qt build"
0094         return 0
0095     fi
0096     configure_ext
0097     cd $DEPS_BUILD
0098     cmake --build . --config $BUILD_TYPE --target ext_qt -- -j$PROC_COUNT
0099     cd $BUILD_ROOT
0100 }
0101 
0102 build_ext() {
0103     if [[ ! -d $QT_ANDROID ]]; then
0104         echoerr "qt libs not found"
0105         echo "Please run -p=qt prior to this"
0106         exit
0107     fi
0108 
0109     configure_ext
0110     cd $DEPS_BUILD
0111     # Please do not change the order
0112     cmake --build . --config $BUILD_TYPE --target ext_png -- -j$PROC_COUNT
0113     cmake --build . --config $BUILD_TYPE --target ext_zlib -- -j$PROC_COUNT
0114     cmake --build . --config $BUILD_TYPE --target ext_quazip -- -j$PROC_COUNT
0115     cmake --build . --config $BUILD_TYPE --target ext_lcms2 -- -j$PROC_COUNT
0116     cmake --build . --config $BUILD_TYPE --target ext_expat -- -j$PROC_COUNT
0117     cmake --build . --config $BUILD_TYPE --target ext_exiv2 -- -j$PROC_COUNT
0118     cmake --build . --config $BUILD_TYPE --target ext_gsl -- -j$PROC_COUNT
0119     cmake --build . --config $BUILD_TYPE --target ext_tiff -- -j$PROC_COUNT
0120     cmake --build . --config $BUILD_TYPE --target ext_fftw3 -- -j$PROC_COUNT
0121     cmake --build . --config $BUILD_TYPE --target ext_jpeg -- -j$PROC_COUNT
0122     cmake --build . --config $BUILD_TYPE --target ext_giflib -- -j$PROC_COUNT
0123     cmake --build . --config $BUILD_TYPE --target ext_eigen3 -- -j$PROC_COUNT
0124     cmake --build . --config $BUILD_TYPE --target ext_seexpr -- -j$PROC_COUNT
0125     cmake --build . --config $BUILD_TYPE --target ext_mypaint -- -j$PROC_COUNT
0126     cmake --build . --config $BUILD_TYPE --target ext_webp -- -j$PROC_COUNT
0127     cmake --build . --config $BUILD_TYPE --target ext_libunwindstack-ndk -- -j$PROC_COUNT
0128     cmake --build . --config $BUILD_TYPE --target ext_xsimd -- -j$PROC_COUNT
0129     cmake --build . --config $BUILD_TYPE --target ext_jpegxl -- -j$PROC_COUNT
0130     # cmake --build . --config $BUILD_TYPE --target ext_ocio -- -j$PROC_COUNT
0131 
0132     cd $BUILD_ROOT
0133 }
0134 
0135 build_plugins() {
0136     if [[ ! -d $QT_ANDROID ]]; then
0137         echoerr "qt libs not found"
0138         echo "Please run -p=qt prior to this"
0139         exit
0140     fi
0141 
0142     configure_plugins
0143     cd $PLUGINS_BUILD
0144     # Please do not change the order
0145     cmake --build . --config $BUILD_TYPE --target ext_gmic -- -j$PROC_COUNT
0146 
0147     cd $BUILD_ROOT
0148 }
0149 
0150 build_boost() {
0151     configure_ext
0152     cd $DEPS_BUILD
0153     cmake --build . --config $BUILD_TYPE --target ext_boost -- -j$PROC_COUNT
0154     cd $BUILD_ROOT
0155 }
0156 
0157 build_kf5() {
0158     if [[ ! -d $QT_ANDROID ]]; then
0159         echoerr "qt libs not found"
0160         echo "Please run -p=qt prior to this"
0161         exit
0162     fi
0163 
0164     configure_ext
0165     cd $DEPS_BUILD
0166 
0167     cmake --build . --config $BUILD_TYPE --target ext_extra_cmake_modules -- -j$PROC_COUNT
0168     cmake --build . --config $BUILD_TYPE --target ext_libintl-lite -- -j$PROC_COUNT
0169     cmake --build . --config $BUILD_TYPE --target ext_kconfig -- -j$PROC_COUNT
0170     cmake --build . --config $BUILD_TYPE --target ext_kwidgetsaddons -- -j$PROC_COUNT
0171     cmake --build . --config $BUILD_TYPE --target ext_kcompletion -- -j$PROC_COUNT
0172     cmake --build . --config $BUILD_TYPE --target ext_kcoreaddons -- -j$PROC_COUNT
0173     cmake --build . --config $BUILD_TYPE --target ext_kguiaddons -- -j$PROC_COUNT
0174     cmake --build . --config $BUILD_TYPE --target ext_ki18n -- -j$PROC_COUNT
0175     cmake --build . --config $BUILD_TYPE --target ext_kitemmodels -- -j$PROC_COUNT
0176     cmake --build . --config $BUILD_TYPE --target ext_kitemviews -- -j$PROC_COUNT
0177     cmake --build . --config $BUILD_TYPE --target ext_kwindowsystem -- -j$PROC_COUNT
0178 
0179     cd $BUILD_ROOT
0180 }
0181 
0182 build_krita() {
0183     cd $BUILD_ROOT
0184     # Configure files using cmake
0185     cmake $KRITA_ROOT -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX                                \
0186          -DKRITA_ENABLE_PCH=off                                                             \
0187          -DDEFINE_NO_DEPRECATED=1                                                           \
0188          -DCMAKE_BUILD_TYPE=$BUILD_TYPE                                                     \
0189          -DCMAKE_TOOLCHAIN_FILE=$CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake      \
0190          -DANDROID_PLATFORM=$ANDROID_NATIVE_API_LEVEL                                       \
0191          -DBUILD_TESTING=OFF -DKDE4_BUILD_TESTS=OFF                                         \
0192          -DBoost_NO_BOOST_CMAKE=TRUE                                                        \
0193          -DBoost_NO_SYSTEM_PATHS=TRUE                                                       \
0194          -DTIFF_HAS_PSD_TAGS=TRUE                                                           \
0195          -DTIFF_CAN_WRITE_PSD_TAGS=TRUE                                                     \
0196          -DQTANDROID_EXPORTED_TARGET=krita                                                  \
0197          -DANDROID_APK_DIR=$KRITA_ROOT/packaging/android/apk                                \
0198          -DANDROID_STL=c++_shared                                                           \
0199          -DANDROID_ABI=$ANDROID_ABI                                                         \
0200          -DNDK_VERSION=21                                                                   \
0201          -DCMAKE_FIND_ROOT_PATH="$QT_ANDROID;$BUILD_ROOT/i" $EXTRA_ARGS
0202 
0203     make -j$PROC_COUNT install
0204 }
0205 
0206 build_apk() {
0207     cd $BUILD_ROOT
0208 
0209     if [[ $NIGHTLY_BUILD == 1 ]]; then
0210         # to copy files, --aux-mode doesn't seem to work
0211         make create-apk ARGS="--no-gdbserver"
0212 
0213         cd $BUILD_ROOT/krita_build_apk
0214         ./gradlew clean  # so binary factory doesn't use the debug files
0215         ./gradlew assembleNightly
0216 
0217         cd $BUILD_ROOT
0218     elif [[ $BUILD_TYPE == "Release" ]]; then
0219         make create-apk ARGS="--release"
0220     else
0221         make create-apk ARGS="--no-gdbserver"
0222     fi
0223 }
0224 
0225 # if no arguments are passed
0226 if [[ "$#" == 0 ]]; then
0227     print_usage
0228     exit
0229 fi
0230 
0231 for i in "$@"
0232 do
0233 case $i in
0234     -p=*)
0235         PACKAGE="${i#*=}"
0236         shift
0237         ;;
0238     --src=*)
0239         export KRITA_ROOT="${i#*=}"
0240         shift
0241         ;;
0242     --build-type=*)
0243         export BUILD_TYPE="${i#*=}"
0244         ;;
0245     --build-root=*)
0246         export BUILD_ROOT="${i#*=}"
0247         shift
0248         ;;
0249     --qt-path=*)
0250         export QT_ANDROID="${i#*=}"
0251         shift
0252         ;;
0253     --ndk-path=*)
0254         export CMAKE_ANDROID_NDK="${i#*=}"
0255         shift
0256         ;;
0257     --sdk-path=*)
0258         export ANDROID_SDK_ROOT="${i#*=}"
0259         shift
0260         ;;
0261     --api-level=*)
0262         export ANDROID_API_LEVEL="${i#*=}"
0263         shift
0264         ;;
0265     --android-abi=*)
0266         export ANDROID_ABI="${i#*=}"
0267         shift
0268         ;;
0269     --help)
0270         print_usage
0271         exit
0272         ;;
0273 esac
0274 done
0275 
0276 if [[ -z $ANDROID_ABI ]]; then
0277     echo "Warning: ANDROID_ABI not specified, using the default one: arm64-v8a"
0278     export ANDROID_ABI=arm64-v8a
0279 fi
0280 
0281 if [[ $ANDROID_ABI != "armeabi-v7a" && $ANDROID_ABI != "arm64-v8a" && \
0282     $ANDROID_ABI != "x86" && $ANDROID_ABI != "x86_64" ]]; then
0283     echoerr "Invalid ABI, please choose among: armeabi-v7a, arm64-v8a, x86, x86_64"
0284     echo "Exiting Now."
0285     exit
0286 fi
0287 
0288 if [[ -z $ANDROID_API_LEVEL ]]; then
0289     echo "Warning: ANDROID_API_LEVEL not set, using the default one: 23"
0290     export ANDROID_API_LEVEL=23
0291 fi
0292 
0293 if [[ -z $BUILD_ROOT ]]; then
0294     echoerr "Build root not specified"
0295     print_usage
0296 elif [[ ! -d $BUILD_ROOT ]]; then
0297     mkdir $BUILD_ROOT -p
0298 fi
0299 
0300 check_exists CMAKE_ANDROID_NDK
0301 check_exists ANDROID_SDK_ROOT
0302 check_exists KRITA_ROOT
0303 
0304 # this helps SDK find the NDK, where ever it may be
0305 export ANDROID_NDK_HOME=$CMAKE_ANDROID_NDK
0306 export ANDROID_NATIVE_API_LEVEL=android-$ANDROID_API_LEVEL
0307 export INSTALL_PREFIX=$BUILD_ROOT/krita-android-build
0308 export ANDROID_NDK=$CMAKE_ANDROID_NDK
0309 if [[ -z $QT_ANDROID ]]; then
0310     export QT_ANDROID=$BUILD_ROOT/i
0311 fi
0312 
0313 setup_directories
0314 
0315 case $PACKAGE in
0316     all)
0317         build_qt
0318         build_kf5
0319         build_ext
0320         build_boost
0321         build_krita
0322         # build_plugins
0323         build_apk
0324         ;;
0325     krita-bin)
0326         build_krita
0327         ;;
0328     apk)
0329         # build_plugins
0330         build_apk
0331         ;;
0332     qt)
0333         build_qt
0334         ;;
0335     3rdparty)
0336         build_ext
0337         ;;
0338     plugins)
0339         build_plugins
0340         ;;
0341     boost)
0342         build_boost
0343         ;;
0344     kf5)
0345         build_qt
0346         build_kf5
0347         ;;
0348     *)
0349         echoerr "Invalid package"
0350         print_usage
0351         ;;
0352 esac
0353