# CMakeLists.txt for src/kvirc/

include_directories(
	kernel
	kvs
	kvs/event
	kvs/object
	kvs/parser
	kvs/tree
	module
	sparser
	ui
	../kvilib/tal
	../kvilib/config
	../kvilib/core
	../kvilib/ext
	../kvilib/file
	../kvilib/irc
	../kvilib/locale
	../kvilib/net
	../kvilib/system
)

set(kvirc_SRCS
	ui/KviActionDrawer.cpp
	ui/KviChannelWindow.cpp
	ui/KviColorSelectionWindow.cpp
	ui/KviConsoleWindow.cpp
	ui/KviCryptController.cpp
	ui/KviCtcpPageDialog.cpp
	ui/KviCustomToolBar.cpp
	ui/KviDebugWindow.cpp
	ui/KviDynamicToolTip.cpp
	ui/KviFileDialog.cpp
	ui/KviMainWindow.cpp
	ui/KviHistoryWindow.cpp
	ui/KviHtmlDialog.cpp
	ui/KviImageDialog.cpp
	ui/KviInput.cpp
	ui/KviInputEditor.cpp
	ui/KviInputHistory.cpp
	ui/KviIpEditor.cpp
	ui/KviIrcToolBar.cpp
	ui/KviIrcView.cpp
	ui/KviIrcView_events.cpp
	ui/KviIrcView_getTextLine.cpp
	ui/KviIrcView_loghandling.cpp
	ui/KviIrcView_tools.cpp
	ui/KviMaskEditor.cpp
	ui/KviMenuBar.cpp
	ui/KviModeEditor.cpp
	ui/KviModeWidget.cpp
	ui/KviMessageBox.cpp
	ui/KviOptionsWidget.cpp
	ui/KviQueryWindow.cpp
	ui/KviScriptButton.cpp
	ui/KviScriptEditor.cpp
	ui/KviSelectors.cpp
	ui/KviStatusBar.cpp
	ui/KviStatusBarApplet.cpp
	ui/KviTextIconWindow.cpp
	ui/KviThemedComboBox.cpp
	ui/KviThemedLabel.cpp
	ui/KviThemedLineEdit.cpp
	ui/KviThemedTreeWidget.cpp
	ui/KviToolBar.cpp
	ui/KviWebPackageManagementDialog.cpp
	ui/KviWindowToolWidget.cpp
	ui/KviTopicWidget.cpp
	ui/KviUserListView.cpp
	ui/KviWindow.cpp
	ui/KviWindowListBase.cpp
	ui/KviWindowStack.cpp
	ui/KviTreeWindowList.cpp
	sparser/KviAntiSpam.cpp
	sparser/KviIrcMessage.cpp
	sparser/KviIrcServerParser_ctcp.cpp
	sparser/KviIrcServerParser_literalHandlers.cpp
	sparser/KviIrcServerParser_numericHandlers.cpp
	sparser/KviIrcServerParser_tables.cpp
	sparser/KviIrcServerParser.cpp
	module/KviMexLinkFilter.cpp
	module/KviMexServerImport.cpp
	module/KviMexToolBar.cpp
	module/KviModule.cpp
	module/KviModuleExtension.cpp
	module/KviModuleManager.cpp
	kvs/KviKvs.cpp
	kvs/KviKvsAction.cpp
	kvs/KviKvsAliasManager.cpp
	kvs/KviKvsArray.cpp
	kvs/KviKvsArrayCast.cpp
	kvs/KviKvsAsyncDnsOperation.cpp
	kvs/KviKvsAsyncOperation.cpp
	kvs/KviKvsCallbackObject.cpp
	kvs/KviKvsCoreCallbackCommands.cpp
	kvs/KviKvsCoreFunctions.cpp
	kvs/KviKvsCoreFunctions_af.cpp
	kvs/KviKvsCoreFunctions_gl.cpp
	kvs/KviKvsCoreFunctions_mr.cpp
	kvs/KviKvsCoreFunctions_sz.cpp
	kvs/KviKvsCoreSimpleCommands.cpp
	kvs/KviKvsCoreSimpleCommands_af.cpp
	kvs/KviKvsCoreSimpleCommands_gl.cpp
	kvs/KviKvsCoreSimpleCommands_mr.cpp
	kvs/KviKvsCoreSimpleCommands_sz.cpp
	kvs/KviKvsDnsManager.cpp
	kvs/KviKvsHash.cpp
	kvs/KviKvsKernel.cpp
	kvs/KviKvsModuleInterface.cpp
	kvs/KviKvsParameterProcessor.cpp
	kvs/KviKvsPopupManager.cpp
	kvs/KviKvsPopupMenu.cpp
	kvs/KviKvsProcessManager.cpp
	kvs/KviKvsReport.cpp
	kvs/KviKvsRunTimeCall.cpp
	kvs/KviKvsRunTimeContext.cpp
	kvs/KviKvsRWEvaluationResult.cpp
	kvs/KviKvsScript.cpp
	kvs/KviKvsScriptAddonManager.cpp
	kvs/KviKvsSwitchList.cpp
	kvs/KviKvsTimerManager.cpp
	kvs/KviKvsUserAction.cpp
	kvs/KviKvsVariant.cpp
	kvs/KviKvsVariantList.cpp
	kvs/event/KviKvsEvent.cpp
	kvs/event/KviKvsEventHandler.cpp
	kvs/event/KviKvsEventManager.cpp
	kvs/event/KviKvsEventTable.cpp
	kvs/object/KviKvsObject.cpp
	kvs/object/KviKvsObjectClass.cpp
	kvs/object/KviKvsObjectController.cpp
	kvs/object/KviKvsObjectFunctionCall.cpp
	kvs/object/KviKvsObjectFunctionHandler.cpp
	kvs/object/KviKvsObjectFunctionHandlerImpl.cpp
	kvs/parser/KviKvsParser.cpp
	kvs/parser/KviKvsParser_command.cpp
	kvs/parser/KviKvsParser_comment.cpp
	kvs/parser/KviKvsParser_dollar.cpp
	kvs/parser/KviKvsParser_expression.cpp
	kvs/parser/KviKvsParser_lside.cpp
	kvs/parser/KviKvsParser_specialCommands.cpp
	kvs/tree/KviKvsTreeNodeAliasFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeAliasSimpleCommand.cpp
	kvs/tree/KviKvsTreeNodeArrayCount.cpp
	kvs/tree/KviKvsTreeNodeArrayElement.cpp
	kvs/tree/KviKvsTreeNodeArrayOrHashElement.cpp
	kvs/tree/KviKvsTreeNodeArrayReferenceAssert.cpp
	kvs/tree/KviKvsTreeNodeBase.cpp
	kvs/tree/KviKvsTreeNodeBaseObjectFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeCallbackCommand.cpp
	kvs/tree/KviKvsTreeNodeCommand.cpp
	kvs/tree/KviKvsTreeNodeCommandEvaluation.cpp
	kvs/tree/KviKvsTreeNodeCommandWithParameters.cpp
	kvs/tree/KviKvsTreeNodeCompositeData.cpp
	kvs/tree/KviKvsTreeNodeConstantData.cpp
	kvs/tree/KviKvsTreeNodeCoreCallbackCommand.cpp
	kvs/tree/KviKvsTreeNodeCoreFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeCoreSimpleCommand.cpp
	kvs/tree/KviKvsTreeNodeData.cpp
	kvs/tree/KviKvsTreeNodeDataList.cpp
	kvs/tree/KviKvsTreeNodeExpression.cpp
	kvs/tree/KviKvsTreeNodeExpressionReturn.cpp
	kvs/tree/KviKvsTreeNodeExtendedScopeVariable.cpp
	kvs/tree/KviKvsTreeNodeFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeGlobalVariable.cpp
	kvs/tree/KviKvsTreeNodeHashCount.cpp
	kvs/tree/KviKvsTreeNodeHashElement.cpp
	kvs/tree/KviKvsTreeNodeHashReferenceAssert.cpp
	kvs/tree/KviKvsTreeNodeIndirectData.cpp
	kvs/tree/KviKvsTreeNodeInstruction.cpp
	kvs/tree/KviKvsTreeNodeInstructionBlock.cpp
	kvs/tree/KviKvsTreeNodeLocalVariable.cpp
	kvs/tree/KviKvsTreeNodeModuleCallbackCommand.cpp
	kvs/tree/KviKvsTreeNodeModuleFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeModuleSimpleCommand.cpp
	kvs/tree/KviKvsTreeNodeMultipleParameterIdentifier.cpp
	kvs/tree/KviKvsTreeNodeObjectField.cpp
	kvs/tree/KviKvsTreeNodeObjectFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeOperation.cpp
	kvs/tree/KviKvsTreeNodeParameterCount.cpp
	kvs/tree/KviKvsTreeNodeParameterReturn.cpp
	kvs/tree/KviKvsTreeNodeRebindingSwitch.cpp
	kvs/tree/KviKvsTreeNodeScopeOperator.cpp
	kvs/tree/KviKvsTreeNodeSimpleCommand.cpp
	kvs/tree/KviKvsTreeNodeSingleParameterIdentifier.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommand.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandBreak.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandClass.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandContinue.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandDefpopup.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandDo.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandFor.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandForeach.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandIf.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandSwitch.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandUnset.cpp
	kvs/tree/KviKvsTreeNodeSpecialCommandWhile.cpp
	kvs/tree/KviKvsTreeNodeStringCase.cpp
	kvs/tree/KviKvsTreeNodeSwitchList.cpp
	kvs/tree/KviKvsTreeNodeThisObjectFunctionCall.cpp
	kvs/tree/KviKvsTreeNodeVariable.cpp
	kvs/tree/KviKvsTreeNodeVoidFunctionCall.cpp
	kernel/KviAction.cpp
	kernel/KviActionManager.cpp
	kernel/KviApplication.cpp
	kernel/KviApplication_filesystem.cpp
	kernel/KviApplication_setup.cpp
	kernel/KviAsynchronousConnectionData.cpp
	kernel/KviCoreActions.cpp
	kernel/KviCustomToolBarDescriptor.cpp
	kernel/KviCustomToolBarManager.cpp
	kernel/KviDbusAdaptor.cpp
	kernel/KviDefaultScript.cpp
	kernel/KviFileTransfer.cpp
	kernel/KviHtmlGenerator.cpp
	kernel/KviIconManager.cpp
	kernel/KviInternalCommand.cpp
	kernel/KviIpcSentinel.cpp
	kernel/KviIrcConnection.cpp
	kernel/KviIrcConnectionAntiCtcpFloodData.cpp
	kernel/KviIrcConnectionAsyncWhoisData.cpp
	kernel/KviIrcConnectionNetsplitDetectorData.cpp
	kernel/KviIrcConnectionRequestQueue.cpp
	kernel/KviIrcConnectionServerInfo.cpp
	kernel/KviIrcConnectionStateData.cpp
	kernel/KviIrcConnectionStatistics.cpp
	kernel/KviIrcConnectionTarget.cpp
	kernel/KviIrcConnectionTargetResolver.cpp
	kernel/KviIrcConnectionUserInfo.cpp
	kernel/KviIrcContext.cpp
	kernel/KviIrcDataStreamMonitor.cpp
	kernel/KviIrcLink.cpp
	kernel/KviIrcSocket.cpp
	kernel/KviIrcUrl.cpp
	kernel/KviLagMeter.cpp
	kernel/KviMain.cpp
	kernel/KviNotifyList.cpp
	kernel/KviOptions.cpp
	kernel/KviSSLMaster.cpp
	kernel/KviTextIconManager.cpp
	kernel/KviTheme.cpp
	kernel/KviUserAction.cpp
	kernel/KviUserInput.cpp
)

