CMakeLists.txt 11.9 KB
Newer Older
1
cmake_minimum_required(VERSION 3.3)
2
find_package(ECM 5.40.0 REQUIRED NO_MODULE)
3
set(CMAKE_CXX_STANDARD 14)
4
set(QT_MIN_VERSION "5.8.0")
5

Jonah Brüchert's avatar
Jonah Brüchert committed
6 7 8 9
if(POLICY CMP0071)
	cmake_policy(SET CMP0071 NEW)
endif()

10 11
project(kaidan)

12
set(APPLICATION_ID "im.kaidan.kaidan")
13 14 15 16 17
set(APPLICATION_NAME "kaidan")
set(APPLICATION_DISPLAY_NAME "Kaidan")
if(UBUNTU_TOUCH)
	set(APPLICATION_NAME "${APPLICATION_ID}")
endif()
Linus Jahn's avatar
Linus Jahn committed
18 19 20
set(VERSION_STRING "0.4.0~dev")
set(DEVELOPMENT_BUILD TRUE)
set(ANDROID_VERSION_CODE 3)
21

22 23
# CMake options
option(I18N "Enable i18n support" FALSE)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
24
option(STATIC_BUILD "Build Kaidan statically")
Melvin Keskin's avatar
Melvin Keskin committed
25
option(UBUNTU_TOUCH "Building an Ubuntu Touch click (internal use only!)" FALSE)
26
option(CLICK_ARCH "Architecture that will be used in the click's manifest")
27
option(CLICK_DATE "Date used in the version number in the click's manifest")
28
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" FALSE)
29
option(USE_KNOTIFICATIONS "Use KNotifications for displaying notifications" TRUE)
30
option(BUNDLE_ICONS "Bundle breeze icons" FALSE)
31 32 33 34 35 36 37 38

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc, uic and rcc automatically when needed.
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
39
set(AUTOMOC_MOC_OPTIONS -Muri=${APPLICATION_ID})
40

41 42 43 44
#
# Dependecies
#

45
# CMake module path
Ilya Bizyaev's avatar
Ilya Bizyaev committed
46
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
47 48 49 50 51 52 53 54

# CMake modules include
include(KDEInstallDirs)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDECMakeSettings)
include(ECMInstallIcons)
include(FeatureSummary)
kde_enable_exceptions()
55 56

# Find packages
57
find_package(PkgConfig REQUIRED)
Linus Jahn's avatar
Linus Jahn committed
58
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Qml Quick Svg Sql QuickControls2 Xml)
Linus Jahn's avatar
Linus Jahn committed
59
find_package(KF5Kirigami2 REQUIRED)
60
pkg_search_module(QXmpp REQUIRED qxmpp>=0.9)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
61

Jonah Brüchert's avatar
Jonah Brüchert committed
62
# Optional QtQuickCompiler
63 64 65 66
if(QUICK_COMPILER)
	find_package(Qt5QuickCompiler)
	set_package_properties(Qt5QuickCompiler PROPERTIES
		DESCRIPTION "Compile QML at build time"
67
		TYPE OPTIONAL
68 69
	)
endif()
Jonah Brüchert's avatar
Jonah Brüchert committed
70

71 72 73 74 75 76
if(USE_KNOTIFICATIONS)
	find_package(KF5Notifications REQUIRED)
	set(__KF5Notifications_LIBRARIES KF5::Notifications)
	add_definitions(-DHAVE_KNOTIFICATIONS)
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
77
# Optional QWidget style integration (not on mobile)
78
if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS)
79 80 81 82 83
	find_package(Qt5Widgets)
	set_package_properties(Qt5Widgets PROPERTIES
		DESCRIPTION "Integration with QWidget based desktop styles"
		TYPE OPTIONAL
	)
84 85
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
86
# Platform-specific
87 88 89 90 91 92 93
if(Qt5Widgets_FOUND)
	add_definitions(-DHAVE_QWIDGETS -DQAPPLICATION_CLASS=QApplication)
	set(__Qt5Widgets_LIBRARIES Qt5::Widgets)
else()
	add_definitions(-DQAPPLICATION_CLASS=QGuiApplication)
endif()

94
if(ANDROID)
95
	find_package(Qt5 REQUIRED COMPONENTS AndroidExtras)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
96 97
endif()

98 99
if(ANDROID OR WIN32)
	pkg_search_module(OPENSSL REQUIRED openssl IMPORTED_TARGET)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
100
	message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
101 102
endif()

103

104
#
105
# Load submodules
106 107
#

108 109 110 111
# Main kaidan sources
include("${CMAKE_SOURCE_DIR}/src/CMakeLists.txt")

# I18n support
112 113 114
if(I18N)
	include("${CMAKE_SOURCE_DIR}/i18n/CMakeLists.txt")
