CMakeLists.txt 22.8 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 194 195 196 197 198 199 200 201 202 203 204 205 206 207
function(TestCompileLinkPythonLibs OUTPUT_VARNAME)
	include(CheckCXXSourceCompiles)
	set(CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_PATH})
	set(CMAKE_REQUIRED_LIBRARIES ${PYTHON_LIBRARIES})
    if (MINGW)
        set(CMAKE_REQUIRED_DEFINITIONS -D_hypot=hypot)
    endif (MINGW)
	unset(${OUTPUT_VARNAME} CACHE)
	CHECK_CXX_SOURCE_COMPILES("
#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 226 227 228 229 230 231
    # 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)
		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.")
            unset(PYTHONLIBS_FOUND CACHE)
		endif (NOT CAN_USE_PYTHON_LIBS)
    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
383
  -DQT_DISABLE_DEPRECATED_BEFORE=0x50900
Boudewijn Rempt's avatar
Boudewijn Rempt committed
384 385
)

386 387
add_definitions(-DTRANSLATION_DOMAIN=\"krita\")

Boudewijn Rempt's avatar
Boudewijn Rempt committed
388 389 390 391 392
#
# 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
393
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fext-numeric-literals")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
394 395 396 397 398 399 400 401 402 403 404 405 406
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()

407 408 409
# enable exceptions globally
kde_enable_exceptions()

410

411 412 413 414 415
# 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)
416
    add_definitions(-DCOMPILING_TESTS)
417
endif()
418

Boudewijn Rempt's avatar
Boudewijn Rempt committed
419
set(KRITA_DEFAULT_TEST_DATA_DIR ${CMAKE_SOURCE_DIR}/sdk/tests/data/)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
420 421 422 423
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}")
424
  add_definitions(-DSYSTEM_RESOURCES_DATA_DIR="${CMAKE_SOURCE_DIR}/krita/data/")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
425 426 427 428 429
endmacro()




430 431 432 433 434 435
# 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)
436
endif()
437

438
# set custom krita plugin installdir
439
set(KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR}/kritaplugins)
440

441 442 443 444 445
 ###########################
############################
## Required dependencies  ##
############################
###########################
446 447

find_package(PNG REQUIRED)
448

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

add_definitions(-DBOOST_ALL_NO_LIB)
455
find_package(Boost 1.55 REQUIRED COMPONENTS system) # for pigment and stage
456
include_directories(${Boost_INCLUDE_DIRS})
457 458 459
##
## Test for GNU Scientific Library
##
460 461 462 463 464
find_package(GSL)
set_package_properties(GSL PROPERTIES
    URL "http://www.gnu.org/software/gsl"
    TYPE RECOMMENDED
    PURPOSE "Required by Krita's Transform tool.")
465 466 467
macro_bool_to_01(GSL_FOUND HAVE_GSL)
configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h )

468 469 470 471 472 473 474
 ###########################
############################
## Optional dependencies  ##
############################
###########################

##
Jigar Raisinghani's avatar
Jigar Raisinghani committed
475
## Check for OpenEXR
476
##
477 478 479 480 481 482
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")
483 484
macro_bool_to_01(ZLIB_FOUND HAVE_ZLIB)

485 486 487 488 489 490
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")
491
macro_bool_to_01(OPENEXR_FOUND HAVE_OPENEXR)
492 493
set(LINK_OPENEXR_LIB)
if(OPENEXR_FOUND)
494
    include_directories(SYSTEM ${OPENEXR_INCLUDE_DIR})
495 496 497 498
    set(LINK_OPENEXR_LIB ${OPENEXR_LIBRARIES})
    add_definitions(${OPENEXR_DEFINITIONS})
endif()

499 500 501 502 503 504
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")
505

506 507 508 509 510 511
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")
512 513

set(LIBRAW_MIN_VERSION  "0.16")
514 515 516 517 518 519 520 521 522 523 524 525 526
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")
527
macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
528

529 530 531 532 533 534
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")
535
macro_bool_to_01(OCIO_FOUND HAVE_OCIO)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
536

537 538 539
##
## Look for OpenGL
##
540 541 542
# 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
543
else()
544
    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
545 546
endif()

547
##
Maximiliano Curia's avatar
Maximiliano Curia committed
548
## Test for eigen3
549
##
550
find_package(Eigen3 3.0 REQUIRED)
551 552 553 554
set_package_properties(Eigen3 PROPERTIES
    DESCRIPTION "C++ template library for linear algebra"
    URL "http://eigen.tuxfamily.org"
    TYPE REQUIRED)
