Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

CMakeLists.txt 22.4 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

Boudewijn Rempt's avatar
Boudewijn Rempt committed
7
set(MIN_QT_VERSION 5.4.0)
8 9
set(MIN_FRAMEWORKS_VERSION 5.7.0)

10 11 12 13 14
if (POLICY CMP0002)
    cmake_policy(SET CMP0002 OLD)
endif()

if (POLICY CMP0017)
15
    cmake_policy(SET CMP0017 NEW)
16
endif ()
Laurent Montel's avatar
Laurent Montel committed
17

18
if (POLICY CMP0022)
19
    cmake_policy(SET CMP0022 OLD)
20
endif ()
21

22
if (POLICY CMP0026)
23
    cmake_policy(SET CMP0026 OLD)
24 25
endif()

26 27 28 29
if (POLICY CMP0042)
    cmake_policy(SET CMP0042 NEW)
endif()

30
if (POLICY CMP0046)
31
    cmake_policy(SET CMP0046 OLD)
32
endif ()
33

34
if (POLICY CMP0059)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
35
    cmake_policy(SET CMP0059 OLD)
36 37 38
endif()

if (POLICY CMP0063)
39
    cmake_policy(SET CMP0063 OLD)
40
endif()
41

Boudewijn Rempt's avatar
Boudewijn Rempt committed
42 43 44 45 46 47 48 49
if (POLICY CMP0054)
    cmake_policy(SET CMP0054 OLD)
endif()

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

50 51 52 53 54

if (APPLE)
    set(APPLE_SUPPRESS_X11_WARNING TRUE)
    set(CMAKE_MACOSX_RPATH ON)
endif ()
Boudewijn Rempt's avatar
Boudewijn Rempt committed
55

56 57 58 59 60 61 62 63 64 65 66 67 68 69
# QT5TODO: remove KDE4_BUILD_TESTS once all kde4_add_unit_test have been converted
# transitional forward compatibility:
# BUILD_TESTING is cmake standard, KDE4_BUILD_TESTS not used by ECM/KF5, but only
# macros in cmake/transitional. Just, Macros from cmake/transitional,
# incl. kde4_add_unit_test, are only picked up if no macros from kdelibs4 are installed,
# because that transitional path is appended. Prepending instead might possibly unwantedly
# mask ECM/KF5 macros. Not tested.
# So have BUILD_TESTING define KDE4_BUILD_TESTS.
if (BUILD_TESTING)
    set(KDE4_BUILD_TESTS TRUE)
else()
    set(KDE4_BUILD_TESTS FALSE)
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 82 83 84 85 86 87 88
set(KRITA_VERSION_STRING "3.0 Beta")
set(KRITA_STABLE_VERSION_MAJOR 3) # 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 90)     # 89 for Alpha, increase for next test releases, set 0 for first Stable, etc.
#set(KRITA_ALPHA 1) # uncomment only for Alpha
set(KRITA_BETA 1) # uncomment only for Beta
#set(KRITA_RC 1) # uncomment only for RC
set(KRITA_YEAR 2016) # update every year

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
96
# (2.x) so we're starting with 15 in 3.x series.
97 98
if(KRITA_STABLE_VERSION_MAJOR EQUAL 3)
    math(EXPR GENERIC_KRITA_LIB_VERSION_MAJOR "${KRITA_STABLE_VERSION_MINOR} + 15")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
99
else()
100
    # let's make sure we won't forget to update the "15"
101
    message(FATAL_ERROR "Reminder: please update offset == 15 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 107
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                      "${CMAKE_SOURCE_DIR}/cmake/modules")
108
LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/kde_macro")
109 110

message("Module path:" ${CMAKE_MODULE_PATH})
111

Jigar Raisinghani's avatar
Jigar Raisinghani committed
112 113
# fetch git revision for the current build

