CMakeLists.txt 10.3 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")
Linus Jahn's avatar
Linus Jahn committed
5 6 7

project(kaidan)

8 9
set(APPLICATION_ID "im.kaidan.kaidan")

10 11
# CMake options
option(I18N "Enable i18n support" FALSE)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
12
option(STATIC_BUILD "Build Kaidan statically")
13 14
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")
15
option(CLICK_DATE "Date used in the version number in the click's manifest")
Linus Jahn's avatar
Linus Jahn committed
16 17 18 19 20 21 22 23

# 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)
24
set(AUTOMOC_MOC_OPTIONS -Muri=im.kaidan.kaidan)
Linus Jahn's avatar
Linus Jahn committed
25

26 27 28 29
#
# Dependecies
#

Linus Jahn's avatar
Linus Jahn committed
30
# CMake module path
Ilya Bizyaev's avatar
Ilya Bizyaev committed
31
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
32 33 34 35 36 37 38 39 40

# CMake modules include
include(GNUInstallDirs)
include(KDEInstallDirs)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDECMakeSettings)
include(ECMInstallIcons)
include(FeatureSummary)
kde_enable_exceptions()
Linus Jahn's avatar
Linus Jahn committed
41 42

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

# Optional QWidget style integration (not on mobile)
49
if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS)
50 51 52 53 54
	find_package(Qt5Widgets)
	set_package_properties(Qt5Widgets PROPERTIES
		DESCRIPTION "Integration with QWidget based desktop styles"
		TYPE OPTIONAL
	)
55 56
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
57
# Platform-specific
58 59 60 61 62 63 64
if(Qt5Widgets_FOUND)
	add_definitions(-DHAVE_QWIDGETS -DQAPPLICATION_CLASS=QApplication)
	set(__Qt5Widgets_LIBRARIES Qt5::Widgets)
else()
	add_definitions(-DQAPPLICATION_CLASS=QGuiApplication)
endif()

65
if(ANDROID)
66
	find_package(Qt5 REQUIRED COMPONENTS AndroidExtras)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
67 68
endif()

69 70
if(ANDROID OR WIN32)
	pkg_search_module(OPENSSL REQUIRED openssl IMPORTED_TARGET)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
71
	message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
72 73
endif()

74

75
#
76
# Load submodules
77 78
#

79 80 81 82
# Main kaidan sources
include("${CMAKE_SOURCE_DIR}/src/CMakeLists.txt")

# I18n support
83 84 85
if(I18N)
	include("${CMAKE_SOURCE_DIR}/i18n/CMakeLists.txt")
endif()
86

87

88 89 90
#
# Sources / Resources
#
Linus Jahn's avatar
Linus Jahn committed
91