if(MINGW)
	list(APPEND LIBS -lshlwapi)
	# resource compilation for mingw
	set(CMAKE_RC_COMPILER_INIT windres)
	enable_language(RC)
	set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")

	list(APPEND kvirc_SRCS ${CMAKE_SOURCE_DIR}/data/resources_win32/kvirc.rc)
	list(APPEND kvirc_SRCS ${CMAKE_SOURCE_DIR}/data/resources_win32/kvirc.exe.manifest)
endif()

if(MSVC)
	list(APPEND LIBS shlwapi.lib)
	list(APPEND kvirc_SRCS ${CMAKE_SOURCE_DIR}/data/resources_win32/kvirc.rc)
	list(APPEND kvirc_SRCS ${CMAKE_SOURCE_DIR}/data/resources_win32/kvirc.exe.manifest)
endif()

# Link libraries
# don't mind the WIN32 flag, its needed to not show a console on non-debug windows builds and is ignored anywhere else.
if(NOT WANT_DEBUG)
	add_executable(${KVIRC_BINARYNAME} WIN32 ${kvirc_SRCS} ${kvirc_MOC_SRCS})
else()
	add_executable(${KVIRC_BINARYNAME} ${kvirc_SRCS} ${kvirc_MOC_SRCS})
endif()

target_link_libraries(${KVIRC_BINARYNAME} ${KVILIB_BINARYNAME} ${LIBS} ${qt_kvirc_modules})

