[graphics/krita] /: Android: enable building GMic as a plugin
L. E. Segovia
null at kde.org
Tue Aug 17 17:35:57 BST 2021
Git commit 2e0c862adb2856067fcf6c7cf4a6a546896a4f73 by L. E. Segovia.
Committed on 17/08/2021 at 16:34.
Pushed by lsegovia into branch 'master'.
Android: enable building GMic as a plugin
This commit adds a *completely optional* step to build GMic as a plugin
for Android. It also adds a workaround to ensure that its project
can pick CMAKE_FIND_ROOT_PATH up.
BUG: 428995
CCMAIL: kimageshop at kde.org
M +10 -1 3rdparty/CMakeLists.txt
M +11 -1 3rdparty_plugins/CMakeLists.txt
M +1 -0 3rdparty_plugins/ext_gmic/CMakeLists.txt
M +11 -0 CMakeLists.txt
M +43 -1 packaging/android/androidbuild.sh
https://invent.kde.org/graphics/krita/commit/2e0c862adb2856067fcf6c7cf4a6a546896a4f73
diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt
index 72cd5ba25a..2f4b949ac4 100644
--- a/3rdparty/CMakeLists.txt
+++ b/3rdparty/CMakeLists.txt
@@ -163,12 +163,21 @@ if (ANDROID)
# HACK: copied from ECM, this makes sure that we don't build an executable (kf5s do that), but a DSO.
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+ # Increase the stack size to match MinGW's. Prevents crashes with GMic.
+ set(SECURITY_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(SECURITY_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(SECURITY_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+
set (GLOBAL_PROFILE ${GLOBAL_PROFILE}
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DANDROID_PLATFORM=${ANDROID_PLATFORM}
-DANDROID_ABI=${ANDROID_ABI}
-DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}
- -DCMAKE_CXX_LINK_EXECUTABLE=${CMAKE_CXX_LINK_EXECUTABLE})
+ -DCMAKE_CXX_LINK_EXECUTABLE=${CMAKE_CXX_LINK_EXECUTABLE}
+ -DCMAKE_EXE_LINKER_FLAGS=${SECURITY_EXE_LINKER_FLAGS}
+ -DCMAKE_SHARED_LINKER_FLAGS=${SECURITY_SHARED_LINKER_FLAGS}
+ -DCMAKE_MODULE_LINKER_FLAGS=${SECURITY_MODULE_LINKER_FLAGS}
+ )
# see: https://github.com/android/ndk/issues/929
unset (CMAKE_SYSROOT)
diff --git a/3rdparty_plugins/CMakeLists.txt b/3rdparty_plugins/CMakeLists.txt
index d0ee19626e..8d6f4df1ee 100644
--- a/3rdparty_plugins/CMakeLists.txt
+++ b/3rdparty_plugins/CMakeLists.txt
@@ -119,11 +119,21 @@ if (APPLE)
endif ()
if (ANDROID)
+ # Increase the stack size to match MinGW's. Prevents crashes with GMic.
+ set(SECURITY_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(SECURITY_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(SECURITY_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+
+ string(REPLACE ";" "|" _escape_find_root_path "${CMAKE_FIND_ROOT_PATH}")
set (GLOBAL_PROFILE ${GLOBAL_PROFILE}
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DANDROID_PLATFORM=${ANDROID_PLATFORM}
-DANDROID_ABI=${ANDROID_ABI}
- -DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH})
+ -DCMAKE_FIND_ROOT_PATH="${_escape_find_root_path}"
+ -DCMAKE_EXE_LINKER_FLAGS=${SECURITY_EXE_LINKER_FLAGS}
+ -DCMAKE_SHARED_LINKER_FLAGS=${SECURITY_SHARED_LINKER_FLAGS}
+ -DCMAKE_MODULE_LINKER_FLAGS=${SECURITY_MODULE_LINKER_FLAGS}
+ )
# see: https://github.com/android/ndk/issues/929
unset (CMAKE_SYSROOT)
diff --git a/3rdparty_plugins/ext_gmic/CMakeLists.txt b/3rdparty_plugins/ext_gmic/CMakeLists.txt
index f648158095..667cc1db15 100644
--- a/3rdparty_plugins/ext_gmic/CMakeLists.txt
+++ b/3rdparty_plugins/ext_gmic/CMakeLists.txt
@@ -10,6 +10,7 @@ ExternalProject_Add( ext_gmic
INSTALL_DIR ${PREFIX_ext_gmic}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${PREFIX_ext_gmic} -DGMIC_QT_HOST=krita-plugin -DCMAKE_BUILD_TYPE=${GLOBAL_BUILD_TYPE} ${GLOBAL_PROFILE}
+ LIST_SEPARATOR "|"
UPDATE_COMMAND ""
)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0207f869ae..248c8896cd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -195,6 +195,11 @@ add_feature_info("Dr. Mingw" USE_DRMINGW "Enable the Dr. Mingw crash handler")
add_link_options(/GUARD:CF)
endif (USE_CONTROL_FLOW_GUARD)
endif (MINGW)
+elseif(ANDROID)
+ # Increase the stack size to match MinGW's. Prevents crashes with GMic.
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
endif ()
option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
@@ -814,6 +819,12 @@ set_package_properties(FFTW3 PROPERTIES
macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
if (FFTW3_FOUND)
list (APPEND ANDROID_EXTRA_LIBS ${FFTW3_LIBRARY})
+
+ # GMic uses the Threads library if available.
+ find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS})
+ if(FFTW3_THREADS_LIB)
+ list(APPEND ANDROID_EXTRA_LIBS ${FFTW3_THREADS_LIB})
+ endif()
endif()
find_package(OCIO 1.1.1 EXACT)
diff --git a/packaging/android/androidbuild.sh b/packaging/android/androidbuild.sh
index 7a7c32b374..9151371e36 100755
--- a/packaging/android/androidbuild.sh
+++ b/packaging/android/androidbuild.sh
@@ -5,11 +5,14 @@
# 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
+set -e
+set -x
+
echoerr() { printf "ERROR: %s\n" "$*" >&2; }
print_usage() {
printf "\nUsage: "$0" [-p=PACKAGE] [ARGUMENTS..]\n"
- printf "Packages: [all|krita-bin|apk|qt|3rdparty|boost|kf5]\n"
+ printf "Packages: [all|krita-bin|apk|qt|3rdparty|plugins|boost|kf5]\n"
printf "Arguments: \n"
printf "\t--src=PATH Source files\n"
printf "\t--build-type=TYPE TYPE=[Debug|RelWithDebInfo|Release]\n"
@@ -33,6 +36,7 @@ check_exists() {
setup_directories() {
export DOWNLOADS_DIR=$BUILD_ROOT/d
export DEPS_BUILD=$BUILD_ROOT/b
+ export PLUGINS_BUILD=$BUILD_ROOT/p
export THIRDPARTY_INSTALL=$BUILD_ROOT/i
if [[ ! -d $DOWNLOADS_DIR ]]; then
@@ -43,6 +47,10 @@ setup_directories() {
mkdir $DEPS_BUILD -p
fi
+ if [[ ! -d $PLUGINS_BUILD ]]; then
+ mkdir $PLUGINS_BUILD -p
+ fi
+
if [[ ! -d $THIRDPARTY_INSTALL ]]; then
mkdir $THIRDPARTY_INSTALL -p
fi
@@ -62,6 +70,20 @@ configure_ext() {
cd $BUILD_ROOT
}
+configure_plugins() {
+ cd $PLUGINS_BUILD
+ cmake $KRITA_ROOT/3rdparty_plugins \
+ -DINSTALL_ROOT=$INSTALL_PREFIX \
+ -DEXTERNALS_DOWNLOAD_DIR=$DOWNLOADS_DIR \
+ -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
+ -DCMAKE_TOOLCHAIN_FILE=$CMAKE_ANDROID_NDK/build/cmake/android.toolchain.cmake \
+ -DANDROID_ABI=$ANDROID_ABI \
+ -DANDROID_PLATFORM=$ANDROID_NATIVE_API_LEVEL \
+ -DANDROID_SDK_ROOT=$ANDROID_SDK_ROOT \
+ -DCMAKE_FIND_ROOT_PATH="$QT_ANDROID;$BUILD_ROOT/i;$INSTALL_PREFIX"
+ cd $BUILD_ROOT
+}
+
PROC_COUNT=`grep processor /proc/cpuinfo | wc -l`
build_qt() {
@@ -104,6 +126,21 @@ build_ext() {
cd $BUILD_ROOT
}
+build_plugins() {
+ if [[ ! -d $QT_ANDROID ]]; then
+ echoerr "qt libs not found"
+ echo "Please run -p=qt prior to this"
+ exit
+ fi
+
+ configure_plugins
+ cd $PLUGINS_BUILD
+ # Please do not change the order
+ cmake --build . --config $BUILD_TYPE --target ext_gmic -- -j$PROC_COUNT
+
+ cd $BUILD_ROOT
+}
+
build_boost() {
configure_ext
cd $DEPS_BUILD
@@ -263,12 +300,14 @@ case $PACKAGE in
build_ext
build_boost
build_krita
+ # build_plugins
build_apk
;;
krita-bin)
build_krita
;;
apk)
+ # build_plugins
build_apk
;;
qt)
@@ -277,6 +316,9 @@ case $PACKAGE in
3rdparty)
build_ext
;;
+ plugins)
+ build_plugins
+ ;;
boost)
build_boost
;;
More information about the kimageshop
mailing list