CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Modbus)

INCLUDE(CheckIncludeFiles)
INCLUDE(CheckFunctionExists)

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

CHECK_INCLUDE_FILES( arpa/inet.h HAVE_ARPA_INET_H )
CHECK_INCLUDE_FILES( dlfcn.h HAVE_DLFCN_H )
CHECK_INCLUDE_FILES( errno.h HAVE_ERRNO_H )
CHECK_INCLUDE_FILES( fcntl.h HAVE_FCNTL_H )
CHECK_INCLUDE_FILES( inttypes.h HAVE_INTTYPES_H )
CHECK_INCLUDE_FILES( limits.h HAVE_LIMITS_H )
CHECK_INCLUDE_FILES( memory.h HAVE_MEMORY_H )
CHECK_INCLUDE_FILES( netinet/in.h HAVE_NETINET_IN_H )
CHECK_INCLUDE_FILES( netinet/tcp.h HAVE_NETINET_TCP_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/ioctl.h HAVE_SYS_IOCTL_H )
CHECK_INCLUDE_FILES( sys/socket.h HAVE_SYS_SOCKET_H )
CHECK_INCLUDE_FILES( sys/stat.h HAVE_SYS_STAT_H )
CHECK_INCLUDE_FILES( sys/time.h HAVE_SYS_TIME_H )
CHECK_INCLUDE_FILES( sys/types.h HAVE_SYS_TYPES_H )
CHECK_INCLUDE_FILES( termios.h HAVE_TERMIOS_H )
CHECK_INCLUDE_FILES( unistd.h HAVE_UNISTD_H )
CHECK_INCLUDE_FILES( vfork.h HAVE_VFORK_H )

CHECK_FUNCTION_EXISTS( fork HAVE_FORK )
CHECK_FUNCTION_EXISTS( gettimeofday HAVE_GETTIMEOFDAY )
CHECK_FUNCTION_EXISTS( inet_ntoa HAVE_INET_NTOA )
CHECK_FUNCTION_EXISTS( memset HAVE_MEMSET )
CHECK_FUNCTION_EXISTS( select HAVE_SELECT )
CHECK_FUNCTION_EXISTS( socket HAVE_SOCKET )
CHECK_FUNCTION_EXISTS( strerror HAVE_STRERROR )
CHECK_FUNCTION_EXISTS( strlcpy HAVE_STRLCPY )
CHECK_FUNCTION_EXISTS( vfork HAVE_VFORK )

IF(UNIX)
	# Assume, that we have working fork on Unix
	SET(HAVE_WORKING_FORK 1)
	# Assume, that we have working vfork on Unix
	SET(HAVE_WORKING_VFORK 1)
	# Assume, that we have ANSI C header files
	SET(STDC_HEADERS 1)
	# Assume, can safely include both <sys/time.h> and <time.h>
	SET(TIME_WITH_SYS_TIME 1)
ENDIF()

IF(WIN32)
	# Assume, that we have ANSI C header files
	SET(STDC_HEADERS 1)
ENDIF()

SET(PACKAGE           "libmodbus")
SET(PACKAGE_BUGREPORT "stephane.raimbault@gmail.com")
SET(PACKAGE_NAME      "libmodbus")
SET(PACKAGE_STRING    "libmodbus 2.9.3")
SET(PACKAGE_TARNAME   "libmodbus")
SET(PACKAGE_VERSION   "2.9.3")

SET(LIBMODBUS_VERSION_MAJOR "2")
SET(LIBMODBUS_VERSION_MINOR "9")
SET(LIBMODBUS_VERSION_MICRO "3")
SET(LIBMODBUS_VERSION       "2.9.3")

CONFIGURE_FILE(
	${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake 
	${CMAKE_CURRENT_BINARY_DIR}/config.h)

CONFIGURE_FILE(
	${CMAKE_CURRENT_SOURCE_DIR}/src/modbus-version.h.cmake
	${CMAKE_CURRENT_BINARY_DIR}/src/modbus-version.h)

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

SET(libmodbus_SRCS
	src/modbus.c
	src/modbus.h
	src/modbus-data.c
	src/modbus-private.h
	src/modbus-rtu.c
	src/modbus-rtu.h
	src/modbus-rtu-private.h
	src/modbus-tcp.c
	src/modbus-tcp.h
	src/modbus-tcp-private.h
	src/modbus-version.h
)

INCLUDE_DIRECTORIES(.) # for config.h

IF(UNIX)
	ADD_DEFINITIONS(-fPIC)
	SET(libmodbus_LIBS "")
ENDIF()
IF(WIN32)
	ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
	SET(libmodbus_LIBS "ws2_32")
ENDIF()

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

ADD_LIBRARY(modbus STATIC ${libmodbus_SRCS})

SET_TARGET_PROPERTIES(modbus PROPERTIES VERSION 4.2.0 SOVERSION 4)

TARGET_LINK_LIBRARIES(modbus ${libmodbus_LIBS})
