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