endif()
115

116

117 118 119
#
# Sources / Resources
#
120

Ilya Bizyaev's avatar
Ilya Bizyaev committed
121
# Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS
122
if(BUNDLE_ICONS OR UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
123 124 125
	set(KAIDAN_ICONS_QRC kirigami-icons.qrc)
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
126 127
# Bundle images on Android, Windows, macOS and iOS
if(ANDROID OR WIN32 OR APPLE)
128 129 130
	set(KAIDAN_IMAGES_QRC "data/images/images.qrc")
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
131 132 133
# Set app icon
if(APPLE)
	set(KAIDAN_ICNS "${CMAKE_SOURCE_DIR}/misc/macos/kaidan.icns")
134
	set_source_files_properties(${KAIDAN_ICNS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
Ilya Bizyaev's avatar
Ilya Bizyaev committed
135 136 137 138 139 140 141 142
elseif(WIN32)
	include(ECMAddAppIcon)
	file(GLOB WIN_ICONS_SRCS "${CMAKE_SOURCE_DIR}/misc/windows/*kaidan.png")
	message(STATUS ${WIN_ICONS_SRCS})
	ecm_add_app_icon(KAIDAN_ICNS ICONS ${WIN_ICONS_SRCS})
	message(STATUS ${KAIDAN_ICNS})
endif()

143 144
link_directories(${QXmpp_LIBDIR})

145
if(QUICK_COMPILER)
Jonah Brüchert's avatar
Jonah Brüchert committed
146 147 148 149 150
	qtquick_compiler_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc)
else()
	qt5_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc)
endif()

151
add_executable(${PROJECT_NAME}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
152 153 154
	MACOSX_BUNDLE
	WIN32
	${KAIDAN_ICNS}
155
	${KAIDAN_SOURCES}
Jonah Brüchert's avatar
Jonah Brüchert committed
156
	${KAIDAN_QML_QRC}
157 158 159
	${KAIDAN_ICONS_QRC}  # only set if enabled
	${KAIDAN_IMAGES_QRC} #
	${I18N_QRC_CPP}      #
160 161 162 163
)

target_link_libraries(${PROJECT_NAME}
	Qt5::Core
164
	Qt5::Sql
165 166
	Qt5::Qml
	Qt5::Quick
167
	Qt5::Svg
Ilya Bizyaev's avatar
Ilya Bizyaev committed
168
	Qt5::Network
Linus Jahn's avatar
Linus Jahn committed
169
	Qt5::Xml
170
	${__Qt5Widgets_LIBRARIES}
171
	${__KF5Notifications_LIBRARIES}
172 173
	# currently needs to be hardcoded for windows builds
	qxmpp
174 175 176 177 178 179 180 181
)

target_include_directories(${PROJECT_NAME} PUBLIC
	${QXmpp_INCLUDE_DIRS}
)

target_compile_options(${PROJECT_NAME} PUBLIC
	${QXmpp_CFLAGS_OTHER}
182
)
183

184 185
if(ANDROID OR WIN32 OR IOS)
	target_link_libraries(${PROJECT_NAME} Qt5::QuickControls2 KF5::Kirigami2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
186 187
endif()

188 189 190 191 192
if(ANDROID OR WIN32)
	target_link_libraries(${PROJECT_NAME} PkgConfig::OPENSSL)
endif()

if(ANDROID)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
193
	target_link_libraries(${PROJECT_NAME} Qt5::AndroidExtras)
194
endif()
195

196
if(STATIC_BUILD)
197
	add_definitions(-DQXMPP_BUILD)
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227

	find_package(Perl REQUIRED)

	set(STATIC_DEPENDENCIES_CMAKE_FILE "${CMAKE_BINARY_DIR}/QtStaticDependencies.cmake")
	if(EXISTS ${STATIC_DEPENDENCIES_CMAKE_FILE})
		file(REMOVE ${STATIC_DEPENDENCIES_CMAKE_FILE})
	endif()

	get_target_property(QT_LIBDIR Qt5::Core LOCATION)
	get_filename_component(QT_LIBDIR ${QT_LIBDIR} DIRECTORY)

	macro(CONVERT_PRL_LIBS_TO_CMAKE _qt_component)
		if(TARGET Qt5::${_qt_component})
			get_target_property(_lib_location Qt5::${_qt_component} LOCATION)
			execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/utils/convert-prl-libs-to-cmake.pl
				--lib ${_lib_location}
				--libdir ${QT_LIBDIR}
				--out ${STATIC_DEPENDENCIES_CMAKE_FILE}
				--component ${_qt_component}
				--compiler ${CMAKE_CXX_COMPILER_ID}
			)
		endif()
	endmacro()

	link_directories(${_qt5_install_prefix}/../)

	foreach(qt_module Gui Quick QuickControls2 Network Qml Svg Sql QSQLiteDriverPlugin
             QJpegPlugin QGifPlugin QSvgPlugin QSvgIconPlugin QICOPlugin QGenericEnginePlugin
	         QLocalClientConnectionFactory QTcpServerConnectionFactory)
		CONVERT_PRL_LIBS_TO_CMAKE(${qt_module})
Ilya Bizyaev's avatar
Ilya Bizyaev committed
228
	endforeach()
229 230 231 232 233 234 235 236 237 238 239 240 241 242

	if(WIN32)
		CONVERT_PRL_LIBS_TO_CMAKE(QWindowsIntegrationPlugin)
	elseif(IOS)
		foreach(qt_module QIOSIntegrationPlugin QMacHeifPlugin QMacJp2Plugin
			QICNSPlugin QTgaPlugin QTiffPlugin QWbmpPlugin QWebpPlugin)
			CONVERT_PRL_LIBS_TO_CMAKE(${qt_module})
		endforeach()
	endif()

	if(NOT EXISTS ${STATIC_DEPENDENCIES_CMAKE_FILE})
		message(FATAL_ERROR "Unable to find ${STATIC_DEPENDENCIES_CMAKE_FILE}")
	endif()
	include(${STATIC_DEPENDENCIES_CMAKE_FILE})
Ilya Bizyaev's avatar
Ilya Bizyaev committed
243 244

	set(QT_QML_PATH ${_qt5Quick_install_prefix})
245

246
	find_library(KIRIGAMI_PLUGIN kirigamiplugin PATHS ${Kirigami2_INSTALL_PREFIX}/${KDE_INSTALL_QMLDIR}/org/kde/kirigami.2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
247 248 249 250 251 252 253 254 255 256
	find_library(QUICK_PLUGIN qtquick2plugin PATHS ${QT_QML_PATH}/qml/QtQuick.2)
	find_library(LABS_PLATFORM_PLUGIN qtlabsplatformplugin PATHS ${QT_QML_PATH}/qml/Qt/labs/platform)
	find_library(GRAPHEFFECTS_PLUGIN qtgraphicaleffectsplugin PATHS ${QT_QML_PATH}/qml/QtGraphicalEffects)
	find_library(GRAPHEFFECTS_PRIVATE_PLUGIN qtgraphicaleffectsprivate PATHS ${QT_QML_PATH}/qml/QtGraphicalEffects/private)
	find_library(QQC2_PLUGIN qtquickcontrols2plugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2)
	find_library(QQC2_MATERIAL_PLUGIN qtquickcontrols2materialstyleplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2/Material)
	find_library(QQC2_UNIVERSAL_PLUGIN qtquickcontrols2universalstyleplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2/Universal)
	find_library(QLAYOUTS_PLUGIN qquicklayoutsplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Layouts)
	find_library(QWINDOW_PLUGIN windowplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Window.2)
	find_library(QSHAPES_PLUGIN qmlshapesplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Shapes)
257
	find_library(QUICKSHAPES Qt5QuickShapes PATHS ${QT_LIBDIR})
Ilya Bizyaev's avatar
Ilya Bizyaev committed
258 259 260 261
	find_library(QTEMPLATES_PLUGIN qtquicktemplates2plugin PATHS ${QT_QML_PATH}/qml/QtQuick/Templates.2)
	find_library(QMODELS_PLUGIN modelsplugin PATHS ${QT_QML_PATH}/qml/QtQml/Models.2)
	target_link_libraries(${PROJECT_NAME}
		${plugin_libs}
262 263 264 265 266 267 268 269 270
		Qt5::QSQLiteDriverPlugin
		Qt5::QJpegPlugin
		Qt5::QGifPlugin
		Qt5::QSvgPlugin
		Qt5::QSvgIconPlugin
		Qt5::QICOPlugin
		Qt5::QGenericEnginePlugin
		Qt5::QLocalClientConnectionFactory
		Qt5::QTcpServerConnectionFactory
Ilya Bizyaev's avatar
Ilya Bizyaev committed
271 272 273 274 275 276 277 278 279 280 281
		${KIRIGAMI_PLUGIN}
		${QUICK_PLUGIN}
		${LABS_PLATFORM_PLUGIN}
		${GRAPHEFFECTS_PLUGIN}
		${GRAPHEFFECTS_PRIVATE_PLUGIN}
		${QQC2_PLUGIN}
		${QQC2_MATERIAL_PLUGIN}
		${QQC2_UNIVERSAL_PLUGIN}
		${QLAYOUTS_PLUGIN}
		${QWINDOW_PLUGIN}
		${QSHAPES_PLUGIN}
282
		${QUICKSHAPES}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
283 284
		${QTEMPLATES_PLUGIN}
		${QMODELS_PLUGIN}
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
		${__Qt5Widgets_LIBRARIES}
	)

	if(WIN32)
		target_link_libraries(${PROJECT_NAME}
			Qt5::QWindowsIntegrationPlugin
		)
	elseif(IOS)
		target_link_libraries(${PROJECT_NAME}
			Qt5::QIOSIntegrationPlugin
			Qt5::QMacHeifPlugin
			Qt5::QMacJp2Plugin
			Qt5::QICNSPlugin
			Qt5::QTgaPlugin
			Qt5::QTiffPlugin
			Qt5::QWbmpPlugin
			Qt5::QWebpPlugin
		)
	endif()
Ilya Bizyaev's avatar
Ilya Bizyaev committed
304 305 306
endif()

# Set a custom plist file for the app bundle
307 308 309 310 311 312 313
if(APPLE)
	if(IOS)
		set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/misc/ios/Info.plist)
	else()
		set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/misc/macos/Info.plist)
	endif()