if(MINGW)
	# For some reason CMake doesn't do this itself...
	# In case of MSVC, it does add /implib:kvirc.lib though
	set_target_properties(${KVIRC_BINARYNAME} PROPERTIES LINK_FLAGS "${ADDITIONAL_LINK_FLAGS} -Wl,--out-implib=libkvirc.dll.a")
else()
	set_target_properties(${KVIRC_BINARYNAME} PROPERTIES LINK_FLAGS "${ADDITIONAL_LINK_FLAGS}")
endif()

if(CMAKE_HOST_SYSTEM MATCHES "FreeBSD")
	set_target_properties(${KVIRC_BINARYNAME} PROPERTIES LINK_FLAGS -Wl,-export-dynamic)
	message(STATUS "Patching for FreeBSD...")
endif()

# This is needed for linking the modules (not actually used by gcc on linux... but it SHOULD be)
set_target_properties(${KVIRC_BINARYNAME} PROPERTIES ENABLE_EXPORTS ON)

if(WIN32)
	# We need this defined when mingw will compile moc files
	add_definitions(-D_WANT_KVIRC_)
endif()

if(WANT_STRIP)
	add_custom_command(
		TARGET ${KVIRC_BINARYNAME}
		POST_BUILD
		COMMAND ${STRIP_EXECUTABLE} $<TARGET_FILE:${KVIRC_BINARYNAME}>
	)
endif()

# Installation directives
install(TARGETS ${KVIRC_BINARYNAME} RUNTIME DESTINATION "${KVIRC_BIN_PATH}")
if(MSVC)
	install(FILES $<TARGET_PDB_FILE:${KVIRC_BINARYNAME}> DESTINATION ${KVIRC_BIN_PATH} OPTIONAL)
endif()