CMakeLists.txt 10.7 KB
Newer Older
1
cmake_minimum_required(VERSION 2.8.12)
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 13
set(APPLICATION_ID "im.kaidan.kaidan")

14 15
# CMake options
option(I18N "Enable i18n support" FALSE)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
16
option(STATIC_BUILD "Build Kaidan statically")
17 18
option(UBUNTU_TOUCH "Building a Ubuntu Touch click (internal use only!)" FALSE)
option(CLICK_ARCH "Architecture that will be used in the click's manifest")
19
option(CLICK_DATE "Date used in the version number in the click's manifest")
20
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" TRUE)
21 22 23 24 25 26 27 28

# 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)
29
set(AUTOMOC_MOC_OPTIONS -Muri=im.kaidan.kaidan)
30

31 32 33 34
#
# Dependecies
#

35
# CMake module path
Ilya Bizyaev's avatar
Ilya Bizyaev committed
36
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
37 38 39 40 41 42 43 44

# CMake modules include
include(KDEInstallDirs)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDECMakeSettings)
include(ECMInstallIcons)
include(FeatureSummary)
kde_enable_exceptions()
45 46

# Find packages
47
find_package(PkgConfig REQUIRED)
Linus Jahn's avatar
Linus Jahn committed
48
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Qml Quick Svg Sql QuickControls2 Xml)
Linus Jahn's avatar
Linus Jahn committed
49
find_package(KF5Kirigami2 REQUIRED)
50
pkg_search_module(QXmpp REQUIRED qxmpp>=0.9)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
51

Jonah Brüchert's avatar
Jonah Brüchert committed
52
# Optional QtQuickCompiler
53 54 55 56 57 58 59
if(QUICK_COMPILER)
	find_package(Qt5QuickCompiler)
	set_package_properties(Qt5QuickCompiler PROPERTIES
		DESCRIPTION "Compile QML at build time"
	        TYPE OPTIONAL
	)
endif()
Jonah Brüchert's avatar
Jonah Brüchert committed
60

Ilya Bizyaev's avatar
Ilya Bizyaev committed
61
# Optional QWidget style integration (not on mobile)
62
if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS)
63 64 65 66 67
	find_package(Qt5Widgets)
	set_package_properties(Qt5Widgets PROPERTIES
		DESCRIPTION "Integration with QWidget based desktop styles"
		TYPE OPTIONAL
	)
68 69
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
70
# Platform-specific
71 72 73 74 75 76 77
if(Qt5Widgets_FOUND)
	add_definitions(-DHAVE_QWIDGETS -DQAPPLICATION_CLASS=QApplication)
	set(__Qt5Widgets_LIBRARIES Qt5::Widgets)
else()
	add_definitions(-DQAPPLICATION_CLASS=QGuiApplication)
endif()

78
if(ANDROID)
79
	find_package(Qt5 REQUIRED COMPONENTS AndroidExtras)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
80 81
endif()

82 83
if(ANDROID OR WIN32)
	pkg_search_module(OPENSSL REQUIRED openssl IMPORTED_TARGET)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
84
	message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
85 86
endif()

87

88
#
89
# Load submodules
90 91
#

92 93 94 95
# Main kaidan sources
include("${CMAKE_SOURCE_DIR}/src/CMakeLists.txt")

# I18n support
96 97 98
if(I18N)
	include("${CMAKE_SOURCE_DIR}/i18n/CMakeLists.txt")
endif()
99

100

101 102 103
#
# Sources / Resources
#
104

