CMakeLists.txt 23.2 KB
Newer Older
Boudewijn Rempt's avatar
Boudewijn Rempt committed
1
project(krita)
Laurent Montel's avatar
Laurent Montel committed
2

3 4
message(STATUS "Using CMake version: ${CMAKE_VERSION}")

5
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
6

7 8 9
set(MIN_QT_VERSION 5.6.0)
option(OVERRIDE_QT_VERSION "Use this to make it possible to build with Qt < 5.6.0. There will be bugs." OFF)
if (OVERRIDE_QT_VERSION)
10 11 12
    set(MIN_QT_VERSION 5.4.0)
endif()

13 14
set(MIN_FRAMEWORKS_VERSION 5.7.0)

15 16 17 18 19
if (POLICY CMP0002)
    cmake_policy(SET CMP0002 OLD)
endif()

if (POLICY CMP0017)
20
    cmake_policy(SET CMP0017 NEW)
21
endif ()
Laurent Montel's avatar
Laurent Montel committed
22

23
if (POLICY CMP0022)
24
    cmake_policy(SET CMP0022 OLD)
25
endif ()
26

27
if (POLICY CMP0026)
28
    cmake_policy(SET CMP0026 OLD)
29 30
endif()

31 32 33 34
if (POLICY CMP0042)
    cmake_policy(SET CMP0042 NEW)
endif()

35
if (POLICY CMP0046)
36
    cmake_policy(SET CMP0046 OLD)
37
endif ()
38

39
if (POLICY CMP0059)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
40
    cmake_policy(SET CMP0059 OLD)
41 42 43
endif()

if (POLICY CMP0063)
44
    cmake_policy(SET CMP0063 OLD)
45
endif()
46

Boudewijn Rempt's avatar
Boudewijn Rempt committed
47 48 49 50 51 52 53 54
if (POLICY CMP0054)
    cmake_policy(SET CMP0054 OLD)
endif()

if (POLICY CMP0064)
    cmake_policy(SET CMP0064 OLD)
endif()

55 56 57

if (APPLE)
    set(APPLE_SUPPRESS_X11_WARNING TRUE)
58 59 60
    set(KDE_SKIP_RPATH_SETTINGS TRUE)
    set(CMAKE_MACOSX_RPATH 1)
    set(BUILD_WITH_INSTALL_RPATH 1)
61
    add_definitions(-mmacosx-version-min=10.9 -Wno-macro-redefined -Wno-deprecated-register)
62
endif()
Boudewijn Rempt's avatar
Boudewijn Rempt committed
63

64 65 66 67
if (LINUX)
    if (CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9 AND NOT WINDOWS)
        add_definitions(-Werror=delete-incomplete)
    endif()
Dmitry Kazakov's avatar
Dmitry Kazakov committed
68 69
endif()

70 71 72 73 74
 ######################
#######################
## Constants defines ##
#######################
######################
Thomas Zander's avatar
Thomas Zander committed
75

76
# define common versions of Krita applications, used to generate kritaversion.h
Jigar Raisinghani's avatar
Jigar Raisinghani committed
77
# update these version for every release:
78 79 80 81
set(KRITA_VERSION_STRING "4.0.0-pre-alpha")
set(KRITA_STABLE_VERSION_MAJOR 4) # 3 for 3.x, 4 for 4.x, etc.
set(KRITA_STABLE_VERSION_MINOR 0) # 0 for 3.0, 1 for 3.1, etc.
set(KRITA_VERSION_RELEASE 0)     # 88 for pre-alpha, 89 for Alpha, increase for next test releases, set 0 for first Stable, etc.
Boudewijn Rempt's avatar
Boudewijn Rempt committed
82 83
set(KRITA_ALPHA 1) # uncomment only for Alpha
#set(KRITA_BETA 1) # uncomment only for Beta
Boudewijn Rempt's avatar
Boudewijn Rempt committed
84
#set(KRITA_RC 1) # uncomment only for RC
Boudewijn Rempt's avatar
Boudewijn Rempt committed
85
set(KRITA_YEAR 2017) # update every year
86 87 88

