]> granicus.if.org Git - libevent/commitdiff
cmake: fix getaddrinfo checking error
authoryuangongji <yuangongji@foxmail.com>
Mon, 16 Mar 2020 12:11:06 +0000 (20:11 +0800)
committerAzat Khuzhin <azat@libevent.org>
Tue, 17 Mar 2020 18:43:39 +0000 (21:43 +0300)
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.

CMakeLists.txt
cmake/CheckSymbolsExist.cmake [new file with mode: 0644]

index 36094d2058b3d8cba276e54098077ad302b77e75..7dc45fd6f674b53bcfc95420359a5f79df9c3530 100644 (file)
@@ -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 (file)
index 0000000..2c3c5dc
--- /dev/null
@@ -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()