include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/include ${CMAKE_CURRENT_SOURCE_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/lib)
include_directories(${Boost_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})

set(lib_SRCS
		StdInc.cpp
		${CMAKE_BINARY_DIR}/Version.cpp

		battle/AccessibilityInfo.cpp
		battle/BattleAction.cpp
		battle/BattleAttackInfo.cpp
		battle/BattleHex.cpp
		battle/BattleInfo.cpp
		battle/CBattleInfoCallback.cpp
		battle/CBattleInfoEssentials.cpp
		battle/CCallbackBase.cpp
		battle/CObstacleInstance.cpp
		battle/CPlayerBattleCallback.cpp
		battle/ReachabilityInfo.cpp
		battle/SideInBattle.cpp
		battle/SiegeInfo.cpp

		filesystem/AdapterLoaders.cpp
		filesystem/CArchiveLoader.cpp
		filesystem/CBinaryReader.cpp
		filesystem/CCompressedStream.cpp
		filesystem/CFileInputStream.cpp
		filesystem/CFilesystemLoader.cpp
		filesystem/CMemoryBuffer.cpp
		filesystem/CMemoryStream.cpp
		filesystem/CZipLoader.cpp
		filesystem/CZipSaver.cpp
		filesystem/FileInfo.cpp
		filesystem/FileStream.cpp
		filesystem/Filesystem.cpp
		filesystem/MinizipExtensions.cpp
		filesystem/ResourceID.cpp

		logging/CBasicLogConfigurator.cpp
		logging/CLogger.cpp

		mapObjects/CArmedInstance.cpp
		mapObjects/CBank.cpp
		mapObjects/CGHeroInstance.cpp
		mapObjects/CGMarket.cpp
		mapObjects/CGPandoraBox.cpp
		mapObjects/CGTownInstance.cpp
		mapObjects/CObjectClassesHandler.cpp
		mapObjects/CObjectHandler.cpp
		mapObjects/CommonConstructors.cpp
		mapObjects/CQuest.cpp
		mapObjects/CRewardableConstructor.cpp
		mapObjects/CRewardableObject.cpp
		mapObjects/JsonRandom.cpp
		mapObjects/MiscObjects.cpp
		mapObjects/ObjectTemplate.cpp

		mapping/CCampaignHandler.cpp
		mapping/CDrawRoadsOperation.cpp
		mapping/CMap.cpp
		mapping/CMapEditManager.cpp
		mapping/CMapInfo.cpp
		mapping/CMapService.cpp
		mapping/MapFormatH3M.cpp
		mapping/MapFormatJson.cpp

		registerTypes/RegisterTypes.cpp
		registerTypes/TypesClientPacks1.cpp
		registerTypes/TypesClientPacks2.cpp
		registerTypes/TypesMapObjects1.cpp
		registerTypes/TypesMapObjects2.cpp
		registerTypes/TypesMapObjects3.cpp
		registerTypes/TypesPregamePacks.cpp
		registerTypes/TypesServerPacks.cpp

		rmg/CMapGenerator.cpp
		rmg/CMapGenOptions.cpp
		rmg/CRmgTemplate.cpp
		rmg/CRmgTemplateStorage.cpp
		rmg/CRmgTemplateZone.cpp
		rmg/CZoneGraphGenerator.cpp
		rmg/CZonePlacer.cpp

		serializer/BinaryDeserializer.cpp
		serializer/BinarySerializer.cpp
		serializer/CLoadIntegrityValidator.cpp
		serializer/CMemorySerializer.cpp
		serializer/Connection.cpp
		serializer/CSerializer.cpp
		serializer/CTypeList.cpp
		serializer/JsonDeserializer.cpp
		serializer/JsonSerializeFormat.cpp
		serializer/JsonSerializer.cpp

		spells/AdventureSpellMechanics.cpp
		spells/BattleSpellMechanics.cpp
		spells/CDefaultSpellMechanics.cpp
		spells/CreatureSpellMechanics.cpp
		spells/CSpellHandler.cpp
		spells/ISpellMechanics.cpp
		spells/ViewSpellInt.cpp

		CAndroidVMHelper.cpp
		CArtHandler.cpp
		CBonusTypeHandler.cpp
		CBuildingHandler.cpp
		CConfigHandler.cpp
		CConsoleHandler.cpp
		CCreatureHandler.cpp
		CCreatureSet.cpp
		CGameInfoCallback.cpp
		CGameInterface.cpp
		CGameState.cpp
		CGeneralTextHandler.cpp
		CHeroHandler.cpp
		CModHandler.cpp
		CPathfinder.cpp
		CRandomGenerator.cpp
		CStack.cpp
		CThreadHelper.cpp
		CTownHandler.cpp
		GameConstants.cpp
		HeroBonus.cpp
		IGameCallback.cpp
		IHandlerBase.cpp
		JsonDetail.cpp
		JsonNode.cpp
		LogicalExpression.cpp
		NetPacksLib.cpp
		ResourceSet.cpp
		VCMIDirs.cpp
		VCMI_Lib.cpp

		${VCMILIB_ADDITIONAL_SOURCES}
)