114 115
set(KRITA_GIT_SHA1_STRING "")
set(KRITA_GIT_BRANCH_STRING "")
Jigar Raisinghani's avatar
Jigar Raisinghani committed
116 117 118

include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
119
get_git_branch(GIT_BRANCH)
Jigar Raisinghani's avatar
Jigar Raisinghani committed
120

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

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

Jigar Raisinghani's avatar
Jigar Raisinghani committed
140 141 142 143 144
 ############
#############
## Options ##
#############
############
145

146
option(PACKAGERS_BUILD "Build support of multiple CPU architectures in one binary. Should be used by packagers only or Krita developers. Only switch off when you're an artist optimizing a build for your very own machine." ON)
147 148 149
if (WIN32)
    option(USE_BREAKPAD "Build the crash handler for Krita (only on windows)" OFF)
endif ()
150

151 152 153
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)

154 155 156 157 158 159
 #######################
########################
## Productset setting ##
########################
#######################

160
# For predefined productsets see the definitions in KritaProducts.cmake and
161 162 163 164 165 166 167 168 169 170
# in the files in the folder cmake/productsets.

# Finding out the products & features to build is done in 5 steps:
# 1. have the user define the products/features wanted, by giving a productset
# 2. estimate all additional required products/features
# 3. estimate which of the products/features can be build by external deps
# 4. find which products/features have been temporarily disabled due to problems
# 5. estimate which of the products/features can be build by internal deps

# get the special macros
171
include(CalligraProductSetMacros)
172
include(MacroJPEG)
173 174
include(GenerateTestExportHeader)

175 176

# get the definitions of products, features and product sets
177
include(KritaProducts.cmake)
178

179
set(PRODUCTSET_DEFAULT "ALL")
180 181 182 183 184
# temporary migration support
if (CREATIVEONLY)
    set(WARN_ABOUT_CREATIVEONLY TRUE)
    set(PRODUCTSET_DEFAULT "CREATIVE")
endif ()
185 186

if(NOT PRODUCTSET)
187
    set(PRODUCTSET ${PRODUCTSET_DEFAULT} CACHE STRING "Set of products/features to build" FORCE)
188
endif()
189

190 191
if (RELEASE_BUILD)
    set(CALLIGRA_SHOULD_BUILD_STAGING FALSE)
192
else ()
193
    set(CALLIGRA_SHOULD_BUILD_STAGING TRUE)
194
endif ()
195

196
# finally choose products/features to build
197
calligra_set_productset(${PRODUCTSET})
198

199 200 201 202 203
 ########################
#########################
## Look for KDE and Qt ##
#########################
########################
Cyrille Berger's avatar
Cyrille Berger committed
204

Yue Liu's avatar
Yue Liu committed
205
find_package(ECM 1.7.0 REQUIRED NOMODULE)
206
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
207
include(ECMOptionalAddSubdirectory)
Yue Liu's avatar
Yue Liu committed
208
include(ECMAddAppIcon)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
209 210 211 212 213
include(ECMSetupVersion)
include(ECMMarkNonGuiExecutable)
include(ECMGenerateHeaders)
include(GenerateExportHeader)
include(ECMMarkAsTest)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
214
include(ECMInstallIcons)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
215 216 217

include(CMakePackageConfigHelpers)
include(WriteBasicConfigVersionFile)
Yue Liu's avatar
Yue Liu committed
218
include(CheckFunctionExists)
219 220 221 222 223

include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings)
include(FeatureSummary)
224
include(KDE4Macros)
225

226 227
# do not reorder to be alphabetical: this is the order in which the frameworks
# depend on each other.
228 229 230 231
find_package(KF5 ${MIN_FRAMEWORKS_VERSION} REQUIRED COMPONENTS
        Archive
        Config
        WidgetsAddons
232
        Completion
233
        CoreAddons
234 235 236
        GuiAddons
        I18n
        ItemModels
237
        ItemViews
238
        WindowSystem
239
)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
240