Ilya Bizyaev's avatar
Ilya Bizyaev committed
92 93
# Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS
if(UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
94 95 96
	set(KAIDAN_ICONS_QRC kirigami-icons.qrc)
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
97 98
# Bundle images on Android, Windows, macOS and iOS
if(ANDROID OR WIN32 OR APPLE)
99 100 101
	set(KAIDAN_IMAGES_QRC "data/images/images.qrc")
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
102 103 104
# Set app icon
if(APPLE)
	set(KAIDAN_ICNS "${CMAKE_SOURCE_DIR}/misc/macos/kaidan.icns")
105
	set_source_files_properties(${KAIDAN_ICNS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
Ilya Bizyaev's avatar
Ilya Bizyaev committed
106 107 108 109 110 111 112 113
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()

114 115
link_directories(${QXmpp_LIBDIR})

Linus Jahn's avatar
Linus Jahn committed
116
add_executable(${PROJECT_NAME}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
117 118 119
	MACOSX_BUNDLE
	WIN32
	${KAIDAN_ICNS}
120
	${KAIDAN_SOURCES}
121 122 123
	${KAIDAN_ICONS_QRC}  # only set if enabled
	${KAIDAN_IMAGES_QRC} #
	${I18N_QRC_CPP}      #
124
	"kaidan_qml.qrc"
Linus Jahn's avatar
Linus Jahn committed
125 126 127 128
)

target_link_libraries(${PROJECT_NAME}
	Qt5::Core
129
	Qt5::Sql
Linus Jahn's avatar
Linus Jahn committed
130 131
	Qt5::Qml
	Qt5::Quick
132
	Qt5::Svg
Ilya Bizyaev's avatar
Ilya Bizyaev committed
133
	Qt5::Network
Linus Jahn's avatar
Linus Jahn committed
134
	Qt5::Xml
135
	${__Qt5Widgets_LIBRARIES}
136 137
	# currently needs to be hardcoded for windows builds
	qxmpp
138 139 140 141 142 143 144 145
)

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

target_compile_options(${PROJECT_NAME} PUBLIC
	${QXmpp_CFLAGS_OTHER}
Linus Jahn's avatar
Linus Jahn committed
146
)
147

148 149
if(ANDROID OR WIN32 OR IOS)
	target_link_libraries(${PROJECT_NAME} Qt5::QuickControls2 KF5::Kirigami2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
150 151
endif()

152 153 154 155 156
if(ANDROID OR WIN32)
	target_link_libraries(${PROJECT_NAME} PkgConfig::OPENSSL)
endif()

if(ANDROID)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
157
	target_link_libraries(${PROJECT_NAME} Qt5::AndroidExtras)
158
endif()
159

160
if(STATIC_BUILD)
161
	add_definitions(-DQXMPP_BUILD)
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

	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
192
	endforeach()
193 194 195 196 197 198 199 200 201 202 203 204 205 206

	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
207 208

	set(QT_QML_PATH ${_qt5Quick_install_prefix})
209

210
	find_library(KIRIGAMI_PLUGIN kirigamiplugin PATHS ${Kirigami2_INSTALL_PREFIX}/${KDE_INSTALL_QMLDIR}/org/kde/kirigami.2)
Ilya Bizyaev's avatar
Ilya Bizyaev committed
211 212 213 214 215 216 217 218 219 220
	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)
221
	find_library(QUICKSHAPES Qt5QuickShapes PATHS ${QT_LIBDIR})
Ilya Bizyaev's avatar
Ilya Bizyaev committed
222 223 224 225
	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}
226 227 228 229 230 231 232 233 234
		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
235 236 237 238 239 240 241 242 243 244 245
		${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}
246
		${QUICKSHAPES}
Ilya Bizyaev's avatar
Ilya Bizyaev committed
247 248
		${QTEMPLATES_PLUGIN}
		${QMODELS_PLUGIN}
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
		${__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
268 269 270
endif()

# Set a custom plist file for the app bundle
271 272 273 274 275 276 277
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
278

279 280 281 282
#
# Global C++ variables
#

283 284 285 286 287
# iOS-specific linker flags
if(IOS)
	set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper -u _qt_registerPlatformPlugin")
endif()

288
if(UBUNTU_TOUCH)
289 290 291
	set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True)
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32)
	set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True)
292 293
endif()

Ilya Bizyaev's avatar
Ilya Bizyaev committed
294 295 296 297 298 299 300
if(STATIC_BUILD)
	set(KAIDAN_COMPILE_DEFINITIONS
		STATIC_BUILD=True
		${KAIDAN_COMPILE_DEFINITIONS}
	)
endif()

301
target_compile_definitions(${PROJECT_NAME} PRIVATE
302
	DEBUG_SOURCE_PATH="${CMAKE_SOURCE_DIR}"
303
	${KAIDAN_COMPILE_DEFINITIONS}
304
)
305 306

#
307
# Install Kaidan
308 309
#

310 311 312 313 314 315
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
316
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
317 318 319 320 321 322 323 324 325 326 327 328
	        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)
329
	# install kaidan binary
330
	install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME}
331
	        DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
332 333
	)

334
	# install kaidan media
335
	install(DIRECTORY "data/images"
336
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}"
337
	)
338

339 340
	# install icon (scalable + 128x)
	install(FILES "misc/kaidan.svg"
341
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/scalable/apps"
342 343
	)
	install(FILES "misc/kaidan-128x128.png"
344 345
	        DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/128x128/apps"
	        RENAME "kaidan.png"
346
	)
347 348
	# install desktop file
	install(FILES "misc/kaidan.desktop"
Jonah Brüchert's avatar
Jonah Brüchert committed
349 350 351 352 353 354
	        DESTINATION "${KDE_INSTALL_APPDIR}"
	)
	# install metainfo
	install(FILES "misc/metadata.xml"
		DESTINATION "${KDE_INSTALL_METAINFODIR}"
		RENAME "im.kaidan.kaidan.appdata.xml"
355
	)
356
endif()
Linus Jahn's avatar
Linus Jahn committed
357 358 359


feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)