CMAKE_MINIMUM_REQUIRED( VERSION 2.6 )

project( gloox )

#SET( CPACK_PACKAGE_DESCRIPTION_SUMMARY "A Jabber/XMPP library" )
#SET( CPACK_PACKAGE_VENDOR "Jakob Schröter" )
#SET( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README" )
#SET( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" )
#SET( CPACK_PACKAGE_VERSION_MAJOR "1" )
#SET( CPACK_PACKAGE_VERSION_MINOR "1" )
#SET( CPACK_PACKAGE_VERSION_PATCH "svn" )
#SET( CPACK_SOURCE_GENERATOR "TBZ2" )
#set( CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}-${CPACK_PACKAGE_VERSION_PATCH}" )
#set( CPACK_SOURCE_IGNORE_FILES "/build/;/.svn/;~$;${CPACK_SOURCE_IGNORE_FILES}" )
#SET( CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}-${CMake_VERSION_PATCH}" )
#include( CPack )


option( GLOOX_ENABLE_MAINTAINER "Enable Maintainer Mode" OFF )
option( GLOOX_ENABLE_GETADDRINFO "Enable getaddrinfo()" OFF )
if( WIN32 )
	option( GLOOX_WITH_SCHANNEL "Enable SChannel" OFF )
endif( WIN32 )

if( GLOOX_ENABLE_MAINTAINER )
	set( CMAKE_CXX_FLAGS "-Wshadow -Werror" CACHE STRING "Maintainer Flags" FORCE )
endif( GLOOX_ENABLE_MAINTAINER )

set( CMAKE_CXX_FLAGS_DEBUG "-g3 -fno-inline -DDEBUG" CACHE STRING "Debug Flags" FORCE )

find_package( ZLIB )
find_package( IDN )
find_package( Threads )

include( CheckFunctionExists )

## Check functions
check_function_exists( setsockopt SETSOCKOPT_EXISTS )
if(NOT WIN32)
	include ( CheckFunctionExists )
	include ( CheckIncludeFile )
	include ( CheckIncludeFiles )
	include ( CheckLibraryExists )

	check_include_file( dlfcn.h HAVE_DLFCN_H )
	check_include_file( inttypes.h HAVE_INTTYPES_H )
	check_include_file( memory.h HAVE_MEMORY_H )
	check_include_file( stdint.h HAVE_STDINT_H )
	check_include_file( stdlib.h HAVE_STDLIB_H )
	check_include_file( strings.h HAVE_STRINGS_H )
	check_include_file( string.h HAVE_STRING_H )
	check_include_file( sys/stat.h HAVE_SYS_STAT_H )
	check_include_file( sys/types.h HAVE_SYS_TYPES_H )
	check_include_file( unistd.h HAVE_UNISTD_H )
	check_include_file( errno.h HAVE_ERRNO_H )
	check_include_file( arpa/nameser.h HAVE_ARPA_NAMESER_H )
	check_include_files( "stdlib.h;stdarg.h;string.h;float.h" HAVE_STDC_HEADERS )

	set ( CMAKE_REQUIRED_LIBRARIES "resolv" )
	check_function_exists( res_querydomain HAVE_RES_QUERYDOMAIN )
	check_function_exists( res_query HAVE_RES_QUERY )
	check_function_exists( dn_skipname _HAVE_DN_SKIPNAME )
	check_function_exists( __dn_skipname _HAVE___DN_SKIPNAME )
	if ( _HAVE_DN_SKIPNAME OR _HAVE___DN_SKIPNAME )
		set ( HAVE_DN_SKIPNAME 1 )
	endif ( _HAVE_DN_SKIPNAME OR _HAVE___DN_SKIPNAME )

	check_library_exists( resolv res_init "" _HAVE_LIBRESOLV )
	check_library_exists( resolv __res_init "" _HAVE___LIBRESOLV )
	check_library_exists( bind gethostbyname "" HAVE_LIBBIND )
	check_library_exists( socket connect "" HAVE_LIBSOCKET )
	if ( _HAVE_LIBRESOLV OR _HAVE___LIBRESOLV )
		list( APPEND GLOOX_LIBS "resolv" )
		set ( HAVE_LIBRESOLV 1 )
	endif ( _HAVE_LIBRESOLV OR _HAVE___LIBRESOLV )
