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