if(NOT DEFINED KRITA_ALPHA AND NOT DEFINED KRITA_BETA AND NOT DEFINED KRITA_RC)
    set(KRITA_STABLE 1) # do not edit
Jigar Raisinghani's avatar
Jigar Raisinghani committed
89 90
endif()

91
message(STATUS "Krita version: ${KRITA_VERSION_STRING}")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
92

93 94 95
# Define the generic version of the Krita libraries here
# This makes it easy to advance it when the next Krita release comes.
# 14 was the last GENERIC_KRITA_LIB_VERSION_MAJOR of the previous Krita series
Dmitry Kazakov's avatar
Dmitry Kazakov committed
96 97 98
# (2.x) so we're starting with 15 in 3.x series, 16 in 4.x series
if(KRITA_STABLE_VERSION_MAJOR EQUAL 4)
    math(EXPR GENERIC_KRITA_LIB_VERSION_MAJOR "${KRITA_STABLE_VERSION_MINOR} + 16")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
99
else()
Dmitry Kazakov's avatar
Dmitry Kazakov committed
100 101
    # let's make sure we won't forget to update the "16"
    message(FATAL_ERROR "Reminder: please update offset == 16 used to compute GENERIC_KRITA_LIB_VERSION_MAJOR to something bigger")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
102
endif()
103 104
set(GENERIC_KRITA_LIB_VERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}.0.0")
set(GENERIC_KRITA_LIB_SOVERSION "${GENERIC_KRITA_LIB_VERSION_MAJOR}")
105

106
LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
107
LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/kde_macro")
108

Jigar Raisinghani's avatar
Jigar Raisinghani committed
109 110
# fetch git revision for the current build

111 112
set(KRITA_GIT_SHA1_STRING "")
set(KRITA_GIT_BRANCH_STRING "")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
113 114 115

include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
116
get_git_branch(GIT_BRANCH)
Jigar Raisinghani's avatar
Jigar Raisinghani committed
117

118
if(GIT_SHA1 AND GIT_BRANCH)
Jigar Raisinghani's avatar
Jigar Raisinghani committed
119
    string(SUBSTRING ${GIT_SHA1} 0 7 GIT_SHA1)
120 121
    set(KRITA_GIT_SHA1_STRING ${GIT_SHA1})
    set(KRITA_GIT_BRANCH_STRING ${GIT_BRANCH})
122
endif()
123

124 125
if(NOT DEFINED RELEASE_BUILD)
    # estimate mode by CMAKE_BUILD_TYPE content if not set on cmdline
126
    string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_TOLOWER)
127
    set(RELEASE_BUILD_TYPES "release" "relwithdebinfo" "minsizerel")
128
    list(FIND RELEASE_BUILD_TYPES "${CMAKE_BUILD_TYPE_TOLOWER}" INDEX)
129 130
    if (INDEX EQUAL -1)
        set(RELEASE_BUILD FALSE)
131
    else()
132
        set(RELEASE_BUILD TRUE)
133 134
    endif()
endif()
135 136
message(STATUS "Release build: ${RELEASE_BUILD}")

Frederik Gladhorn's avatar
Frederik Gladhorn committed
137 138
# create test make targets
enable_testing()
139 140
# collect list of broken tests, empty here to start fresh with each cmake run
set(KRITA_BROKEN_TESTS "" CACHE INTERNAL "KRITA_BROKEN_TESTS")
Frederik Gladhorn's avatar
Frederik Gladhorn committed
141

Jigar Raisinghani's avatar
Jigar Raisinghani committed
142 143 144 145 146
 ############
#############
## Options ##
#############
############
147

148 149
include(FeatureSummary)

150
if (WIN32)
151
    option(USE_DRMINGW "Support the Dr. Mingw crash handler (only on windows)" ON)
