PROJECT( libsyncml C )

SET( LIBSYNCML_VERSION_MAJOR "0" )
SET( LIBSYNCML_VERSION_MINOR "5" )
SET( LIBSYNCML_VERSION_PATCH "4" )
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 6 )

# 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 4 )

# 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_AGE}.${LIBSYNCML_LIBVERSION_REVISION}" )

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( LIBDATA_INSTALL_DIR  "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "library data 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 )
INCLUDE( CheckFunctionExists )
INCLUDE( Documentation )
INCLUDE( AddDocumentation )

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 ( GLIB2_MIN_VERSION "2.12" )
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.10.0" )
SET ( CHECK_MIN_VERSION "0.9.7" )
#SET ( BLUEZ_MIN_VERSION "3.19" )

## avoid caching of CHECK_FOUND without CHECK_MIN_VERSION
SET ( CHECK_FOUND OFF )

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

IF ( NOT GLIB2_FOUND )
	SET ( FATAL_ERROR_GLIB2 "Cannot find correct glib version ${GLIB2_MIN_VERSION}." )
	SET ( ENABLE_GLIB2_GREGEX ON )
ELSE ( NOT GLIB2_FOUND )
	SET( CMAKE_REQUIRED_INCLUDES ${GLIB2_INCLUDE_DIRS} )
	SET( CMAKE_REQUIRED_LIBRARIES ${GLIB2_LIBRARIES} )
	CHECK_FUNCTION_EXISTS( g_regex_new GLIB2_HAVE_GREGEX )
	IF ( GLIB2_HAVE_GREGEX )
		SET ( ENABLE_GLIB2_GREGEX ON )
	ELSE ( GLIB2_HAVE_GREGEX )
		SET ( ENABLE_GLIB2_GREGEX OFF )
	ENDIF ( GLIB2_HAVE_GREGEX )
ENDIF ( NOT GLIB2_FOUND )

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