Ilya Bizyaev's avatar
Ilya Bizyaev committed
105 106
# Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS
if(UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
107 108 109
	set(KAIDAN_ICONS_QRC kirigami-icons.qrc)
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
110 111
# Bundle images on Android, Windows, macOS and iOS
if(ANDROID OR WIN32 OR APPLE)
112 113 114
	set(KAIDAN_IMAGES_QRC "data/images/images.qrc")
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
115 116 117
# Set app icon
if(APPLE)
	set(KAIDAN_ICNS "${CMAKE_SOURCE_DIR}/misc/macos/kaidan.icns")
118
	set_source_files_properties(${KAIDAN_ICNS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
Ilya Bizyaev's avatar
Ilya Bizyaev committed
119 120 121 122 123 124 125 126
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()

127 128
link_directories(${QXmpp_LIBDIR})

129
if(QUICK_COMPILER)
Jonah Brüchert's avatar
Jonah Brüchert committed
130 131 132 133 134
	qtquick_compiler_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc)
else()
	qt5_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc)
endif()

135
add_executable(${PROJECT_NAME}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
136 137 138
	MACOSX_BUNDLE
	WIN32
	${KAIDAN_ICNS}
139
	${KAIDAN_SOURCES}
Jonah Brüchert's avatar
Jonah Brüchert committed
140
	${KAIDAN_QML_QRC}
141 142 143
	${KAIDAN_ICONS_QRC}  # only set if enabled
	${KAIDAN_IMAGES_QRC} #
	${I18N_QRC_CPP}      #
144 145 146 147
)

target_link_libraries(${PROJECT_NAME}
	Qt5::Core
148
	Qt5::Sql
149 150
	Qt5::Qml
	Qt5::Quick
151
	Qt5::Svg
Ilya Bizyaev's avatar
Ilya Bizyaev committed
152
	Qt5::Network
Linus Jahn's avatar
Linus Jahn committed
153
	Qt5::Xml
154
	${__Qt5Widgets_LIBRARIES}
155 156
	# currently needs to be hardcoded for windows builds
	qxmpp
157 158 159 160 161 162 163 164
)

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

target_compile_options(${PROJECT_NAME} PUBLIC
	${QXmpp_CFLAGS_OTHER}
165
)
166

167 168
if(ANDROID OR WIN32 OR IOS)
	target_link_libraries(${PROJECT_NAME} Qt5::QuickControls2 KF5::Kirigami2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
169 170
endif()

171 172 173 174 175
if(ANDROID OR WIN32)
	target_link_libraries(${PROJECT_NAME} PkgConfig::OPENSSL)
endif()

if(ANDROID)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
176
	target_link_libraries(${PROJECT_NAME} Qt5::AndroidExtras)
177
endif()
178

179
if(STATIC_BUILD)
180
	add_definitions(-DQXMPP_BUILD)
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210

	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
211
	endforeach()
212 213 214 215 216 217 218 219 220 221 222 223 224 225

	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
226 227

	set(QT_QML_PATH ${_qt5Quick_install_prefix})
228

229
	find_library(KIRIGAMI_PLUGIN kirigamiplugin PATHS ${Kirigami2_INSTALL_PREFIX}/${KDE_INSTALL_QMLDIR}/org/kde/kirigami.2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
230 231 232 233 234 235 236 237 238 239
	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)
240
	find_library(QUICKSHAPES Qt5QuickShapes PATHS ${QT_LIBDIR})
Ilya Bizyaev's avatar
Ilya Bizyaev committed
241 242 243 244
	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}
245 246 247 248 249 250 251 252 253
		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
254 255 256 257 258 259 260 261 262 263 264
		${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}
265
		${QUICKSHAPES}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
266 267
		${QTEMPLATES_PLUGIN}
		${QMODELS_PLUGIN}
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
		${__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
287 288 289
endif()

# Set a custom plist file for the app bundle
290 291 292 293 294 295 296
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
297

298 299 300 301
#
# Global C++ variables
#

302 303 304 305 306
# iOS-specific linker flags
if(IOS)
	set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper -u _qt_registerPlatformPlugin")
endif()

307
if(UBUNTU_TOUCH)
308 309 310
	set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True)
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32)
	set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True)
311 312
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
313 314 315 316 317 318 319
if(STATIC_BUILD)
	set(KAIDAN_COMPILE_DEFINITIONS
		STATIC_BUILD=True
		${KAIDAN_COMPILE_DEFINITIONS}
	)
endif()

320
target_compile_definitions(${PROJECT_NAME} PRIVATE
321
	DEBUG_SOURCE_PATH="${CMAKE_SOURCE_DIR}"
322
	${KAIDAN_COMPILE_DEFINITIONS}
323
)
324 325

#
326
# Install Kaidan
327 328
#

329 330 331 332 333 334
if(UBUNTU_TOUCH AND CLICK_ARCH)
	# 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
335
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
336 337 338 339 340 341 342 343 344 345 346 347
	        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)
348
	# install kaidan binary
349
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
350
	        DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
351 352
	)

353
	# install kaidan media
354
	install(DIRECTORY "data/images"
355
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}"
356
	)
357

358 359
	# install icon (scalable + 128x)
	install(FILES "misc/kaidan.svg"
360
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/scalable/apps"
361 362
	)
	install(FILES "misc/kaidan-128x128.png"
363 364
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/128x128/apps"
	        RENAME "kaidan.png"
365
	)
366 367
	# install desktop file
	install(FILES "misc/kaidan.desktop"
Jonah Brüchert's avatar
Jonah Brüchert committed
368 369 370 371 372 373
	        DESTINATION "${KDE_INSTALL_APPDIR}"
	)
	# install metainfo
	install(FILES "misc/metadata.xml"
		DESTINATION "${KDE_INSTALL_METAINFODIR}"
		RENAME "im.kaidan.kaidan.appdata.xml"
374
	)
375
endif()
376 377 378


feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)