241 242 243 244 245 246 247
find_package(Qt5 ${MIN_QT_VERSION}
        REQUIRED COMPONENTS
        Core
        Gui
        Widgets
        Xml
        Network
248
        PrintSupport
249 250
        Svg
        Test
251 252
        Concurrent
)
253

254

255 256
set(QT_QTTEST_LIBRARY Qt5::Test)

257 258 259
if (NOT WIN32 AND NOT APPLE)
    find_package(Qt5 ${MIN_QT_VERSION} REQUIRED X11Extras)
endif()
Jigar Raisinghani's avatar
Jigar Raisinghani committed
260

261
include (MacroLibrary)
262 263
include (MacroAdditionalCleanFiles)
include (MacroAddFileDependencies)
264

265
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")
266

Boudewijn Rempt's avatar
Boudewijn Rempt committed
267 268 269
# Note: OPTIONAL_COMPONENTS does not seem to be reliable
# (as of ECM 5.15.0, CMake 3.2)
find_package(Qt5Quick ${MIN_QT_VERSION} QUIET)
270
macro_log_feature(${Qt5Quick_FOUND} "QtQuick" "Qt Quick" "http://www.qt.io" FALSE "" "Necessary to build the tablet gui for Krita")
271

Boudewijn Rempt's avatar
Boudewijn Rempt committed
272 273 274 275 276 277 278
find_package(Qt5DBus ${MIN_QT_VERSION} QUIET)
set(HAVE_DBUS ${Qt5DBus_FOUND})
macro_log_feature(${Qt5DBus_FOUND} "dbus" "Qt DBUS integration" "http://www.qt.io/" FALSE "" "Optionally used to provide a dbus api on Linux")


if (NOT WIN32 AND NOT APPLE)

Boudewijn Rempt's avatar
Boudewijn Rempt committed
279
        find_package(KF5KIO ${MIN_FRAMEWORKS_VERSION} QUIET)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
280
        macro_bool_to_01(KF5KIO_FOUND HAVE_KIO)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
281
        macro_log_feature(${KF5KIO_FOUND} "KIO" "KDE's KIO Framework" "http://api.kde.org/frameworks-api/frameworks5-apidocs/kio/html/index.html" FALSE "" "Optionally used for recent document handling")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
282

Boudewijn Rempt's avatar
Boudewijn Rempt committed
283
        find_package(KF5Crash ${MIN_FRAMEWORKS_VERSION} QUIET) 
Boudewijn Rempt's avatar
Boudewijn Rempt committed
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
        macro_bool_to_01(KF5Crash_FOUND HAVE_KCRASH)
        macro_log_feature(${KF5Crash_FOUND} "kcrash" "KDE's Crash Handler" "http://api.kde.org/frameworks-api/frameworks5-apidocs/kcrash/html/index.html" FALSE "" "Optionally used to provide crash reporting on Linux")

        find_package(X11)
        if(X11_FOUND)
            find_package(Qt5 ${MIN_QT_VERSION} REQUIRED NO_MODULE COMPONENTS X11Extras)
            set(HAVE_X11 TRUE)
            add_definitions(-DHAVE_X11)
        else()
            set(HAVE_X11 FALSE)
        endif()

        find_package(XCB COMPONENTS XCB ATOM)
        if(XCB_FOUND)
            set(HAVE_XCB TRUE)
        else()
            set(HAVE_XCB FALSE)
        endif()
302
else()
Boudewijn Rempt's avatar
Boudewijn Rempt committed
303 304
    set(HAVE_X11 FALSE)
    set(HAVE_XCB FALSE)
305 306
endif()

