if (ENABLE_DEVELOPER_BUILD AND NOT MSVC AND NOT APPLE)
	set (FAST_LINKING_DEFAULT ON)
else ()
	set (FAST_LINKING_DEFAULT OFF)
endif ()
option (FAST_LINKING "Enable for linking optimized for low RAM (works best with GCC and GNU ld)" "${FAST_LINKING_DEFAULT}")

if (FAST_LINKING)
	message (STATUS "Fast (re)linking enabled")
else ()
	message (STATUS "Fast (re)linking disabled")
endif ()

if (UNIX AND NOT APPLE)
	if (NOT DEFINED WITH_LIBINDICATE_QT OR WITH_LIBINDICATE_QT)
		find_package (PkgConfig)
		pkg_search_module (LIBINDICATE_QT indicate-qt)
	endif ()

	option (WITH_LIBINDICATE_QT "Compile with Messaging Menu (Ayatana) support through libindicate-qt" "${LIBINDICATE_QT_FOUND}")
	set (KADU_WITH_LIBINDICATE_QT ${WITH_LIBINDICATE_QT} PARENT_SCOPE)  # Do not use it here, it's in parent scope

	if (WITH_LIBINDICATE_QT)
		if (NOT LIBINDICATE_QT_FOUND)
			message (SEND_ERROR "Could NOT find libindicate-qt")
		else ()
			message (STATUS "Found libindicate-qt. Enabling Ayatana support")
			# We need to link core to libindicate-qt so that indicator_docking
			# doesn't crash at unloading. And it crashes mainly because dbus-glib
			# doesn't support being dlclose()'d, so there is no better workaround.
			link_directories (${LIBINDICATE_QT_LIBRARY_DIRS})
			add_definitions (${LIBINDICATE_QT_CFLAGS_OTHER})
			include_directories (${LIBINDICATE_QT_INCLUDE_DIRS})
			list (APPEND ADDITIONAL_LIBRARIES ${LIBINDICATE_QT_LIBRARIES})
		endif ()
	else ()
		message (STATUS "Could NOT find libindicate-qt. Disabling Ayatana support")
	endif ()
endif ()

if (NOT DEFINED NETWORK_IMPLEMENTATION OR "${NETWORK_IMPLEMENTATION}" STREQUAL "ntrack")
	find_package (QNtrack 010)
endif ()

if (NOT DEFINED NETWORK_IMPLEMENTATION)
	if (QNTRACK_FOUND)
		message (STATUS "No NETWORK_IMPLEMENTATION defined. Autodetected implementation: ntrack")
		set (NETWORK_IMPLEMENTATION "ntrack")
	else ()
		message (STATUS "No NETWORK_IMPLEMENTATION defined. Autodetected implementation: Qt")
		set (NETWORK_IMPLEMENTATION "Qt")
	endif ()
endif ()

set (NETWORK_IMPLEMENTATION "${NETWORK_IMPLEMENTATION}" CACHE STRING "Select network-aware implementation (Qt/ntrack/dummy)" FORCE)

if ("${NETWORK_IMPLEMENTATION}" STREQUAL "ntrack")
	list (APPEND ADDITIONAL_LIBRARIES ${QNTRACK_LIBRARIES})
endif ()
# The rest of NETWORK_IMPLEMENTATION stuff is handled in network/CMakeLists.txt.

configure_file (kadu-config.h.in "${CMAKE_CURRENT_BINARY_DIR}/kadu-config.h" ESCAPE_QUOTES)
include_directories ("${CMAKE_CURRENT_BINARY_DIR}")

set (kadu_SRCS
	activate.cpp
	debug.cpp
	kadu-application.cpp
	languages-manager.cpp
	themes.cpp
	updates.cpp

	os/qtsingleapplication/qtlocalpeer.cpp
	os/qtsingleapplication/qtlockedfile.cpp
)

if (WIN32)
	list (APPEND kadu_SRCS
		os/qtsingleapplication/qtlockedfile_win.cpp
		kadu.rc
	)
else ()
	list (APPEND kadu_SRCS
		os/qtsingleapplication/qtlockedfile_unix.cpp
	)
endif ()

if (UNIX AND NOT APPLE)
	list (APPEND kadu_SRCS
		os/x11tools.cpp
	)
endif ()

set (main_SRCS
	main.cpp
)

if (WIN32)
	list (APPEND main_SRCS
		main_win32.cpp
		kadu.rc
	)
else ()
	list (APPEND main_SRCS
		main_unix.cpp
	)
endif ()

set (kadu_MOC_SRCS
	kadu-application.h
	themes.h
	updates.h

	os/qtsingleapplication/qtlocalpeer.h
)