152
    add_feature_info("Dr. Mingw" USE_DRMINGW "Enable the Dr. Mingw crash handler")
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

    if (MINGW)
        option(USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags (mingw-w64)" ON)
        add_feature_info("Linker Security Flags" USE_MINGW_HARDENING_LINKER "Enable DEP (NX), ASLR and high-entropy ASLR linker flags")
        if (USE_MINGW_HARDENING_LINKER)
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
            set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat -Wl,--disable-auto-image-base")
            if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
                # Enable high-entropy ASLR for 64-bit
                # The image base has to be >4GB for HEASLR to be enabled.
                # The values used here are kind of arbitrary.
                set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x140000000")
                set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
                set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va -Wl,--image-base,0x180000000")
            endif ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
        else (USE_MINGW_HARDENING_LINKER)
            message(WARNING "Linker Security Flags not enabled!")
        endif (USE_MINGW_HARDENING_LINKER)
    endif (MINGW)
173
endif ()
174

175 176
option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
configure_file(config-hide-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hide-safe-asserts.h)
177
add_feature_info("Safe Asserts" HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal.")
178

Frederik Gladhorn's avatar
Frederik Gladhorn committed
179
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)
180
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.")
181

182 183
option(KRITA_ENABLE_BROKEN_TESTS "Enable tests that are marked as broken" OFF)
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).")
184 185


186
include(MacroJPEG)
187

Dmitry Kazakov's avatar
Dmitry Kazakov committed
188 189 190 191 192
###########################################################
## Look for Python3. It is also searched by KF5,         ##
## so we should request the correct  version in advance  ##
###########################################################

193
function(TestCompileLinkPythonLibs OUTPUT_VARNAME)
194 195 196
        include(CheckCXXSourceCompiles)
        set(CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_PATH})
        set(CMAKE_REQUIRED_LIBRARIES ${PYTHON_LIBRARIES})
197 198 199
    if (MINGW)
        set(CMAKE_REQUIRED_DEFINITIONS -D_hypot=hypot)
    endif (MINGW)
200 201
        unset(${OUTPUT_VARNAME} CACHE)
        CHECK_CXX_SOURCE_COMPILES("
202 203 204 205 206 207
#include <Python.h>
int main(int argc, char *argv[]) {
    Py_InitializeEx(0);
}" ${OUTPUT_VARNAME})
endfunction()

208
if(MINGW)
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
    # First get the Python library path to make sure the selected Python
    # can be used for Building, then try to get the Python interpreter again
    find_package(PythonInterp 3.6 EXACT)
    find_package(PythonLibs 3.6 EXACT)
    if (PYTHONLIBS_FOUND)
        # Use the same Python as the library
        get_filename_component(PYTHON_DIR ${PYTHON_LIBRARIES} DIRECTORY)
        get_filename_component(PYTHON_DIR ${PYTHON_DIR} DIRECTORY)
        set(PYTHON_EXECUTABLE "${PYTHON_DIR}/python.exe")
        message(STATUS "Set Python executable: ${PYTHON_EXECUTABLE}")
        find_package(PythonInterp 3.6 EXACT)
        if (PYTHONINTERP_FOUND)
            find_package(PythonLibrary 3.6)
        else (PYTHONINTERP_FOUND)
            # This shouldn't happen on Windows...
            message(FATAL_ERROR "Python library found but python.exe not found!")
        endif (PYTHONINTERP_FOUND)
226 227 228
                TestCompileLinkPythonLibs(CAN_USE_PYTHON_LIBS)
                if (NOT CAN_USE_PYTHON_LIBS)
                        message(WARNING "Compiling with Python library failed, please check whether the architecture is correct. Python will be disabled.")
229
            unset(PYTHONLIBS_FOUND CACHE)
230
                endif (NOT CAN_USE_PYTHON_LIBS)
231
    endif (PYTHONLIBS_FOUND)
232 233 234 235
else(MINGW)
    find_package(PythonInterp 3.0)
    find_package(PythonLibrary 3.0)
endif(MINGW)
Dmitry Kazakov's avatar
Dmitry Kazakov committed
236

237 238 239 240 241
 ########################
#########################
## Look for KDE and Qt ##
#########################
########################
Cyrille Berger's avatar
Cyrille Berger committed
242

243
find_package(ECM 5.19 REQUIRED NOMODULE)
244
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
245
include(ECMOptionalAddSubdirectory)
Yue Liu's avatar
Yue Liu committed
246
include(ECMAddAppIcon)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
247 248 249 250 251
include(ECMSetupVersion)
include(ECMMarkNonGuiExecutable)
include(ECMGenerateHeaders)
include(GenerateExportHeader)
include(ECMMarkAsTest)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
252
include(ECMInstallIcons)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
253 254 255

include(CMakePackageConfigHelpers)
include(WriteBasicConfigVersionFile)
Yue Liu's avatar
Yue Liu committed
256
include(CheckFunctionExists)
257 258 259 260 261

include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings)

