PROJECT( libsyncml C )

SET( LIBSYNCML_VERSION_MAJOR "0" )
SET( LIBSYNCML_VERSION_MINOR "4" )
SET( LIBSYNCML_VERSION_PATCH "7" )
SET( LIBSYNCML_VERSION "${LIBSYNCML_VERSION_MAJOR}.${LIBSYNCML_VERSION_MINOR}.${LIBSYNCML_VERSION_PATCH}" )

# The most recent interface number that this library implements.
#UPDATE: If any interface have been added, removed or changed since
#UPDATE: the last update increment CURRENT.
SET( LIBSYNCML_LIBVERSION_CURRENT 2 )

# The implementation number of the CURRENT interface.
# UPDATE: Increment only if the library code has changed at all, since
# UPDATE: last release.
# UPDATE: Set REVISION to 0 if any interface have been added, removed or
# UPDATE: changed since the last update.
SET( LIBSYNCML_LIBVERSION_REVISION 0 )

# The difference between the newest and the oldest interfaces.
# UPDATE: If any interface have been added since the last public
# UPDATE: release, then increment.
# UPDATE: If any interface have been removed since the last release
# UPDATE: reset to 0.
SET( LIBSYNCML_LIBVERSION_AGE 0 )

# The range of implemention CURRENT - AGE is the SOVERSION
MATH( EXPR LIBSYNCML_LIBVERSION_SOVERSION "${LIBSYNCML_LIBVERSION_CURRENT} - ${LIBSYNCML_LIBVERSION_AGE}" )

SET( LIBSYNCML_LIBVERSION_VERSION "${LIBSYNCML_LIBVERSION_SOVERSION}.${LIBSYNCML_LIBVERSION_REVISION}.${LIBSYNCML_LIBVERSION_AGE}" )

CMAKE_MINIMUM_REQUIRED(VERSION 2.4)