set (kadu_SUBDIRS
	accounts
	avatars
	buddies
	chat
	chat-style
	compression
	configuration
	contacts
	core
	dom
	file-transfer
	formatted-string
	gui
	icons
	identities
	message
	misc
	model
	multilogon
	network
	notify
	os
	parser
	plugin
	protocols
	qt
	services
	status
	storage
	talkable
	themes
	url-handlers
)

find_package (QCA2 REQUIRED)
include_directories (${QCA2_INCLUDE_DIR})
add_definitions (${QCA2_DEFINITIONS})
list (APPEND ADDITIONAL_LIBRARIES ${QCA2_LIBRARIES})

find_package (LibArchive 2.6.0 REQUIRED)
include (CheckLibraryExists)
check_library_exists ("${LibArchive_LIBRARIES}" "archive_write_set_compression_lzma" "" have_libarchive_lzma_support)
check_library_exists ("${LibArchive_LIBRARIES}" "archive_write_set_compression_xz" "" have_libarchive_xz_support)
if (NOT have_libarchive_lzma_support OR NOT have_libarchive_xz_support)
	message (SEND_ERROR "Your libarchive does not have support for lzma and/or xz archives.")
endif ()

include_directories (${LibArchive_INCLUDE_DIRS})
list (APPEND ADDITIONAL_LIBRARIES ${LibArchive_LIBRARIES})

if (UNIX AND NOT APPLE)
	find_package (X11 REQUIRED COMPONENTS X11 Xutil Xfixes)
	if (X11_FOUND AND X11_Xutil_FOUND AND X11_Xfixes_FOUND)
		message (STATUS "Found required X11 libraries: ${X11_X11_LIB};${X11_Xfixes_LIB}")
	else ()
		message (FATAL_ERROR "Could NOT find X11 or X11 Xfixes extension")
	endif ()

	include_directories (${X11_INCLUDE_DIR})
	list (APPEND ADDITIONAL_LIBRARIES ${X11_X11_LIB} ${X11_Xfixes_LIB})
endif ()

if (APPLE)
	list (APPEND ADDITIONAL_LIBRARIES "-framework carbon")
endif ()

macro (kadu_subdirectory SUBDIR SRCS MOC_SRCS ADDITIONAL_INCLUDES)
	if (FAST_LINKING)
		add_library (${SUBDIR}
			STATIC
			${SRCS}
			${MOC_SRCS}
		)
		kadu_set_flags (${SUBDIR})
		set_property (TARGET ${SUBDIR} PROPERTY POSITION_INDEPENDENT_CODE TRUE)
		set_property (TARGET ${SUBDIR} APPEND PROPERTY COMPILE_DEFINITIONS libkadu_EXPORTS)
	else ()
		set (tmp "")
		foreach (SRC ${SRCS})
			list (APPEND tmp "${SUBDIR}/${SRC}")
		endforeach ()

		set (tmp_moc "")
		foreach (MOC_SRC ${MOC_SRCS})
			list (APPEND tmp_moc "${SUBDIR}/${MOC_SRC}")
		endforeach ()

		set (${SUBDIR}_SRCS "${tmp}" PARENT_SCOPE)
		set (${SUBDIR}_MOC_SRCS "${tmp_moc}" PARENT_SCOPE)
		set (${SUBDIR}_INCLUDES "${ADDITIONAL_INCLUDES}" PARENT_SCOPE)
	endif ()
endmacro ()

foreach (ARG ${kadu_SUBDIRS})
	add_subdirectory (${ARG})

	if (NOT FAST_LINKING)
		list (APPEND kadu_SUBDIRS_SRCS ${${ARG}_SRCS} ${${ARG}_MOC_SRCS})
		include_directories (${${ARG}_INCLUDES})
	endif ()
endforeach ()

add_library (libkadu SHARED ${kadu_SRCS} ${kadu_MOC_SRCS} ${kadu_SUBDIRS_SRCS})
kadu_set_flags (libkadu)
set_property (TARGET libkadu PROPERTY PREFIX "")

if (FAST_LINKING)
	if (APPLE)
		target_link_libraries (libkadu LINK_PRIVATE -Wl,-all_load ${kadu_SUBDIRS})
	else ()
		target_link_libraries (libkadu LINK_PRIVATE -Wl,--start-group -Wl,--whole-archive ${kadu_SUBDIRS} -Wl,--no-whole-archive -Wl,--end-group)
	endif ()
endif ()

target_link_libraries (libkadu LINK_PRIVATE ${QT_LIBRARIES} ${ADDITIONAL_LIBRARIES})

