PROJECT(libevent C)

## check for everything in the config.h
CHECK_INCLUDE_FILES(sys/time.h   HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILES(sys/tree.h   HAVE_SYS_TREE_H)
CHECK_INCLUDE_FILES(sys/types.h  HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILES(fcntl.h      HAVE_FCNTL_H)
CHECK_INCLUDE_FILES(stdarg.h     HAVE_STDARG_H)
CHECK_INCLUDE_FILES(inttypes.h   HAVE_INTTYPES_H)
CHECK_INCLUDE_FILES(stdint.h     HAVE_STDINT_H)
CHECK_INCLUDE_FILES(stdlib.h     HAVE_STDLIB_H)
CHECK_INCLUDE_FILES(poll.h       HAVE_POLL_H)
CHECK_INCLUDE_FILES(signal.h     HAVE_SIGNAL_H)
CHECK_INCLUDE_FILES(unistd.h     HAVE_UNISTD_H)
CHECK_INCLUDE_FILES(sys/devpoll.h HAVE_SYS_DEVPOLL_H)
CHECK_INCLUDE_FILES(port.h       HAVE_PORT_H)
CHECK_INCLUDE_FILES(kqueue.h     HAVE_KQUEUE_H)

CHECK_FUNCTION_EXISTS(poll       HAVE_POLL)
CHECK_FUNCTION_EXISTS(select     HAVE_SELECT)
CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
CHECK_FUNCTION_EXISTS(vasprintf  HAVE_VASPRINTF)
CHECK_FUNCTION_EXISTS(fcntl      HAVE_FCNTL)
CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
CHECK_FUNCTION_EXISTS(strtok_r   HAVE_STRTOK_R)
CHECK_FUNCTION_EXISTS(strsep     HAVE_STRSEP)
CHECK_FUNCTION_EXISTS(getaddrinfo HAVE_GETADDRINFO)
CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO)
CHECK_FUNCTION_EXISTS(strlcpy    HAVE_STRLCPY)
CHECK_FUNCTION_EXISTS(inet_ntop  HAVE_INET_NTOP)
CHECK_FUNCTION_EXISTS(sigtimedwait HAVE_SIGTIMEDWAIT)
CHECK_FUNCTION_EXISTS(epoll_ctl  HAVE_EPOLL)
CHECK_FUNCTION_EXISTS(kqueue     HAVE_KQUEUE)
CHECK_FUNCTION_EXISTS(timeradd     HAVE_TIMERADD)
CHECK_FUNCTION_EXISTS(timersub     HAVE_TIMERSUB)
CHECK_FUNCTION_EXISTS(timerclear   HAVE_TIMERCLEAR)
CHECK_FUNCTION_EXISTS(timerisset   HAVE_TIMERISSET)
CONFIGURE_FILE(config.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/config.h)

## config.h is the internal one, event-config.h the external header
CHECK_INCLUDE_FILES(sys/time.h   _EVENT_HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILES(sys/tree.h   _EVENT_HAVE_SYS_TREE_H)
CHECK_INCLUDE_FILES(sys/types.h  _EVENT_HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILES(fcntl.h      _EVENT_HAVE_FCNTL_H)
CHECK_INCLUDE_FILES(stdarg.h     _EVENT_HAVE_STDARG_H)
CHECK_INCLUDE_FILES(inttypes.h   _EVENT_HAVE_INTTYPES_H)
CHECK_INCLUDE_FILES(stdint.h     _EVENT_HAVE_STDINT_H)
CHECK_INCLUDE_FILES(stdlib.h     _EVENT_HAVE_STDLIB_H)
CHECK_INCLUDE_FILES(poll.h       _EVENT_HAVE_POLL_H)
CHECK_INCLUDE_FILES(signal.h     _EVENT_HAVE_SIGNAL_H)
CHECK_INCLUDE_FILES(unistd.h     _EVENT_HAVE_UNISTD_H)
CHECK_INCLUDE_FILES(sys/devpoll.h _EVENT_HAVE_SYS_DEVPOLL_H)
CHECK_INCLUDE_FILES(port.h       _EVENT_HAVE_PORT_H)
CHECK_INCLUDE_FILES(kqueue.h     _EVENT_HAVE_KQUEUE_H)

CHECK_FUNCTION_EXISTS(poll       _EVENT_HAVE_POLL)
CHECK_FUNCTION_EXISTS(select     _EVENT_HAVE_SELECT)
CHECK_FUNCTION_EXISTS(gettimeofday _EVENT_HAVE_GETTIMEOFDAY)
CHECK_FUNCTION_EXISTS(vasprintf  _EVENT_HAVE_VASPRINTF)
CHECK_FUNCTION_EXISTS(fcntl      _EVENT_HAVE_FCNTL)
CHECK_FUNCTION_EXISTS(clock_gettime _EVENT_HAVE_CLOCK_GETTIME)
CHECK_FUNCTION_EXISTS(strtok_r   _EVENT_HAVE_STRTOK_R)
CHECK_FUNCTION_EXISTS(strsep     _EVENT_HAVE_STRSEP)
CHECK_FUNCTION_EXISTS(getaddrinfo _EVENT_HAVE_GETADDRINFO)
CHECK_FUNCTION_EXISTS(getnameinfo _EVENT_HAVE_GETNAMEINFO)
CHECK_FUNCTION_EXISTS(strlcpy    _EVENT_HAVE_STRLCPY)
CHECK_FUNCTION_EXISTS(inet_ntop  _EVENT_HAVE_INET_NTOP)
CHECK_FUNCTION_EXISTS(sigtimedwait _EVENT_HAVE_SIGTIMEDWAIT)
CHECK_FUNCTION_EXISTS(epoll_ctl  _EVENT_HAVE_EPOLL)
CHECK_FUNCTION_EXISTS(kqueue     _EVENT_HAVE_KQUEUE)
CHECK_FUNCTION_EXISTS(timeradd   _EVENT_HAVE_TIMERADD)
CHECK_FUNCTION_EXISTS(timersub   _EVENT_HAVE_TIMERSUB)
CHECK_FUNCTION_EXISTS(timerclear   _EVENT_HAVE_TIMERCLEAR)
CHECK_FUNCTION_EXISTS(timerisset   _EVENT_HAVE_TIMERISSET)
CONFIGURE_FILE(event-config.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/event-config.h)

ADD_DEFINITIONS(-DHAVE_CONFIG_H)
## in event-config.h we define 

IF(WIN32)
	ADD_DEFINITIONS(-D__func__=__FUNCTION__)
	ADD_DEFINITIONS(-Dinline=__inline)
	ADD_DEFINITIONS(-DBUILD_EVENT_DLL)
    ADD_DEFINITIONS(-D_BIND_TO_CURRENT_MFC_VERSION=1 -D_BIND_TO_CURRENT_CRT_VERSION=1)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE)
    ADD_DEFINITIONS(/wd4005)
ENDIF(WIN32)


INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(compat/)

SET(libevent_sources 
	event.c
	evbuffer.c
	buffer.c
	log.c
	signal.c
	evutil.c
	event_tagging.c
	# rtsig.c
	
	strlcpy.c
)

IF(WIN32)
	SET(libevent_sources 
		${libevent_sources} 
		WIN32-Code/win32.c
		libevent.def
	)
	INCLUDE_DIRECTORIES(WIN32-Code/)
ENDIF(WIN32)

IF(HAVE_SELECT)
	SET(libevent_sources 
		${libevent_sources} 
		select.c
		signal.c
	)
ENDIF(HAVE_SELECT)

IF(HAVE_POLL)
	SET(libevent_sources 
		${libevent_sources} 
		poll.c
	)
ENDIF(HAVE_POLL)

IF(HAVE_EPOLL)
	SET(libevent_sources 
		${libevent_sources} 
		epoll.c
        epoll_sub.c
	)
ENDIF(HAVE_EPOLL)

IF(HAVE_SYS_DEVPOLL_H)
	SET(libevent_sources 
		${libevent_sources} 
		devpoll.c
	)
ENDIF(HAVE_SYS_DEVPOLL_H)

IF(HAVE_PORT_H)
	SET(libevent_sources 
		${libevent_sources} 
		evport.c
	)
ENDIF(HAVE_PORT_H)

IF(HAVE_KQUEUE_H)
	SET(libevent_sources 
		${libevent_sources} 
		kqueue.c
	)
ENDIF(HAVE_KQUEUE_H)

ADD_LIBRARY(event SHARED
	${libevent_sources}
)

IF(WIN32)
	## winsock2 
	TARGET_LINK_LIBRARIES(event ws2_32)
ENDIF(WIN32)

INSTALL(TARGETS event 
	RUNTIME DESTINATION bin
	ARCHIVE DESTINATION lib
	LIBRARY DESTINATION lib
)

INSTALL(FILES
		event-config.h
		event.h
		evutil.h
		evhttp.h
	DESTINATION
		include/
	)