set(lib_HEADERS
		StdInc.h
		../Global.h

		battle/AccessibilityInfo.h
		battle/BattleAction.h
		battle/BattleAttackInfo.h
		battle/BattleHex.h
		battle/BattleInfo.h
		battle/CBattleInfoCallback.h
		battle/CBattleInfoEssentials.h
		battle/CCallbackBase.h
		battle/CObstacleInstance.h
		battle/CPlayerBattleCallback.h
		battle/ReachabilityInfo.h
		battle/SideInBattle.h
		battle/SiegeInfo.h

		filesystem/AdapterLoaders.h
		filesystem/CArchiveLoader.h
		filesystem/CBinaryReader.h
		filesystem/CCompressedStream.h
		filesystem/CFileInputStream.h
		filesystem/CFilesystemLoader.h
		filesystem/CInputOutputStream.h
		filesystem/CInputStream.h
		filesystem/CMemoryBuffer.h
		filesystem/CMemoryStream.h
		filesystem/COutputStream.h
		filesystem/CStream.h
		filesystem/CZipLoader.h
		filesystem/CZipSaver.h
		filesystem/FileInfo.h
		filesystem/FileStream.h
		filesystem/Filesystem.h
		filesystem/ISimpleResourceLoader.h
		filesystem/MinizipExtensions.h
		filesystem/ResourceID.h

		logging/CBasicLogConfigurator.h
		logging/CLogger.h

		mapObjects/CArmedInstance.h
		mapObjects/CBank.h
		mapObjects/CGHeroInstance.h
		mapObjects/CGMarket.h
		mapObjects/CGPandoraBox.h
		mapObjects/CGTownInstance.h
		mapObjects/CObjectClassesHandler.h
		mapObjects/CObjectHandler.h
		mapObjects/CommonConstructors.h
		mapObjects/CQuest.h
		mapObjects/CRewardableConstructor.h
		mapObjects/CRewardableObject.h
		mapObjects/JsonRandom.h
		mapObjects/MapObjects.h
		mapObjects/MiscObjects.h
		mapObjects/ObjectTemplate.h

		mapping/CCampaignHandler.h
		mapping/CDrawRoadsOperation.h
		mapping/CMapDefines.h
		mapping/CMapEditManager.h
		mapping/CMap.h
		mapping/CMapInfo.h
		mapping/CMapService.h
		mapping/MapFormatH3M.h
		mapping/MapFormatJson.h

		registerTypes/RegisterTypes.h

		rmg/CMapGenerator.h
		rmg/CMapGenOptions.h
		rmg/CRmgTemplate.h
		rmg/CRmgTemplateStorage.h
		rmg/CRmgTemplateZone.h
		rmg/CZoneGraphGenerator.h
		rmg/CZonePlacer.h
		rmg/float3.h

		serializer/BinaryDeserializer.h
		serializer/BinarySerializer.h
		serializer/CLoadIntegrityValidator.h
		serializer/CMemorySerializer.h
		serializer/Connection.h
		serializer/CSerializer.h
		serializer/CTypeList.h
		serializer/JsonDeserializer.h
		serializer/JsonSerializeFormat.h
		serializer/JsonSerializer.h

		spells/AdventureSpellMechanics.h
		spells/BattleSpellMechanics.h
		spells/CDefaultSpellMechanics.h
		spells/CreatureSpellMechanics.h
		spells/CSpellHandler.h
		spells/ISpellMechanics.h
		spells/Magic.h
		spells/SpellMechanics.h
		spells/ViewSpellInt.h

		AI_Base.h
		CAndroidVMHelper.h
		CArtHandler.h
		CBonusTypeHandler.h
		CBuildingHandler.h
		CConfigHandler.h
		CConsoleHandler.h
		CCreatureHandler.h
		CCreatureSet.h
		CGameInfoCallback.h
		CGameInterface.h
		CGameStateFwd.h
		CGameState.h
		CGeneralTextHandler.h
		CHeroHandler.h
		CModHandler.h
		CondSh.h
		ConstTransitivePtr.h
		CPathfinder.h
		CPlayerState.h
		CRandomGenerator.h
		CScriptingModule.h
		CSoundBase.h
		CStack.h
		CStopWatch.h
		CThreadHelper.h
		CTownHandler.h
		FunctionList.h
		GameConstants.h
		HeroBonus.h
		IBonusTypeHandler.h
		IGameCallback.h
		IGameEventsReceiver.h
		IHandlerBase.h
		int3.h
		Interprocess.h
		JsonDetail.h
		JsonNode.h
		LogicalExpression.h
		NetPacksBase.h
		NetPacks.h
		ResourceSet.h
		ScopeGuard.h
		StartInfo.h
		StringConstants.h
		UnlockGuard.h
		VCMIDirs.h
		vcmi_endian.h
		VCMI_Lib.h
)

assign_source_group(${lib_SRCS} ${lib_HEADERS})

add_library(vcmi SHARED ${lib_SRCS} ${lib_HEADERS})
set_target_properties(vcmi PROPERTIES COMPILE_DEFINITIONS "VCMI_DLL=1")
target_link_libraries(vcmi ${MINIZIP_LIBRARIES} ${Boost_LIBRARIES} ${SDL2_LIBRARY} ${ZLIB_LIBRARIES} ${SYSTEM_LIBS})

if(WIN32)
	set_target_properties(vcmi
		PROPERTIES
			OUTPUT_NAME "VCMI_lib"
			PROJECT_LABEL "VCMI_lib"
	)
endif()

if(ANDROID)
	return()
endif()

vcmi_set_output_dir(vcmi "")

set_target_properties(vcmi PROPERTIES ${PCH_PROPERTIES})
cotire(vcmi)

# We want to deploy assets into build directory for easier debugging without install
add_custom_command(TARGET vcmi POST_BUILD
	COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/config
	COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/Mods
	COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/config ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/config
	COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/Mods ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/Mods
)

install(TARGETS vcmi RUNTIME DESTINATION ${LIB_DIR} LIBRARY DESTINATION ${LIB_DIR})
