Warning, /graphics/krita/CMakeLists.txt is written in an unsupported language. File is not indexed.

0001 cmake_minimum_required(VERSION 3.19.0 FATAL_ERROR)
0002 
0003 set(SUPPORTED_LANGUAGES CXX C)
0004 
0005 if (APPLE)
0006     list (APPEND SUPPORTED_LANGUAGES OBJC OBJCXX)
0007 endif()
0008 
0009 project(krita LANGUAGES ${SUPPORTED_LANGUAGES})
0010 message(STATUS "Using CMake version: ${CMAKE_VERSION}")
0011 
0012 set(MIN_QT_VERSION 5.12.0)
0013 set(MIN_FRAMEWORKS_VERSION 5.44.0)
0014 
0015 set( CMAKE_CXX_STANDARD 17 )
0016 set( CMAKE_CXX_STANDARD_REQUIRED ON )
0017 
0018 if (POLICY CMP0002)
0019     cmake_policy(SET CMP0002 NEW)
0020 endif()
0021 
0022 if (POLICY CMP0017)
0023     cmake_policy(SET CMP0017 NEW)
0024 endif ()
0025 
0026 if (POLICY CMP0020)
0027     cmake_policy(SET CMP0020 NEW)
0028 endif ()
0029 
0030 if (POLICY CMP0022)
0031     cmake_policy(SET CMP0022 NEW)
0032 endif ()
0033 
0034 if (POLICY CMP0026)
0035     cmake_policy(SET CMP0026 NEW)
0036 endif()
0037 
0038 if (POLICY CMP0042)
0039     cmake_policy(SET CMP0042 NEW)
0040 endif()
0041 
0042 if (POLICY CMP0046)
0043     cmake_policy(SET CMP0046 NEW)
0044 endif ()
0045 
0046 if (POLICY CMP0059)
0047     cmake_policy(SET CMP0059 NEW)
0048 endif()
0049 
0050 if (POLICY CMP0063)
0051     cmake_policy(SET CMP0063 NEW)
0052 endif()
0053 
0054 if (POLICY CMP0054)
0055     cmake_policy(SET CMP0054 NEW)
0056 endif()
0057 
0058 if (POLICY CMP0064)
0059     cmake_policy(SET CMP0064 NEW)
0060 endif()
0061 
0062 if (POLICY CMP0071)
0063     cmake_policy(SET CMP0071 NEW)
0064 endif()
0065 
0066 if (POLICY CMP0135)
0067     cmake_policy(SET CMP0135 NEW)
0068 endif()
0069 
0070 if (APPLE)
0071     add_subdirectory(packaging/macos)
0072     set(MACOSX_RPATH TRUE)
0073     set(APPLE_SUPPRESS_X11_WARNING TRUE)
0074     set(KDE_SKIP_RPATH_SETTINGS TRUE)
0075     set(CMAKE_FIND_FRAMEWORK LAST)
0076     set(CMAKE_MACOSX_RPATH 1)
0077     set(BUILD_WITH_INSTALL_RPATH 1)
0078     set(MACOS_GUI_TEST "GUI")
0079     add_definitions(-mmacosx-version-min=10.13 -Wno-macro-redefined -Wno-deprecated-register)
0080     if (CMAKE_OSX_ARCHITECTURES)
0081         message(STATUS "CMake OSX architectures: ${CMAKE_OSX_ARCHITECTURES}")
0082     endif()
0083 
0084 endif()
0085 
0086 function(macos_test_fixrpath)
0087     if (APPLE AND BUILD_TESTING)
0088     foreach(TEST IN LISTS ARGN)
0089         set_property(TARGET ${TEST}
0090                      PROPERTY BUILD_RPATH "@loader_path/../../../../lib;@loader_path/../lib;@loader_path/../Frameworks;${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
0091     endforeach()
0092     endif()
0093 endfunction()
0094 
0095 if (CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9 AND NOT WIN32)
0096     add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-suggest-override> -Wextra -Wno-class-memaccess)
0097 endif()
0098 
0099  ######################
0100 #######################
0101 ## Constants defines ##
0102 #######################
0103 ######################
0104 
0105 # define common versions of Krita applications, used to generate kritaversion.h
0106 # update these version for every release:
0107 set(KRITA_VERSION_STRING "5.3.0-prealpha")
0108 # Major version: 3 for 3.x, 4 for 4.x, etc.
0109 set(KRITA_STABLE_VERSION_MAJOR 5)
0110 # Minor version: 0 for 4.0, 1 for 4.1, etc.
0111 set(KRITA_STABLE_VERSION_MINOR 3)
0112 # Bugfix release version, or 0 for before the first stable release
0113 set(KRITA_VERSION_RELEASE 0)
0114 # the 4th digit, really only used for the Windows installer:
0115 # - [Pre-]Alpha: Starts from 0, increment 1 per release
0116 # - Beta: Starts from 50, increment 1 per release
0117 # - Stable: Set to 100, bump to 101 if emergency update is needed
0118 set(KRITA_VERSION_REVISION 0)
0119 # Uncomment the following if this is currently in the "stable" branch.
0120 # Do not uncomment for master branch.
0121 #set(KRITA_STABLE_BRANCH 1)
0122 set(KRITA_ALPHA 1) # uncomment only for Alpha
0123 #set(KRITA_BETA 1) # uncomment only for Beta
0124 #set(KRITA_RC 1) # uncomment only for RC
0125 
0126 if(NOT DEFINED KRITA_ALPHA AND NOT DEFINED KRITA_BETA AND NOT DEFINED KRITA_RC)
0127     set(KRITA_STABLE 1) # do not edit
0128 endif()
0129 
0130 message(STATUS "Krita version: ${KRITA_VERSION_STRING}")
0131 
0132 # Define the generic version of the Krita libraries here
0133 # This makes it easy to advance it when the next Krita release comes.
0134 # 14 was the last GENERIC_KRITA_LIB_VERSION_MAJOR of the previous Krita series
0135 # (2.x) so we're starting with 15 in 3.x series, 16 in 4.x series
0136 if(KRITA_STABLE_VERSION_MAJOR EQUAL 5)
0137     math(EXPR GENERIC_KRITA_LIB_VERSION_MAJOR "${KRITA_STABLE_VERSION_MINOR} + 17")
0138 else()
0139     # let's make sure we won't forget to update the "16"
0140     message(FATAL_ERROR "Reminder: please update offset == 16 used to compute GENERIC_KRITA_LIB_VERSION_MAJOR to something bigger")
0141 endif()
0142 set(GENERIC_KRITA_LIB_VERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}.0.0")
0143 set(GENERIC_KRITA_LIB_SOVERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}")
0144 
0145 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
0146 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/kde_macro")
0147 
0148 # fetch git revision for the current build
0149 
0150 set(KRITA_GIT_SHA1_STRING "")
0151 set(KRITA_GIT_BRANCH_STRING "")
0152 
0153 include(GetGitRevisionDescription)
0154 get_git_head_hash(GIT_SHA1)
0155 get_git_branch(GIT_BRANCH)
0156 
0157 if(GIT_SHA1)
0158    string(SUBSTRING ${GIT_SHA1} 0 7 GIT_SHA1)
0159    set(KRITA_GIT_SHA1_STRING ${GIT_SHA1} CACHE STRING "Git commit of the current build" FORCE)
0160    if(NOT GIT_BRANCH)
0161        set(GIT_BRANCH "(detached HEAD)")
0162    endif()
0163    set(KRITA_GIT_BRANCH_STRING ${GIT_BRANCH} CACHE STRING "Git branch of the current build" FORCE)
0164 endif()
0165 
0166 # create test make targets
0167 enable_testing()
0168 # collect list of broken tests, empty here to start fresh with each cmake run
0169 set(KRITA_BROKEN_TESTS "" CACHE INTERNAL "KRITA_BROKEN_TESTS")
0170 # Keep track of all test target (need special attention on macos)
0171 set(KRITA_TESTS_TARGET "" CACHE INTERNAL "KRITA_TESTS_TARGET")
0172 
0173  ############
0174 #############
0175 ## Options ##
0176 #############
0177 ############
0178 
0179 include(FeatureSummary)
0180 
0181 if (WIN32)
0182 option(USE_DRMINGW "Support the Dr. Mingw crash handler (only on windows)" ON)
0183 add_feature_info("Dr. Mingw" USE_DRMINGW "Enable the Dr. Mingw crash handler")
0184     if (MINGW)
0185         option(USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags (mingw-w64)" ON)
0186         add_feature_info("Linker Security Flags" USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags")
0187         if (USE_MINGW_HARDENING_LINKER)
0188             set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0189             set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0190             set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0191             # Enable high-entropy ASLR for 64-bit
0192             # The image base has to be >4GB for HEASLR to be enabled.
0193             # The values used here are kind of arbitrary.
0194             set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x140000000")
0195             set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0196             set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0197         else (USE_MINGW_HARDENING_LINKER)
0198             message(WARNING "Linker Security Flags not enabled!")
0199         endif (USE_MINGW_HARDENING_LINKER)
0200 
0201         # Clang does not generate DWARF aranges data by default, which makes
0202         # DrMingw not able to parse the DWARF debug symbols. Add -gdwarf-aranges
0203         # explicitly.
0204         # See: https://github.com/jrfonseca/drmingw/issues/42#issuecomment-516614561
0205         if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
0206             set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -gdwarf-aranges")
0207         endif ()
0208         if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
0209             set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gdwarf-aranges")
0210         endif ()
0211     elseif (MSVC)
0212         # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0213         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:4194304")
0214         set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /STACK:4194304")
0215         set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /STACK:4194304")
0216         option(USE_CONTROL_FLOW_GUARD "Enable Control Flow Guard hardening (MSVC)" ON)
0217         add_feature_info("Linker Security Flags" USE_CONTROL_FLOW_GUARD "Enable Control Flow Guard")
0218         if (USE_CONTROL_FLOW_GUARD)
0219             add_compile_options(/guard:cf)
0220             add_link_options(/GUARD:CF)
0221         endif (USE_CONTROL_FLOW_GUARD)
0222     endif (MINGW)
0223 elseif(ANDROID)
0224     # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0225     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0226     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0227     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0228 endif ()
0229 
0230 option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
0231 add_feature_info("Hide safe asserts" HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal.")
0232 
0233 option(INSTALL_BENCHMARKS "Install benchmarks into the installation root to make them packagable" OFF)
0234 add_feature_info("Install benchmarks" INSTALL_BENCHMARKS "Install benchmarks into the installation root to make them packagable")
0235 
0236 option(CRASH_ON_SAFE_ASSERTS "Crash unconditionally whenever a \"safe\" assert happens. Useful for running unittests" OFF)
0237 add_feature_info("Crash on safe asserts" CRASH_ON_SAFE_ASSERTS "Crash unconditionally whenever a \"safe\" assert happens. Useful for running unittests")
0238 
0239 configure_file(config-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-safe-asserts.h)
0240 
0241 option(USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking." ON)
0242 configure_file(config-hash-table-implementation.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hash-table-implementation.h)
0243 add_feature_info("Lock free hash table" USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking.")
0244 
0245 option(FOUNDATION_BUILD "A Foundation build is a binary release build that can package some extra things like color themes. Linux distributions that build and install Krita into a default system location should not define this option to true." OFF)
0246 add_feature_info("Foundation Build" FOUNDATION_BUILD "A Foundation build is a binary release build that can package some extra things like color themes. Linux distributions that build and install Krita into a default system location should not define this option to true.")
0247 
0248 option(KRITA_ENABLE_BROKEN_TESTS "Enable tests that are marked as broken" OFF)
0249 add_feature_info("Enable Broken Tests" KRITA_ENABLE_BROKEN_TESTS "Runs broken test when \"make test\" is invoked (use -DKRITA_ENABLE_BROKEN_TESTS=ON to enable).")
0250 
0251 option(LIMIT_LONG_TESTS "Run long running unittests in a limited quick mode" ON)
0252 configure_file(config-limit-long-tests.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-limit-long-tests.h)
0253 add_feature_info("Limit long tests" LIMIT_LONG_TESTS "Run long running unittests in a limited quick mode")
0254 
0255 option(BUILD_KRITA_QT_DESIGNER_PLUGINS "Build Qt Designer plugins for Krita widgets" OFF)
0256 add_feature_info("Build Qt Designer plugins" BUILD_KRITA_QT_DESIGNER_PLUGINS "Builds Qt Designer plugins for Krita widgets (use -DBUILD_KRITA_QT_DESIGNER_PLUGINS=ON to enable).")
0257 
0258 option(ENABLE_UPDATERS "Enable updaters/update notifications" ON)
0259 configure_file(config-updaters.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-updaters.h)
0260 add_feature_info("Enable updaters" ENABLE_UPDATERS "Enable updaters/update notifications.")
0261 
0262 option(KRITA_ENABLE_PCH "Enable precompiled headers support" OFF)
0263 add_feature_info("Precompiled Headers" KRITA_ENABLE_PCH "precompiled headers make build process faster on some systems")
0264 
0265 option(DISABLE_PO_INSTALLATION "Disable installation of po files" OFF)
0266 
0267 option(USE_EXTERNAL_RAQM "Fetch Raqm dependency online instead of the embedded one" OFF)
0268 
0269 set(ADDRESS_SANITIZER_ENABLED FALSE)
0270 if (ECM_ENABLE_SANITIZERS MATCHES address)
0271     set(ADDRESS_SANITIZER_ENABLED TRUE)
0272 endif()
0273 
0274 add_feature_info("ASAN address sanitizer" ADDRESS_SANITIZER_ENABLED "crash Krita if it violates address access rules (-DECM_ENABLE_SANITIZERS=address)")
0275 
0276 # Branding. Available options: default, Beta, Plus, Next. Can be set from command line
0277 if ("${BRANDING}" STREQUAL "")
0278     if (DEFINED KRITA_STABLE)
0279         set(BRANDING "default")
0280     elseif (DEFINED KRITA_BETA OR DEFINED KRITA_RC)
0281         set(BRANDING "Beta")
0282     elseif (DEFINED KRITA_STABLE_BRANCH)
0283         # Alpha/pre-alpha in stable branch
0284         set(BRANDING "Plus")
0285     else ()
0286         # Alpha/pre-alpha in master branch or other experiments
0287         set(BRANDING "Next")
0288     endif ()
0289 endif()
0290 message(STATUS "Branding selected: ${BRANDING}")
0291 
0292 include(MacroJPEG)
0293 
0294  #########################################################
0295 ## Look for Python3 - it is also searched by KF5,       ##
0296 ## so we should request the correct version in advance  ##
0297 #########################################################
0298 
0299 function(TestCompileLinkPythonLibs OUTPUT_VARNAME)
0300     include(CheckCXXSourceCompiles)
0301     set(CMAKE_REQUIRED_INCLUDES ${Python_INCLUDE_DIRS})
0302     set(CMAKE_REQUIRED_LIBRARIES ${Python_LIBRARIES})
0303     if (MINGW)
0304         set(CMAKE_REQUIRED_DEFINITIONS -D_hypot=hypot)
0305     endif (MINGW)
0306     unset(${OUTPUT_VARNAME} CACHE)
0307     CHECK_CXX_SOURCE_COMPILES("
0308 // https://bugs.python.org/issue22411
0309 #if defined(_MSC_VER)
0310 #  ifdef _DEBUG
0311 #    undef _DEBUG
0312 #  endif /* _DEBUG */
0313 #endif /* _MSC_VER */
0314 #include <Python.h>
0315 int main(int argc, char *argv[]) {
0316     Py_InitializeEx(0);
0317 }" ${OUTPUT_VARNAME})
0318 endfunction()
0319 
0320 if(WIN32)
0321     set(Python_FIND_STRATEGY LOCATION)
0322     find_package(Python 3.8 COMPONENTS Development Interpreter)
0323     if (Python_FOUND)
0324         find_package(PythonLibrary 3.8)
0325         TestCompileLinkPythonLibs(CAN_USE_PYTHON_LIBS)
0326         if (NOT CAN_USE_PYTHON_LIBS)
0327             file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log ERROR_LOG)
0328             string(REPLACE "\n" "\n  " ERROR_LOG "${ERROR_LOG}")
0329             message(FATAL_ERROR "Compiling with Python library failed, please check whether the architecture is correct!\nCMakeError.log:\n  ${ERROR_LOG}\n\n")
0330         endif (NOT CAN_USE_PYTHON_LIBS)
0331     endif (Python_FOUND)
0332 else(WIN32)
0333     find_package(PythonLibrary 3.8)
0334 endif(WIN32)
0335 
0336  ########################
0337 #########################
0338 ## Look for KDE and Qt ##
0339 #########################
0340 ########################
0341 
0342 find_package(ECM 5.22 REQUIRED NOMODULE)
0343 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
0344 include(ECMOptionalAddSubdirectory)
0345 include(ECMAddAppIcon)
0346 include(ECMSetupVersion)
0347 include(ECMMarkNonGuiExecutable)
0348 include(ECMGenerateHeaders)
0349 include(GenerateExportHeader)
0350 include(ECMMarkAsTest)
0351 include(ECMInstallIcons)
0352 
0353 include(CMakePackageConfigHelpers)
0354 include(WriteBasicConfigVersionFile)
0355 include(CheckFunctionExists)
0356 
0357 include(KDEInstallDirs)
0358 
0359 if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)
0360     # Block KDE's translation infrastructure, we'll use our own
0361     add_custom_target(fetch-translations)
0362 endif()
0363 include(KDECMakeSettings)
0364 include(KDECompilerSettings)
0365 
0366 if (WIN32)
0367 # KDECompilerSettings sets Windows Vista as the default,
0368 # while MSVC's default is 0x0A00 (_WIN32_WINNT_WIN10, sdkddkver.h) and
0369 # MinGW's is 0x0601 (_WIN32_WINNT_WIN7, _mingw.h).
0370 # Both are enough to supply the APIs we need in main.cc, but since we
0371 # need the Windows 8 APIs anyway for the surface orientation and Store API,
0372 # we set the minimum here.
0373 remove_definitions(-D_WIN32_WINNT=0x0600 -DWINVER=0x0600 -D_WIN32_IE=0x0600)
0374 add_definitions(-D_WIN32_WINNT=0x0602 -DWINVER=0x0602  -D_WIN32_IE=0x0602)
0375 
0376 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
0377     if (MSVC) # or CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC"
0378         # KDE's CompilerSettings module sets -Wall -Wextra for Clang.
0379         # However, -Wall on clang-cl maps to -Weverything, which turns on way too
0380         # much, so we're using -W4 instead, which is mapped to clang's -Wall -Wextra.
0381         # Source: https://hg.mozilla.org/mozilla-central/rev/ffb7bfbfc328
0382         string(REPLACE "-Wall -Wextra" "-W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
0383         string(REPLACE "-Wall -Wextra" "-W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
0384         # Allow KoColorSpaceMaths operators to build.
0385         add_compile_options("/permissive")
0386     endif()
0387 
0388     # Remove these invalid flags.
0389     string(REPLACE "-fno-common" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
0390     string(REPLACE "-fno-operator-names" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
0391     string(REPLACE "-fdiagnostics-color=always" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
0392     string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
0393     string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
0394     string(REPLACE "-Wl,--fatal-warnings" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
0395     string(REPLACE "-Wl,--fatal-warnings" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
0396 endif()
0397 endif()
0398 
0399 # do not reorder to be alphabetical: this is the order in which the frameworks
0400 # depend on each other.
0401 find_package(KF5 ${MIN_FRAMEWORKS_VERSION} REQUIRED COMPONENTS
0402         Config
0403         WidgetsAddons
0404         Completion
0405         CoreAddons
0406         GuiAddons
0407         I18n
0408         ItemModels
0409         ItemViews
0410         WindowSystem
0411 )
0412 
0413 find_package(Qt5 ${MIN_QT_VERSION}
0414         REQUIRED COMPONENTS
0415         Core
0416         Gui
0417         Widgets
0418         Xml
0419         Network
0420         PrintSupport
0421         Svg
0422         Test
0423         Concurrent
0424         Sql
0425 )
0426 
0427 if (ANDROID)
0428     find_package(Qt5 ${MIN_QT_VERSION}
0429         REQUIRED COMPONENTS
0430         AndroidExtras
0431     )
0432 endif()
0433 
0434 if (WIN32)
0435     set(CMAKE_REQUIRED_INCLUDES ${Qt5Core_INCLUDE_DIRS})
0436     set(CMAKE_REQUIRED_LIBRARIES ${Qt5Core_LIBRARIES})
0437 
0438     CHECK_CXX_SOURCE_COMPILES("
0439 #include <QCoreApplication>
0440 int main(int argc, char *argv[]) {
0441 QCoreApplication::setAttribute(Qt::AA_MSWindowsUseWinTabAPI);
0442 }
0443 "
0444     QT_HAS_WINTAB_SWITCH
0445     )
0446 
0447     unset(CMAKE_REQUIRED_INCLUDES)
0448     unset(CMAKE_REQUIRED_LIBRARIES)
0449 
0450     option(USE_QT_TABLET_WINDOWS "Do not use Krita's forked Wintab and Windows Ink support on Windows, but leave everything to Qt." ON)
0451         add_feature_info("Use Qt's Windows Tablet Support" USE_QT_TABLET_WINDOWS "Do not use Krita's forked Wintab and Windows Ink support on Windows, but leave everything to Qt.")
0452     configure_file(config_use_qt_tablet_windows.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_use_qt_tablet_windows.h)
0453 endif ()     
0454 
0455 set(CMAKE_REQUIRED_INCLUDES ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS})
0456 set(CMAKE_REQUIRED_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Widgets_LIBRARIES})
0457 
0458 CHECK_CXX_SOURCE_COMPILES("
0459 #include <QSurfaceFormat>
0460 int main(int argc, char *argv[]) {
0461 QSurfaceFormat fmt;
0462 fmt.setColorSpace(QSurfaceFormat::scRGBColorSpace);
0463 fmt.setColorSpace(QSurfaceFormat::bt2020PQColorSpace);
0464 }
0465 "
0466 HAVE_HDR
0467 )
0468 configure_file(config-hdr.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hdr.h)
0469 
0470 CHECK_CXX_SOURCE_COMPILES("
0471 #include <QGuiApplication>
0472 int main(int argc, char *argv[]) {
0473 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Round);
0474 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::RoundPreferFloor);
0475 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
0476 }
0477 "
0478 HAVE_HIGH_DPI_SCALE_FACTOR_ROUNDING_POLICY
0479 )
0480 configure_file(config-high-dpi-scale-factor-rounding-policy.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-high-dpi-scale-factor-rounding-policy.h)
0481 
0482 CHECK_CXX_SOURCE_COMPILES("
0483 #include <QMdiArea>
0484 int main(int argc, char *argv[]) {
0485 QMdiArea area;
0486 area.setOption(QMdiArea::AlwaysShowSubwindowNameInTitleBar);
0487 }
0488 "
0489 HAVE_QMDIAREA_ALWAYS_SHOW_SUBWINDOW_TITLE
0490 )
0491 configure_file(config-qmdiarea-always-show-subwindow-title.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-qmdiarea-always-show-subwindow-title.h)
0492 
0493 if (WIN32)
0494     CHECK_CXX_SOURCE_COMPILES("
0495 #include <QtPlatformHeaders/QWindowsWindowFunctions>
0496 int main(int argc, char *argv[]) {
0497 QWindowsWindowFunctions::setHasBorderInFullScreenDefault(true);
0498 }
0499 "
0500     HAVE_SET_HAS_BORDER_IN_FULL_SCREEN_DEFAULT
0501     )
0502     configure_file(config-set-has-border-in-full-screen-default.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-set-has-border-in-full-screen-default.h)
0503 
0504 endif (WIN32)
0505 
0506 unset(CMAKE_REQUIRED_INCLUDES)
0507 unset(CMAKE_REQUIRED_LIBRARIES)
0508 
0509 
0510 include (MacroAddFileDependencies)
0511 include (MacroBoolTo01)
0512 include (MacroEnsureOutOfSourceBuild)
0513 macro_ensure_out_of_source_build("Compiling Krita inside the source directory is not possible. Please refer to the build instruction https://community.kde.org/Krita#Build_Instructions")
0514 
0515 
0516 # Note: OPTIONAL_COMPONENTS does not seem to be reliable
0517 # (as of ECM 5.15.0, CMake 3.2)
0518 
0519 if (NOT APPLE)
0520 find_package(Qt5Quick ${MIN_QT_VERSION})
0521 set_package_properties(Qt5Quick PROPERTIES
0522         DESCRIPTION "QtQuick"
0523         URL "https://www.qt.io/"
0524         TYPE OPTIONAL
0525         PURPOSE "Optionally used for the touch gui for Krita")
0526 
0527 macro_bool_to_01(Qt5Quick_FOUND HAVE_QT_QUICK)
0528 
0529 find_package(Qt5QuickWidgets ${MIN_QT_VERSION})
0530 set_package_properties(Qt5QuickWidgets PROPERTIES
0531         DESCRIPTION "QtQuickWidgets"
0532         URL "https://www.qt.io/"
0533         TYPE OPTIONAL
0534         PURPOSE "Optionally used for the touch gui for Krita")
0535 endif()
0536 if (Qt5QuickWidgets_FOUND)
0537     # This is needed because Qt dependencies aren't added by ECM but by androideployqt,
0538     # so it doesn't benefit from our patch in ECM.
0539     list (APPEND ANDROID_EXTRA_LIBS $<TARGET_FILE:Qt5::QuickWidgets>)
0540 endif()
0541 
0542 
0543 if (NOT WIN32 AND NOT APPLE AND NOT ANDROID)
0544 
0545     find_package(Qt5 ${MIN_QT_VERSION} REQUIRED X11Extras)
0546 
0547     find_package(Qt5DBus ${MIN_QT_VERSION})
0548     set(HAVE_DBUS ${Qt5DBus_FOUND})
0549     set_package_properties(Qt5DBus PROPERTIES
0550         DESCRIPTION "Qt DBUS integration"
0551         URL "https://www.qt.io/"
0552         TYPE OPTIONAL
0553         PURPOSE "Optionally used to provide a dbus api on Linux")
0554 
0555     find_package(KF5Crash ${MIN_FRAMEWORKS_VERSION})
0556     macro_bool_to_01(KF5Crash_FOUND HAVE_KCRASH)
0557     set_package_properties(KF5Crash PROPERTIES
0558         DESCRIPTION "KDE's Crash Handler"
0559         URL "https://api.kde.org/frameworks-api/frameworks5-apidocs/kcrash/html/index.html"
0560         TYPE OPTIONAL
0561         PURPOSE "Optionally used to provide crash reporting on Linux")
0562 
0563     find_package(X11 REQUIRED COMPONENTS Xinput)
0564     set(HAVE_X11 TRUE)
0565     add_definitions(-DHAVE_X11)
0566 
0567 else()
0568     set(HAVE_DBUS FALSE)
0569     set(HAVE_X11 FALSE)
0570 endif()
0571 
0572 
0573 add_definitions(
0574   -DQT_USE_QSTRINGBUILDER
0575   -DQT_NO_SIGNALS_SLOTS_KEYWORDS
0576   -DQT_NO_URL_CAST_FROM_STRING
0577   -DQT_USE_FAST_CONCATENATION 
0578   -DQT_USE_FAST_OPERATOR_PLUS
0579 )
0580 
0581 # MSVC is unable to disambiguate between definitions of QVector<QPointF> 
0582 # and QPolygonF. This is a known upstream bug e.g.:
0583 # - https://phabricator.kde.org/D21314
0584 # - https://codereview.qt-project.org/c/qt/qtbase/+/180229
0585 # Starting with Qt 5.13, it is impossible to use strict iterators
0586 # wholesale because of:
0587 # https://github.com/qt/qtbase/commit/972f8845a85d6a07140025e4257cb8a1a2699b5d
0588 if (NOT (MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") OR ${Qt5_VERSION} VERSION_LESS "5.13.0")
0589   add_definitions(-DQT_STRICT_ITERATORS)
0590 endif()
0591 
0592 #if (${Qt5_VERSION} VERSION_GREATER "5.14.0" )
0593 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50F00)
0594 #elseif (${Qt5_VERSION} VERSION_GREATER "5.13.0" )
0595 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50E00)
0596 #elseif (${Qt5_VERSION} VERSION_GREATER "5.12.0" )
0597 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50D00)
0598 #elseif (${Qt5_VERSION} VERSION_GREATER "5.11.0" )
0599 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50C00)
0600 #if(${Qt5_VERSION} VERSION_GREATER "5.10.0" )
0601 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50B00)
0602 #if(${Qt5_VERSION} VERSION_GREATER "5.9.0" )
0603 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50A00)
0604 #else()
0605     add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50900)
0606 #endif()
0607 add_definitions(-DQT_DEPRECATED_WARNINGS)
0608 add_definitions(-DTRANSLATION_DOMAIN=\"krita\")
0609 
0610 #
0611 # The reason for this mode is that the Debug mode disable inlining
0612 #
0613 if(CMAKE_COMPILER_IS_GNUCXX)
0614     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fext-numeric-literals")
0615 endif()
0616 
0617 option(KRITA_DEVS "For Krita developers. This modifies the DEBUG build type to use -O3 -g, while still enabling Q_ASSERT. This is necessary because the Qt5 cmake modules normally append QT_NO_DEBUG to any build type that is not labeled Debug")
0618 if (KRITA_DEVS)
0619     set(CMAKE_CXX_FLAGS_DEBUG "-O3 -g" CACHE STRING "" FORCE)
0620 endif()
0621 
0622 if(UNIX)
0623     set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};m")
0624 endif()
0625 
0626 if(WIN32)
0627     if(MSVC)
0628         # C4522: 'class' : multiple assignment operators specified
0629         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4522 -wd4138 /Zc:__cplusplus")
0630         # libs\ui\dialogs\kis_about_application.cpp : fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj
0631         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
0632 
0633         # Enable intrinsics
0634         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Oi")
0635         # Favor fast code
0636         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Ot")
0637         # Function-level linking
0638         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Gy")
0639 
0640         # Our code is UTF-8 encoded.
0641         add_compile_options(/utf-8)
0642     endif()
0643 endif()
0644 
0645 if (MSVC AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Clang/CL is incompatible with this flag
0646     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /RELEASE")
0647     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /RELEASE")
0648     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /RELEASE")
0649 endif()
0650 
0651 # Force enable a good many optimizations
0652 if (MSVC AND NOT BUILD_TESTING)
0653     # Aggresive inlining (Release)
0654     string(REPLACE "Ob2" "Ob3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
0655     # Aggresive inlining (RelWithDebInfo)
0656     string(REPLACE "Ob1" "Ob3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
0657     # Whole program optimization
0658     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL")
0659     # For all objects:
0660     # - strip unused functions
0661     # - fold identical functions
0662     # - link-time code generation
0663     string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
0664     string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}")
0665     string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO}")
0666     set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0667     set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0668     set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0669 endif()
0670 
0671 # KDECompilerSettings adds the `--export-all-symbols` linker flag.
0672 # We don't really need it.
0673 if(MINGW)
0674     string(REPLACE "-Wl,--export-all-symbols" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
0675     string(REPLACE "-Wl,--export-all-symbols" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
0676 endif(MINGW)
0677 
0678 if(MINGW)
0679     # Hack CMake's variables to tell AR to create thin archives to reduce unnecessary writes.
0680     # Source of definition: https://github.com/Kitware/CMake/blob/v3.14.1/Modules/Platform/Windows-GNU.cmake#L128
0681     # Thin archives: https://sourceware.org/binutils/docs/binutils/ar.html#index-thin-archives
0682     macro(mingw_use_thin_archive lang)
0683         foreach(rule CREATE_SHARED_MODULE CREATE_SHARED_LIBRARY LINK_EXECUTABLE)
0684             string(REGEX REPLACE "(<CMAKE_AR> [^ T]+) " "\\1T " CMAKE_${lang}_${rule} "${CMAKE_${lang}_${rule}}")
0685         endforeach()
0686     endmacro()
0687     mingw_use_thin_archive(CXX)
0688 endif(MINGW)
0689 
0690 # enable exceptions globally
0691 # WARNING: in MSVC this will NOT catch exceptions thrown through C code
0692 # see: 
0693 # - https://learn.microsoft.com/en-us/cpp/build/reference/eh-exception-handling-model?view=msvc-170#arguments
0694 # - https://invent.kde.org/frameworks/extra-cmake-modules/-/blob/v5.101.0/kde-modules/KDECompilerSettings.cmake#L502-526
0695 kde_enable_exceptions()
0696 
0697 function(krita_select_pch_file targetname pch_file_name)
0698     #TODO: make kritaimage and kritaglobal targets to link to its own PCH
0699 
0700     if (targetname STREQUAL "kritaglobal")
0701         set(${pch_file_name} kis_qt_only_pch.h PARENT_SCOPE)
0702     elseif (targetname STREQUAL "kritaimage")
0703         set(${pch_file_name} kis_global_pch.h PARENT_SCOPE)
0704     else ()
0705         set(immediate_deps $<TARGET_PROPERTY:${targetname},LINK_LIBRARIES>)
0706         set(depends_on_kritaui $<IN_LIST:kritaui,${immediate_deps}>)
0707         set(depends_on_kritaimage $<IN_LIST:kritaimage,${immediate_deps}>)
0708         set(depends_on_kritalibkis $<IN_LIST:kritalibkis,${immediate_deps}>)
0709         set(depends_on_kritalibpaintop $<IN_LIST:kritalibpaintop,${immediate_deps}>)
0710 
0711         set(${pch_file_name} $<IF:$<OR:${depends_on_kritalibpaintop},${depends_on_kritalibkis},${depends_on_kritaui},${depends_on_kritaimage}>,kis_image_pch.h,kis_global_pch.h> PARENT_SCOPE)
0712     endif()
0713 endfunction()
0714 
0715 macro(kis_add_library)
0716     # the first run strips only options specific to kis_add_library
0717     # to create arguments for real add_library call
0718     cmake_parse_arguments(REAL "" PCH_FILE "" ${ARGV} )
0719     add_library(${REAL_UNPARSED_ARGUMENTS})
0720 
0721     if (KRITA_ENABLE_PCH)
0722         # the second run strips out all the option supported by the function
0723         # to let the script to calculate the number of source files in
0724         # the library
0725         set(options INTERFACE STATIC SHARED MODULE EXCLUDE_FROM_ALL OBJECT ALIAS)
0726         set(one_value_keywords PCH_FILE)
0727         set(multi_value_keywords)
0728         cmake_parse_arguments(LOCAL "${options}" "${one_value_keywords}" "" ${ARGV} )
0729 
0730         list(LENGTH LOCAL_UNPARSED_ARGUMENTS source_count)
0731         list(GET REAL_UNPARSED_ARGUMENTS 0 NEW_LIBRARY_TARGET)
0732 
0733         if (NOT LOCAL_PCH_FILE)
0734             krita_select_pch_file(${NEW_LIBRARY_TARGET} LOCAL_PCH_FILE)
0735             #file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/out/${NEW_LIBRARY_TARGET}.txt" CONTENT ${LOCAL_PCH_FILE})
0736         endif()
0737 
0738         # if the number of sources in the library is greater
0739         # than a threshold value, then we can try to use PCH
0740         # for this library
0741 
0742         if (${source_count} GREATER "2" AND
0743             NOT LOCAL_INTERFACE AND
0744             NOT LOCAL_ALIAS AND
0745             LOCAL_PCH_FILE)
0746 
0747             set_property(TARGET ${NEW_LIBRARY_TARGET} PROPERTY PCH_WARN_INVALID TRUE )
0748             target_precompile_headers(${NEW_LIBRARY_TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/pch/${LOCAL_PCH_FILE}>")
0749         endif()
0750     endif()
0751 endmacro()
0752 
0753 # overcome some platform incompatibilities
0754 if(WIN32)
0755     include_directories(${CMAKE_CURRENT_SOURCE_DIR}/winquirks)
0756     add_definitions(-D_USE_MATH_DEFINES)
0757     add_definitions(-DNOMINMAX)
0758 endif()
0759 
0760 # set custom krita plugin installdir
0761 if (ANDROID)
0762     # use default ABI
0763     if (NOT ANDROID_ABI)
0764         set (ANDROID_ABI arm64-v8a)
0765     endif()
0766     set (ANDROID_SDK_ROOT $ENV{ANDROID_SDK_ROOT})
0767     set (KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR})
0768     # set (DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/assets)
0769 
0770     # From ECM
0771     # Because Qt changes library suffix (to include arch), this changes name of
0772     # libraries that depend on Qt, but its Find file may not necessarily be
0773     # adapted for this.
0774     set(CMAKE_FIND_LIBRARY_SUFFIXES "_${CMAKE_ANDROID_ARCH_ABI}.so" ".so" ".a")
0775 else()
0776     set (KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR}/kritaplugins)
0777 endif()
0778 
0779 
0780  ###########################
0781 ############################
0782 ## Required dependencies  ##
0783 ############################
0784 ###########################
0785 
0786 # FIXME: Still hardcoded
0787 if (ANDROID)
0788     set (Boost_INCLUDE_DIR          ${CMAKE_CURRENT_BINARY_DIR}/i/${ANDROID_ABI}/include/boost-1_80)
0789     set (Boost_LIBRARY_DIR          ${CMAKE_CURRENT_BINARY_DIR}/i/${ANDROID_ABI}/lib)
0790     set (KF5_LIBRARIES              ${CMAKE_CURRENT_BINARY_DIR}/i/lib)
0791 
0792     find_package(unwindstack REQUIRED)
0793 endif()
0794 
0795 find_package(PNG REQUIRED "1.2.6")
0796 
0797 if (APPLE)
0798     # this is not added correctly on OSX -- see https://forum.kde.org/viewtopic.php?f=139&t=101867&p=221242#p221242
0799     include_directories(SYSTEM ${PNG_INCLUDE_DIR})
0800 endif()
0801 
0802 if (MINGW AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
0803     string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1"
0804         KRITA_boost_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
0805     set(Boost_COMPILER "mgw${KRITA_boost_COMPILER_VERSION}")
0806 endif()
0807 
0808 find_package(Boost 1.65 REQUIRED COMPONENTS system)
0809 set_package_properties(Boost PROPERTIES
0810     DESCRIPTION "Boost provides free peer-reviewed portable C++ source libraries."
0811     URL "https://www.boost.org"
0812     TYPE REQUIRED)
0813 target_link_libraries(Boost::boost
0814     INTERFACE
0815         Boost::disable_autolinking
0816 )
0817 
0818 # Disallow usage of std::unary_function. 
0819 # See https://github.com/boostorg/container_hash/issues/22
0820 # and https://releases.llvm.org/15.0.0/projects/libcxx/docs/ReleaseNotes.html#deprecations-and-removals
0821 if(Boost_VERSION VERSION_LESS "1.81.0")
0822 target_compile_definitions(Boost::boost
0823     INTERFACE
0824         BOOST_NO_CXX98_FUNCTION_BASE
0825 )
0826 endif()
0827 
0828 find_package(Immer REQUIRED)
0829 find_package(Zug REQUIRED)
0830 find_package(Lager REQUIRED)
0831 
0832 ##
0833 ## Test for GNU Scientific Library
0834 ##
0835 find_package(GSL)
0836 set_package_properties(GSL PROPERTIES
0837     URL "https://www.gnu.org/software/gsl"
0838     TYPE RECOMMENDED
0839     PURPOSE "Required by Krita's Transform tool.")
0840 macro_bool_to_01(GSL_FOUND HAVE_GSL)
0841 configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h )
0842 
0843  ###########################
0844 ############################
0845 ## Optional dependencies  ##
0846 ############################
0847 ###########################
0848 
0849 
0850 find_package(WebP 1.2.0 COMPONENTS demux mux)
0851 set_package_properties(WebP PROPERTIES
0852     URL "https://developers.google.com/speed/webp"
0853     TYPE OPTIONAL
0854     PURPOSE "Required by the WebP plugin"
0855 )
0856 
0857 ##
0858 ## Test for KSeExpr
0859 ##
0860 find_package(KSeExpr 4.0.0.0)
0861 set_package_properties(KSeExpr PROPERTIES
0862     URL "https://invent.kde.org/graphics/kseexpr"
0863     TYPE OPTIONAL
0864     PURPOSE "Required by the SeExpr generator layer"
0865 )
0866 macro_bool_to_01(KSeExpr_FOUND HAVE_SEEXPR)
0867 configure_file(config-seexpr.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-seexpr.h )
0868 
0869 find_package(ZLIB REQUIRED)
0870 set_package_properties(ZLIB PROPERTIES
0871     DESCRIPTION "Compression library"
0872     URL "https://www.zlib.net/"
0873     TYPE REQUIRED
0874     PURPOSE "Required by Krita's PNG and PSD support")
0875 macro_bool_to_01(ZLIB_FOUND HAVE_ZLIB)
0876 
0877 find_package(OpenEXR)
0878 macro_bool_to_01(OpenEXR_FOUND HAVE_OPENEXR)
0879 if(OpenEXR_FOUND)
0880     set(LINK_OPENEXR_LIB OpenEXR::IlmImf)
0881 endif()
0882 
0883 find_package(TIFF)
0884 set_package_properties(TIFF PROPERTIES
0885     DESCRIPTION "TIFF Library and Utilities"
0886     URL "http://www.libtiff.org"
0887     TYPE OPTIONAL
0888     PURPOSE "Required by the Krita TIFF filter")
0889 include(CheckLibTIFFPSDSupport)
0890 configure_file(config-tiff.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-tiff.h)
0891 
0892 find_package(JPEG)
0893 set_package_properties(JPEG PROPERTIES
0894     DESCRIPTION "Free library for JPEG image compression. Note that libjpeg8 is NOT supported."
0895     URL "https://www.libjpeg-turbo.org"
0896     TYPE OPTIONAL
0897     PURPOSE "Required by the Krita JPEG filter")
0898 if (JPEG_FOUND)
0899     macro_bool_to_01(JPEG_FOUND HAVE_JPEG)
0900 endif()
0901 
0902 find_package(libjpeg-turbo 2.1.3 COMPONENTS turbojpeg)
0903 set_package_properties(libjpeg-turbo PROPERTIES
0904     DESCRIPTION "libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, AVX2, Neon, AltiVec) to accelerate baseline JPEG compression and decompression on x86, x86-64, Arm, and PowerPC systems, as well as progressive JPEG compression on x86 and x86-64 systems."
0905     URL "https://www.libjpeg-turbo.org"
0906     TYPE OPTIONAL
0907     PURPOSE "Required by the Krita JPEG and TIFF filters")
0908 macro_bool_to_01(libjpeg-turbo_FOUND HAVE_JPEG_TURBO)
0909 configure_file(config-jpeg.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-jpeg.h )
0910 
0911 if(libjpeg-turbo_FOUND)
0912     set(JPEG_TURBO_LIBRARIES libjpeg-turbo::turbojpeg)
0913 endif()
0914 
0915 find_package(GIF)
0916 set_package_properties(GIF PROPERTIES
0917     DESCRIPTION "Library for loading and saving gif files."
0918     URL "http://giflib.sourceforge.net/"
0919     TYPE OPTIONAL
0920     PURPOSE "Required by the Krita GIF filter")
0921 
0922 find_package(HEIF "1.11.0")
0923 set_package_properties(HEIF PROPERTIES
0924     DESCRIPTION "Library for loading and saving heif files."
0925     URL "https://github.com/strukturag/libheif"
0926     TYPE OPTIONAL
0927     PURPOSE "Required by the Krita HEIF filter")
0928 
0929 find_package(OpenJPEG "2.3.0")
0930 set_package_properties(OpenJPEG PROPERTIES
0931     DESCRIPTION "Library for loading and saving jp2000 files."
0932     URL "https://www.openjpeg.org/"
0933     TYPE OPTIONAL
0934     PURPOSE "Required by the Krita JP2000 filter")
0935 
0936 find_package(JPEGXL 0.7.0)
0937 set_package_properties(JPEGXL PROPERTIES
0938     DESCRIPTION "JPEG XL is a royalty-free raster-graphics file format that supports both lossy and lossless compression and is experimentally supported by Chrome, Firefox, and Edge."
0939     URL "https://github.com/libjxl/libjxl"
0940     TYPE OPTIONAL
0941     PURPOSE "Required by the Krita JPEG-XL filter")
0942 
0943 find_package(FFTW3)
0944 set_package_properties(FFTW3 PROPERTIES
0945     DESCRIPTION "A fast, free C FFT library"
0946     URL "http://www.fftw.org/"
0947     TYPE OPTIONAL
0948     PURPOSE "Required by the Krita for fast convolution operators and some G'Mic features")
0949 macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
0950 if (FFTW3_FOUND)
0951     # GMic uses the Threads library if available.
0952     find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS})
0953 endif()
0954 
0955 find_package(OpenColorIO 1.1.1)
0956 set_package_properties(OpenColorIO PROPERTIES
0957     DESCRIPTION "The OpenColorIO Library"
0958     URL "https://www.opencolorio.org"
0959     TYPE OPTIONAL
0960     PURPOSE "Required by the Krita LUT docker")
0961 macro_bool_to_01(OpenColorIO_FOUND HAVE_OCIO)
0962 if (OPENCOLORIO_VERSION VERSION_GREATER_EQUAL "2.0.0")
0963     set(HAVE_OCIO_V2 TRUE)
0964 endif()
0965 configure_file(config-ocio.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-ocio.h)
0966 
0967 set_package_properties(PythonLibrary PROPERTIES
0968     DESCRIPTION "Python Library"
0969     URL "https://www.python.org"
0970     TYPE OPTIONAL
0971     PURPOSE "Required by the Krita PyQt plugin")
0972 macro_bool_to_01(Python_Development_FOUND HAVE_PYTHONLIBS)
0973 
0974 find_package(SIP "4.19.13")
0975 set_package_properties(SIP PROPERTIES
0976     DESCRIPTION "Support for generating SIP Python bindings"
0977     URL "https://www.riverbankcomputing.com/software/sip/download"
0978     TYPE OPTIONAL
0979     PURPOSE "Required by the Krita PyQt plugin")
0980 macro_bool_to_01(SIP_FOUND HAVE_SIP)
0981 
0982 find_package(PyQt5 "5.6.0")
0983 set_package_properties(PyQt5 PROPERTIES
0984     DESCRIPTION "Python bindings for Qt5."
0985     URL "https://www.riverbankcomputing.com/software/pyqt/download5"
0986     TYPE OPTIONAL
0987     PURPOSE "Required by the Krita PyQt plugin")
0988 macro_bool_to_01(PYQT5_FOUND HAVE_PYQT5)
0989 
0990 find_package(Mlt7)
0991 set_package_properties(Mlt7 PROPERTIES DESCRIPTION "Media Lovin' Toolkit (Multimedia Framework)"
0992                 URL "https://mltframework.org/"
0993                 PURPOSE "Required to do audio/video syncrhonization and processing. No MLT = No Audio! ")
0994 if (Mlt7_FOUND)
0995     find_package(SDL2 REQUIRED)
0996     set_package_properties(SDL2 PROPERTIES DESCRIPTION "Simple DirectMedia Layer 2"
0997                 URL "https://www.libsdl.org/"
0998                 PURPOSE "Required for MLT to render audio buffers. Required **only** when MLT is found on the system." )
0999 
1000   if (ANDROID)
1001       # Get the first item in the CMAKE_FIND_ROOT_PATH, hopefully it will be where plugins are saved.
1002       list(GET CMAKE_FIND_ROOT_PATH 0 FIRST_FIND_PATH)
1003       # TODO(sh_zam): Hardcoded, apparently generators doesn't work for this purpose?
1004       file(GLOB MLT_PLUGINS "${FIRST_FIND_PATH}/lib/mlt-7/*.so")
1005       list(APPEND ANDROID_EXTRA_LIBS ${MLT_PLUGINS})
1006   endif()
1007 endif()
1008 macro_bool_to_01(Mlt7_FOUND HAVE_MLT)
1009 configure_file(config-mlt.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-mlt.h)
1010 
1011 find_package(LibMyPaint 1.4.0)
1012 set_package_properties(LibMyPaint PROPERTIES
1013     DESCRIPTION "MyPaint brush engine API for C/C++"
1014     TYPE OPTIONAL
1015     PURPOSE "Required for the MyPaint brush engine")
1016 macro_bool_to_01(LibMyPaint_FOUND HAVE_LIBMYPAINT)
1017 configure_file(config-mypaint.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-mypaint.h )
1018 
1019 ##
1020 ## Look for OpenGL
1021 ##
1022 # TODO: see if there is a better check for QtGui being built with opengl support (and thus the QOpenGL* classes)
1023 if(Qt5Gui_OPENGL_IMPLEMENTATION)
1024     message(STATUS "Found QtGui OpenGL support")
1025 else()
1026     message(FATAL_ERROR  "Did NOT find QtGui OpenGL support. Check your Qt configuration. You cannot build Krita without Qt OpenGL support.")
1027 endif()
1028 
1029 ##
1030 ## Test for eigen3
1031 ##
1032 find_package(Eigen3 3.3 REQUIRED NO_MODULE)
1033 set_package_properties(Eigen3 PROPERTIES
1034     DESCRIPTION "C++ template library for linear algebra"
1035     URL "http://eigen.tuxfamily.org"
1036     TYPE REQUIRED)
1037 
1038 ##
1039 ## Test for exiv2
1040 ##
1041 find_package(LibExiv2 0.16 REQUIRED)
1042 
1043 ##
1044 ## Test for lcms
1045 ##
1046 find_package(LCMS2 2.4 REQUIRED)
1047 set_package_properties(LCMS2 PROPERTIES
1048     DESCRIPTION "LittleCMS Color management engine"
1049     URL "http://www.littlecms.com"
1050     TYPE REQUIRED
1051     PURPOSE "Will be used for color management and is necessary for Krita")
1052 if(LCMS2_FOUND)
1053     if(NOT ${LCMS2_VERSION} VERSION_LESS 2.4 )
1054         set(HAVE_LCMS24 TRUE)
1055     endif()
1056     set(HAVE_REQUIRED_LCMS_VERSION TRUE)
1057     set(HAVE_LCMS2 TRUE)
1058 
1059     include(CheckIncludeFileCXX)
1060 
1061     set(CMAKE_REQUIRED_INCLUDES ${LCMS2_INCLUDE_DIRS})
1062     set(CMAKE_REQUIRED_LIBRARIES ${LCMS2_LIBRARIES})
1063 
1064     if(LCMS2_FAST_FLOAT_INCLUDE_DIR)
1065         message(STATUS "Found LittleCMS's fast float plugin")
1066         set(HAVE_LCMS_FAST_FLOAT_PLUGIN 1)
1067     endif()
1068 endif()
1069 
1070 ##
1071 ## Test for xsimd
1072 ##
1073 ## xsimd has `SameMajorVersion` compatibility option set
1074 ## in `write_basic_package_version_file`, so we cannot just
1075 ## write a version range in the find_package call. Instead we
1076 ## should try all the supported versions manually
1077 ##
1078 foreach(xsimd_version 8.1.0 9 10 11 12)
1079     if(NOT xsimd_FOUND)
1080         find_package(xsimd ${xsimd_version})
1081     endif()
1082 endforeach()
1083 
1084 set_package_properties(xsimd PROPERTIES
1085     DESCRIPTION "C++ wrappers for SIMD intrinsics"
1086     URL "https://github.com/xtensor-stack/xsimd"
1087     TYPE OPTIONAL
1088     PURPOSE "Required by Krita for vectorization")
1089 macro_bool_to_01(xsimd_FOUND HAVE_XSIMD)
1090 configure_file(config-xsimd.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-xsimd.h )
1091 
1092 if(HAVE_XSIMD)
1093     macro(ko_compile_for_all_implementations_no_scalar _objs _src)
1094         if("aarch64" IN_LIST XSIMD_ARCH)
1095             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY NEON64)
1096         endif()
1097 
1098         if ("arm" IN_LIST XSIMD_ARCH)
1099             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY NEON)
1100         endif()
1101 
1102         if ("x86" IN_LIST XSIMD_ARCH OR "x86-64" IN_LIST XSIMD_ARCH)
1103             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX AVX2+FMA)
1104         endif()
1105     endmacro()
1106 
1107     macro(ko_compile_for_all_implementations _objs _src)
1108         xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY Scalar)
1109         ko_compile_for_all_implementations_no_scalar(${_objs} ${_src})
1110     endmacro()
1111 endif()
1112 
1113 ##
1114 ## Test endianness
1115 ##
1116 include (TestBigEndian)
1117 test_big_endian(CMAKE_WORDS_BIGENDIAN)
1118 
1119 ##
1120 ## Test for qt-poppler
1121 ##
1122 find_package(Poppler COMPONENTS Qt5)
1123 set_package_properties(Poppler PROPERTIES
1124     DESCRIPTION "A PDF rendering library"
1125     URL "https://poppler.freedesktop.org/"
1126     TYPE OPTIONAL
1127     PURPOSE "Required by the Krita PDF filter.")
1128 
1129 ##
1130 ## Test for quazip
1131 ##
1132 find_package(QUAZIP 0.6)
1133 set_package_properties(QUAZIP PROPERTIES
1134     DESCRIPTION "A library for reading and writing zip files"
1135     URL "https://stachenov.github.io/quazip/"
1136     TYPE REQUIRED
1137     PURPOSE "Needed for reading and writing KRA and ORA files"
1138 )
1139 
1140 ##
1141 ## Test for KDcraw
1142 ##
1143 find_package(KF5KDcraw 5.0.0)
1144 set_package_properties(KF5KDcraw PROPERTIES
1145     DESCRIPTION "A thread-safe wrapper around libraw"
1146     URL "https://api.kde.org/libkdcraw/html/index.html"
1147     TYPE OPTIONAL
1148     PURPOSE "Needed for reading RAW files"
1149 )
1150 
1151 ##
1152 ## Check for freetype
1153 ##
1154 find_package(Freetype 2.10.0 REQUIRED)
1155 set_package_properties(Freetype PROPERTIES
1156     DESCRIPTION "A library for rendering glyphs"
1157     URL "https://download.savannah.gnu.org/releases/freetype"
1158     TYPE REQUIRED
1159     PURPOSE "Needed for rendering text vector shapes."
1160 )
1161 
1162 ##
1163 ## Check for HarfBuzz
1164 ##
1165 find_package(HarfBuzz 4.0.0 REQUIRED)
1166 set_package_properties(HarfBuzz PROPERTIES
1167     DESCRIPTION "OpenType text shaping engine"
1168     URL "https://harfbuzz.github.io"
1169     TYPE REQUIRED
1170     PURPOSE "Needed for rendering text vector shapes."
1171 )
1172 if (HarfBuzz_FOUND)
1173     list(APPEND ANDROID_EXTRA_LIBS ${HarfBuzz_LIBRARIES})
1174 endif()
1175 
1176 # Note: We now build a patched raqm from source with Krita.
1177 
1178 ##
1179 ## Check for fontconfig
1180 ##
1181 find_package(Fontconfig 2.13.1 REQUIRED)
1182 set_package_properties(Fontconfig PROPERTIES
1183     TYPE REQUIRED
1184     PURPOSE "Needed for getting font file information."
1185 )
1186 
1187 ##
1188 ## Check for libunibreak
1189 ##
1190 find_package(libunibreak 5.0 REQUIRED)
1191 set_package_properties(libunibreak PROPERTIES
1192     DESCRIPTION "Implementation of the line breaking and word breaking algorithms as described in Unicode Standard Annex 14 and Unicode Standard Annex 29"
1193     URL "https://github.com/adah1972/libunibreak"
1194     TYPE REQUIRED
1195     PURPOSE "Needed for rendering text vector shapes."
1196 )
1197 
1198 ##
1199 ## Build vendored libraries
1200 ##
1201 
1202 # Allow specification of a directory with pre-downloaded
1203 # requirements. This download directory is used for 3rdparty_vendor
1204 # download
1205 
1206 if(DEFINED ENV{EXTERNALS_DOWNLOAD_DIR})
1207     set(EXTERNALS_DOWNLOAD_DIR $ENV{EXTERNALS_DOWNLOAD_DIR})
1208 endif()
1209 
1210 if(NOT IS_DIRECTORY ${EXTERNALS_DOWNLOAD_DIR})
1211     message(WARNING "No externals download dir set, default location inside build tree is used. Use -DEXTERNALS_DOWNLOAD_DIR to override")
1212 else()
1213     file(TO_CMAKE_PATH "${EXTERNALS_DOWNLOAD_DIR}" EXTERNALS_DOWNLOAD_DIR)
1214 endif()
1215 
1216 add_subdirectory(3rdparty_vendor)
1217 
1218 
1219 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)
1220     find_package(KF5I18n CONFIG REQUIRED)
1221     if (NOT DISABLE_PO_INSTALLATION)
1222         ki18n_install(po)
1223     endif()
1224 endif()
1225 
1226 ##
1227 ## Test for Atomics
1228 ##
1229 include(CheckAtomic)
1230 
1231  ############################
1232 #############################
1233 ## Add Krita helper macros ##
1234 #############################
1235 ############################
1236 
1237 include(MacroKritaAddBenchmark)
1238 
1239  ####################
1240 #####################
1241 ## Define includes ##
1242 #####################
1243 ####################
1244 
1245 # for config.h and <toplevel/foo.h> includes (if any?)
1246 include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}
1247                            ${CMAKE_CURRENT_BINARY_DIR}
1248 )
1249 
1250 add_subdirectory(sdk/tests)
1251 
1252 add_subdirectory(libs)
1253 add_subdirectory(plugins)
1254 if (BUILD_TESTING)
1255     add_subdirectory(benchmarks)
1256 endif()
1257 add_subdirectory(krita)
1258 
1259 configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h )
1260 configure_file(KoTestConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoTestConfig.h )
1261 configure_file(config_convolution.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_convolution.h)
1262 
1263 check_function_exists(powf HAVE_POWF)
1264 configure_file(config-powf.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-powf.h)
1265 
1266 if(WIN32)
1267     include(${CMAKE_CURRENT_LIST_DIR}/packaging/windows/installer/ConfigureInstallerNsis.cmake)
1268     include(${CMAKE_CURRENT_LIST_DIR}/packaging/windows/msix/ConfigureMsixFiles.cmake)
1269 endif()
1270 
1271 message("\nBroken tests:")
1272 foreach(tst ${KRITA_BROKEN_TESTS})
1273     message("    * ${tst}")
1274 endforeach()
1275 
1276 if(APPLE)
1277     # fix macos test rpath
1278     macos_test_fixrpath(${KRITA_TESTS_TARGET})
1279 endif()
1280 
1281 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
1282 
1283 if (ANDROID)
1284   # ECM passes this to Qt, which was already capable of detecting it..
1285   set (ANDROID_SDK_COMPILE_API "33")
1286 
1287   # To assist stdcpp-path in deployment.json file
1288   set(ANDROID_SYSROOT_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/sysroot/usr" CACHE STRING "" FORCE)
1289 
1290   # otherwise ECM can't find the libs and throws a big error at us.
1291   list (APPEND ECM_ADDITIONAL_FIND_ROOT_PATH ${KRITA_3rdparty_LIB_PREFIX})
1292 
1293   # copied regex from ECM's toolchain
1294   string(REGEX REPLACE "-(clang)?([0-9].[0-9])?$" "" ECM_ANDROID_STL_ARCH ${ANDROID_TOOLCHAIN_NAME})
1295 
1296   if (NOT (CMAKE_CXX_STANDARD_LIBRARIES MATCHES "[^ ]*c\\+\\+[^ ]*\\.so"))
1297 
1298     set (KRITA_ANDROID_STL_PATH "${ANDROID_TOOLCHAIN_ROOT}/sysroot/usr/lib/${ECM_ANDROID_STL_ARCH}/lib${ANDROID_STL}.so")
1299     if (NOT EXISTS ${KRITA_ANDROID_STL_PATH})
1300       message(FATAL_ERROR "STL does not exist at the right location, please use NDK r20+")
1301     endif()
1302 
1303     set (CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} \"${KRITA_ANDROID_STL_PATH}\"" CACHE STRING "" FORCE)
1304   endif()
1305 endif()
1306 
1307 if(DEFINED QTANDROID_EXPORTED_TARGET AND NOT TARGET "create-apk")
1308     set (_CMAKE_ANDROID_DIR "${ECM_DIR}/../toolchain")
1309     list(LENGTH QTANDROID_EXPORTED_TARGET targetsCount)
1310     include(${_CMAKE_ANDROID_DIR}/ECMAndroidDeployQt.cmake)
1311 
1312     math(EXPR last "${targetsCount}-1")
1313     foreach(idx RANGE 0 ${last})
1314         list(GET QTANDROID_EXPORTED_TARGET ${idx} exportedTarget)
1315         list(GET ANDROID_APK_DIR ${idx} APK_DIR)
1316         if(APK_DIR AND NOT EXISTS "${ANDROID_APK_DIR}/AndroidManifest.xml" AND IS_ABSOLUTE ANDROID_APK_DIR)
1317             message(FATAL_ERROR "Cannot find ${APK_DIR}/AndroidManifest.xml according to ANDROID_APK_DIR. ${ANDROID_APK_DIR} ${exportedTarget}")
1318         elseif(NOT APK_DIR)
1319             get_filename_component(_qt5Core_install_prefix "${Qt5Core_DIR}/../../../" ABSOLUTE)
1320             set(APK_DIR "${_qt5Core_install_prefix}/src/android/templates/")
1321         endif()
1322 
1323         ecm_androiddeployqt("${exportedTarget}" "${ECM_ADDITIONAL_FIND_ROOT_PATH}")
1324         set_target_properties(create-apk-${exportedTarget} PROPERTIES ANDROID_APK_DIR "${APK_DIR}")
1325     endforeach()
1326 elseif(ANDROID)
1327     message(STATUS "You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname> and -DANDROID_APK_DIR=<paths>")
1328 endif()