Boudewijn Rempt's avatar
Boudewijn Rempt committed
307
add_definitions(
308
  -DTRANSLATION_DOMAIN=\"krita\"
Boudewijn Rempt's avatar
Boudewijn Rempt committed
309 310 311 312 313
  -DQT_USE_QSTRINGBUILDER
  -DQT_STRICT_ITERATORS
  -DQT_NO_SIGNALS_SLOTS_KEYWORDS
  -DQT_USE_FAST_OPERATOR_PLUS
  -DQT_USE_FAST_CONCATENATION
314
  -DQT_NO_URL_CAST_FROM_STRING
315
  -DQT_DISABLE_DEPRECATED_BEFORE=0
Boudewijn Rempt's avatar
Boudewijn Rempt committed
316 317
)

Boudewijn Rempt's avatar
Boudewijn Rempt committed
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
#
# 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)
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()

336 337 338
# enable exceptions globally
kde_enable_exceptions()

339

340 341 342 343 344
# 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)
345
    add_definitions(-DCOMPILING_TESTS)
346
endif()
347

Boudewijn Rempt's avatar
Boudewijn Rempt committed
348
set(KRITA_DEFAULT_TEST_DATA_DIR ${CMAKE_SOURCE_DIR}/sdk/tests/data/)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
349 350 351 352 353 354 355 356 357
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}")
endmacro()




358 359 360 361 362 363
# 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)
364
endif()
365

366
# set custom krita plugin installdir
367
set(KRITA_PLUGIN_INSTALL_DIR ${LIB_INSTALL_DIR}/kritaplugins)
368

369 370 371 372 373
 ###########################
############################
## Required dependencies  ##
############################
###########################
374 375

find_package(PNG REQUIRED)
376

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

add_definitions(-DBOOST_ALL_NO_LIB)
383
find_package(Boost REQUIRED COMPONENTS system) # for pigment and stage
384

385 386
if (APPLE)
    SET(CMAKE_CXX_FLAGS "-stdlib=libstdc++ -std=c++11")
387
#    find_package(Carbon REQUIRED)
388
endif ()
389

390 391 392
##
## Test for GNU Scientific Library
##
Boudewijn Rempt's avatar
Boudewijn Rempt committed
393
macro_optional_find_package(GSL)
394 395 396 397
macro_log_feature(GSL_FOUND "GSL" "GNU Scientific Library" "http://www.gnu.org/software/gsl" FALSE "1.7" "Required by Krita's Transform tool.")
macro_bool_to_01(GSL_FOUND HAVE_GSL)
configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h )

398 399 400 401 402 403 404
 ###########################
############################
## Optional dependencies  ##
############################
###########################

##
Jigar Raisinghani's avatar
Jigar Raisinghani committed
405
## Check for OpenEXR
406
##
407 408 409 410
macro_optional_find_package(ZLIB)
macro_log_feature(ZLIB_FOUND "zlib" "Compression library" "http://www.zlib.net/" FALSE "" "Optionally used by the G'Mic and the PSD plugins")
macro_bool_to_01(ZLIB_FOUND HAVE_ZLIB)

411

412
macro_optional_find_package(OpenEXR)
413
macro_log_feature(OPENEXR_FOUND "OpenEXR" "High dynamic-range (HDR) image file format" "http://www.openexr.com" FALSE "" "Required by the Krita OpenEXR filter")
414
macro_bool_to_01(OPENEXR_FOUND HAVE_OPENEXR)
415 416
set(LINK_OPENEXR_LIB)
if(OPENEXR_FOUND)
417
    include_directories(SYSTEM ${OPENEXR_INCLUDE_DIR})
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
    set(LINK_OPENEXR_LIB ${OPENEXR_LIBRARIES})
    add_definitions(${OPENEXR_DEFINITIONS})
endif()

macro_optional_find_package(TIFF)
macro_log_feature(TIFF_FOUND "tiff" "TIFF Library and Utilities" "http://www.remotesensing.org/libtiff" FALSE "" "Required by the Krita TIFF filter")