262 263
# do not reorder to be alphabetical: this is the order in which the frameworks
# depend on each other.
264 265 266 267
find_package(KF5 ${MIN_FRAMEWORKS_VERSION} REQUIRED COMPONENTS
        Archive
        Config
        WidgetsAddons
268
        Completion
269
        CoreAddons
270 271 272
        GuiAddons
        I18n
        ItemModels
273
        ItemViews
274
        WindowSystem
275
)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
276

277
# KConfig deprecated authorizeKAction. In order to be warning free,
278 279 280
# compile with the updated function when the dependency is new enough.
# Remove this (and the uses of the define) when the minimum KF5
# version is >= 5.24.0.
281 282 283
if (${KF5Config_VERSION} VERSION_LESS "5.24.0" )
    message("Old KConfig (< 5.24.0) found.")
    add_definitions(-DKCONFIG_BEFORE_5_24)
284
endif()
285

286 287 288 289 290 291 292
find_package(Qt5 ${MIN_QT_VERSION}
        REQUIRED COMPONENTS
        Core
        Gui
        Widgets
        Xml
        Network
293
        PrintSupport
294 295
        Svg
        Test
296 297
        Concurrent
)
298

299

300
include (MacroAddFileDependencies)
Frederik Gladhorn's avatar
Frederik Gladhorn committed
301 302
include (MacroBoolTo01)
include (MacroEnsureOutOfSourceBuild)
303
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")
304

Boudewijn Rempt's avatar
Boudewijn Rempt committed
305 306
# Note: OPTIONAL_COMPONENTS does not seem to be reliable
# (as of ECM 5.15.0, CMake 3.2)
307 308 309 310 311 312 313 314 315 316 317

find_package(Qt5Multimedia ${MIN_QT_VERSION})
set_package_properties(Qt5Multimedia PROPERTIES
        DESCRIPTION "Qt multimedia integration"
        URL "http://www.qt.io/"
        TYPE OPTIONAL
        PURPOSE "Optionally used to provide sound support for animations")

macro_bool_to_01(Qt5Multimedia_FOUND HAVE_QT_MULTIMEDIA)
configure_file(config-qtmultimedia.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-qtmultimedia.h )

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
find_package(Qt5Quick ${MIN_QT_VERSION})
set_package_properties(Qt5Quick PROPERTIES
        DESCRIPTION "QtQuick"
        URL "http://www.qt.io/"
        TYPE OPTIONAL
        PURPOSE "Optionally used for the touch gui for Krita")

macro_bool_to_01(Qt5Quick_FOUND HAVE_QT_QUICK)

find_package(Qt5QuickWidgets ${MIN_QT_VERSION})
set_package_properties(Qt5QuickWidgets PROPERTIES
        DESCRIPTION "QtQuickWidgets"
        URL "http://www.qt.io/"
        TYPE OPTIONAL
        PURPOSE "Optionally used for the touch gui for Krita")


Boudewijn Rempt's avatar
Boudewijn Rempt committed
335
if (NOT WIN32 AND NOT APPLE)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
336

