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()