#
# Cmake instructions file
#
cmake_minimum_required(VERSION 3.1)
include(CheckSymbolExists)
include(CheckIncludeFiles)
include(CheckCSourceCompiles)
include(CheckStructHasMember)
include(CheckFunctionExists)
include(CheckCCompilerFlag)
include(CheckCSourceRuns)
project(libmicrohttpd LANGUAGES C VERSION 0.9.55)
set(ENABLE_BAUTH yes CACHE BOOL "Enable basic Auth support")
set(ENABLE_DAUTH yes CACHE BOOL "Enable digest Auth support")
set(ENABLE_EPOLL yes CACHE BOOL "Enable epoll")
set(ENABLE_POLL yes CACHE BOOL "Enable poll")
set(ENABLE_ERROR_MSGS yes CACHE BOOL "Enable support for error messages")
set(ENABLE_POSTPROCESSOR yes CACHE BOOL "Enable postprocessor support")
set(ENABLE_HTTPS yes CACHE BOOL "Enable HTTPS support")
set(DISABLE_THREAD_NAMES no CACHE BOOL "Disable setting name on generated threads")
set(ENABLE_UPGRADE yes CACHE BOOL "Enable Upgrade support")
set(MHD_ITC auto CACHE STRING "For inter process communication choose one of pipe, socketpair, eventfd, auto")
macro(FindNSS)
# - Try to find the NSS library
# Once done this will define
#
# NSS_FOUND - system has mozilla-nss lib
# NSS_INCLUDE_DIRS - the mozilla-nss include directories
# NSS_LDFLAGS - Link these to use mozilla-nss
# NSS_CFLAGS_OTHER - Compiler switches required for using NSS
#
# Copyright (c) 2006, Laurent Montel,
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(NSS_INCLUDE_DIRS AND NSS_LDFLAGS)
# in cache already
SET(NSS_FOUND TRUE)
else()
if(NOT WIN32)
find_package(PkgConfig)
pkg_search_module(NSS nss)
endif(NOT WIN32)
if (NSS_FOUND)
if (NOT Nss_FIND_QUIETLY)
message(STATUS "Found NSS: ${NSS_LDFLAGS}")
endif (NOT Nss_FIND_QUIETLY)
else (NSS_FOUND)
if (Nss_FIND_REQUIRED)
message(FATAL_ERROR "Could NOT find NSS")
endif (Nss_FIND_REQUIRED)
endif (NSS_FOUND)
mark_as_advanced(NSS_INCLUDE_DIRS NSS_LDFLAGS NSS_CFLAGS_OTHER NSS_VERSION)
endif()
endmacro()
macro(FindLibGCrypt)
# - Try to find the libgcrypt library
# Once done this will define
#
# LIBGCRYPT_FOUND - system has libgcrypt
# LIBGCRYPT_INCLUDE_DIR - the libgcrypt include directory
# LIBGCRYPT_LIBRARIES - Link these to use libgcrypt
# Copyright (c) 2010 Joris Guisson
# Copyright (c) 2007 Charles Connell (This was based upon FindKopete.cmake)
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(LIBGCRYPT_INCLUDE_DIR AND LIBGCRYPT_LIBRARIES)
# read from cache
set(LIBGCRYPT_FOUND TRUE)
else(LIBGCRYPT_INCLUDE_DIR AND LIBGCRYPT_LIBRARIES)
FIND_PATH(LIBGCRYPT_INCLUDE_DIR
NAMES
gcrypt.h
PATHS
${KDE4_INCLUDE_DIR}
${INCLUDE_INSTALL_DIR}
PATH_SUFFIXES
libgcrypt
)
FIND_LIBRARY(LIBGCRYPT_LIBRARIES
NAMES
gcrypt
PATHS
${KDE4_LIB_DIR}
${LIB_INSTALL_DIR}
)
if(LIBGCRYPT_INCLUDE_DIR AND LIBGCRYPT_LIBRARIES)
set(LIBGCRYPT_FOUND TRUE)
endif(LIBGCRYPT_INCLUDE_DIR AND LIBGCRYPT_LIBRARIES)
if(MSVC)
FIND_LIBRARY(LIBGCRYPT_LIBRARIES_DEBUG
NAMES
gcryptd
PATHS
${KDE4_LIB_DIR}
${LIB_INSTALL_DIR}
)
if(NOT LIBGCRYPT_LIBRARIES_DEBUG)
set(LIBGCRYPT_FOUND FALSE)
endif(NOT LIBGCRYPT_LIBRARIES_DEBUG)
if(MSVC_IDE)
if( NOT LIBGCRYPT_LIBRARIES_DEBUG OR NOT LIBGCRYPT_LIBRARIES)
message(FATAL_ERROR "\nCould NOT find the debug AND release version of the libgcrypt library.\nYou need to have both to use MSVC projects.\nPlease build and install both libgcrypt libraries first.\n")
endif( NOT LIBGCRYPT_LIBRARIES_DEBUG OR NOT LIBGCRYPT_LIBRARIES)
else(MSVC_IDE)
string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER)
if(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARIES_DEBUG})
else(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARIES})
endif(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug)
endif(MSVC_IDE)
endif(MSVC)
if(LIBGCRYPT_FOUND)
if(NOT LIBGCRYPT_FIND_QUIETLY)
message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES} ")
endif(NOT LIBGCRYPT_FIND_QUIETLY)
else(LIBGCRYPT_FOUND)
if(LIBGCRYPT_FIND_REQUIRED)
if(NOT LIBGCRYPT_INCLUDE_DIR)
message(FATAL_ERROR "Could not find libgcrypt includes.")
endif(NOT LIBGCRYPT_INCLUDE_DIR)
if(NOT LIBGCRYPT_LIBRARIES)
message(FATAL_ERROR "Could not find libgcrypt library.")
endif(NOT LIBGCRYPT_LIBRARIES)
else(LIBGCRYPT_FIND_REQUIRED)
if(NOT LIBGCRYPT_INCLUDE_DIR)
message(STATUS "Could not find libgcrypt includes.")
endif(NOT LIBGCRYPT_INCLUDE_DIR)
if(NOT LIBGCRYPT_LIBRARIES)
message(STATUS "Could not find libgcrypt library.")
endif(NOT LIBGCRYPT_LIBRARIES)
endif(LIBGCRYPT_FIND_REQUIRED)
endif(LIBGCRYPT_FOUND)
endif(LIBGCRYPT_INCLUDE_DIR AND LIBGCRYPT_LIBRARIES)
endmacro()
if ("FreeBSD" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_BSD_SOURCE)
set(FREEBSD 1)
elseif ("Linux" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
list(APPEND CMAKE_REQUIRED_LIBRARIES -lrt)
set(LINUX 1)
elseif ("NetBSD" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_NETBSD_SOURCE)
set(NETBSD 1)
elseif ("OpenBSD" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_BSD_SOURCE)
set(OPENBSD 1)
elseif ("Darwin" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_DARWIN_C_SOURCE)
set(OSX 1)
elseif ("SunOS" STREQUAL "${CMAKE_SYSTEM_NAME}")
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_REENTRANT)
set(SOLARIS 1)
elseif ("BSD/OS" STREQUAL "${CMAKE_SYSTEM_NAME}")
set(SOMEBSD 1)
elseif ("Windows" STREQUAL "${CMAKE_SYSTEM_NAME}")
set(WINDOWS 1)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_CRT_SECURE_NO_DEPRECATE)
list(APPEND CMAKE_REQUIRED_LIBRARIES Ws2_32.lib odbc32.lib odbccp32.lib)
else()
set(OTHEROS 1)
endif()
if (ENABLE_BAUTH)
set(BAUTH_SUPPORT 1)
endif()
if (ENABLE_DAUTH)
set(DAUTH_SUPPORT 1)
endif()
if (ENABLE_ERROR_MSGS)
set(HAVE_MESSAGES 1)
endif()
if (ENABLE_POSTPROCESSOR)
set(HAVE_POSTPROCESSOR 1)
endif()
if (ENABLE_UPGRADE)
set(UPGRADE_SUPPORT 1)
endif()
if (ENABLE_HTTPS)
set(HTTPS_SUPPORT 1)
set(MSG_HTTPS yes)
FindLibGCrypt()
include(FindGnuTLS)
set(HttpsMissingLibraries "")
if (NOT GNUTLS_FOUND)
list(APPEND HttpsMissingLibraries libgnutls)
endif()
if (NOT LIBGCRYPT_FOUND)
list(APPEND HttpsMissingLibraries libgcrypt)
endif()
if (NOT "" STREQUAL "${HttpsMissingLibraries}")
set(HTTPS_SUPPORT 0)
set(MSG_HTTPS "no (lacking ${HttpsMissingLibraries})")
endif()
else()
set(MSG_HTTPS "no (disabled)")
endif()
if (ENABLE_EPOLL)
set(MSG_EPOLL yes)
check_symbol_exists(epoll_create "sys/epoll.h" EPOLL_SUPPORT)
check_symbol_exists(epoll_create1 "sys/epoll.h" HAVE_EPOLL_CREATE1)
if (NOT EPOLL_SUPPORT)
set(MSG_EPOLL "no (platform does not support epoll)")
endif()
else()
set(MSG_EPOLL "no (disabled)")
endif()
if (ENABLE_POLL)
set(MSG_POLL yes)
if (WINDOWS)
check_c_source_compiles("
#include
int main(int argc, char** argv)
{
WSAPOLLFD fda[2];
WSAPoll(fda, 2, 0);
return 0;
}
" HAVE_POLL
)
else()
check_symbol_exists(poll "poll.h" HAVE_POLL)
check_include_files(poll.h HAVE_POLL_H)
endif()
if (NOT HAVE_POLL)
set(MSG_POLL "no (platform does not support poll)")
endif()
else()
set(MSG_POLL "no (disabled)")
endif()
if(APPLE AND CMAKE_OSX_ARCHITECTURES)
# I am not sure if this mean AC_APPLE_UNIVERSAL_BUILD
set (AC_APPLE_UNIVERSAL_BUILD 1)
endif()
check_function_exists(accept4 HAVE_ACCEPT4)
check_include_files(arpa/inet.h HAVE_ARPA_INET_H)
if (WINDOWS)
list(APPEND CMAKE_REQUIRED_FLAGS /WX)
endif()
check_c_source_compiles("
#define __STDC_WANT_LIB_EXT1__ 1
#include
int main(int argc, char** argv)
{
struct tm res;
time_t t;
gmtime_s (&t, &res);
return 0;
}
" HAVE_C11_GMTIME_S
)
if (NOT HAVE_C11_GMTIME_S)
check_c_source_compiles("
#include
int main(int argc, char** argv)
{
struct tm res;
time_t t;
gmtime_s (&res, &t);
return 0;
}
" HAVE_W32_GMTIME_S
)
endif()
if (WINDOWS)
list(REMOVE_ITEM CMAKE_REQUIRED_FLAGS /WX)
endif()
check_symbol_exists(calloc stdlib.h HAVE_CALLOC)
check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME)
check_symbol_exists(clock_get_time mach/clock.h;mach/mach.h MACH_clock_get_time)
check_symbol_exists(mach_port_deallocate mach/clock.h;mach/mach.h MACH_mach_port_deallocate)
check_symbol_exists(host_get_clock_service mach/clock.h;mach/mach.h MACH_host_get_clock_service)
if (MACH_clock_get_time AND MACH_mach_port_deallocate AND MACH_host_get_clock_service)
set(HAVE_CLOCK_GET_TIME 1)
endif()
check_symbol_exists(SOCK_NONBLOCK sys/socket.h HAVE_DECL_SOCK_NONBLOCK)
if (HAVE_DECL_SOCK_NONBLOCK)
set(HAVE_SOCK_NONBLOCK 1)
endif()
check_include_files(dlfcn.h HAVE_DLFCN_H)
check_include_files(endian.h HAVE_ENDIAN_H)
check_include_files(errno.h HAVE_ERRNO_H)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_symbol_exists(fork "unistd.h" HAVE_FORK)
check_symbol_exists(fseeko "stdio.h" HAVE_FSEEKO)
check_include_files(gcrypt.h HAVE_GCRYPT_H)
check_symbol_exists(gethrtime "sys/time.h" HAVE_GETHRTIME)
check_symbol_exists(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY)
check_symbol_exists(gmtime_r "sys/time.h" HAVE_GMTIME_R)
check_include_files(gnutls/gnutls.h HAVE_GNUTLS_GNUTLS_H)
check_include_files(inetLib.h HAVE_INETLIB_H)
check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(limits.h HAVE_LIMITS_H)
check_include_files(locale.h HAVE_LOCALE_H)
check_symbol_exists(lseek64 "sys/types.h;unistd.h" HAVE_LSEEK64)
check_include_files(machine/endian.h HAVE_MACHINE_ENDIAN_H)
check_include_files(machine/param.h HAVE_MACHINE_PARAM_H)
check_include_files(magic.h HAVE_MAGIC_H)
check_include_files(math.h HAVE_MATH_H)
check_symbol_exists(memmem "string.h" HAVE_MEMMEM)
check_include_files(memory.h HAVE_MEMORY_H)
check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP)
check_include_files(netdb.h HAVE_NETDB_H)
check_include_files(netinet/in.h HAVE_NETINET_IN_H)
check_include_files(netinet/ip.h HAVE_NETINET_IP_H)
check_include_files(netinet/tcp.h HAVE_NETINET_TCP_H)
check_include_files(net/if.h HAVE_NET_IF_H)
check_symbol_exists(pipe2 "fcntl.h;unistd.h" HAVE_PIPE2_FUNC)
check_symbol_exists(pipe "unistd.h" HAVE_PIPE_FUNC)
check_symbol_exists(socketpair "sys/socket.h" HAVE_SOCKETPAIR_FUNC)
check_symbol_exists(pread64 "unistd.h" HAVE_PREAD64)
check_include_files(pthread.h HAVE_PTHREAD_H)
check_include_files(pthread_np.h HAVE_PTHREAD_NP_H)
set(USE_THREADS "unknown threads")
if (HAVE_PTHREAD_H)
set(MHD_USE_POSIX_THREADS 1)
set(USE_THREADS posix)
else()
check_symbol_exists(CreateThread "Windows.h" MHD_USE_W32_THREADS)
if (MHD_USE_W32_THREADS)
set(USE_THREADS w32)
endif()
endif()
if (DISABLE_THREAD_NAMES)
set(MHD_NO_THREAD_NAMES 1)
set(MSG_THREAD_NAMES "no (disbaled)")
else()
set(MSG_THREAD_NAMES "yes")
endif()
if (NOT HAVE_PTHREAD_H AND NOT DISABLE_THREAD_NAMES)
set(MHD_NO_THREAD_NAMES 1)
set(MSG_THREAD_NAMES "no (not supported by platform)")
elseif (HAVE_PTHREAD_H AND NOT DISABLE_THREAD_NAMES)
set(old_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
if(HAVE_PTHREAD_NP_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_PTHREAD_NP_H)
endif()
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
pthread_attr_t thr_attr;
pthread_attr_init(&thr_attr);
pthread_attr_setname_np(&thr_attr, \"name\", 0);
pthread_attr_destroy(&thr_attr);
return 0;
}
" HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD
)
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
pthread_attr_t thr_attr;
pthread_attr_init(&thr_attr);
pthread_attr_setname_np(&thr_attr, \"name\");
pthread_attr_destroy(&thr_attr);
return 0;
}
" HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI
)
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
int res = pthread_setname_np(pthread_self(), \"name\", 0);
return 0;
}
" HAVE_PTHREAD_SETNAME_NP_NETBSD
)
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
int res = pthread_setname_np(pthread_self(), \"name\");
return 0;
}
" HAVE_PTHREAD_SETNAME_NP_GNU
)
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
int res = pthread_setname_np(\"name\");
return 0;
}
" HAVE_PTHREAD_SETNAME_NP_DARWIN
)
check_c_source_compiles("
#include
#ifdef HAVE_PTHREAD_NP_H
#include
#endif
int main(int argc, char** argv)
{
pthread_set_name_np(pthread_self(), \"name\");
return 0;
}
" HAVE_PTHREAD_SET_NAME_NP_FREEBSD
)
if (NOT (HAVE_PTHREAD_ATTR_SETNAME_NP_NETBSD OR HAVE_PTHREAD_ATTR_SETNAME_NP_IBMI OR HAVE_PTHREAD_SETNAME_NP_GNU OR HAVE_PTHREAD_SET_NAME_NP_FREEBSD OR HAVE_PTHREAD_SETNAME_NP_DARWIN OR HAVE_PTHREAD_SETNAME_NP_NETBSD))
# thread names not supported by platform
set(MHD_NO_THREAD_NAMES 1)
set(MSG_THREAD_NAMES "no (not supported by platform)")
else()
set(MSG_THREAD_NAMES "yes")
endif()
set(CMAKE_REQUIRED_DEFINITIONS ${old_CMAKE_REQUIRED_DEFINITIONS})
endif()
check_c_source_compiles("
#include
int main(int argc, char** argv)
{
static int i = PTHREAD_PRIO_INHERIT;
return 0;
}
" HAVE_PTHREAD_PRIO_INHERIT)
check_symbol_exists(rand "stdlib.h" HAVE_RAND)
check_function_exists(random HAVE_RANDOM)
check_symbol_exists(tsearch "search.h" HAVE_TSEARCH)
check_symbol_exists(tfind "search.h" HAVE_tfind)
check_symbol_exists(tdelete "search.h" HAVE_tdelete)
if (HAVE_TSEARCH AND HAVE_tfind AND HAVE_tdelete)
set(HAVE_SEARCH_H 1)
endif()
check_symbol_exists(sendfile64 "sys/sendfile.h" HAVE_SENDFILE64)
check_symbol_exists(snprintf "stdio.h" HAVE_SNPRINTF)
check_struct_has_member("struct sockaddr_in" sin_len netinet/in.h HAVE_SOCKADDR_IN_SIN_LEN)
check_include_files(sockLib.h HAVE_SOCKLIB_H)
check_c_source_compiles("
#include
int main(int argc, char** argv)
{
static bool b;
return 0;
}
" HAVE_STDBOOL_H)
if (NOT HAVE_STDBOOL_H)
set(bool "int")
set(false "(0)")
set(true "(!0)")
else()
set(HAVE_REAL_BOOL 1)
endif()
check_include_files(stddef.h HAVE_STDDEF_H)
check_include_files(stdint.h HAVE_STDINT_H)
check_include_files(stdio.h HAVE_STDIO_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/byteorder.h HAVE_SYS_BYTEORDER_H)
check_include_files(sys/endian.h HAVE_SYS_ENDIAN_H)
check_include_files(sys/eventfd.h HAVE_SYS_EVENTFD_H)
check_symbol_exists(eventfd "sys/eventfd.h" HAVE_EVENTFD_FUNCTION)
check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H)
check_include_files(sys/isa_defs.h HAVE_SYS_ISA_DEFS_H)
check_include_files(sys/machine.h HAVE_SYS_MACHINE_H)
check_include_files(sys/mman.h HAVE_SYS_MMAN_H)
check_include_files(sys/msg.h HAVE_SYS_MSG_H)
check_include_files(sys/param.h HAVE_SYS_PARAM_H)
check_include_files(sys/select.h HAVE_SYS_SELECT_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(time.h HAVE_TIME_H)
check_include_files(sys/types.h HAVE_SYS_TYPES_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_symbol_exists(usleep "unistd.h" HAVE_USLEEP)
check_symbol_exists(waitpid "sys/wait.h" HAVE_WAITPID)
check_include_files(winsock2.h HAVE_WINSOCK2_H)
check_include_files(ws2tcpip.h HAVE_WS2TCPIP_H)
check_c_compiler_flag(-Werror=attributes HAVE_OPTION_ERROR_ON_ATTRIBUTES)
set(PossibleInlines "")
if (HAVE_OPTION_ERROR_ON_ATTRIBUTES)
list(APPEND PossibleInlines "inline __attribute__((always_inline))")
endif()
list(APPEND PossibleInlines __forceinline inline __inline__ __inline _inline _Inline)
foreach(PossibleInline ${PossibleInlines})
check_c_source_compiles("
static ${PossibleInline} int sumfn(int x, int y)
{ return x + y; }
int main(int argc, char** argv)
{
int i = sumfn(1,2);
return 0;
}"
HAVE_INLINE)
if (HAVE_INLINE)
set(INLINE_FUNC 1)
set(_MHD_inline "static ${PossibleInline}")
break()
endif()
endforeach()
check_c_compiler_flag(-fvisibility=hidden HAVE_OPTION_VISIBILITY)
if(HAVE_OPTION_VISIBILITY AND CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.2")
set(_MHD_EXTERN "__attribute__((visibility(\"default\"))) extern")
elseif(WINDOWS)
set(_MHD_EXTERN "__declspec(dllexport) extern")
endif()
include(FindCURL)
if (CURL_FOUND)
set(MSG_CURL "yes")
set(MHD_REQ_CURL_VERSION "${CURL_VERSION_STRING}")
include(FindOpenSSL)
set(MHD_REQ_CURL_OPENSSL_VERSION "${OPENSSL_VERSION}")
include(FindGnuTLS)
set(MHD_REQ_CURL_GNUTLS_VERSION "${GNUTLS_VERSION_STRING}")
FindNSS()
set(MHD_REQ_CURL_NSS_VERSION "${NSS_VERSION}")
set(HAVE_LIBCURL 1)
find_program(CURL_CONFIG curl-config)
if (CURL_CONFIG)
execute_process(COMMAND ${CURL_CONFIG} --features OUTPUT_VARIABLE cfs OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "\n\r?" ";" cfs "${cfs}")
foreach(cf ${cfs})
string(TOUPPER "${cf}" cf)
set(LIBCURL_FEATURE_${cf} 1)
endforeach()
endif()
else()
set(MSG_CURL "no, many unit tests will not run")
endif()
set(PACKAGE "\"${Name}\"")
set(PACKAGE_BUGREPORT "\"address@hidden"")
set(PACKAGE_NAME "\"GNU Libmicrohttpd\"")
set(PACKAGE_STRING "\"GNU Libmicrohttpd ${Version}\"")
set(PACKAGE_TARNAME "\"libmicrohttpd\"")
set(PACKAGE_URL "\"http://www.gnu.org/software/libmicrohttpd/\"")
set(PACKAGE_VERSION "\"${Version}\"")
set(VERSION "\"${Version}\"")
#
#/* Define to necessary symbol if this constant uses a non-standard name on
# your system. */
#/* #undef PTHREAD_CREATE_JOINABLE */
#
set(STDC_HEADERS 1)
set(AvailableInterPorcessCommunication "")
if (WINDOWS)
list(APPEND AvailableInterPorcessCommunication socketpair)
else()
if (HAVE_SYS_EVENTFD_H AND HAVE_EVENTFD_FUNCTION)
list(APPEND AvailableInterPorcessCommunication eventfd)
endif()
if (HAVE_PIPE2_FUNC OR HAVE_PIPE_FUNC)
list(APPEND AvailableInterPorcessCommunication pipe)
endif()
if (HAVE_SOCKETPAIR_FUNC)
list(APPEND AvailableInterPorcessCommunication socketpair)
endif()
endif()
if ("" STREQUAL "${AvailableInterPorcessCommunication}")
message(FATAL_ERROR "cannot find useable type of inter-thread communication")
endif()
if ("auto" STREQUAL "${MHD_ITC}")
list(GET AvailableInterPorcessCommunication 0 MHD_ITC)
else()
list(FIND AvailableInterPorcessCommunication "${MHD_ITC}" ITC_INDEX)
if (ITC_INDEX GREATER -1)
# it is already correctly set
else()
message(FATAL_ERROR "Requested ${MHD_ITC} inter-thread communication is not available (try auto). Available are [${AvailableInterPorcessCommunication}].")
endif()
endif()
if("pipe" STREQUAL "${MHD_ITC}")
set(_MHD_ITC_PIPE 1)
elseif("eventfd" STREQUAL "${MHD_ITC}")
set(_MHD_ITC_EVENTFD 1)
elseif("socketpair" STREQUAL "${MHD_ITC}")
set(_MHD_ITC_SOCKETPAIR 1)
else()
message(FATAL_ERROR "Cannot find useable type of inter-thread communication. Available are [${AvailableInterPorcessCommunication}].")
endif()
if (LINUX)
set(HAVE_LISTEN_SHUTDOWN 1)
elseif(CYGWIN OR MINGW OR WINDOWS)
set(HAVE_LISTEN_SHUTDOWN 0)
else()
# we must check it
set(old_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
if(HAVE_UNISTD_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_UNISTD_H)
endif()
if(HAVE_TIME_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_TIME_H)
endif()
if(HAVE_STRING_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STRING_H)
endif()
if(HAVE_SYS_TYPES_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
endif()
if(HAVE_SYS_SOCKET_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_SOCKET_H)
endif()
if(HAVE_NETINET_IN_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_NETINET_IN_H)
endif()
if(HAVE_SYS_SELECT_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_SELECT_H)
endif()
if(HAVE_NETINET_TCP_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_NETINET_TCP_H)
endif()
if(HAVE_GETTIMEOFDAY)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_GETTIMEOFDAY)
endif()
if(HAVE_NANOSLEEP)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_NANOSLEEP)
endif()
if(HAVE_USLEEP)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_USLEEP)
endif()
check_c_source_runs([=[
#include
#ifdef HAVE_UNISTD_H
# include
#endif
#ifdef HAVE_TIME_H
# include
#endif
#ifdef HAVE_STRING_H
# include
#endif
#if !defined(_WIN32) || defined(__CYGWIN__)
# ifdef HAVE_SYS_TYPES_H
# include
# endif
# ifdef HAVE_SYS_SOCKET_H
# include
# endif
# ifdef HAVE_NETINET_IN_H
# include
# endif
# ifdef HAVE_SYS_TIME_H
# include
# endif
# ifdef HAVE_SYS_SELECT_H
# include
# endif
# ifdef HAVE_NETINET_TCP_H
# include
# endif
typedef int MHD_socket;
# define MHD_INVALID_SOCKET (-1)
# define MHD_POSIX_SOCKETS 1
#else
# include
# include
# include
typedef SOCKET MHD_socket;
# define MHD_INVALID_SOCKET (INVALID_SOCKET)
# define MHD_WINSOCK_SOCKETS 1
#endif
#include
#ifndef SHUT_RD
# define SHUT_RD 0
#endif
#ifndef SHUT_WR
# define SHUT_WR 1
#endif
#ifndef SHUT_RDWR
# define SHUT_RDWR 2
#endif
#ifndef NULL
# define NULL ((void*)0)
#endif
#ifdef HAVE_GETTIMEOFDAY
# if defined(_WIN32) && !defined(__CYGWIN__)
# undef HAVE_GETTIMEOFDAY
# endif
#endif
#ifdef HAVE_NANOSLEEP
static const struct timespec sm_tmout = {0, 1000};
# define short_sleep() nanosleep(&sm_tmout, NULL)
#elif defined(HAVE_USLEEP)
# define short_sleep() usleep(1)
#else
# define short_sleep() (void)0
#endif
static volatile int going_select = 0;
static volatile int select_ends = 0;
static volatile int gerror = 0;
static int timeout_mils;
#ifndef HAVE_GETTIMEOFDAY
static volatile long long select_elapsed_time = 0;
static long long time_chk(void)
{
long long ret = time(NULL);
if (-1 == ret)
gerror = 4;
return ret;
}
#endif
static void* select_thrd_func(void* param)
{
#ifndef HAVE_GETTIMEOFDAY
long long start, stop;
#endif
fd_set rs;
struct timeval tmot = {0, 0};
MHD_socket fd = *((MHD_socket*)param);
FD_ZERO(&rs);
FD_SET(fd, &rs);
tmot.tv_usec = timeout_mils * 1000;
#ifndef HAVE_GETTIMEOFDAY
start = time_chk();
#endif
going_select = 1;
if (0 > select ((int)(fd) + 1, &rs, NULL, NULL, &tmot))
gerror = 5;
#ifndef HAVE_GETTIMEOFDAY
stop = time_chk();
select_elapsed_time = stop - start;
#endif
select_ends = 1;
return NULL;
}
static MHD_socket create_socket(void)
{ return socket (AF_INET, SOCK_STREAM, 0); }
static void close_socket(MHD_socket fd)
{
#ifdef MHD_POSIX_SOCKETS
close(fd);
#else
closesocket(fd);
#endif
}
static MHD_socket
create_socket_listen(int port)
{
MHD_socket fd;
struct sockaddr_in sock_addr;
fd = create_socket();
if (MHD_INVALID_SOCKET == fd)
return fd;
memset (&sock_addr, 0, sizeof (struct sockaddr_in));
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(port);
sock_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (bind (fd, (const struct sockaddr*) &sock_addr, sizeof(sock_addr)) < 0 ||
listen(fd, SOMAXCONN) < 0)
{
close_socket(fd);
return MHD_INVALID_SOCKET;
}
return fd;
}
#ifdef HAVE_GETTIMEOFDAY
#define diff_time(tv1, tv2) ((long long)(tv1.tv_sec-tv2.tv_sec)*10000 + (long long)(tv1.tv_usec-tv2.tv_usec)/100)
#else
#define diff_time(tv1, tv2) ((long long)(tv1-tv2))
#endif
static long long test_run_select(int timeout_millsec, int use_shutdown, long long delay_before_shutdown)
{
pthread_t select_thrd;
MHD_socket fd;
#ifdef HAVE_GETTIMEOFDAY
struct timeval start, stop;
#else
long long start;
#endif
fd = create_socket_listen(0);
if (MHD_INVALID_SOCKET == fd)
return -7;
going_select = 0;
select_ends = 0;
gerror = 0;
timeout_mils = timeout_millsec;
if (0 != pthread_create (&select_thrd, NULL, select_thrd_func, (void*)&fd))
return -8;
while (!going_select) {short_sleep();}
#ifdef HAVE_GETTIMEOFDAY
gettimeofday (&start, NULL);
#else
start = time_chk();
#endif
if (use_shutdown)
{
#ifdef HAVE_GETTIMEOFDAY
struct timeval current;
do {short_sleep(); gettimeofday(¤t, NULL); } while (delay_before_shutdown > diff_time(current, start));
#else
while (delay_before_shutdown > time_chk() - start) {short_sleep();}
#endif
shutdown(fd, SHUT_RDWR);
}
#ifdef HAVE_GETTIMEOFDAY
while (!select_ends) {short_sleep();}
gettimeofday (&stop, NULL);
#endif
if (0 != pthread_join(select_thrd, NULL))
return -9;
close_socket(fd);
if (gerror)
return -10;
#ifdef HAVE_GETTIMEOFDAY
return (long long)diff_time(stop, start);
#else
return select_elapsed_time;
#endif
}
static int test_it(void)
{
long long duration2;
#ifdef HAVE_GETTIMEOFDAY
long long duration0, duration1;
duration0 = test_run_select(0, 0, 0);
if (0 > duration0)
return -duration0;
duration1 = test_run_select(50, 0, 0);
if (0 > duration1)
return -duration1 + 20;
duration2 = test_run_select(500, 1, (duration0 + duration1) / 2);
if (0 > duration2)
return -duration2 + 40;
if (duration1 * 2 > duration2)
{ /* Check second time to be sure. */
duration2 = test_run_select(500, 1, (duration0 + duration1) / 2);
if (0 > duration2)
return -duration2 + 60;
if (duration1 * 2 > duration2)
return 0;
}
#else
duration2 = test_run_select(5000, 1, 2);
if (0 > duration2)
return -duration2 + 80;
if (4 > duration2)
{ /* Check second time to be sure. */
duration2 = test_run_select(5000, 1, 2);
if (0 > duration2)
return -duration2 + 100;
if (4 > duration2)
return 0;
}
#endif
return 1;
}
static int init(void)
{
#ifdef MHD_WINSOCK_SOCKETS
WSADATA wsa_data;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsa_data) || MAKEWORD(2, 2) != wsa_data.wVersion)
{
WSACleanup();
return 0;
}
#endif /* MHD_WINSOCK_SOCKETS */
return 1;
}
static void cleanup(void)
{
#ifdef MHD_WINSOCK_SOCKETS
WSACleanup();
#endif /* MHD_WINSOCK_SOCKETS */
}
int main(void)
{
int res;
if (!init())
return 19;
res = test_it();
cleanup();
if (gerror)
return gerror;
return res;
}
]=] HAVE_LISTEN_SHUTDOWN)
set(CMAKE_REQUIRED_DEFINITIONS ${old_CMAKE_REQUIRED_DEFINITIONS})
endif()
if (HAVE_LISTEN_SHUTDOWN)
set(MSG_LISTEN_SHUTDOWN yes)
else()
set(MSG_LISTEN_SHUTDOWN no)
endif()
set(old_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
if(HAVE_NETINET_IN_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_NETINET_IN_H)
endif()
if(HAVE_SYS_SOCKET_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_SOCKET_H)
endif()
if(HAVE_WINSOCK2_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_WINSOCK2_H)
endif()
if(HAVE_WS2TCPIP_H)
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_WS2TCPIP_H)
endif()
check_c_source_compiles("
#include
#if HAVE_NETINET_IN_H
#include
#endif
#if HAVE_SYS_SOCKET_H
#include
#endif
#if HAVE_WINSOCK2_H
#include
#endif
#if HAVE_WS2TCPIP_H
#include
#endif
int main(int argc, char** argv)
{
int af=AF_INET6;
int pf=PF_INET6;
struct sockaddr_in6 sa;
printf(\"%d %d %p\\\\n\", af, pf, &sa);
return 0;
}
" HAVE_INET6
)
if (WINDOWS)
macro(get_WIN32_WINNT version)
if (CMAKE_SYSTEM_VERSION)
set(ver ${CMAKE_SYSTEM_VERSION})
string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver})
string(REGEX MATCH "^([0-9]+)" verMajor ${ver})
# Check for Windows 10, b/c we'll need to convert to hex 'A'.
if ("${verMajor}" MATCHES "10")
set(verMajor "A")
string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver})
endif ("${verMajor}" MATCHES "10")
# Remove all remaining '.' characters.
string(REPLACE "." "" ver ${ver})
# Prepend each digit with a zero.
string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver})
set(${version} "0x${ver}")
endif(CMAKE_SYSTEM_VERSION)
endmacro(get_WIN32_WINNT)
get_WIN32_WINNT(_WIN32_WINNT)
# fixing wrong conditionals in code that check system version instead of compiler version.
# E.g. It is not possible to compile with MSVC 2005 on Windows 7.
if (${MSVC_VERSION} LESS 1500)
set(_WIN32_WINNT 0x501)
endif()
endif()
set(CMAKE_REQUIRED_DEFINITIONS ${old_CMAKE_REQUIRED_DEFINITIONS})
configure_file(MHD_config_cmake.h.in MHD_config.h)
if(NOT HAVE_SEARCH_H)
set(PlatformSpecificSources
src/microhttpd/tsearch.c
)
endif()
add_library(microhttpd
src/microhttpd/connection.c
src/microhttpd/reason_phrase.c
src/microhttpd/daemon.c
src/microhttpd/internal.c
src/microhttpd/memorypool.c
src/microhttpd/mhd_mono_clock.c
src/microhttpd/sysfdsetsize.c
src/microhttpd/mhd_str.c
src/microhttpd/mhd_threads.c
src/microhttpd/mhd_sockets.c
src/microhttpd/mhd_itc.c
src/microhttpd/mhd_compat.c
src/microhttpd/response.c
${PlatformSpecificSources}
)
target_include_directories(microhttpd PRIVATE src/microhttpd src/include ${CMAKE_BINARY_DIR})
target_compile_definitions(microhttpd PRIVATE ${CMAKE_REQUIRED_DEFINITIONS})
target_link_libraries(microhttpd PRIVATE ${CMAKE_REQUIRED_LIBRARIES})
if (HAVE_OPTION_VISIBILITY)
target_compile_options(microhttpd PRIVATE -fvisibility=hidden)
endif()
if (CMAKE_CROSSCOMPILING)
set(MSG_CROSSCOMPILING yes)
else()
set(MSG_CROSSCOMPILING no)
endif()
message(
"libmicrohttpd ${PACKAGE_VERSION} Configuration Summary:
Cross-compiling: ${MSG_CROSSCOMPILING}
Operating System: ${CMAKE_SYSTEM_NAME}
Threading lib: ${USE_THREADS}
Use thread names: ${MSG_THREAD_NAMES}
Inter-thread comm: ${MHD_ITC}
libcurl (testing): ${MSG_CURL}
Target directory: ${CMAKE_INSTALL_PREFIX}
Shutdown of listening socket
trigger select: ${MSG_LISTEN_SHUTDOWN}
Messages: ${ENABLE_ERROR_MSGS}
Basic auth.: ${ENABLE_BAUTH}
Digest auth.: ${ENABLE_DAUTH}
HTTP \"Upgrade\": ${ENABLE_UPGRADE}
Postproc: ${ENABLE_POSTPROCESSOR}
HTTPS support: ${MSG_HTTPS}
poll support: ${MSG_POLL}
epoll support: ${MSG_EPOLL}
build docs: no
build examples: no"
)