Boudewijn Rempt's avatar
Boudewijn Rempt committed
337
    find_package(Qt5 ${MIN_QT_VERSION} REQUIRED X11Extras)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
338

339
    find_package(Qt5DBus ${MIN_QT_VERSION})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
340
    set(HAVE_DBUS ${Qt5DBus_FOUND})
341 342 343 344 345
    set_package_properties(Qt5DBus PROPERTIES
        DESCRIPTION "Qt DBUS integration"
        URL "http://www.qt.io/"
        TYPE OPTIONAL
        PURPOSE "Optionally used to provide a dbus api on Linux")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
346

347
    find_package(KF5KIO ${MIN_FRAMEWORKS_VERSION})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
348
    macro_bool_to_01(KF5KIO_FOUND HAVE_KIO)
349 350 351 352 353
    set_package_properties(KF5KIO PROPERTIES
        DESCRIPTION "KDE's KIO Framework"
        URL "http://api.kde.org/frameworks-api/frameworks5-apidocs/kio/html/index.html"
        TYPE OPTIONAL
        PURPOSE "Optionally used for recent document handling")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
354

355
    find_package(KF5Crash ${MIN_FRAMEWORKS_VERSION})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
356
    macro_bool_to_01(KF5Crash_FOUND HAVE_KCRASH)
357 358 359 360 361
    set_package_properties(KF5Crash PROPERTIES
        DESCRIPTION "KDE's Crash Handler"
        URL "http://api.kde.org/frameworks-api/frameworks5-apidocs/kcrash/html/index.html"
        TYPE OPTIONAL
        PURPOSE "Optionally used to provide crash reporting on Linux")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
362

363 364 365
    find_package(X11 REQUIRED COMPONENTS Xinput)
    set(HAVE_X11 TRUE)
    add_definitions(-DHAVE_X11)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
366 367

    find_package(XCB COMPONENTS XCB ATOM)
Frederik Gladhorn's avatar
Frederik Gladhorn committed
368
    set(HAVE_XCB ${XCB_FOUND})
369
else()
Boudewijn Rempt's avatar
Boudewijn Rempt committed
370
    set(HAVE_DBUS FALSE)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
371 372
    set(HAVE_X11 FALSE)
    set(HAVE_XCB FALSE)
373 374
endif()

375

Boudewijn Rempt's avatar
Boudewijn Rempt committed
376 377 378 379 380 381
add_definitions(
  -DQT_USE_QSTRINGBUILDER
  -DQT_STRICT_ITERATORS
  -DQT_NO_SIGNALS_SLOTS_KEYWORDS
  -DQT_USE_FAST_OPERATOR_PLUS
  -DQT_USE_FAST_CONCATENATION
382
  -DQT_NO_URL_CAST_FROM_STRING
Boudewijn Rempt's avatar
Boudewijn Rempt committed
383 384
)

385 386 387 388 389 390 391 392 393 394
if (${Qt5_VERSION} VERSION_GREATER "5.8.0" )
    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50900)
elseif(${Qt5_VERSION} VERSION_GREATER "5.7.0" )
    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50800)
elseif(${Qt5_VERSION} VERSION_GREATER "5.6.0" )
    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50700)
else()
    add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x50600)
endif()

395 396
add_definitions(-DTRANSLATION_DOMAIN=\"krita\")

Boudewijn Rempt's avatar
Boudewijn Rempt committed
397 398 399 400 401
#
# The reason for this mode is that the Debug mode disable inlining
#
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS_KRITADEVS "-O3 -g" CACHE STRING "" FORCE)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
402
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fext-numeric-literals")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
403 404 405 406 407 408 409 410 411 412 413 414 415
endif()

if(UNIX)
    set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};m")
endif()

if(WIN32)
    if(MSVC)
        # C4522: 'class' : multiple assignment operators specified
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4522")
    endif()
endif()

416 417 418
# enable exceptions globally
kde_enable_exceptions()

419