IF(LIBSOUP2_FOUND)
	OPTION( ENABLE_HTTP "enable http transports" ON )
	IF (LIBSOUP24_FOUND)
		OPTION( HAVE_LIBSOUP24 "building with libsoup 2.4" ON )
		OPTION( HAVE_LIBSOUP22 "building with libsoup 2.2" OFF )
		OPTION( HAVE_LIBSOUP22_SOLARIS "enable Solaris libsoup workarounds" OFF )
	ELSE (LIBSOUP24_FOUND)
		OPTION( HAVE_LIBSOUP24 "building with libsoup 2.4" OFF )
		OPTION( HAVE_LIBSOUP22 "building with libsoup 2.2" ON )
		IF( CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
			OPTION( HAVE_LIBSOUP22_SOLARIS "enable Solaris libsoup workarounds" ON )
		ELSE( CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
			OPTION( HAVE_LIBSOUP22_SOLARIS "enable Solaris libsoup workarounds" OFF )
		ENDIF( CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
	ENDIF (LIBSOUP24_FOUND)
ELSE(LIBSOUP2_FOUND)
	OPTION( ENABLE_HTTP "enable http transports" OFF )
	OPTION( HAVE_LIBSOUP22_SOLARIS "enable Solaris libsoup workarounds" 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 )
		SET( CMAKE_REQUIRED_FLAGS ${BLUEZ_CFLAGS} )
		SET( CMAKE_REQUIRED_INCLUDES ${BLUEZ_INCLUDE_DIRS} )
		SET( CMAKE_REQUIRED_LIBRARIES ${BLUEZ_LIBRARIES} )
		CHECK_FUNCTION_EXISTS( sdp_service_search_attr_req BLUETOOTH_SDPLIB )
		IF( BLUETOOTH_SDPLIB )
			OPTION( ENABLE_BLUETOOTH_SDPLIB "enable bluetooth channel discovery" ON )
		ENDIF( BLUETOOTH_SDPLIB )
	ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") 
		OPTION( ENABLE_BLUETOOTH "enable obex over bluetooth transports" ON ) 
		LINK_LIBRARIES(bluetooth sdp)
	ELSE(BLUEZ_FOUND)
		OPTION( ENABLE_BLUETOOTH "enable obex over bluetooth transports" OFF )
	ENDIF(BLUEZ_FOUND)
	IF( OPENOBEX_HAVE_TCPOBEX )
		OPTION( ENABLE_OPENOBEX_TCP "enable obex over bluetooth transports" ON )
	ELSE( OPENOBEX_HAVE_TCPOBEX )
		OPTION( ENABLE_OPENOBEX_TCP "enable OBEX transport via TCP (requires OpenOBEX 1.3+SVN)" OFF )
	ENDIF( OPENOBEX_HAVE_TCPOBEX )
ELSE(OPENOBEX_FOUND)
	OPTION( ENABLE_OBEX "enable obex transports" OFF )
	OPTION( ENABLE_OPENOBEX_TCP "enable OBEX transport via TCP (requires OpenOBEX 1.3+SVN)" OFF )
	OPTION( ENABLE_BLUETOOTH "enable obex over bluetooth transports" OFF )
	OPTION( ENABLE_BLUETOOTH_SDPLIB "enable bluetooth channel discovery" OFF )
ENDIF(OPENOBEX_FOUND)

IF( NOT LIBSOUP2_FOUND AND NOT OPENOBEX_FOUND )
	SET ( FATAL_ERROR_TRANSPORT "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 )

OPTION( ENABLE_UNIT_TEST "enable unit tests" OFF )
OPTION( THREAD_SAFE_CHECK "check is thread safe" OFF )
IF(CHECK_FOUND)
	SET( THREAD_SAFE_CHECK ON )
ELSE(CHECK_FOUND)
	## perhaps to small version
	## these versions are not thread safe
	SET ( CHECK_MIN_VERSION "" )
	FIND_PACKAGE( Check )
ENDIF(CHECK_FOUND)
IF(CHECK_FOUND)
	SET( ENABLE_UNIT_TEST ON )
	SET( MEMORYCHECK_SUPPRESSIONS_FILE "${CMAKE_SOURCE_DIR}/tests/valgrind.supp" CACHE FILEPATH "valgrind.supp" )
	INCLUDE( Testing )
ENDIF(CHECK_FOUND)

OPTION( ENABLE_TOOLS "enable building tools" ON )
OPTION( ENABLE_TRACE "enable tracing" ON )
OPTION( ENABLE_BASE64_TEST "enable deprecated base64 tests" OFF )

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( PACKAGE_SONAME "${LIBSYNCML_LIBVERSION_VERSION}" )
SET( VERSION "${LIBSYNCML_VERSION}" )

CONFIGURE_FILE( "config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/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 )

MARK_AS_ADVANCED( CLEAR BUILD_DOCUMENTATION )
IF ( BUILD_DOCUMENTATION )
	IF ( DOXYGEN_DOT_EXECUTABLE )
		SET( HAVE_DOT "YES" )
	ENDIF ( DOXYGEN_DOT_EXECUTABLE )

	# configure tools documentation
	CONFIGURE_FILE( "tools/Doxyfile.in" "${CMAKE_CURRENT_BINARY_DIR}/tools/Doxyfile" @ONLY)
	ADD_CUSTOM_TARGET( DoxygenDocTools ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/tools/Doxyfile )

	# configure library documentation
	CONFIGURE_FILE( "libsyncml/Doxyfile.in" "${CMAKE_CURRENT_BINARY_DIR}/libsyncml/Doxyfile" @ONLY)
	ADD_CUSTOM_TARGET( DoxygenDocLibrary ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/libsyncml/Doxyfile )

	# configure general doxygen target
	CONFIGURE_FILE( "misc/doxygen.css" "${CMAKE_CURRENT_BINARY_DIR}/misc/doxygen.css" @ONLY)
	# WARNING: Do not use DEPENDS of ADD_CUSTOM_TARGET here
	ADD_CUSTOM_TARGET( DoxygenDoc )
	ADD_DEPENDENCIES( DoxygenDoc DoxygenDocLibrary DoxygenDocTools )

	# install documentation
	ADD_DOCUMENTATION( HTML DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/docs/html/" )
	ADD_DOCUMENTATION( MAN DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/docs/man/" )
	ADD_DEPENDENCIES( syncml DoxygenDoc )
	
ENDIF ( BUILD_DOCUMENTATION )

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

# status output
INCLUDE( ShowStatus )
MESSAGE( STATUS "==================================================" )
MESSAGE( STATUS "Operating System                           ${CMAKE_SYSTEM_NAME}" )
IF( CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
	SHOW_STATUS( HAVE_LIBSOUP22_SOLARIS "libsoup 2.2 Solaris workaround" )
ENDIF( CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
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( THREAD_SAFE_CHECK "check is thread safe\t\t" CHECK_VERSION )
SHOW_STATUS( ENABLE_WBXML "WAP Binary XML\t\t" LIBWBXML2_VERSION )
SHOW_STATUS( ENABLE_HTTP "http transports\t\t" LIBSOUP2_VERSION )
SHOW_STATUS( ENABLE_OBEX "obex transports\t\t" OPENOBEX_VERSION )
SHOW_STATUS( ENABLE_BLUETOOTH "obex over bluetooth transports" BLUEZ_VERSION )
SHOW_STATUS( ENABLE_BLUETOOTH_SDPLIB "bluetooth channel discovery\t" )
SHOW_STATUS( ENABLE_OPENOBEX_TCP "obex over tcp transports\t" )
SHOW_STATUS( ENABLE_BASE64_TEST "deprecated base64 tests\t" )
SHOW_STATUS( ENABLE_GLIB2_GREGEX "glib2 GRegex support\t\t" GLIB2_VERSION )
SHOW_STATUS( BUILD_DOCUMENTATION "documentation\t\t" )

# fatal error detection
IF ( FATAL_ERROR_GLIB2 OR FATAL_ERROR_TRANSPORT )
	MESSAGE( STATUS "==================================================" )
	MESSAGE( STATUS "FATAL ERROR(S) DETECTED ... DETAILS FOLLOW:" )
	MESSAGE( STATUS "==================================================" )
	IF ( FATAL_ERROR_GLIB2 )
		MESSAGE( STATUS "${FATAL_ERROR_GLIB2}" )
	ENDIF ( FATAL_ERROR_GLIB2 )
	IF ( FATAL_ERROR_TRANSPORT )
		MESSAGE( STATUS "${FATAL_ERROR_TRANSPORT}" )
	ENDIF ( FATAL_ERROR_TRANSPORT )
	MESSAGE( STATUS "==================================================" )
ENDIF ( FATAL_ERROR_GLIB2 OR FATAL_ERROR_TRANSPORT )

### CPack ########################################

IF( RELEASE_CANDIDATE )
	SET( LIBSYNCML_VERSION "${LIBSYNCML_VERSION}-RC${RELEASE_CANDIDATE}" )
ENDIF( RELEASE_CANDIDATE )

SET( CPACK_GENERATOR "TGZ;TBZ2" ) # This line is need for a CMake (Version 2.4.7) Bug - Fixed in CVS 
SET( CPACK_SOURCE_GENERATOR "TGZ;TBZ2") 
SET( CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${LIBSYNCML_VERSION}" ) 
SET( CPACK_SET_DESTDIR ON )
INCLUDE( CPack ) 