macro_optional_find_package(JPEG)
macro_log_feature(JPEG_FOUND "jpeg" "Free library for JPEG image compression. Note: libjpeg8 is NOT supported." "http://www.libjpeg-turbo.org" FALSE "" "Required by the Krita JPEG filter")

macro_optional_find_package(OpenJPEG)
macro_log_feature(OPENJPEG_FOUND "openjpeg" "Free library for JPEG 2000 image compression" "http://www.openjpeg.org" FALSE "" "Required by the Krita JPEG 2000 filter")

set(LIBRAW_MIN_VERSION  "0.16")
macro_optional_find_package(LibRaw ${LIBRAW_MIN_VERSION})
Boudewijn Rempt's avatar
Boudewijn Rempt committed
433
macro_log_feature(LIBRAW_FOUND "LibRaw" "Library to decode RAW images" "http://www.libraw.org" FALSE "" "Required to build the raw import plugin")
434 435 436 437

macro_optional_find_package(FFTW3)
macro_log_feature(FFTW3_FOUND "FFTW3" "A fast, free C FFT library" "http://www.fftw.org/" FALSE "" "Required by the Krita for fast convolution operators and some G'Mic features")
macro_bool_to_01(FFTW3_FOUND HAVE_FFTW3)
438

439 440 441
macro_optional_find_package(OCIO)
macro_log_feature(OCIO_FOUND "OCIO" "The OpenColorIO Library" "http://www.opencolorio.org" FALSE "" "Required by the Krita LUT docker")
macro_bool_to_01(OCIO_FOUND HAVE_OCIO)
Boudewijn Rempt's avatar
Boudewijn Rempt committed
442

443 444 445
##
## Look for OpenGL
##
446 447 448
# 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
449
else()
450
    message(FATAL_ERROR "Did NOT find QtGui OpenGL support. Check your Qt configuration.")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
451 452
endif()

453
##
Maximiliano Curia's avatar
Maximiliano Curia committed
454
## Test for eigen3
455
##
Boudewijn Rempt's avatar
Boudewijn Rempt committed
456
find_package(Eigen3 REQUIRED)
457
macro_log_feature(EIGEN3_FOUND "Eigen" "C++ template library for linear algebra" "http://eigen.tuxfamily.org" FALSE "3.0" "Required by Krita")
458

459 460 461
##
## Test for exiv2
##
462
set(EXIV2_MIN_VERSION "0.16")
Boudewijn Rempt's avatar
Boudewijn Rempt committed
463
find_package(Exiv2 REQUIRED)
464
macro_log_feature(EXIV2_FOUND "Exiv2" "Image metadata library and tools" "http://www.exiv2.org" FALSE "0.16" "Required by Krita")
465

466 467
##
## Test for lcms
468
##
Boudewijn Rempt's avatar
Boudewijn Rempt committed
469
find_package(LCMS2 REQUIRED)
470
macro_log_feature(LCMS2_FOUND "LittleCMS" "Color management engine" "http://www.littlecms.com" FALSE "2.4" "Will be used for color management and is necessary for Krita")
471
if(LCMS2_FOUND)
472
    if(NOT ${LCMS2_VERSION} VERSION_LESS 2040 )
473
        set(HAVE_LCMS24 TRUE)
474
    endif()
475
    set(HAVE_REQUIRED_LCMS_VERSION TRUE)
476
    set(HAVE_LCMS2 TRUE)
477
endif()
478

479 480 481
##
## Test for Vc
##
482 483
set(OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} )
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
484
macro_optional_find_package(Vc 0.6.70)
485 486 487 488 489
macro_log_feature(Vc_FOUND "Vc" "Portable, zero-overhead SIMD library for C++" "https://github.com/VcDevel/Vc" FALSE "" "Required by the Krita for vectorization")
macro_bool_to_01(Vc_FOUND HAVE_VC)
macro_bool_to_01(PACKAGERS_BUILD DO_PACKAGERS_BUILD)

configure_file(config-vc.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-vc.h )
490 491 492