420 421 422 423 424
# only with this definition will all the FOO_TEST_EXPORT macro do something
# TODO: check if this can be moved to only those places which make use of it,
# to reduce global compiler definitions that would trigger a recompile of
# everything on a change (like adding/removing tests to/from the build)
if(BUILD_TESTING)
425
    add_definitions(-DCOMPILING_TESTS)
426
endif()
427

Boudewijn Rempt's avatar
Boudewijn Rempt committed
428
set(KRITA_DEFAULT_TEST_DATA_DIR ${CMAKE_SOURCE_DIR}/sdk/tests/data/)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
429 430 431 432
macro(macro_add_unittest_definitions)
  add_definitions(-DFILES_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/")
  add_definitions(-DFILES_OUTPUT_DIR="${CMAKE_CURRENT_BINARY_DIR}")
  add_definitions(-DFILES_DEFAULT_DATA_DIR="${KRITA_DEFAULT_TEST_DATA_DIR}")
433
  add_definitions(-DSYSTEM_RESOURCES_DATA_DIR="${CMAKE_SOURCE_DIR}/krita/data/")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
434 435 436 437 438
endmacro()




439 440 441 442 443 444
# overcome some platform incompatibilities
if(WIN32)
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/winquirks)
    add_definitions(-D_USE_MATH_DEFINES)
    add_definitions(-DNOMINMAX)
    set(WIN32_PLATFORM_NET_LIBS ws2_32.lib netapi32.lib)
445
endif()
446

447
# set custom krita plugin installdir
448
set(KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR}/kritaplugins)
449

450 451 452 453 454
 ###########################
############################
## Required dependencies  ##
############################
###########################
455 456

find_package(PNG REQUIRED)
457

Boudewijn Rempt's avatar
Boudewijn Rempt committed
458 459
if (APPLE)
    # this is not added correctly on OSX -- see http://forum.kde.org/viewtopic.php?f=139&t=101867&p=221242#p221242
460
    include_directories(SYSTEM ${PNG_INCLUDE_DIR})
461
endif()
Dmitry Kazakov's avatar
Dmitry Kazakov committed
462 463

add_definitions(-DBOOST_ALL_NO_LIB)
464
find_package(Boost 1.55 REQUIRED COMPONENTS system) # for pigment and stage
465
include_directories(${Boost_INCLUDE_DIRS})
466 467 468
##
## Test for GNU Scientific Library
##
469 470 471 472 473
find_package(GSL)
set_package_properties(GSL PROPERTIES
    URL "http://www.gnu.org/software/gsl"
    TYPE RECOMMENDED
    PURPOSE "Required by Krita's Transform tool.")
474 475 476
macro_bool_to_01(GSL_FOUND HAVE_GSL)
configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h )

477 478 479 480 481 482 483
 ###########################
############################
## Optional dependencies  ##
############################
###########################

##
Jigar Raisinghani's avatar
Jigar Raisinghani committed
484
## Check for OpenEXR
485
##
486 487 488 489 490 491
find_package(ZLIB)
set_package_properties(ZLIB PROPERTIES
    DESCRIPTION "Compression library"
    URL "http://www.zlib.net/"
    TYPE OPTIONAL
    PURPOSE "Optionally used by the G'Mic and the PSD plugins")
492 493
macro_bool_to_01(ZLIB_FOUND HAVE_ZLIB)