endif()
Ilya Bizyaev's avatar
Ilya Bizyaev committed
314

315 316 317 318
#
# Global C++ variables
#

319 320 321 322 323
# iOS-specific linker flags
if(IOS)
	set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper -u _qt_registerPlatformPlugin")
endif()

324
if(UBUNTU_TOUCH)
325
	set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True)
326
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32 AND NOT APPLE)
327
	set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True)
328 329
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
330 331 332 333 334 335 336
if(STATIC_BUILD)
	set(KAIDAN_COMPILE_DEFINITIONS
		STATIC_BUILD=True
		${KAIDAN_COMPILE_DEFINITIONS}
	)
endif()

337
target_compile_definitions(${PROJECT_NAME} PRIVATE
338
	DEBUG_SOURCE_PATH="${CMAKE_SOURCE_DIR}"
339 340 341 342
	VERSION_STRING="${VERSION_STRING}"
	APPLICATION_ID="${APPLICATION_ID}"
	APPLICATION_NAME="${APPLICATION_NAME}"
	APPLICATION_DISPLAY_NAME="${APPLICATION_DISPLAY_NAME}"
343
	${KAIDAN_COMPILE_DEFINITIONS}
344
)
345 346

#
347
# Install Kaidan
348 349
#

350 351 352 353 354
if(ANDROID)
	configure_file(${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml.in
	               ${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml)
endif()

355
if(UBUNTU_TOUCH AND CLICK_ARCH)
356 357 358 359 360
	set(CLICK_VERSION ${VERSION_STRING})
	if(DEVELOPMENT_BUILD)
		set(CLICK_VERSION "${CLICK_VERSION}.${CLICK_DATE}")
	endif()

361 362 363 364 365
	# will replace ${CLICK_ARCH} with its value
	configure_file(${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json.in
	               ${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json)

	# install kaidan binary
366
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
367 368 369 370 371 372 373 374 375 376 377 378
	        DESTINATION ${CMAKE_INSTALL_PREFIX}
	)
	# install kaidan media
	install(DIRECTORY "data/images"
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${APPLICATION_ID}"
	)
	# install icon
	install(FILES "misc/kaidan.svg" "misc/ubuntu-touch/apparmor.json"
	              "misc/ubuntu-touch/kaidan.desktop" "misc/ubuntu-touch/manifest.json"
	        DESTINATION "${CMAKE_INSTALL_PREFIX}"
	)
elseif(UNIX AND NOT APPLE)
379
	# install kaidan binary
380
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
381
	        DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
382 383
	)

384
	# install kaidan media
385
	install(DIRECTORY "data/images"
386
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}"
387
	)
388

389 390
	# install icon (scalable + 128x)
	install(FILES "misc/kaidan.svg"
391
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/scalable/apps"
392 393
	)
	install(FILES "misc/kaidan-128x128.png"
394 395
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/128x128/apps"
	        RENAME "kaidan.png"
396
	)
397 398
	# install desktop file
	install(FILES "misc/kaidan.desktop"
Jonah Brüchert's avatar
Jonah Brüchert committed
399 400 401 402 403 404
	        DESTINATION "${KDE_INSTALL_APPDIR}"
	)
	# install metainfo
	install(FILES "misc/metadata.xml"
		DESTINATION "${KDE_INSTALL_METAINFODIR}"
		RENAME "im.kaidan.kaidan.appdata.xml"
405
	)
406
endif()
407

408 409 410 411
# KNotifications
if(USE_KNOTIFICATIONS)
	install(FILES misc/kaidan.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR})
endif()
412 413

feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)