if(HAVE_VC)
    message(STATUS "Vc found!")
493 494
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                        "${CMAKE_SOURCE_DIR}/cmake/vc")
495

496 497
    include (VcMacros)

Stefano Bonicatti's avatar
Stefano Bonicatti committed
498
    if(Vc_COMPILER_IS_CLANG)
499 500 501
        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
502
    endif()
503

504
    #Handle Vc master
505 506 507 508 509 510 511 512
    if(Vc_VERSION_MAJOR GREATER 0 OR Vc_VERSION_MINOR GREATER 7)
        message(STATUS "Vc version is greater than 0.7, enabling AVX2 support")

        if(Vc_COMPILER_IS_GCC OR Vc_COMPILER_IS_CLANG)
            AddCompilerFlag("-std=c++11" _ok)
            if(NOT _ok)
                AddCompilerFlag("-std=c++0x" _ok)
            endif()
513
        endif()
514

515 516 517 518 519 520 521
        macro(ko_compile_for_all_implementations_no_scalar _objs _src)
        if(PACKAGERS_BUILD)
            vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX AVX2)
        else()
            set(${_objs} ${_src})
        endif()
        endmacro()
522

523 524 525 526 527 528 529
        macro(ko_compile_for_all_implementations _objs _src)
        if(PACKAGERS_BUILD)
            vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY Scalar SSE2 SSSE3 SSE4_1 AVX AVX2)
        else()
            set(${_objs} ${_src})
        endif()
        endmacro()
530
    else()
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
        macro(ko_compile_for_all_implementations_no_scalar _objs _src)
        if(PACKAGERS_BUILD)
            vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX)
        else()
            set(${_objs} ${_src})
        endif()
        endmacro()

        macro(ko_compile_for_all_implementations _objs _src)
        if(PACKAGERS_BUILD)
            vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY Scalar SSE2 SSSE3 SSE4_1 AVX)
        else()
            set(${_objs} ${_src})
        endif()
        endmacro()
546
    endif()
547

548
    if (NOT PACKAGERS_BUILD)
549 550
        # Optimize everything for the current architecture
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Vc_DEFINITIONS}")
551 552
    endif ()
endif()
553 554
set(CMAKE_MODULE_PATH ${OLD_CMAKE_MODULE_PATH} )

555 556 557
##
## Test for Xinput
##
558
if(NOT WIN32 AND NOT APPLE)
559
  set(REQUIRED_Xinput_FOUND ${X11_Xinput_FOUND})
560
else()
561
  set(REQUIRED_Xinput_FOUND TRUE)
562
endif()
563

David Faure's avatar
David Faure committed
564
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS})
Laurent Montel's avatar
Laurent Montel committed
565

566
if(WIN32)
567 568 569 570
    set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR}
                        RUNTIME DESTINATION ${BIN_INSTALL_DIR}
                        LIBRARY ${INSTALL_TARGETS_DEFAULT_ARGS}
                        ARCHIVE ${INSTALL_TARGETS_DEFAULT_ARGS} )
571
endif()
572

573 574 575
##
## Test endianess
##
David Faure's avatar
David Faure committed
576
include (TestBigEndian)
577
test_big_endian(CMAKE_WORDS_BIGENDIAN)
578

579 580 581 582
##
## Test SharedMimeInfo
##
macro_optional_find_package(SharedMimeInfo)
583
macro_log_feature(SHARED_MIME_INFO_FOUND "SharedMimeInfo" "Shared Mime Info" "http://freedesktop.org/wiki/Software/shared-mime-info" FALSE "" "Required to determine file types OpenRaster (Krita default format).")
584 585 586 587 588

##
## Test for qt-poppler
##
macro_optional_find_package(Poppler)
589
macro_log_feature( POPPLER_FOUND "Poppler-Qt5" "A PDF rendering library" "http://poppler.freedesktop.org" FALSE "" "Required by the Krita PDF filter.")
590