494 495 496 497 498 499
find_package(OpenEXR)
set_package_properties(OpenEXR PROPERTIES
    DESCRIPTION "High dynamic-range (HDR) image file format"
    URL "http://www.openexr.com"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita OpenEXR filter")
500
macro_bool_to_01(OPENEXR_FOUND HAVE_OPENEXR)
501 502
set(LINK_OPENEXR_LIB)
if(OPENEXR_FOUND)
503
    include_directories(SYSTEM ${OPENEXR_INCLUDE_DIR})
504 505 506 507
    set(LINK_OPENEXR_LIB ${OPENEXR_LIBRARIES})
    add_definitions(${OPENEXR_DEFINITIONS})
endif()

508 509 510 511 512 513
find_package(TIFF)
set_package_properties(TIFF PROPERTIES
    DESCRIPTION "TIFF Library and Utilities"
    URL "http://www.remotesensing.org/libtiff"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita TIFF filter")
514

515 516 517 518 519 520
find_package(JPEG)
set_package_properties(JPEG PROPERTIES
    DESCRIPTION "Free library for JPEG image compression. Note: libjpeg8 is NOT supported."
    URL "http://www.libjpeg-turbo.org"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita JPEG filter")
521 522

set(LIBRAW_MIN_VERSION  "0.16")
523 524 525 526 527 528 529 530 531 532 533 534 535
find_package(LibRaw ${LIBRAW_MIN_VERSION})
set_package_properties(LibRaw PROPERTIES
    DESCRIPTION "Library to decode RAW images"
    URL "http://www.libraw.org"
    TYPE OPTIONAL
    PURPOSE "Required to build the raw import plugin")

find_package(FFTW3)
set_package_properties(FFTW3 PROPERTIES
    DESCRIPTION "A fast, free C FFT library"
    URL "http://www.fftw.org/"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita for fast convolution operators and some G'Mic features")
536
macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
537

538 539 540 541 542 543
find_package(OCIO)
set_package_properties(OCIO PROPERTIES
    DESCRIPTION "The OpenColorIO Library"
    URL "http://www.opencolorio.org"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita LUT docker")
544
macro_bool_to_01(OCIO_FOUND HAVE_OCIO)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
545

546 547 548
##
## Look for OpenGL
##
549 550 551
# TODO: see if there is a better check for QtGui being built with opengl support (and thus the QOpenGL* classes)
if(Qt5Gui_OPENGL_IMPLEMENTATION)
    message(STATUS "Found QtGui OpenGL support")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
552
else()
553
    message(FATAL_ERROR  "Did NOT find QtGui OpenGL support. Check your Qt configuration. You cannot build Krita without Qt OpenGL support.")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
554 555
endif()

556
##
Maximiliano Curia's avatar
Maximiliano Curia committed
557
## Test for eigen3
558
##
559
find_package(Eigen3 3.0 REQUIRED)
560 561 562 563
set_package_properties(Eigen3 PROPERTIES
    DESCRIPTION "C++ template library for linear algebra"
    URL "http://eigen.tuxfamily.org"
    TYPE REQUIRED)
564

565 566 567
##
## Test for exiv2
##
568
find_package(Exiv2 0.16 REQUIRED)
569 570 571 572
set_package_properties(Exiv2 PROPERTIES
    DESCRIPTION "Image metadata library and tools"
    URL "http://www.exiv2.org"
    PURPOSE "Required by Krita")
573

574 575
##
## Test for lcms
576
##
577
find_package(LCMS2 2.4 REQUIRED)
578 579 580 581 582
set_package_properties(LCMS2 PROPERTIES
    DESCRIPTION "LittleCMS Color management engine"
    URL "http://www.littlecms.com"
    TYPE REQUIRED
    PURPOSE "Will be used for color management and is necessary for Krita")
583
if(LCMS2_FOUND)
584
    if(NOT ${LCMS2_VERSION} VERSION_LESS 2040 )
585
        set(HAVE_LCMS24 TRUE)
586
    endif()
587
    set(HAVE_REQUIRED_LCMS_VERSION TRUE)
588
    set(HAVE_LCMS2 TRUE)
589
endif()
590

591 592 593
##
## Test for Vc
##
594 595
set(OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} )
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
Boudewijn Rempt's avatar
Boudewijn Rempt committed
596 597
set(HAVE_VC FALSE)
if( NOT MSVC)
598 599 600 601 602 603
    find_package(Vc 1.1.0)
    set_package_properties(Vc PROPERTIES
        DESCRIPTION "Portable, zero-overhead SIMD library for C++"
        URL "https://github.com/VcDevel/Vc"
        TYPE OPTIONAL
        PURPOSE "Required by the Krita for vectorization")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
604
    macro_bool_to_01(Vc_FOUND HAVE_VC)
605
endif()
606
configure_file(config-vc.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-vc.h )
607 608 609

if(HAVE_VC)
    message(STATUS "Vc found!")
610 611
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                        "${CMAKE_SOURCE_DIR}/cmake/vc")
612

613 614
    include (VcMacros)

Stefano Bonicatti's avatar
Stefano Bonicatti committed
615
    if(Vc_COMPILER_IS_CLANG)
616 617 618
        set(ADDITIONAL_VC_FLAGS "-Wabi -ffp-contract=fast -fPIC")
    elseif (NOT MSVC)
        set(ADDITIONAL_VC_FLAGS "-Wabi -fabi-version=0 -ffp-contract=fast -fPIC")
Stefano Bonicatti's avatar
Stefano Bonicatti committed
619
    endif()
620

621
    #Handle Vc master
622 623 624 625
    if(Vc_COMPILER_IS_GCC OR Vc_COMPILER_IS_CLANG)
        AddCompilerFlag("-std=c++11" _ok)
        if(NOT _ok)
            AddCompilerFlag("-std=c++0x" _ok)
626
        endif()
627
    endif()
628

629 630 631
    macro(ko_compile_for_all_implementations_no_scalar _objs _src)
        vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX AVX2+FMA+BMI2)
    endmacro()
632

633 634 635
    macro(ko_compile_for_all_implementations _objs _src)
        vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY Scalar SSE2 SSSE3 SSE4_1 AVX AVX2+FMA+BMI2)
    endmacro()
636
endif()
637 638
set(CMAKE_MODULE_PATH ${OLD_CMAKE_MODULE_PATH} )

639
add_definitions(${QT_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS})
Laurent Montel's avatar
Laurent Montel committed
640

641
if(WIN32)
642 643 644 645
    set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR}
                        RUNTIME DESTINATION ${BIN_INSTALL_DIR}
                        LIBRARY ${INSTALL_TARGETS_DEFAULT_ARGS}
                        ARCHIVE ${INSTALL_TARGETS_DEFAULT_ARGS} )
