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.

(cherry picked from commit 503ba1d36571e3cb01826d15dc462b7d8b5094de)
This commit is contained in:
yuangongji 2020-03-16 20:11:06 +08:00 committed by Azat Khuzhin
parent 88384865be
commit dea51c2e11
2 changed files with 40 additions and 12 deletions

View File

@ -57,6 +57,7 @@ include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckVariableExists)
include(CheckSymbolExists)
include(CheckSymbolsExist)
include(CheckStructHasMember)
include(CheckCSourceCompiles)
include(CheckPrototypeDefinition)
@ -337,7 +338,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)
@ -449,6 +450,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)
@ -457,13 +476,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)
@ -478,7 +491,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)
@ -494,11 +506,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)

View File

@ -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()