591 592 593 594 595 596 597 598 599 600
##
## Test for pthreads (for G'Mic)
##
macro_optional_find_package(Threads)
macro_log_feature(Threads_FOUND "PThreads" "A low-level threading library" "" FALSE "" "Optionally used by the G'Mic plugin")

##
## Test for OpenMP (for G'Mic)
##
macro_optional_find_package(OpenMP)
601
macro_log_feature(OPENMP_FOUND "OpenMP" "A low-level parallel execution library" "http://openmp.org/wp/" FALSE "" "Optionally used by the G'Mic plugin")
602

603
##
604
## Test for Curl (for G'Mic)
605
##
606
macro_optional_find_package(CURL)
607
macro_log_feature(CURL_FOUND "CURL" "A tool to fetch remote data" "http://curl.haxx.se/" FALSE "" "Optionally used by the G'Mic plugin")
608

609 610 611 612 613
 ############################
#############################
## Add Krita helper macros ##
#############################
############################
Cyrille Berger's avatar
Cyrille Berger committed
614

615
include(MacroKritaAddBenchmark)
Cyrille Berger's avatar
Cyrille Berger committed
616

617 618 619 620 621 622
 ####################
#####################
## Define includes ##
#####################
####################

623
# for config.h and <toplevel/foo.h> includes (if any?)
624 625 626
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} 
                           ${CMAKE_CURRENT_BINARY_DIR} 
                           ${CMAKE_SOURCE_DIR}/interfaces 
627 628
)

629 630 631
include_directories(
   ${CMAKE_SOURCE_DIR}/libs/version
   ${CMAKE_BINARY_DIR}/libs/version
632
)
633

634 635 636 637 638
 ###################################################
####################################################
## Detect which products/features can be compiled ##
####################################################
###################################################
639

Boudewijn Rempt's avatar
Boudewijn Rempt committed
640
calligra_drop_product_on_bad_condition( APP_KRITA
641 642 643 644 645 646
    EIGEN3_FOUND "Eigen devel not found"
    EXIV2_FOUND "libexiv2 devel not found"
    HAVE_REQUIRED_LCMS_VERSION "lcms devel not found"
    Boost_SYSTEM_FOUND "boost-system devel not found"
    REQUIRED_Xinput_FOUND "Xinput devel not found "
)
647

648 649 650 651 652 653
#############################################
####  Backward compatibility BUILD_x=off ####
#############################################

# workaround: disable directly all products which might be activated by internal
# dependencies, but belong to scope of old flag
654
calligra_drop_products_on_old_flag(krita APP_KRITA)
655

656 657 658 659 660
#############################################
####      Temporarily broken products    ####
#############################################

# If a product does not build due to some temporary brokeness disable it here,
661 662
# by calling calligra_disable_product with the product id and the reason,
# e.g.:
663
# calligra_disable_product(APP_KEXI "isn't buildable at the moment")
664 665 666 667 668

#############################################
####     Calculate buildable products    ####
#############################################

669
calligra_drop_unbuildable_products()
Jarosław Staniek's avatar
Jarosław Staniek committed
670

671 672 673 674 675 676
 ###################
####################
## Subdirectories ##
####################
###################

677
if(SHOULD_BUILD_APP_KRITA)
678
  add_subdirectory(krita)
679
endif()
680

681 682
# non-app directories are moved here because they can depend on SHOULD_BUILD_{appname} variables set above
add_subdirectory(libs)
683
add_subdirectory(plugins)
Laurent Montel's avatar
Laurent Montel committed
684

685
add_subdirectory( benchmarks )
686

687
macro_display_feature_log()
688

689
calligra_product_deps_report("product_deps")
690
calligra_log_should_build()
691

692
configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h )
Boudewijn Rempt's avatar
Boudewijn Rempt committed
693 694 695 696 697
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)