set(CMAKE_REQUIRED_QUIET 1)

# Check headers
check_include_file(sys/param.h    HAVE_SYS_PARAM_H)
check_include_file(sys/termios.h  HAVE_SYS_TERMIOS_H)
check_include_file(sys/socket.h   HAVE_SYS_SOCKET_H)
check_include_file(sys/ioctl.h    HAVE_SYS_IOCTL_H)
check_include_file(sys/resource.h HAVE_SYS_RESOURCE_H)
check_include_file(sys/time.h HAVE_SYS_TIME_H)
check_include_file(ctype.h        HAVE_CTYPE_H)
check_include_file(stdio.h        HAVE_STDIO_H)
check_include_file(stdarg.h       HAVE_STDARG_H)
check_include_file(dirent.h       HAVE_DIRENT_H)
check_include_file(time.h         HAVE_TIME_H)
check_include_file(signal.h       HAVE_SIGNAL_H)
check_include_file(netdb.h        HAVE_NETDB_H)
check_include_file(arpa/inet.h    HAVE_ARPA_INET_H)
check_include_file(netinet/tcp.h  HAVE_NETINET_TCP_H)
check_include_file(netinet/in.h   HAVE_NETINET_IN_H)
check_include_file(arpa/inet.h    HAVE_ARPA_INET_H)
check_include_file(pthread.h      HAVE_PTHREAD_H)
check_include_file(stdbool.h      HAVE_STDBOOL_H)
check_include_file(regex.h        HAVE_REGEX_H)
check_include_file(string.h       HAVE_STRING_H)
check_include_file(unistd.h       HAVE_UNISTD_H)
check_include_file(limits.h       HAVE_LIMITS_H)
check_include_file(stdlib.h       HAVE_STDLIB_H)
check_include_file(errno.h        HAVE_ERRNO_H)
check_include_file(locale.h       HAVE_LOCALE_H)

# Check functions
check_function_exists(bzero HAVE_BZERO)
check_function_exists(_doprnt HAVE_DOPRNT)
check_function_exists(dup2 HAVE_DUP2)
check_function_exists(fork HAVE_FORK)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(malloc HAVE_MALLOC)
check_function_exists(memset HAVE_MEMSET)
check_function_exists(realloc HAVE_REALLOC)
check_function_exists(setenv HAVE_SETENV)
check_function_exists(setlocale HAVE_SETLOCALE)
check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(strchr HAVE_STRCHR)
check_function_exists(strdup HAVE_STRDUP)
check_function_exists(strftime HAVE_STRFTIME)
check_function_exists(strncasecmp HAVE_STRNCASECMP)
check_function_exists(strrchr HAVE_STRRCHR)
check_function_exists(strstr HAVE_STRSTR)
check_function_exists(strtol HAVE_STRTOL)
check_function_exists(strtold HAVE_STRTOLD)
check_function_exists(system HAVE_SYSTEM)
check_function_exists(vfork HAVE_VFORK)
check_function_exists(vprintf HAVE_VPRINTF)

# Check types
check_type_size(uid_t UID_T LANGUAGE C)
check_type_size(int16_t INT16_T LANGUAGE C)
check_type_size(int32_t INT32_T LANGUAGE C)
check_type_size(int64_t INT64_T LANGUAGE C)

set(SIZEOF_INT16_T ${INT16_T})
set(SIZEOF_INT32_T ${INT32_T})
set(SIZEOF_INT64_T ${INT64_T})

check_type_size(int8_t INT8_T LANGUAGE C)
check_type_size(mode_t MODE_T LANGUAGE C)
check_type_size(off_t OFF_T LANGUAGE C)
check_type_size(pid_t PID_T LANGUAGE C)
check_type_size(size_t SIZE_T LANGUAGE C)
check_type_size(ssize_t SSIZE_T LANGUAGE C)
check_type_size(uint16_t UINT16_T LANGUAGE C)
check_type_size(uint32_t UINT32_T LANGUAGE C)
check_type_size(uint64_t UINT64_T LANGUAGE C)
check_type_size(uint8_t UINT8_T LANGUAGE C)
check_type_size(ptrdiff_t PTRDIFF_T LANGUAGE C)
check_type_size(float FLOAT LANGUAGE C)
set(SIZEOF_FLOAT ${FLOAT})
check_type_size(double DOUBLE LANGUAGE C)
set(SIZEOF_DOUBLE ${DOUBLE})
check_type_size("long double" LONG_DOUBLE LANGUAGE C)
set(SIZEOF_LONG_DOUBLE ${LONG_DOUBLE})
check_type_size("unsigned char" UNSIGNED_CHAR LANGUAGE C)
set(SIZEOF_UNSIGNED_CHAR ${UNSIGNED_CHAR})
check_type_size("unsigned short" UNSIGNED_SHORT LANGUAGE C)
set(SIZEOF_UNSIGNED_SHORT ${UNSIGNED_SHORT})
check_type_size("unsigned int" UNSIGNED_INT LANGUAGE C)
set(SIZEOF_UNSIGNED_INT ${UNSIGNED_INT})
check_type_size("unsigned long" UNSIGNED_LONG LANGUAGE C)
set(SIZEOF_UNSIGNED_LONG ${UNSIGNED_LONG})
check_type_size("unsigned long long" UNSIGNED_LONG_LONG LANGUAGE C)
set(SIZEOF_UNSIGNED_LONG_LONG ${UNSIGNED_LONG_LONG})
set(CMAKE_EXTRA_INCLUDE_FILES_BACKUP ${CMAKE_EXTRA_INCLUDE_FILES})

if(HAVE_STDBOOL_H)
    set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} stdbool.h)
    check_type_size("bool" BOOL LANGUAGE C)
    set(SIZEOF__BOOL ${BOOL})
    set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES_BACKUP})
endif()

check_type_size("(long int) (sizeof (void *))" VOID_P LANGUAGE C)
set(SIZEOF_VOID_P ${VOID_P})
SET(SIZEOF_VOID_P  "${SIZEOF_VOID_P}" CACHE INTERNAL "SIZEOF_VOID_P")

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