add_executable (kadu WIN32 ${main_SRCS})
kadu_set_flags (kadu)
target_link_libraries (kadu LINK_PRIVATE libkadu ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY})
if (NOT IS_ABSOLUTE "${KADU_INSTALL_LIB_DIR}")
	set (install_full_lib_dir "${CMAKE_INSTALL_PREFIX}/${KADU_INSTALL_LIB_DIR}")
else ()
	set (install_full_lib_dir "${KADU_INSTALL_LIB_DIR}")
endif ()
set_target_properties (kadu PROPERTIES
	INSTALL_RPATH "${install_full_lib_dir}/kadu"
	BUILD_WITH_INSTALL_RPATH TRUE
)

install (TARGETS libkadu kadu
	EXPORT KaduTargets
	LIBRARY DESTINATION ${KADU_INSTALL_LIB_DIR}/kadu
	RUNTIME DESTINATION ${KADU_INSTALL_BIN_DIR}
)
# TODO this WIN32 check is a workaround for an error on Linux
if (WIN32 AND KADU_INSTALL_SDK)
	install (TARGETS libkadu ARCHIVE DESTINATION ${KADU_INSTALL_SDK_DIR}/lib)
endif ()

if (WIN32)
	add_executable (kadu_c ${main_SRCS})
	kadu_set_flags (kadu_c)

	set_property (TARGET kadu_c APPEND PROPERTY COMPILE_DEFINITIONS KADU_CONSOLE)

	target_link_libraries (kadu LINK_PRIVATE ws2_32)
	target_link_libraries (kadu_c LINK_PRIVATE libkadu ${QT_LIBRARIES} ws2_32)

	install (TARGETS kadu_c DESTINATION ${KADU_INSTALL_BIN_DIR})

	file (WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf" "[Paths]\nPlugins = qt-plugins\nTranslations = translations\n")
	install (FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf" "kadu.ico" DESTINATION "${KADU_INSTALL_BIN_DIR}")
endif ()

install (TARGETS kadu DESTINATION ${KADU_INSTALL_BIN_DIR})

if (UNIX AND NOT APPLE)
	configure_file (kadu.desktop.in "${CMAKE_CURRENT_BINARY_DIR}/${KADU_DESKTOP_FILE_NAME}")
	install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${KADU_DESKTOP_FILE_NAME}" DESTINATION "${KADU_DESKTOP_FILE_DIR}")

	install (FILES hi16-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/16x16/apps" RENAME kadu.png)
	install (FILES hi22-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/22x22/apps" RENAME kadu.png)
	install (FILES hi24-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/24x24/apps" RENAME kadu.png)
	install (FILES hi32-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps" RENAME kadu.png)
	install (FILES hi48-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/48x48/apps" RENAME kadu.png)
	install (FILES hi64-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/64x64/apps" RENAME kadu.png)
	install (FILES hi128-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps" RENAME kadu.png)
	install (FILES hi256-app-kadu.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/apps" RENAME kadu.png)
endif ()

install (FILES "chat-style/engine/chat-scripts.js" DESTINATION "${KADU_INSTALL_DATA_DIR}/scripts")

# install api headers
# how to get list: find . -name '*.h' -exec dirname {} +|sort|uniq|sed -e 's|\./||' -e 's|^|\t|'
# TODO: consider using file (GLOB_RECURSE) command here
kadu_api_directories (kadu-core
	.
	accounts
	accounts/filter
	accounts/model
	avatars
	buddies
	buddies/model
	chat
	chat/model
	chat/style-engine
	chat-style/engine/chat-engine-adium
	chat-style/engine/chat-engine-kadu
	chat/type
	compression
	configuration
	contacts
	contacts/model
	core
	dom
	file-transfer
	formatted-string
	gui
	gui/actions
	gui/actions/chat
	gui/menu
	gui/model
	gui/services
	gui/widgets
	gui/widgets/configuration
	gui/widgets/dialog
	gui/widgets/chat-widget
	gui/widgets/webkit-messages-view
	chat-style/engine
	gui/windows
	gui/windows/open-chat-with
	icons
	identities
	identities/model
	message
	misc
	model
	multilogon
	multilogon/model
	network
	network/proxy
	network/proxy/model
	notify
	notify/listener
	notify/notification
	os
	os/generic
	os/qtsingleapplication
	parser
	plugin
	plugin/model
	protocols
	protocols/filter
	protocols/model
	protocols/services
	protocols/services/roster
	provider
	qt
	services
	status
	storage
	talkable
	talkable/filter
	talkable/model
	themes
	url-handlers
)
