###############################################################################
# The main CMakefile for MIRAbase
###############################################################################

# Include our own dependencies
MIRA_REQUIRE_PACKAGE(MIRABase)

###############################################################################

# these includes are used within the MIRAbase source files only
# include directories for headers used in MIRAbase headers must be placed
# into MIRABase.package
INCLUDE_DIRECTORIES( ${LIBICONV_INCLUDE_DIRS} )
INCLUDE_DIRECTORIES( ${LIBXML2_INCLUDE_DIRS} )
INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIRS} )
INCLUDE_DIRECTORIES( ${OPENSSL_INCLUDE_DIRS} )
INCLUDE_DIRECTORIES( ${SQLITE_INCLUDE_DIRS} )
INCLUDE_DIRECTORIES( ${LIBPROCPS_INCLUDE_DIRS} )

INCLUDE_DIRECTORIES( src )

###############################################################################

ADD_SOURCES (MIRABaseSources
	src/communication/IOService.C
	src/communication/MulticastSender.C
	src/communication/SerialPort.C

	src/database/SQLiteDB.C
	src/database/SQLiteQuery.C

	src/error/CallStack.C
	src/error/Exception.C
	src/error/Exceptions.C
	src/error/LogConsoleSink.C
	src/error/LogFileSink.C
	src/error/LoggingCore.C
	src/error/LoggingAux.C
	src/error/LogTimer.C
	src/error/LogTxtStreamSink.C
	src/error/SignalHandler.C

	src/factory/Class.C
	src/factory/Factory.C
	src/factory/LibraryRegistry.C
	src/factory/LightFactoryMutexGetter.C
	src/factory/ManifestAgent.C
	src/factory/NullClass.C
	src/factory/TypeId.C
	src/factory/VacantClass.C

	src/geometry/DistanceLUT.C

	src/image/Color.C
	src/image/Colormap.C
	src/image/ImgPainter.C
	src/image/TgaFormat.C

	src/json/JSON.C

	src/platform/Console.C
	src/platform/Environment.C
	src/platform/Process.C
	src/platform/Memory.C
	src/platform/Typename.C
	src/platform/private/ProcessAncestryHelper.C

	src/rpc/RPCError.C
	src/rpc/RPCManager.C
	src/rpc/RPCServer.C

	src/security/AESFilter.C
	src/security/Base64.C
	src/security/HashStream.C

	src/serialization/BinarySerializerCodec.C
	src/serialization/BinaryJSONConverter.C
	src/serialization/MetaSerializer.C
	src/serialization/NoGenericReflect.C
	src/serialization/Print.C
	src/serialization/PropertyNode.C
	src/serialization/RecursiveMemberReflector.C

	src/stream/BufferStream.C
	src/stream/GzStream.C

	src/thread/Thread.C
	src/thread/ThreadMonitor.C

	src/transform/Transformer.C
	src/transform/TransformerNode.C

	src/utils/CompressBuffer.C
	src/utils/Hexdump.C
	src/utils/PackageFinder.C
	src/utils/Path.C
	src/utils/PathFinder.C
	src/utils/Profiler.C
	src/utils/ProgramOptions.C
	src/utils/ResolveVariable.C
	src/utils/Singleton.C
	src/utils/SharedLibrary.C
	src/utils/Time.C
	src/utils/TimeHumanReadable.C

	src/xml/XMLDom.C
	src/xml/XMLDomPreprocessor.C
)

IF(MIRA_USE_OPENSSL3)
	ADD_SOURCES (MIRABaseSources
		src/security/openssl3/OpenSSLWrapperMD.C
		src/security/openssl3/RSAKey.C
		src/security/openssl3/RSAFilter.C
		src/security/openssl3/RSASignature.C
	)
ELSE()
	ADD_SOURCES (MIRABaseSources
		src/security/openssl1/MD5.C
		src/security/openssl1/SHA1.C
		src/security/openssl1/SHA256.C
		src/security/openssl1/RSAKey.C
		src/security/openssl1/RSAFilter.C
		src/security/openssl1/RSASignature.C
	)
ENDIF()

IF(NOT WIN32) # LINUX

	ADD_SOURCES (MIRABaseSources src/error/CallStackLinux.C)

	IF(HAVE_LINUX_BFD)
		ADD_SOURCE_PROPERTIES(src/error/CallStackLinux.C COMPILE_FLAGS "-DCALLSTACK_LINUX_USE_SYMBOLTABLE")
		ADD_SOURCES (MIRABaseSources	src/error/private/SymbolTableLinux.C)
	ELSE(HAVE_LINUX_BFD)
		MESSAGE("-- WARNING: No 'libiberty' or no 'binutils-devel' or no 'libbfd-devel' installed, debug symbols will not be available in stack trace")
	ENDIF(HAVE_LINUX_BFD)

	IF(HAVE_LINUX_DEMANGLE)
		INCLUDE_DIRECTORIES( ${DEMANGLEHEADER_PATH} )
		ADD_SOURCE_PROPERTIES(src/error/CallStackLinux.C COMPILE_FLAGS "-DCALLSTACK_LINUX_USE_DEMANGLE")
	ELSE(HAVE_LINUX_DEMANGLE)
		MESSAGE("-- WARNING: No 'libiberty' or no 'binutils-devel' installed, symbols can not be demangled in stack trace")
	ENDIF(HAVE_LINUX_DEMANGLE)

ELSE() #WINDOWS

	ADD_SOURCES (MIRABaseSources src/error/CallStackWin.C)
	ADD_SOURCES (MIRABaseSources src/error/private/SymbolTableWin.C)

ENDIF()

###############################################################################

MIRA_ADD_LIBRARY(MIRABase
	SHARED
	PACKAGE       MIRABase
	EXPORT_SYMBOL "MIRA_BASE_EXPORTS"
	SOURCE
		${MIRABaseSources}
)

###############################################################################

# Add dependencies to external libraries, to ensure, that these external
# dependencies are downloaded/built before MIRAbase.
#
ADD_DEPENDENCIES(MIRABase MIRAExternalDependencies)

###############################################################################

MIRA_INSTALL_PACKAGE_BASICS(
	DESTINATION base
	PACKAGE MIRABase)

MIRA_INSTALL(
	DIRECTORY include
	DESTINATION base
	PACKAGE MIRABase
	FILES_MATCHING
	PATTERN ".svn" EXCLUDE
	PATTERN "*.h"
	PATTERN "*.hpp"
	REGEX "serialization/adapters/.*"
)

MIRA_INSTALL(
	FILES
		src/factory/RegisterLibraryConstructor.C
	DESTINATION base/src/factory/
	PACKAGE MIRABase
)

###############################################################################

# This must be the first subdirectory, to ensure, that tools/ManifestGen
# is seen before any other MIRA_ADD_LIBRARY targets. Otherwise the DEPENDS
# option in ADD_CUSTOM_TARGET in ADD_MANIFEST to the target ManifestGen will
# not work properly.
ADD_SUBDIR(tools)

ADD_SUBDIR(examples)
ADD_SUBDIR(tests)

###############################################################################