endif(NOT WIN32)

if( GLOOX_ENABLE_GETADDRINFO )
	check_function_exists( getaddrinfo HAVE_GETADDRINFO )
endif( GLOOX_ENABLE_GETADDRINFO )

if( SETSOCKOPT_EXISTS )
	set( HAVE_SETSOCKOPT true )
endif( SETSOCKOPT_EXISTS )


## Zlib
if( ZLIB_FOUND )
	list( APPEND GLOOX_LIBS ${ZLIB_LIBRARIES} )
	include_directories( ${ZLIB_INCLUDE_DIR} )
	set( HAVE_ZLIB true )
endif( ZLIB_FOUND )

## SSL/TLS
find_package(OpenSSL)
if(OPENSSL_FOUND)
	list(APPEND GLOOX_LIBS ${OPENSSL_LIBRARIES})
	include_directories( ${OPENSSL_INCLUDE_DIR})
	set(HAVE_OPENSSL true )
	message(STATUS "Use OpenSSL")
else(OPENSSL_FOUND)
	find_package(GNUTLS)
	if(GNUTLS_FOUND)
		list(APPEND GLOOX_LIBS ${GNUTLS_LIBRARIES})
		include_directories(${GNUTLS_INCLUDE_DIRS})
		set(HAVE_GNUTLS true)
		message(STATUS "Use GNUTLS")
	endif(GNUTLS_FOUND)
endif(OPENSSL_FOUND)

## IDN
if( IDN_FOUND )
	add_definitions(${IDN_DEFINITIONS})
	list(APPEND GLOOX_LIBS ${IDN_LIBRARIES})
	link_directories(${IDN_LIBRARY_DIRS})  # hack for freebsd
	INCLUDE_DIRECTORIES( ${IDN_INCLUDE_DIR})
	set(HAVE_LIBIDN true)
endif( IDN_FOUND )

## Windows/Pthreads
if( WIN32 )
	list( APPEND GLOOX_LIBS wsock32 gdi32 dnsapi )
	#		if( GLOOX_WITH_SCHANNEL )
	list(APPEND GLOOX_LIBS crypt32 secur32 )
	#		endif( GLOOX_WITH_SCHANNEL )
	set( HAVE_WINTLS true )
	set( HAVE_WINDNS_H true )
else( WIN32 )
	if( CMAKE_USE_PTHREADS_INIT )
		set( HAVE_PTHREAD true )
	else( CMAKE_USE_PTHREADS_INIT )
		message( FATAL_ERROR "we do need pthread support!" )
	endif( CMAKE_USE_PTHREADS_INIT )
endif( WIN32 )

if( UNIX )
	configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.unix.cmake ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.unix )
elseif( WIN32 )
	configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.win.cmake ${CMAKE_CURRENT_SOURCE_DIR}/config.h.win )
elseif( ${CMAKE_SYSTEM_NAME} MATCHES "symbian" )
	configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.symbian.cmake ${CMAKE_CURRENT_SOURCE_DIR}/config.h.symbian )
endif( UNIX )

