From: yuangongji Date: Mon, 16 Mar 2020 12:11:06 +0000 (+0800) Subject: cmake: fix getaddrinfo checking error X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=503ba1d36571e3cb01826d15dc462b7d8b5094de;p=libevent cmake: fix getaddrinfo checking error Using `CheckFunctionExists` on Windows to check `getaddrinfo` will get `not found`, but it actually exists. Using `CheckSymbolExists` with headers will get correct results. Other functions such as `getnameinfo`,`inet_ntop`,etc. have the same issue. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 36094d20..7dc45fd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,7 @@ include(CheckIncludeFile) include(CheckIncludeFiles) include(CheckVariableExists) include(CheckSymbolExists) +include(CheckSymbolsExist) include(CheckStructHasMember) include(CheckCSourceCompiles) include(CheckPrototypeDefinition) @@ -338,7 +339,7 @@ endif() if(WIN32) set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h ws2tcpip.h) set(CMAKE_REQUIRED_LIBRARIES ws2_32.lib shell32.lib advapi32.lib) - set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h) + set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h -D_WIN32_WINNT=0x0600) endif() if (SOLARIS) set(CMAKE_REQUIRED_LIBRARIES socket nsl) @@ -450,6 +451,24 @@ endif() CHECK_INCLUDE_FILE(sys/timerfd.h EVENT__HAVE_SYS_TIMERFD_H) CHECK_INCLUDE_FILE(errno.h EVENT__HAVE_ERRNO_H) +if (WIN32) + list(APPEND CHECK_SYMBOL_HEADERS winsock2.h ws2tcpip.h) +endif() +list(APPEND SYMBOLS_TO_CHECK + getaddrinfo + getnameinfo + getprotobynumber + inet_ntop + inet_pton + strtoll + timerclear + timercmp + timerisset + putenv +) +CHECK_SYMBOLS_EXIST("${SYMBOLS_TO_CHECK}" "${CHECK_SYMBOL_HEADERS}" "EVENT") +unset(CHECK_SYMBOL_HEADERS) +unset(SYMBOLS_TO_CHECK) CHECK_FUNCTION_EXISTS(epoll_create EVENT__HAVE_EPOLL) CHECK_FUNCTION_EXISTS(epoll_ctl EVENT__HAVE_EPOLL_CTL) @@ -458,13 +477,7 @@ if(NOT EVENT__DISABLE_CLOCK_GETTIME) CHECK_FUNCTION_EXISTS(clock_gettime EVENT__HAVE_CLOCK_GETTIME) endif() CHECK_FUNCTION_EXISTS(fcntl EVENT__HAVE_FCNTL) -CHECK_FUNCTION_EXISTS(getaddrinfo EVENT__HAVE_GETADDRINFO) -CHECK_FUNCTION_EXISTS(getnameinfo EVENT__HAVE_GETNAMEINFO) CHECK_FUNCTION_EXISTS(gettimeofday EVENT__HAVE_GETTIMEOFDAY) -CHECK_FUNCTION_EXISTS(getprotobynumber EVENT__HAVE_GETPROTOBYNUMBER) -CHECK_FUNCTION_EXISTS(getservbyname EVENT__HAVE_GETSERVBYNAME) -CHECK_FUNCTION_EXISTS(inet_ntop EVENT__HAVE_INET_NTOP) -CHECK_FUNCTION_EXISTS(inet_pton EVENT__HAVE_INET_PTON) CHECK_FUNCTION_EXISTS(kqueue EVENT__HAVE_KQUEUE) CHECK_FUNCTION_EXISTS(mmap EVENT__HAVE_MMAP) CHECK_FUNCTION_EXISTS(pipe EVENT__HAVE_PIPE) @@ -479,7 +492,6 @@ CHECK_FUNCTION_EXISTS(splice EVENT__HAVE_SPLICE) CHECK_FUNCTION_EXISTS(strlcpy EVENT__HAVE_STRLCPY) CHECK_FUNCTION_EXISTS(strsep EVENT__HAVE_STRSEP) CHECK_FUNCTION_EXISTS(strtok_r EVENT__HAVE_STRTOK_R) -CHECK_FUNCTION_EXISTS(strtoll EVENT__HAVE_STRTOLL) CHECK_FUNCTION_EXISTS(vasprintf EVENT__HAVE_VASPRINTF) CHECK_FUNCTION_EXISTS(sysctl EVENT__HAVE_SYSCTL) CHECK_FUNCTION_EXISTS(accept4 EVENT__HAVE_ACCEPT4) @@ -495,11 +507,7 @@ CHECK_FUNCTION_EXISTS(mach_absolute_time EVENT__HAVE_MACH_ABSOLUTE_TIME) CHECK_FUNCTION_EXISTS(nanosleep EVENT__HAVE_NANOSLEEP) CHECK_FUNCTION_EXISTS(usleep EVENT__HAVE_USLEEP) CHECK_FUNCTION_EXISTS(timeradd EVENT__HAVE_TIMERADD) -CHECK_FUNCTION_EXISTS(timerclear EVENT__HAVE_TIMERCLEAR) -CHECK_FUNCTION_EXISTS(timercmp EVENT__HAVE_TIMERCMP) CHECK_FUNCTION_EXISTS(timerfd_create EVENT__HAVE_TIMERFD_CREATE) -CHECK_FUNCTION_EXISTS(timerisset EVENT__HAVE_TIMERISSET) -CHECK_FUNCTION_EXISTS(putenv EVENT__HAVE_PUTENV) CHECK_FUNCTION_EXISTS(setenv EVENT__HAVE_SETENV) CHECK_FUNCTION_EXISTS(setrlimit EVENT__HAVE_SETRLIMIT) CHECK_FUNCTION_EXISTS(umask EVENT__HAVE_UMASK) diff --git a/cmake/CheckSymbolsExist.cmake b/cmake/CheckSymbolsExist.cmake new file mode 100644 index 00000000..2c3c5dc3 --- /dev/null +++ b/cmake/CheckSymbolsExist.cmake @@ -0,0 +1,20 @@ +# Check if each symbol in the symbol list exists, +# and define PREFIX__HAVE_SYMNAME to 1 if yes. +# + +include(CheckSymbolExists) + +# SYMLIST: list of symbols to check +# HEADERS: header files to be included in check code +# PREFIX: the prefix of definition +macro(CHECK_SYMBOLS_EXIST SYMLIST HEADERS PREFIX) + foreach(SYMNAME ${SYMLIST}) + string(TOUPPER "${SYMNAME}" SYMNAME_UPPER) + if("${PREFIX}" STREQUAL "") + set(HAVE_SYM_DEF "HAVE_${SYMNAME_UPPER}") + else() + set(HAVE_SYM_DEF "${PREFIX}__HAVE_${SYMNAME_UPPER}") + endif() + CHECK_SYMBOL_EXISTS(${SYMNAME} "${HEADERS}" ${HAVE_SYM_DEF}) + endforeach() +endmacro()