# TODO: Move to external file/macro
SET( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" )

SET( LIB_SUFFIX "" CACHE STRING "The library directory suffix. 32bit empty string, 64 for 64bit." )
SET( LIB_INSTALL_DIR  "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE INTERNAL "libary location" )
SET( BIN_INSTALL_DIR  "${CMAKE_INSTALL_PREFIX}/bin" CACHE INTERNAL "binary location" )
SET( SHARE_INSTALL_DIR  "${CMAKE_INSTALL_PREFIX}/share" CACHE INTERNAL "data location" )
SET( INCLUDE_INSTALL_DIR  "${CMAKE_INSTALL_PREFIX}/include" CACHE INTERNAL "headers location" )
SET( LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/libexec" CACHE INTERNAL "libexec location" )

#MESSAGE(STATUS "CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}" )

SET( LIBSYNCML_LIBRARIES_DIR "${LIB_INSTALL_DIR}" CACHE PATH "Syncml library location" )
SET( LIBSYNCML_INCLUDE_DIR "${INCLUDE_INSTALL_DIR}/libsyncml-1.0" CACHE PATH "Syncml headers location" )
SET( LIBSYNCML_BIN_DIR "${BIN_INSTALL_DIR}" CACHE PATH "Syncml binaries location" )
SET( LIBSYNCML_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Syncml data location" )
SET( LIBSYNCML_EXEC_INSTALL_DIR "${BIN_INSTALL_DIR}" CACHE PATH "Syncml binary location" )

# find header files and type size
INCLUDE( CheckTypeSize )
INCLUDE( CheckIncludeFiles )

CHECK_INCLUDE_FILES( dlfcn.h HAVE_DLFCN_H )
CHECK_INCLUDE_FILES( inttypes.h HAVE_INTTYPES_H )
CHECK_INCLUDE_FILES( memory.h HAVE_MEMORY_H )
CHECK_INCLUDE_FILES( stdint.h HAVE_STDINT_H )
CHECK_INCLUDE_FILES( stdlib.h HAVE_STDLIB_H )
CHECK_INCLUDE_FILES( strings.h HAVE_STRINGS_H )
CHECK_INCLUDE_FILES( string.h HAVE_STRING_H )
CHECK_INCLUDE_FILES( sys/stat.h HAVE_SYS_STAT_H )
CHECK_INCLUDE_FILES( sys/types.h HAVE_SYS_TYPES_H )
CHECK_INCLUDE_FILES( unistd.h HAVE_UNISTD_H )

CHECK_TYPE_SIZE( uint16_t UINT16_T )
CHECK_TYPE_SIZE( uint32_t UINT32_T )
CHECK_TYPE_SIZE( uint8_t UINT8_T )

# ensure out od source build
INCLUDE( MacroEnsureOutOfSourceBuild )
MACRO_ENSURE_OUT_OF_SOURCE_BUILD("${CMAKE_PROJECT_NAME} doesn't allow to build within the source directory. Please, create a seperate build directory and run 'cmake ${PROJECT_SOURCE_DIR} [options]'!")

# find requirements
SET ( OPENOBEX_MIN_VERSION "1.1" )
# do not set LIBSOUP2_MIN_VERSION
# if you set LIBSOUP2_MIN_VERSION then you cannot support 2.2 and 2.4
SET ( LIBSOUP22_MIN_VERSION "2.2.91" )
SET ( LIBSOUP24_MIN_VERSION "2.3.0.1" )
#SET ( LIBWBXML2_MIN_VERSION "0.9.0" )
#SET ( BLUEZ_MIN_VERSION "3.19" )

FIND_PACKAGE( GLIB2 REQUIRED )
FIND_PACKAGE( LibXml2 REQUIRED )	
FIND_PACKAGE( OpenObex )
FIND_PACKAGE( LibSoup2 )
FIND_PACKAGE( LibWbxml2 )
FIND_PACKAGE( BlueZ )
FIND_PACKAGE( Check )

IF(LIBWBXML2_FOUND)
	SET( ENABLE_WBXML ON)
ENDIF(LIBWBXML2_FOUND)

IF(LIBSOUP2_FOUND)
	OPTION( ENABLE_HTTP "enable http transports" ON )
ELSE(LIBSOUP2_FOUND)
	SET( ENABLE_HTTP OFF )
ENDIF(LIBSOUP2_FOUND)

IF(OPENOBEX_FOUND)
	OPTION( ENABLE_OBEX "enable obex transports" ON )
	IF(BLUEZ_FOUND)
		OPTION( ENABLE_BLUETOOTH "enable obex over bluetooth transports" ON )
	ELSE(BLUEZ_FOUND)
		SET( ENABLE_BLUETOOTH OFF )
	ENDIF(BLUEZ_FOUND)
ELSE(OPENOBEX_FOUND)
	SET( ENABLE_OBEX OFF )
ENDIF(OPENOBEX_FOUND)

IF( NOT LIBSOUP2_FOUND AND NOT OPENOBEX_FOUND )
	MESSAGE( FATAL_ERROR "Could not find libsoup2 nor OpenObex! Please install at least one of these libraries (e.g. libsoup2-dev package)." )
ENDIF( NOT LIBSOUP2_FOUND AND NOT OPENOBEX_FOUND )

IF(CHECK_FOUND)
	OPTION( ENABLE_UNIT_TEST "enable unit tests" ON )
	INCLUDE( Testing )
ENDIF(CHECK_FOUND)

OPTION( ENABLE_TOOLS "enable building tools" ON )
OPTION( ENABLE_TRACE "enable tracing" ON )

SET( PACKAGE "libsyncml" )
SET( PACKAGE_BUGREPORT " " )
SET( PACKAGE_NAME "libsyncml" )
SET( PACKAGE_TARNAME "${PACKAGE_NAME}" )
SET( PACKAGE_STRING "${PACKAGE_NAME} ${LIBSYNCML_VERSION}" )
SET( PACKAGE_VERSION "${LIBSYNCML_VERSION}" )
SET( VERSION "${LIBSYNCML_VERSION}" )

CONFIGURE_FILE( "config.h.cmake" "config.h" )
CONFIGURE_FILE( "libsyncml-1.0.pc.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/libsyncml-1.0.pc" @ONLY)

# add uninstall target
CONFIGURE_FILE(	"${CMAKE_SOURCE_DIR}/cmake/modules/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)

ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")

ADD_SUBDIRECTORY( libsyncml )
ADD_SUBDIRECTORY( tools )
ADD_SUBDIRECTORY( tests )

# todo: add requires in pc file
INSTALL( FILES "${CMAKE_CURRENT_BINARY_DIR}/libsyncml-1.0.pc" DESTINATION "${LIB_INSTALL_DIR}/pkgconfig/" )

# status output
INCLUDE( ShowStatus )
MESSAGE( STATUS "==================================================" )
SHOW_STATUS( ENABLE_TOOLS "building tools\t\t" )
SHOW_STATUS( ENABLE_TRACE "tracing tools\t\t" )
SHOW_STATUS( ENABLE_UNIT_TEST "unit tests\t\t\t" )
SHOW_STATUS( ENABLE_HTTP "http transports\t\t" )
SHOW_STATUS( ENABLE_OBEX "obex transports\t\t" )
SHOW_STATUS( ENABLE_BLUETOOTH "obex over bluetooth transports" )