646
endif()
647

648 649 650
##
## Test endianess
##
David Faure's avatar
David Faure committed
651
include (TestBigEndian)
652
test_big_endian(CMAKE_WORDS_BIGENDIAN)
653

654 655 656
##
## Test for qt-poppler
##
657
find_package(Poppler COMPONENTS Qt5)
658 659 660 661 662
set_package_properties(Poppler PROPERTIES
    DESCRIPTION "A PDF rendering library"
    URL "http://poppler.freedesktop.org"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita PDF filter.")
663

664 665 666 667 668
 ############################
#############################
## Add Krita helper macros ##
#############################
############################
Cyrille Berger's avatar
Cyrille Berger committed
669

670
include(MacroKritaAddBenchmark)
Cyrille Berger's avatar
Cyrille Berger committed
671

672 673 674 675 676 677
 ####################
#####################
## Define includes ##
#####################
####################

678
# for config.h and <toplevel/foo.h> includes (if any?)
679 680 681
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}
                           ${CMAKE_CURRENT_BINARY_DIR}
                           ${CMAKE_SOURCE_DIR}/interfaces
682 683
)

684
add_subdirectory(libs)
685
add_subdirectory(plugins)
686 687
add_subdirectory(benchmarks)
add_subdirectory(krita)
688

689
configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h )
Boudewijn Rempt's avatar
Boudewijn Rempt committed
690 691 692 693 694
configure_file(config_convolution.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_convolution.h)
configure_file(config-ocio.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-ocio.h )

check_function_exists(powf HAVE_POWF)
configure_file(config-powf.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-powf.h)
695

696 697 698 699
message("\nBroken tests:")
foreach(tst ${KRITA_BROKEN_TESTS})
    message("    * ${tst}")
endforeach()
700

701
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)