555

556 557 558
##
## Test for exiv2
##
559
find_package(Exiv2 0.16 REQUIRED)
560 561 562 563
set_package_properties(Exiv2 PROPERTIES
    DESCRIPTION "Image metadata library and tools"
    URL "http://www.exiv2.org"
    PURPOSE "Required by Krita")
564

565 566
##
## Test for lcms
567
##
568
find_package(LCMS2 2.4 REQUIRED)
569 570 571 572 573
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")
574
if(LCMS2_FOUND)
575
    if(NOT ${LCMS2_VERSION} VERSION_LESS 2040 )
576
        set(HAVE_LCMS24 TRUE)
577
    endif()
578
    set(HAVE_REQUIRED_LCMS_VERSION TRUE)
579
    set(HAVE_LCMS2 TRUE)
580
endif()
581

582 583 584
##
## Test for Vc
##
585 586
set(OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} )
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
Boudewijn Rempt's avatar
Boudewijn Rempt committed
587 588
set(HAVE_VC FALSE)
if( NOT MSVC)
589 590 591 592 593 594
    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
595
    macro_bool_to_01(Vc_FOUND HAVE_VC)
596
endif()
597
configure_file(config-vc.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-vc.h )
598 599 600

if(HAVE_VC)
    message(STATUS "Vc found!")
601 602
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                        "${CMAKE_SOURCE_DIR}/cmake/vc")
603

604 605
    include (VcMacros)

Stefano Bonicatti's avatar
Stefano Bonicatti committed
606
    if(Vc_COMPILER_IS_CLANG)
607 608 609
        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
610
    endif()
611

612
    #Handle Vc master
613 614 615 616
    if(Vc_COMPILER_IS_GCC OR Vc_COMPILER_IS_CLANG)
        AddCompilerFlag("-std=c++11" _ok)
        if(NOT _ok)
            AddCompilerFlag("-std=c++0x" _ok)
617
        endif()
618
    endif()
619

620 621 622
    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()
623

624 625 626
    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()
627
endif()
628 629
set(CMAKE_MODULE_PATH ${OLD_CMAKE_MODULE_PATH} )

630
add_definitions(${QT_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS})
Laurent Montel's avatar
Laurent Montel committed
631

632
if(WIN32)
633 634 635 636
    set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR}
                        RUNTIME DESTINATION ${BIN_INSTALL_DIR}
                        LIBRARY ${INSTALL_TARGETS_DEFAULT_ARGS}
                        ARCHIVE ${INSTALL_TARGETS_DEFAULT_ARGS} )
637
endif()
638

639 640 641
##
## Test endianess
##
David Faure's avatar
David Faure committed
642
include (TestBigEndian)
643
test_big_endian(CMAKE_WORDS_BIGENDIAN)
644

645 646 647
##
## Test for qt-poppler
##
648
find_package(Poppler COMPONENTS Qt5)
649 650 651 652 653
set_package_properties(Poppler PROPERTIES
    DESCRIPTION "A PDF rendering library"
    URL "http://poppler.freedesktop.org"
    TYPE OPTIONAL
    PURPOSE "Required by the Krita PDF filter.")
654

655 656 657 658 659
 ############################
#############################
## Add Krita helper macros ##
#############################
############################
Cyrille Berger's avatar
Cyrille Berger committed
660

661
include(MacroKritaAddBenchmark)
Cyrille Berger's avatar
Cyrille Berger committed
662

663 664 665 666 667 668
 ####################
#####################
## Define includes ##
#####################
####################

669
# for config.h and <toplevel/foo.h> includes (if any?)
670 671 672
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}
                           ${CMAKE_CURRENT_BINARY_DIR}
                           ${CMAKE_SOURCE_DIR}/interfaces
673 674
)

675
add_subdirectory(libs)
676
add_subdirectory(plugins)
677 678
add_subdirectory(benchmarks)
add_subdirectory(krita)
679

680
configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h )
Boudewijn Rempt's avatar
Boudewijn Rempt committed
681 682 683 684 685
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)
686

687 688 689 690
message("\nBroken tests:")
foreach(tst ${KRITA_BROKEN_TESTS})
    message("    * ${tst}")
endforeach()
691

692
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)