option ( USE_TESTS ON )
if ( USE_TESTS )
	enable_testing()
	add_test( adhoc_test adhoc_test )
	add_test( adhoccommand_test adhoccommand_test )
	add_test( adhoccommandnote_test adhoccommandnote_test )
	add_test( amprule_test amprule_test )
	add_test( amp_test amp_test )
	add_test( asyncdns_test asyncdns_test )
	add_test( base64_test base64_test )
	add_test( capabilities_test capabilities_test )
	add_test( chatstatefilter_test chatstatefilter_test )
	add_test( client_test client_test )
	add_test( clientbase_test clientbase_test )
	add_test( connectionbosh_test connectionbosh_test )
	add_test( dataform_test dataform_test )
	add_test( dataformfield_test dataformfield_test )
	add_test( dataformreported_test dataformreported_test )
	add_test( dataformitem_test dataformitem_test )
	add_test( delayeddelivery_test delayeddelivery_test )
	add_test( discoinfo_test discoinfo_test )
	add_test( discoitems_test discoitems_test )
	add_test( disco_test disco_test )
	add_test( error_test error_test )
	add_test( featureneg_test featureneg_test )
	add_test( flexoffline_test flexoffline_test )
	add_test( flexofflineoffline_test flexofflineoffline_test )
	add_test( gpgencrypted_test gpgencrypted_test )
	add_test( gpgsigned_test gpgsigned_test )
	add_test( inbandbytestreamibb_test inbandbytestreamibb_test )
	add_test( inbandbytestream_test inbandbytestream_test )
	add_test( iq_test iq_test )
	add_test( jid_test jid_test )
	add_test( jinglesessionjingle_test jinglesessionjingle_test )
	add_test( jinglertp_test jinglertp_test )
	add_test( jingleiceudp_test jingleiceudp_test )
	add_test( jinglerawudp_test jinglerawudp_test )
	add_test( jinglesession_test jinglesession_test )
	add_test( lastactivity_test lastactivity_test )
	add_test( lastactivityquery_test lastactivityquery_test )
	add_test( md5_test md5_test )
	add_test( message_test message_test )
	add_test( messageeventfilter_test messageeventfilter_test )
	add_test( mucroommuc_test mucroommuc_test )
	add_test( mucroommucadmin_test mucroommucadmin_test )
	add_test( mucroommucowner_test mucroommucowner_test )
	add_test( mucroommucuser_test mucroommucuser_test )
	add_test( nickname_test nickname_test )
	add_test( nonsaslauthquery_test nonsaslauthquery_test )
	add_test( nonsaslauth_test nonsaslauth_test )
	add_test( oob_test oob_test )
	add_test( parser_test parser_test )
	add_test( prep_test prep_test )
	add_test( presence_test presence_test )
	add_test( privacymanager_test privacymanager_test )
	add_test( privacymanagerquery_test privacymanagerquery_test )
	add_test( privatexml_test privatexml_test )
	add_test( pubsubmanagerpubsub_test pubsubmanagerpubsub_test )
	add_test( pubsubmanager_test pubsubmanager_test )
	add_test( pubsubevent_test pubsubevent_test )
	add_test( receipt_test receipt_test )
	add_test( registrationquery_test registrationquery_test )
	add_test( registration_test registration_test )
	add_test( rostermanagerquery_test rostermanagerquery_test )
	add_test( rostermanager_test rostermanager_test )
	add_test( searchquery_test searchquery_test )
	add_test( search_test search_test )
	add_test( sha_test sha_test )
	add_test( shim_test shim_test )
	add_test( simanager_test simanager_test )
	add_test( simanagersi_test simanagersi_test )
	add_test( stanzaextensionfactory_test stanzaextensionfactory_test )
	add_test( subscription_test subscription_test )
	add_test( tag_test tag_test )
	add_test( tlsgnutls_test tlsgnutls_test )
	add_test( tlsopenssl_test tlsopenssl_test )
	add_test( uniquemucroomunique_test uniquemucroomunique_test )
	add_test( vcard_test vcard_test )
	add_test( vcardupdate_test vcardupdate_test )
	add_test( xpath_test xpath_test )
	add_test( zlib_test zlib_test )
	add_test( util_test util_test )

	add_subdirectory( src/tests )
endif ( USE_TESTS )

add_subdirectory( "src" )
