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

0001 cmake_minimum_required(VERSION 3.16.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 14 )
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 (APPLE)
0067     set(APPLE_SUPPRESS_X11_WARNING TRUE)
0068     set(KDE_SKIP_RPATH_SETTINGS TRUE)
0069     set(CMAKE_FIND_FRAMEWORK LAST)
0070     set(CMAKE_MACOSX_RPATH 1)
0071     set(BUILD_WITH_INSTALL_RPATH 1)
0072     set(MACOS_GUI_TEST "GUI")
0073     add_definitions(-mmacosx-version-min=10.13 -Wno-macro-redefined -Wno-deprecated-register)
0074     if (CMAKE_OSX_ARCHITECTURES)
0075         message(STATUS "CMake OSX architectures: ${CMAKE_OSX_ARCHITECTURES}")
0076     endif()
0077 
0078 endif()
0079 
0080 function(macos_test_fixrpath)
0081     if (APPLE AND BUILD_TESTING)
0082     foreach(TEST IN LISTS ARGN)
0083         set_property(TARGET ${TEST}
0084                      PROPERTY BUILD_RPATH "@loader_path/../../../../lib;@loader_path/../lib;@loader_path/../Frameworks;${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
0085     endforeach()
0086     endif()
0087 endfunction()
0088 
0089 if (CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9 AND NOT WIN32)
0090     add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-suggest-override> -Wextra -Wno-class-memaccess)
0091 endif()
0092 
0093  ######################
0094 #######################
0095 ## Constants defines ##
0096 #######################
0097 ######################
0098 
0099 # define common versions of Krita applications, used to generate kritaversion.h
0100 # update these version for every release:
0101 set(KRITA_VERSION_STRING "5.1.6")
0102 # Major version: 3 for 3.x, 4 for 4.x, etc.
0103 set(KRITA_STABLE_VERSION_MAJOR 5)
0104 # Minor version: 0 for 4.0, 1 for 4.1, etc.
0105 set(KRITA_STABLE_VERSION_MINOR 1)
0106 # Bugfix release version, or 0 for before the first stable release
0107 set(KRITA_VERSION_RELEASE 6)
0108 # the 4th digit, really only used for the Windows installer:
0109 # - [Pre-]Alpha: Starts from 0, increment 1 per release
0110 # - Beta: Starts from 50, increment 1 per release
0111 # - Stable: Set to 100, bump to 101 if emergency update is needed
0112 set(KRITA_VERSION_REVISION 100)
0113 # Uncomment the following if this is currently in the "stable" branch.
0114 # Do not uncomment for master branch.
0115 set(KRITA_STABLE_BRANCH 1)
0116 #set(KRITA_ALPHA 1) # uncomment only for Alpha
0117 #set(KRITA_BETA 1) # uncomment only for Beta
0118 #set(KRITA_RC 1) # uncomment only for RC
0119 
0120 if(NOT DEFINED KRITA_ALPHA AND NOT DEFINED KRITA_BETA AND NOT DEFINED KRITA_RC)
0121     set(KRITA_STABLE 1) # do not edit
0122 endif()
0123 
0124 message(STATUS "Krita version: ${KRITA_VERSION_STRING}")
0125 
0126 # Define the generic version of the Krita libraries here
0127 # This makes it easy to advance it when the next Krita release comes.
0128 # 14 was the last GENERIC_KRITA_LIB_VERSION_MAJOR of the previous Krita series
0129 # (2.x) so we're starting with 15 in 3.x series, 16 in 4.x series
0130 if(KRITA_STABLE_VERSION_MAJOR EQUAL 5)
0131     math(EXPR GENERIC_KRITA_LIB_VERSION_MAJOR "${KRITA_STABLE_VERSION_MINOR} + 17")
0132 else()
0133     # let's make sure we won't forget to update the "16"
0134     message(FATAL_ERROR "Reminder: please update offset == 16 used to compute GENERIC_KRITA_LIB_VERSION_MAJOR to something bigger")
0135 endif()
0136 set(GENERIC_KRITA_LIB_VERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}.0.0")
0137 set(GENERIC_KRITA_LIB_SOVERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}")
0138 
0139 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
0140 LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/kde_macro")
0141 
0142 # fetch git revision for the current build
0143 
0144 set(KRITA_GIT_SHA1_STRING "")
0145 set(KRITA_GIT_BRANCH_STRING "")
0146 
0147 include(GetGitRevisionDescription)
0148 get_git_head_hash(GIT_SHA1)
0149 get_git_branch(GIT_BRANCH)
0150 
0151 if(GIT_SHA1)
0152    string(SUBSTRING ${GIT_SHA1} 0 7 GIT_SHA1)
0153    set(KRITA_GIT_SHA1_STRING ${GIT_SHA1} CACHE STRING "Git commit of the current build" FORCE)
0154    if(NOT GIT_BRANCH)
0155        set(GIT_BRANCH "(detached HEAD)")
0156    endif()
0157    set(KRITA_GIT_BRANCH_STRING ${GIT_BRANCH} CACHE STRING "Git branch of the current build" FORCE)
0158 endif()
0159 
0160 # create test make targets
0161 enable_testing()
0162 # collect list of broken tests, empty here to start fresh with each cmake run
0163 set(KRITA_BROKEN_TESTS "" CACHE INTERNAL "KRITA_BROKEN_TESTS")
0164 
0165  ############
0166 #############
0167 ## Options ##
0168 #############
0169 ############
0170 
0171 include(FeatureSummary)
0172 
0173 if (WIN32)
0174 option(USE_DRMINGW "Support the Dr. Mingw crash handler (only on windows)" ON)
0175 add_feature_info("Dr. Mingw" USE_DRMINGW "Enable the Dr. Mingw crash handler")
0176     if (MINGW)
0177         option(USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags (mingw-w64)" ON)
0178         add_feature_info("Linker Security Flags" USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags")
0179         if (USE_MINGW_HARDENING_LINKER)
0180             set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0181             set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0182             set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
0183             if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
0184                 # Enable high-entropy ASLR for 64-bit
0185                 # The image base has to be >4GB for HEASLR to be enabled.
0186                 # The values used here are kind of arbitrary.
0187                 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x140000000")
0188                 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0189                 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
0190             endif ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
0191         else (USE_MINGW_HARDENING_LINKER)
0192             message(WARNING "Linker Security Flags not enabled!")
0193         endif (USE_MINGW_HARDENING_LINKER)
0194 
0195         # Clang does not generate DWARF aranges data by default, which makes
0196         # DrMingw not able to parse the DWARF debug symbols. Add -gdwarf-aranges
0197         # explicitly.
0198         # See: https://github.com/jrfonseca/drmingw/issues/42#issuecomment-516614561
0199         if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
0200             set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -gdwarf-aranges")
0201         endif ()
0202         if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
0203             set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gdwarf-aranges")
0204         endif ()
0205     elseif (MSVC)
0206         # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0207         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:4194304")
0208         set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /STACK:4194304")
0209         set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /STACK:4194304")
0210         option(USE_CONTROL_FLOW_GUARD "Enable Control Flow Guard hardening (MSVC)" ON)
0211         add_feature_info("Linker Security Flags" USE_CONTROL_FLOW_GUARD "Enable Control Flow Guard")
0212         if (USE_CONTROL_FLOW_GUARD)
0213             add_compile_options(/guard:cf)
0214             add_link_options(/GUARD:CF)
0215         endif (USE_CONTROL_FLOW_GUARD)
0216     endif (MINGW)
0217 elseif(ANDROID)
0218     # Increase the stack size to match MinGW's. Prevents crashes with GMic.
0219     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0220     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0221     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,stack-size=4194304")
0222 endif ()
0223 
0224 option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
0225 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.")
0226 
0227 option(INSTALL_BENCHMARKS "Install benchmarks into the installation root to make them packagable" OFF)
0228 add_feature_info("Install benchmarks" INSTALL_BENCHMARKS "Install benchmarks into the installation root to make them packagable")
0229 
0230 option(CRASH_ON_SAFE_ASSERTS "Crash unconditionally whenever a \"safe\" assert happens. Useful for running unittests" OFF)
0231 add_feature_info("Crash on safe asserts" CRASH_ON_SAFE_ASSERTS "Crash unconditionally whenever a \"safe\" assert happens. Useful for running unittests")
0232 
0233 configure_file(config-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-safe-asserts.h)
0234 
0235 option(USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking." ON)
0236 configure_file(config-hash-table-implementation.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hash-table-implementation.h)
0237 add_feature_info("Lock free hash table" USE_LOCK_FREE_HASH_TABLE "Use lock free hash table instead of blocking.")
0238 
0239 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)
0240 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.")
0241 
0242 option(KRITA_ENABLE_BROKEN_TESTS "Enable tests that are marked as broken" OFF)
0243 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).")
0244 
0245 option(LIMIT_LONG_TESTS "Run long running unittests in a limited quick mode" ON)
0246 configure_file(config-limit-long-tests.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-limit-long-tests.h)
0247 add_feature_info("Limit long tests" LIMIT_LONG_TESTS "Run long running unittests in a limited quick mode")
0248 
0249 option(ENABLE_PYTHON_2 "Enables the compiler to look for Python 2.7 instead of Python 3. Some packaged scripts are not compatible with Python 2 and this should only be used if you really have to use 2.7." OFF)
0250 
0251 option(BUILD_KRITA_QT_DESIGNER_PLUGINS "Build Qt Designer plugins for Krita widgets" OFF)
0252 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).")
0253 
0254 option(ENABLE_UPDATERS "Enable updaters/update notifications" ON)
0255 configure_file(config-updaters.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-updaters.h)
0256 add_feature_info("Enable updaters" ENABLE_UPDATERS "Enable updaters/update notifications.")
0257 
0258 option(KRITA_ENABLE_PCH "Enable precompiled headers support" ON)
0259 add_feature_info("Precompiled Headers" KRITA_ENABLE_PCH "precompiled headers make build process faster on some systems")
0260 
0261 set(ADDRESS_SANITIZER_ENABLED FALSE)
0262 if (ECM_ENABLE_SANITIZERS MATCHES address)
0263     set(ADDRESS_SANITIZER_ENABLED TRUE)
0264 endif()
0265 
0266 add_feature_info("ASAN address sanitizer" ADDRESS_SANITIZER_ENABLED "crash Krita if it violates address access rules (-DECM_ENABLE_SANITIZERS=address)")
0267 
0268 # Branding. Available options: default, Beta, Plus, Next. Can be set from command line
0269 if ("${BRANDING}" STREQUAL "")
0270     if (DEFINED KRITA_STABLE)
0271         set(BRANDING "default")
0272     elseif (DEFINED KRITA_BETA OR DEFINED KRITA_RC)
0273         set(BRANDING "Beta")
0274     elseif (DEFINED KRITA_STABLE_BRANCH)
0275         # Alpha/pre-alpha in stable branch
0276         set(BRANDING "Plus")
0277     else ()
0278         # Alpha/pre-alpha in master branch or other experiments
0279         set(BRANDING "Next")
0280     endif ()
0281 endif()
0282 message(STATUS "Branding selected: ${BRANDING}")
0283 
0284 include(MacroJPEG)
0285 
0286  #########################################################
0287 ## Look for Python3 - it is also searched by KF5,       ##
0288 ## so we should request the correct version in advance  ##
0289 #########################################################
0290 
0291 function(TestCompileLinkPythonLibs OUTPUT_VARNAME)
0292     include(CheckCXXSourceCompiles)
0293     set(CMAKE_REQUIRED_INCLUDES ${Python_INCLUDE_DIRS})
0294     set(CMAKE_REQUIRED_LIBRARIES ${Python_LIBRARIES})
0295     if (MINGW)
0296         set(CMAKE_REQUIRED_DEFINITIONS -D_hypot=hypot)
0297     endif (MINGW)
0298     unset(${OUTPUT_VARNAME} CACHE)
0299     CHECK_CXX_SOURCE_COMPILES("
0300 #include <Python.h>
0301 int main(int argc, char *argv[]) {
0302     Py_InitializeEx(0);
0303 }" ${OUTPUT_VARNAME})
0304 endfunction()
0305 
0306 if(MINGW)
0307     if(ENABLE_PYTHON_2)
0308         message(FATAL_ERROR "Python 2.7 is not supported on Windows at the moment.")
0309     else(ENABLE_PYTHON_2)
0310         find_package(Python 3.8 COMPONENTS Development Interpreter)
0311     endif(ENABLE_PYTHON_2)
0312     if (Python_FOUND)
0313         if(ENABLE_PYTHON_2)
0314             find_package(PythonLibrary 2.7)
0315         else(ENABLE_PYTHON_2)
0316             find_package(PythonLibrary 3.8)
0317         endif(ENABLE_PYTHON_2)
0318         TestCompileLinkPythonLibs(CAN_USE_PYTHON_LIBS)
0319         if (NOT CAN_USE_PYTHON_LIBS)
0320             file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log ERROR_LOG)
0321             string(REPLACE "\n" "\n  " ERROR_LOG "${ERROR_LOG}")
0322             message(FATAL_ERROR "Compiling with Python library failed, please check whether the architecture is correct!\nCMakeError.log:\n  ${ERROR_LOG}\n\n")
0323         endif (NOT CAN_USE_PYTHON_LIBS)
0324     endif (Python_FOUND)
0325 else(MINGW)
0326     if(ENABLE_PYTHON_2)
0327         find_package(PythonLibrary 2.7)
0328     else(ENABLE_PYTHON_2)
0329         find_package(PythonLibrary 3.0)
0330     endif(ENABLE_PYTHON_2)
0331 endif(MINGW)
0332 
0333  ########################
0334 #########################
0335 ## Look for KDE and Qt ##
0336 #########################
0337 ########################
0338 
0339 find_package(ECM 5.22 REQUIRED NOMODULE)
0340 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
0341 include(ECMOptionalAddSubdirectory)
0342 include(ECMAddAppIcon)
0343 include(ECMSetupVersion)
0344 include(ECMMarkNonGuiExecutable)
0345 include(ECMGenerateHeaders)
0346 include(GenerateExportHeader)
0347 include(ECMMarkAsTest)
0348 include(ECMInstallIcons)
0349 
0350 include(CMakePackageConfigHelpers)
0351 include(WriteBasicConfigVersionFile)
0352 include(CheckFunctionExists)
0353 
0354 include(KDEInstallDirs)
0355 
0356 if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)
0357     # Block KDE's translation infrastructure, we'll use our own
0358     add_custom_target(fetch-translations)
0359 endif()
0360 include(KDECMakeSettings)
0361 include(KDECompilerSettings)
0362 
0363 # do not reorder to be alphabetical: this is the order in which the frameworks
0364 # depend on each other.
0365 find_package(KF5 ${MIN_FRAMEWORKS_VERSION} REQUIRED COMPONENTS
0366         Config
0367         WidgetsAddons
0368         Completion
0369         CoreAddons
0370         GuiAddons
0371         I18n
0372         ItemModels
0373         ItemViews
0374         WindowSystem
0375 )
0376 
0377 find_package(Qt5 ${MIN_QT_VERSION}
0378         REQUIRED COMPONENTS
0379         Core
0380         Gui
0381         Widgets
0382         Xml
0383         Network
0384         PrintSupport
0385         Svg
0386         Test
0387         Concurrent
0388         Sql
0389 )
0390 
0391 if (ANDROID)
0392     find_package(Qt5 ${MIN_QT_VERSION}
0393         REQUIRED COMPONENTS
0394         AndroidExtras
0395     )
0396 endif()
0397 
0398 if (WIN32)
0399     set(CMAKE_REQUIRED_INCLUDES ${Qt5Core_INCLUDE_DIRS})
0400     set(CMAKE_REQUIRED_LIBRARIES ${Qt5Core_LIBRARIES})
0401 
0402     CHECK_CXX_SOURCE_COMPILES("
0403 #include <QCoreApplication>
0404 int main(int argc, char *argv[]) {
0405 QCoreApplication::setAttribute(Qt::AA_MSWindowsUseWinTabAPI);
0406 }
0407 "
0408     QT_HAS_WINTAB_SWITCH
0409     )
0410 
0411     unset(CMAKE_REQUIRED_INCLUDES)
0412     unset(CMAKE_REQUIRED_LIBRARIES)
0413 
0414     option(USE_QT_TABLET_WINDOWS "Do not use Krita's forked Wintab and Windows Ink support on Windows, but leave everything to Qt." ON)
0415         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.")
0416     configure_file(config_use_qt_tablet_windows.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_use_qt_tablet_windows.h)
0417 endif ()     
0418 
0419 
0420 set(CMAKE_REQUIRED_INCLUDES ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS})
0421 set(CMAKE_REQUIRED_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES})
0422 
0423 CHECK_CXX_SOURCE_COMPILES("
0424 #include <QSurfaceFormat>
0425 int main(int argc, char *argv[]) {
0426 QSurfaceFormat fmt;
0427 fmt.setColorSpace(QSurfaceFormat::scRGBColorSpace);
0428 fmt.setColorSpace(QSurfaceFormat::bt2020PQColorSpace);
0429 }
0430 "
0431 HAVE_HDR
0432 )
0433 configure_file(config-hdr.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hdr.h)
0434 
0435 CHECK_CXX_SOURCE_COMPILES("
0436 #include <QGuiApplication>
0437 int main(int argc, char *argv[]) {
0438 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Round);
0439 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::RoundPreferFloor);
0440 QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
0441 }
0442 "
0443 HAVE_HIGH_DPI_SCALE_FACTOR_ROUNDING_POLICY
0444 )
0445 configure_file(config-high-dpi-scale-factor-rounding-policy.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-high-dpi-scale-factor-rounding-policy.h)
0446 
0447 if (WIN32)
0448     CHECK_CXX_SOURCE_COMPILES("
0449 #include <QtPlatformHeaders/QWindowsWindowFunctions>
0450 int main(int argc, char *argv[]) {
0451 QWindowsWindowFunctions::setHasBorderInFullScreenDefault(true);
0452 }
0453 "
0454     HAVE_SET_HAS_BORDER_IN_FULL_SCREEN_DEFAULT
0455     )
0456     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)
0457 endif (WIN32)
0458 
0459 unset(CMAKE_REQUIRED_INCLUDES)
0460 unset(CMAKE_REQUIRED_LIBRARIES)
0461 
0462 
0463 include (MacroAddFileDependencies)
0464 include (MacroBoolTo01)
0465 include (MacroEnsureOutOfSourceBuild)
0466 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")
0467 
0468 
0469 # Note: OPTIONAL_COMPONENTS does not seem to be reliable
0470 # (as of ECM 5.15.0, CMake 3.2)
0471 
0472 find_package(Qt5Multimedia ${MIN_QT_VERSION})
0473 set_package_properties(Qt5Multimedia PROPERTIES
0474         DESCRIPTION "Qt multimedia integration"
0475         URL "https://www.qt.io/"
0476         TYPE OPTIONAL
0477         PURPOSE "Optionally used to provide sound support for animations")
0478 
0479 macro_bool_to_01(Qt5Multimedia_FOUND HAVE_QT_MULTIMEDIA)
0480 configure_file(config-qtmultimedia.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-qtmultimedia.h )
0481 
0482 if (NOT APPLE)
0483 find_package(Qt5Quick ${MIN_QT_VERSION})
0484 set_package_properties(Qt5Quick PROPERTIES
0485         DESCRIPTION "QtQuick"
0486         URL "https://www.qt.io/"
0487         TYPE OPTIONAL
0488         PURPOSE "Optionally used for the touch gui for Krita")
0489 
0490 macro_bool_to_01(Qt5Quick_FOUND HAVE_QT_QUICK)
0491 if (Qt5Quick_FOUND)
0492     list (APPEND ANDROID_EXTRA_LIBS $<TARGET_FILE:Qt5::Quick>)
0493     list (APPEND ANDROID_EXTRA_LIBS $<TARGET_FILE:Qt5::Qml>)
0494 endif()
0495 
0496 
0497 find_package(Qt5QuickWidgets ${MIN_QT_VERSION})
0498 set_package_properties(Qt5QuickWidgets PROPERTIES
0499         DESCRIPTION "QtQuickWidgets"
0500         URL "https://www.qt.io/"
0501         TYPE OPTIONAL
0502         PURPOSE "Optionally used for the touch gui for Krita")
0503 endif()
0504 
0505 if (Qt5QuickWidgets_FOUND)
0506     list (APPEND ANDROID_EXTRA_LIBS $<TARGET_FILE:Qt5::QuickWidgets>)
0507 endif()
0508 
0509 if (NOT WIN32 AND NOT APPLE AND NOT ANDROID)
0510 
0511     find_package(Qt5 ${MIN_QT_VERSION} REQUIRED X11Extras)
0512 
0513     find_package(Qt5DBus ${MIN_QT_VERSION})
0514     set(HAVE_DBUS ${Qt5DBus_FOUND})
0515     set_package_properties(Qt5DBus PROPERTIES
0516         DESCRIPTION "Qt DBUS integration"
0517         URL "https://www.qt.io/"
0518         TYPE OPTIONAL
0519         PURPOSE "Optionally used to provide a dbus api on Linux")
0520 
0521     find_package(KF5Crash ${MIN_FRAMEWORKS_VERSION})
0522     macro_bool_to_01(KF5Crash_FOUND HAVE_KCRASH)
0523     set_package_properties(KF5Crash PROPERTIES
0524         DESCRIPTION "KDE's Crash Handler"
0525         URL "https://api.kde.org/frameworks-api/frameworks5-apidocs/kcrash/html/index.html"
0526         TYPE OPTIONAL
0527         PURPOSE "Optionally used to provide crash reporting on Linux")
0528 
0529     find_package(X11 REQUIRED COMPONENTS Xinput)
0530     set(HAVE_X11 TRUE)
0531     add_definitions(-DHAVE_X11)
0532 
0533 else()
0534     set(HAVE_DBUS FALSE)
0535     set(HAVE_X11 FALSE)
0536 endif()
0537 
0538 
0539 add_definitions(
0540   -DQT_USE_QSTRINGBUILDER
0541   -DQT_NO_SIGNALS_SLOTS_KEYWORDS
0542   -DQT_NO_URL_CAST_FROM_STRING
0543   -DQT_USE_FAST_CONCATENATION 
0544   -DQT_USE_FAST_OPERATOR_PLUS
0545 )
0546 
0547 # MSVC is unable to disambiguate between definitions of QVector<QPointF> 
0548 # and QPolygonF. This is a known upstream bug e.g.:
0549 # - https://phabricator.kde.org/D21314
0550 # - https://codereview.qt-project.org/c/qt/qtbase/+/180229
0551 # Starting with Qt 5.13, it is impossible to use strict iterators
0552 # wholesale because of:
0553 # https://github.com/qt/qtbase/commit/972f8845a85d6a07140025e4257cb8a1a2699b5d
0554 if (NOT MSVC OR ${Qt5_VERSION} VERSION_LESS "5.13.0")
0555   add_definitions(-DQT_STRICT_ITERATORS)
0556 endif()
0557 
0558 #if (${Qt5_VERSION} VERSION_GREATER "5.14.0" )
0559 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50F00)
0560 #elseif (${Qt5_VERSION} VERSION_GREATER "5.13.0" )
0561 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50E00)
0562 #elseif (${Qt5_VERSION} VERSION_GREATER "5.12.0" )
0563 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50D00)
0564 #elseif (${Qt5_VERSION} VERSION_GREATER "5.11.0" )
0565 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50C00)
0566 #if(${Qt5_VERSION} VERSION_GREATER "5.10.0" )
0567 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50B00)
0568 #if(${Qt5_VERSION} VERSION_GREATER "5.9.0" )
0569 #    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50A00)
0570 #else()
0571     add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50900)
0572 #endif()
0573 add_definitions(-DQT_DEPRECATED_WARNINGS)
0574 add_definitions(-DTRANSLATION_DOMAIN=\"krita\")
0575 
0576 #
0577 # The reason for this mode is that the Debug mode disable inlining
0578 #
0579 if(CMAKE_COMPILER_IS_GNUCXX)
0580     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fext-numeric-literals")
0581 endif()
0582 
0583 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")
0584 if (KRITA_DEVS)
0585     set(CMAKE_CXX_FLAGS_DEBUG "-O3 -g" CACHE STRING "" FORCE)
0586 endif()
0587 
0588 if(UNIX)
0589     set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};m")
0590 endif()
0591 
0592 if(WIN32)
0593     if(MSVC)
0594         # C4522: 'class' : multiple assignment operators specified
0595         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4522 -wd4138 /Zc:__cplusplus")
0596         # libs\ui\dialogs\kis_about_application.cpp : fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj
0597         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
0598 
0599         # Force enable a good many optimizations
0600 
0601         # Aggresive inlining (Release)
0602         string(REPLACE "Ob2" "Ob3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
0603         # Aggresive inlining (RelWithDebInfo)
0604         string(REPLACE "Ob1" "Ob3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
0605         # Enable intrinsics
0606         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Oi")
0607         # Favor fast code
0608         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Ot")
0609         # -ffast-math (fused multiply-add if the arch allows)
0610         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast")
0611         # Whole program optimization
0612         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL")
0613         # Function-level linking
0614         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Gy")
0615 
0616         # For all objects:
0617         # - strip unused functions
0618         # - fold identical functions
0619         # - link-time code generation
0620         string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
0621         string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}")
0622         string(REPLACE "INCREMENTAL" "INCREMENTAL:NO" CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO}")
0623         set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0624         set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0625         set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:ICF,REF /LTCG")
0626 
0627         # Our code is UTF-8 encoded.
0628         add_compile_options(/utf-8)
0629     endif()
0630 endif()
0631 
0632 # KDECompilerSettings adds the `--export-all-symbols` linker flag.
0633 # We don't really need it.
0634 if(MINGW)
0635     string(REPLACE "-Wl,--export-all-symbols" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
0636     string(REPLACE "-Wl,--export-all-symbols" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
0637 endif(MINGW)
0638 
0639 if(MINGW)
0640     # Hack CMake's variables to tell AR to create thin archives to reduce unnecessary writes.
0641     # Source of definition: https://github.com/Kitware/CMake/blob/v3.14.1/Modules/Platform/Windows-GNU.cmake#L128
0642     # Thin archives: https://sourceware.org/binutils/docs/binutils/ar.html#index-thin-archives
0643     macro(mingw_use_thin_archive lang)
0644         foreach(rule CREATE_SHARED_MODULE CREATE_SHARED_LIBRARY LINK_EXECUTABLE)
0645             string(REGEX REPLACE "(<CMAKE_AR> [^ T]+) " "\\1T " CMAKE_${lang}_${rule} "${CMAKE_${lang}_${rule}}")
0646         endforeach()
0647     endmacro()
0648     mingw_use_thin_archive(CXX)
0649 endif(MINGW)
0650 
0651 # enable exceptions globally
0652 kde_enable_exceptions()
0653 
0654 set(KRITA_DEFAULT_TEST_DATA_DIR ${CMAKE_SOURCE_DIR}/sdk/tests/data/)
0655 macro(macro_add_unittest_definitions)
0656   add_definitions(-DFILES_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/")
0657   if(WIN32)
0658     add_definitions(-DFILES_OUTPUT_DIR="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
0659   else()
0660     add_definitions(-DFILES_OUTPUT_DIR="${CMAKE_CURRENT_BINARY_DIR}")
0661   endif()
0662   add_definitions(-DFILES_DEFAULT_DATA_DIR="${KRITA_DEFAULT_TEST_DATA_DIR}")
0663   add_definitions(-DSYSTEM_RESOURCES_DATA_DIR="${CMAKE_SOURCE_DIR}/krita/data/")
0664 endmacro()
0665 
0666 function(krita_select_pch_file targetname pch_file_name)
0667     #TODO: make kritaimage and kritaglobal targets to link to its own PCH
0668 
0669     if (targetname STREQUAL "kritaglobal")
0670         set(${pch_file_name} kis_qt_only_pch.h PARENT_SCOPE)
0671     elseif (targetname STREQUAL "kritaimage")
0672         set(${pch_file_name} kis_global_pch.h PARENT_SCOPE)
0673     else ()
0674         set(immediate_deps $<TARGET_PROPERTY:${targetname},LINK_LIBRARIES>)
0675         set(depends_on_kritaui $<IN_LIST:kritaui,${immediate_deps}>)
0676         set(depends_on_kritaimage $<IN_LIST:kritaimage,${immediate_deps}>)
0677         set(depends_on_kritalibkis $<IN_LIST:kritalibkis,${immediate_deps}>)
0678         set(depends_on_kritalibpaintop $<IN_LIST:kritalibpaintop,${immediate_deps}>)
0679 
0680         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)
0681     endif()
0682 endfunction()
0683 
0684 macro(kis_add_library)
0685     # the first run strips only options specific to kis_add_library
0686     # to create arguments for real add_library call
0687     cmake_parse_arguments(REAL "" PCH_FILE "" ${ARGV} )
0688     add_library(${REAL_UNPARSED_ARGUMENTS})
0689 
0690     if (KRITA_ENABLE_PCH)
0691         # the second run strips out all the option supported by the function
0692         # to let the script to calculate the number of source files in
0693         # the library
0694         set(options INTERFACE STATIC SHARED MODULE EXCLUDE_FROM_ALL OBJECT ALIAS)
0695         set(one_value_keywords PCH_FILE)
0696         set(multi_value_keywords)
0697         cmake_parse_arguments(LOCAL "${options}" "${one_value_keywords}" "" ${ARGV} )
0698 
0699         list(LENGTH LOCAL_UNPARSED_ARGUMENTS source_count)
0700         list(GET REAL_UNPARSED_ARGUMENTS 0 NEW_LIBRARY_TARGET)
0701 
0702         if (NOT LOCAL_PCH_FILE)
0703             krita_select_pch_file(${NEW_LIBRARY_TARGET} LOCAL_PCH_FILE)
0704             #file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/out/${NEW_LIBRARY_TARGET}.txt" CONTENT ${LOCAL_PCH_FILE})
0705         endif()
0706 
0707         # if the number of sources in the library is greater
0708         # than a threshold value, then we can try to use PCH
0709         # for this library
0710 
0711         if (${source_count} GREATER "2" AND
0712             NOT LOCAL_INTERFACE AND
0713             NOT LOCAL_ALIAS AND
0714             LOCAL_PCH_FILE)
0715 
0716             set_property(TARGET ${NEW_LIBRARY_TARGET} PROPERTY PCH_WARN_INVALID TRUE )
0717             target_precompile_headers(${NEW_LIBRARY_TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/pch/${LOCAL_PCH_FILE}>")
0718         endif()
0719     endif()
0720 endmacro()
0721 
0722 # overcome some platform incompatibilities
0723 if(WIN32)
0724     include_directories(${CMAKE_CURRENT_SOURCE_DIR}/winquirks)
0725     add_definitions(-D_USE_MATH_DEFINES)
0726     add_definitions(-DNOMINMAX)
0727     set(WIN32_PLATFORM_NET_LIBS ws2_32.lib netapi32.lib)
0728 endif()
0729 
0730 # set custom krita plugin installdir
0731 if (ANDROID)
0732     # use default ABI
0733     if (NOT ANDROID_ABI)
0734         set (ANDROID_ABI arm64-v8a)
0735     endif()
0736     set (ANDROID_SDK_ROOT $ENV{ANDROID_SDK_ROOT})
0737     set (KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR})
0738     # set (DATA_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/assets)
0739 else()
0740     set (KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR}/kritaplugins)
0741 endif()
0742 
0743 
0744  ###########################
0745 ############################
0746 ## Required dependencies  ##
0747 ############################
0748 ###########################
0749 
0750 # FIXME: Still hardcoded
0751 if (ANDROID)
0752     set (Boost_INCLUDE_DIR          ${CMAKE_CURRENT_BINARY_DIR}/i/${ANDROID_ABI}/include/boost-1_80)
0753     set (Boost_LIBRARY_DIR          ${CMAKE_CURRENT_BINARY_DIR}/i/${ANDROID_ABI}/lib)
0754     set (KF5_LIBRARIES              ${CMAKE_CURRENT_BINARY_DIR}/i/lib)
0755 
0756     find_package(unwindstack REQUIRED)
0757 endif()
0758 
0759 find_package(PNG REQUIRED "1.2.6")
0760 list (APPEND ANDROID_EXTRA_LIBS ${PNG_LIBRARY})
0761 
0762 if (APPLE)
0763     # this is not added correctly on OSX -- see https://forum.kde.org/viewtopic.php?f=139&t=101867&p=221242#p221242
0764     include_directories(SYSTEM ${PNG_INCLUDE_DIR})
0765 endif()
0766 
0767 add_definitions(-DBOOST_ALL_NO_LIB)
0768 if (MSVC)
0769     set(Boost_USE_STATIC_LIBS OFF)
0770 endif()
0771 if (MINGW AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
0772     string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1"
0773         KRITA_boost_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
0774     set(Boost_COMPILER "mgw${KRITA_boost_COMPILER_VERSION}")
0775 endif()
0776 find_package(Boost 1.55 REQUIRED COMPONENTS system)
0777 include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
0778 ##
0779 ## Test for GNU Scientific Library
0780 ##
0781 find_package(GSL)
0782 set_package_properties(GSL PROPERTIES
0783     URL "https://www.gnu.org/software/gsl"
0784     TYPE RECOMMENDED
0785     PURPOSE "Required by Krita's Transform tool.")
0786 macro_bool_to_01(GSL_FOUND HAVE_GSL)
0787 configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h )
0788 if (GSL_FOUND)
0789     list (APPEND ANDROID_EXTRA_LIBS ${GSL_LIBRARIES} ${GSL_CBLAS_LIBRARIES})
0790 endif()
0791 
0792  ###########################
0793 ############################
0794 ## Optional dependencies  ##
0795 ############################
0796 ###########################
0797 
0798 
0799 find_package(WebP 1.2.0 COMPONENTS demux mux)
0800 set_package_properties(WebP PROPERTIES
0801     URL "https://developers.google.com/speed/webp"
0802     TYPE OPTIONAL
0803     PURPOSE "Required by the WebP plugin"
0804 )
0805 
0806 ##
0807 ## Test for KSeExpr
0808 ##
0809 find_package(KSeExpr 4.0.0.0)
0810 set_package_properties(KSeExpr PROPERTIES
0811     URL "https://invent.kde.org/graphics/kseexpr"
0812     TYPE OPTIONAL
0813     PURPOSE "Required by the SeExpr generator layer"
0814 )
0815 macro_bool_to_01(KSeExpr_FOUND HAVE_SEEXPR)
0816 configure_file(config-seexpr.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-seexpr.h )
0817 if(KSeExpr_FOUND)
0818     get_target_property(KSeExpr_LIBRARY KSeExpr::KSeExpr "LOCATION")
0819     get_target_property(KSeExprUI_LIBRARY KSeExpr::KSeExprUI "LOCATION") 
0820     list (APPEND ANDROID_EXTRA_LIBS ${KSeExpr_LIBRARY} ${KSeExprUI_LIBRARY})
0821 endif()
0822 
0823 find_package(ZLIB REQUIRED)
0824 set_package_properties(ZLIB PROPERTIES
0825     DESCRIPTION "Compression library"
0826     URL "https://www.zlib.net/"
0827     TYPE REQUIRED
0828     PURPOSE "Required by Krita's PNG and PSD support")
0829 macro_bool_to_01(ZLIB_FOUND HAVE_ZLIB)
0830 
0831 find_package(OpenEXR)
0832 macro_bool_to_01(OpenEXR_FOUND HAVE_OPENEXR)
0833 if(OpenEXR_FOUND)
0834     if(TARGET OpenEXR::OpenEXR)
0835         set(OPENEXR_LIBRARIES OpenEXR::OpenEXR)
0836     else()
0837         set(OPENEXR_LIBRARIES OpenEXR::IlmImf)
0838     endif()
0839     set(LINK_OPENEXR_LIB ${OPENEXR_LIBRARIES})
0840     if(MSVC)
0841         add_compile_definitions(OPENEXR_DLL) 
0842     endif()
0843 endif()
0844 
0845 find_package(TIFF)
0846 set_package_properties(TIFF PROPERTIES
0847     DESCRIPTION "TIFF Library and Utilities"
0848     URL "http://www.libtiff.org"
0849     TYPE OPTIONAL
0850     PURPOSE "Required by the Krita TIFF filter")
0851 include(CheckLibTIFFPSDSupport)
0852 configure_file(config-tiff.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-tiff.h)
0853 if (TIFF_FOUND)
0854     list (APPEND ANDROID_EXTRA_LIBS ${TIFF_LIBRARY})
0855 endif()
0856 
0857 find_package(JPEG)
0858 set_package_properties(JPEG PROPERTIES
0859     DESCRIPTION "Free library for JPEG image compression. Note that libjpeg8 is NOT supported."
0860     URL "https://www.libjpeg-turbo.org"
0861     TYPE OPTIONAL
0862     PURPOSE "Required by the Krita JPEG filter")
0863 if (JPEG_FOUND)
0864     list (APPEND ANDROID_EXTRA_LIBS ${JPEG_LIBRARY})
0865     macro_bool_to_01(JPEG_FOUND HAVE_JPEG)
0866 endif()
0867 
0868 find_package(libjpeg-turbo 2.1.3 COMPONENTS turbojpeg)
0869 set_package_properties(libjpeg-turbo PROPERTIES
0870     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."
0871     URL "https://www.libjpeg-turbo.org"
0872     TYPE OPTIONAL
0873     PURPOSE "Required by the Krita JPEG and TIFF filters")
0874 if(libjpeg-turbo_FOUND)
0875     get_target_property(JPEG_TURBO_LIBRARY libjpeg-turbo::turbojpeg "LOCATION")
0876     set(JPEG_TURBO_LIBRARIES libjpeg-turbo::turbojpeg)
0877     list(APPEND ANDROID_EXTRA_LIBS ${JPEG_TURBO_LIBRARY})
0878 endif()
0879 macro_bool_to_01(libjpeg-turbo_FOUND HAVE_JPEG_TURBO)
0880 configure_file(config-jpeg.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-jpeg.h )
0881 
0882 find_package(GIF)
0883 set_package_properties(GIF PROPERTIES
0884     DESCRIPTION "Library for loading and saving gif files."
0885     URL "http://giflib.sourceforge.net/"
0886     TYPE OPTIONAL
0887     PURPOSE "Required by the Krita GIF filter")
0888 if (GIF_FOUND)
0889     list (APPEND ANDROID_EXTRA_LIBS ${GIF_LIBRARY})
0890 endif()
0891 
0892 find_package(HEIF "1.11.0")
0893 set_package_properties(HEIF PROPERTIES
0894     DESCRIPTION "Library for loading and saving heif files."
0895     URL "https://github.com/strukturag/libheif"
0896     TYPE OPTIONAL
0897     PURPOSE "Required by the Krita HEIF filter")
0898 
0899 find_package(OpenJPEG "2.3.0")
0900 set_package_properties(OpenJPEG PROPERTIES
0901     DESCRIPTION "Library for loading and saving jp2000 files."
0902     URL "https://www.openjpeg.org/"
0903     TYPE OPTIONAL
0904     PURPOSE "Required by the Krita JP2000 filter")
0905 
0906 set(LIBRAW_MIN_VERSION  "0.16")
0907 find_package(LibRaw ${LIBRAW_MIN_VERSION})
0908 set_package_properties(LibRaw PROPERTIES
0909     DESCRIPTION "Library to decode RAW images"
0910     URL "https://www.libraw.org/"
0911     TYPE OPTIONAL
0912     PURPOSE "Required to build the raw import plugin")
0913 
0914 find_package(JPEGXL 0.7.0)
0915 set_package_properties(JPEGXL PROPERTIES
0916     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."
0917     URL "https://github.com/libjxl/libjxl"
0918     TYPE OPTIONAL
0919     PURPOSE "Required by the Krita JPEG-XL filter")
0920 if (JPEGXL_FOUND)
0921     list (APPEND ANDROID_EXTRA_LIBS ${JPEGXL_LIBRARIES})
0922     # because libjxl depends on brotli and it is installed in the same folder
0923     get_filename_component (_base_dir ${JPEGXL_LIBRARY} DIRECTORY)
0924     list (APPEND ANDROID_EXTRA_LIBS 
0925                     ${_base_dir}/libbrotlidec.so
0926                     ${_base_dir}/libbrotlicommon.so
0927                     ${_base_dir}/libbrotlienc.so)
0928 endif()
0929 
0930 find_package(FFTW3)
0931 set_package_properties(FFTW3 PROPERTIES
0932     DESCRIPTION "A fast, free C FFT library"
0933     URL "http://www.fftw.org/"
0934     TYPE OPTIONAL
0935     PURPOSE "Required by the Krita for fast convolution operators and some G'Mic features")
0936 macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
0937 if (FFTW3_FOUND)
0938     list (APPEND ANDROID_EXTRA_LIBS ${FFTW3_LIBRARY})
0939 
0940     # GMic uses the Threads library if available.
0941     find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS})
0942     if(FFTW3_THREADS_LIB)
0943         list(APPEND ANDROID_EXTRA_LIBS ${FFTW3_THREADS_LIB})
0944     endif()
0945 endif()
0946 
0947 find_package(OpenColorIO 1.1.1)
0948 set_package_properties(OpenColorIO PROPERTIES
0949     DESCRIPTION "The OpenColorIO Library"
0950     URL "https://www.opencolorio.org"
0951     TYPE OPTIONAL
0952     PURPOSE "Required by the Krita LUT docker")
0953 macro_bool_to_01(OpenColorIO_FOUND HAVE_OCIO)
0954 if (OPENCOLORIO_VERSION VERSION_GREATER_EQUAL "2.0.0")
0955     set(HAVE_OCIO_V2 TRUE)
0956 endif()
0957 configure_file(config-ocio.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-ocio.h)
0958 if (OpenColorIO_FOUND)
0959     list (APPEND ANDROID_EXTRA_LIBS ${OPENCOLORIO_LIBRARIES})
0960 endif()
0961 
0962 set_package_properties(PythonLibrary PROPERTIES
0963     DESCRIPTION "Python Library"
0964     URL "https://www.python.org"
0965     TYPE OPTIONAL
0966     PURPOSE "Required by the Krita PyQt plugin")
0967 macro_bool_to_01(Python_Development_FOUND HAVE_PYTHONLIBS)
0968 
0969 find_package(SIP "4.19.13")
0970 set_package_properties(SIP PROPERTIES
0971     DESCRIPTION "Support for generating SIP Python bindings"
0972     URL "https://www.riverbankcomputing.com/software/sip/download"
0973     TYPE OPTIONAL
0974     PURPOSE "Required by the Krita PyQt plugin")
0975 macro_bool_to_01(SIP_FOUND HAVE_SIP)
0976 
0977 find_package(PyQt5 "5.6.0")
0978 set_package_properties(PyQt5 PROPERTIES
0979     DESCRIPTION "Python bindings for Qt5."
0980     URL "https://www.riverbankcomputing.com/software/pyqt/download5"
0981     TYPE OPTIONAL
0982     PURPOSE "Required by the Krita PyQt plugin")
0983 macro_bool_to_01(PYQT5_FOUND HAVE_PYQT5)
0984 
0985 find_package(LibMyPaint)
0986 set_package_properties(LibMyPaint PROPERTIES
0987     DESCRIPTION "MyPaint brush engine API for C/C++"
0988     TYPE OPTIONAL
0989     PURPOSE "Required for the mypaint brush engine")
0990 if(LibMyPaint_FOUND)
0991     if(LibMyPaint_VERSION VERSION_LESS "1.4.0")
0992         message(WARNING "Please update libmypaint to version above 1.4.0 as lower versions are known to crash")
0993     else()
0994         list (APPEND ANDROID_EXTRA_LIBS ${libmypaint_LIBRARY_DIRS}/libmypaint.so
0995             ${libmypaint_LIBRARY_DIRS}/libjson-c.so    # this is a direct dependency of libmypaint
0996             )
0997     endif()
0998 endif()
0999 macro_bool_to_01(LibMyPaint_FOUND HAVE_LIBMYPAINT)
1000 configure_file(config-mypaint.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-mypaint.h )
1001 
1002 ##
1003 ## Look for OpenGL
1004 ##
1005 # TODO: see if there is a better check for QtGui being built with opengl support (and thus the QOpenGL* classes)
1006 if(Qt5Gui_OPENGL_IMPLEMENTATION)
1007     message(STATUS "Found QtGui OpenGL support")
1008 else()
1009     message(FATAL_ERROR  "Did NOT find QtGui OpenGL support. Check your Qt configuration. You cannot build Krita without Qt OpenGL support.")
1010 endif()
1011 
1012 ##
1013 ## Test for eigen3
1014 ##
1015 find_package(Eigen3 3.0 REQUIRED)
1016 set_package_properties(Eigen3 PROPERTIES
1017     DESCRIPTION "C++ template library for linear algebra"
1018     URL "http://eigen.tuxfamily.org"
1019     TYPE REQUIRED)
1020 
1021 ##
1022 ## Test for exiv2
1023 ##
1024 find_package(LibExiv2 0.16 REQUIRED)
1025 if (ANDROID)
1026     list (APPEND ANDROID_EXTRA_LIBS ${LibExiv2_LIBRARIES})
1027     # because libexiv2 depends on libexpat and it is installed in the same folder
1028     get_filename_component (_base_dir ${LibExiv2_LIBRARIES} DIRECTORY)
1029     list (APPEND ANDROID_EXTRA_LIBS ${_base_dir}/libexpat.so)
1030 endif()
1031 
1032 ##
1033 ## Test for lcms
1034 ##
1035 find_package(LCMS2 2.4 REQUIRED)
1036 set_package_properties(LCMS2 PROPERTIES
1037     DESCRIPTION "LittleCMS Color management engine"
1038     URL "http://www.littlecms.com"
1039     TYPE REQUIRED
1040     PURPOSE "Will be used for color management and is necessary for Krita")
1041 if(LCMS2_FOUND)
1042     if(NOT ${LCMS2_VERSION} VERSION_LESS 2.4 )
1043         set(HAVE_LCMS24 TRUE)
1044     endif()
1045     set(HAVE_REQUIRED_LCMS_VERSION TRUE)
1046     set(HAVE_LCMS2 TRUE)
1047 
1048     include(CheckIncludeFileCXX)
1049 
1050     set(CMAKE_REQUIRED_INCLUDES ${LCMS2_INCLUDE_DIRS})
1051     set(CMAKE_REQUIRED_LIBRARIES ${LCMS2_LIBRARIES})
1052 
1053     if(LCMS2_FAST_FLOAT_INCLUDE_DIR)
1054         message(STATUS "Found LittleCMS's fast float plugin")
1055         set(HAVE_LCMS_FAST_FLOAT_PLUGIN 1)
1056     endif()
1057 endif()
1058 list (APPEND ANDROID_EXTRA_LIBS ${LCMS2_LIBRARIES})
1059 
1060 ##
1061 ## Test for xsimd
1062 ##
1063 find_package(xsimd 8.1.0)
1064 if(NOT xsimd_FOUND)
1065     find_package(xsimd 9)
1066 endif()
1067 set_package_properties(xsimd PROPERTIES
1068     DESCRIPTION "C++ wrappers for SIMD intrinsics"
1069     URL "https://github.com/xtensor-stack/xsimd"
1070     TYPE OPTIONAL
1071     PURPOSE "Required by Krita for vectorization")
1072 macro_bool_to_01(xsimd_FOUND HAVE_XSIMD)
1073 configure_file(config-xsimd.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-xsimd.h )
1074 
1075 if(HAVE_XSIMD)
1076     macro(ko_compile_for_all_implementations_no_scalar _objs _src)
1077         if("aarch64" IN_LIST XSIMD_ARCH)
1078             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY NEON64)
1079         endif()
1080 
1081         if ("arm" IN_LIST XSIMD_ARCH)
1082             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY NEON)
1083         endif()
1084 
1085         if ("x86" IN_LIST XSIMD_ARCH OR "x86-64" IN_LIST XSIMD_ARCH)
1086             xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX AVX2+FMA)
1087         endif()
1088     endmacro()
1089 
1090     macro(ko_compile_for_all_implementations _objs _src)
1091         xsimd_compile_for_all_implementations(${_objs} ${_src} FLAGS ${xsimd_ARCHITECTURE_FLAGS} ONLY Scalar)
1092         ko_compile_for_all_implementations_no_scalar(${_objs} ${_src})
1093     endmacro()
1094 endif()
1095 
1096 ##
1097 ## Test endianness
1098 ##
1099 include (TestBigEndian)
1100 test_big_endian(CMAKE_WORDS_BIGENDIAN)
1101 
1102 ##
1103 ## Test for qt-poppler
1104 ##
1105 find_package(Poppler COMPONENTS Qt5)
1106 set_package_properties(Poppler PROPERTIES
1107     DESCRIPTION "A PDF rendering library"
1108     URL "https://poppler.freedesktop.org/"
1109     TYPE OPTIONAL
1110     PURPOSE "Required by the Krita PDF filter.")
1111 
1112 
1113 ##
1114 ## Test for quazip
1115 ##
1116 find_package(QUAZIP 0.6)
1117 set_package_properties(QUAZIP PROPERTIES
1118     DESCRIPTION "A library for reading and writing zip files"
1119     URL "https://stachenov.github.io/quazip/"
1120     TYPE REQUIRED
1121     PURPOSE "Needed for reading and writing KRA and ORA files"
1122 )
1123 
1124 # FIXME: better way to do this?
1125 list (APPEND ANDROID_EXTRA_LIBS ${QUAZIP_LIBRARIES}
1126                                 ${EXPAT_LIBRARY}
1127                                 ${KF5_LIBRARIES}/libssl_1_1.so
1128                                 ${KF5_LIBRARIES}/libcrypto_1_1.so
1129                                 ${KF5_LIBRARIES}/libKF5Completion.so
1130                                 ${KF5_LIBRARIES}/libKF5WindowSystem.so
1131                                 ${KF5_LIBRARIES}/libKF5WidgetsAddons.so
1132                                 ${KF5_LIBRARIES}/libKF5ItemViews.so
1133                                 ${KF5_LIBRARIES}/libKF5ItemModels.so
1134                                 ${KF5_LIBRARIES}/libKF5GuiAddons.so
1135                                 ${KF5_LIBRARIES}/libKF5I18n.so
1136                                 ${KF5_LIBRARIES}/libKF5CoreAddons.so
1137                                 ${KF5_LIBRARIES}/libKF5ConfigGui.so
1138                                 ${KF5_LIBRARIES}/libKF5ConfigCore.so)
1139 
1140 
1141 
1142 
1143 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/po)
1144     find_package(KF5I18n CONFIG REQUIRED)
1145     ki18n_install(po)
1146 endif()
1147 
1148 ##
1149 ## Test for Atomics
1150 ##
1151 include(CheckAtomic)
1152 
1153  ############################
1154 #############################
1155 ## Add Krita helper macros ##
1156 #############################
1157 ############################
1158 
1159 include(MacroKritaAddBenchmark)
1160 
1161  ####################
1162 #####################
1163 ## Define includes ##
1164 #####################
1165 ####################
1166 
1167 # for config.h and <toplevel/foo.h> includes (if any?)
1168 include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}
1169                            ${CMAKE_CURRENT_BINARY_DIR}
1170                            ${CMAKE_SOURCE_DIR}/interfaces
1171 )
1172 
1173 add_subdirectory(libs)
1174 add_subdirectory(plugins)
1175 if (BUILD_TESTING)
1176     add_subdirectory(benchmarks)
1177 endif()
1178 add_subdirectory(krita)
1179 
1180 configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h )
1181 configure_file(KoTestConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoTestConfig.h )
1182 configure_file(config_convolution.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_convolution.h)
1183 
1184 check_function_exists(powf HAVE_POWF)
1185 configure_file(config-powf.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-powf.h)
1186 
1187 if(WIN32)
1188     include(${CMAKE_CURRENT_LIST_DIR}/packaging/windows/installer/ConfigureInstallerNsis.cmake)
1189     include(${CMAKE_CURRENT_LIST_DIR}/packaging/windows/msix/ConfigureMsixFiles.cmake)
1190 endif()
1191 
1192 message("\nBroken tests:")
1193 foreach(tst ${KRITA_BROKEN_TESTS})
1194     message("    * ${tst}")
1195 endforeach()
1196 
1197 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
1198 
1199 if (ANDROID)
1200   # ECM passes this to Qt, which was already capable of detecting it..
1201   set (ANDROID_SDK_COMPILE_API "31")
1202   if ((${NDK_VERSION} GREATER_EQUAL 20))
1203     set (USE_LLVM ON)
1204   endif()
1205 
1206   if (NOT (CMAKE_CXX_STANDARD_LIBRARIES MATCHES "[^ ]*c\\+\\+[^ ]*\\.so"))
1207     # copied regex from ECM's toolchain
1208     string(REGEX REPLACE "-(clang)?([0-9].[0-9])?$" "" ECM_ANDROID_STL_ARCH ${ANDROID_TOOLCHAIN_NAME})
1209 
1210     set (KRITA_ANDROID_STL_PATH "${ANDROID_TOOLCHAIN_ROOT}/sysroot/usr/lib/${ECM_ANDROID_STL_ARCH}/lib${ANDROID_STL}.so")
1211     if (NOT EXISTS ${KRITA_ANDROID_STL_PATH})
1212       message(FATAL_ERROR "STL does not exist at the right location, please use NDK r20+")
1213     endif()
1214 
1215     set (CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} \"${KRITA_ANDROID_STL_PATH}\"" CACHE STRING "" FORCE)
1216   endif()
1217 endif()
1218 
1219 if(DEFINED QTANDROID_EXPORTED_TARGET AND NOT TARGET "create-apk")
1220     set (_CMAKE_ANDROID_DIR "${ECM_DIR}/../toolchain")
1221     list(LENGTH QTANDROID_EXPORTED_TARGET targetsCount)
1222     include(${_CMAKE_ANDROID_DIR}/ECMAndroidDeployQt.cmake)
1223 
1224     math(EXPR last "${targetsCount}-1")
1225     foreach(idx RANGE 0 ${last})
1226         list(GET QTANDROID_EXPORTED_TARGET ${idx} exportedTarget)
1227         list(GET ANDROID_APK_DIR ${idx} APK_DIR)
1228         if(APK_DIR AND NOT EXISTS "${ANDROID_APK_DIR}/AndroidManifest.xml" AND IS_ABSOLUTE ANDROID_APK_DIR)
1229             message(FATAL_ERROR "Cannot find ${APK_DIR}/AndroidManifest.xml according to ANDROID_APK_DIR. ${ANDROID_APK_DIR} ${exportedTarget}")
1230         elseif(NOT APK_DIR)
1231             get_filename_component(_qt5Core_install_prefix "${Qt5Core_DIR}/../../../" ABSOLUTE)
1232             set(APK_DIR "${_qt5Core_install_prefix}/src/android/templates/")
1233         endif()
1234 
1235         ecm_androiddeployqt("${exportedTarget}" "${ECM_ADDITIONAL_FIND_ROOT_PATH}")
1236         set_target_properties(create-apk-${exportedTarget} PROPERTIES ANDROID_APK_DIR "${APK_DIR}")
1237     endforeach()
1238 elseif(ANDROID)
1239     message(STATUS "You can export a target by specifying -DQTANDROID_EXPORTED_TARGET=<targetname> and -DANDROID_APK_DIR=<paths>")
1240 endif()