rwrap: Turn some errors into warnings
[resolv_wrapper.git] / ConfigureChecks.cmake
index 41bed3a1f9051a0e48e222de061ed89636cfee0f..84442321127b76134b11517e517588ad3c2261f8 100644 (file)
@@ -7,15 +7,8 @@ include(CheckStructHasMember)
 include(CheckPrototypeDefinition)
 include(TestBigEndian)
 
-set(PACKAGE ${APPLICATION_NAME})
-set(VERSION ${APPLICATION_VERSION})
-set(DATADIR ${DATA_INSTALL_DIR})
-set(LIBDIR ${LIB_INSTALL_DIR})
-set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
-set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
-
-set(BINARYDIR ${CMAKE_BINARY_DIR})
-set(SOURCEDIR ${CMAKE_SOURCE_DIR})
+set(BINARYDIR ${resolv_wrapper_BINARY_DIR})
+set(SOURCEDIR ${resolv_wrapper_SOURCE_DIR})
 
 function(COMPILER_DUMPVERSION _OUTPUT_VERSION)
     # Remove whitespaces from the argument.
@@ -42,81 +35,111 @@ if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
 "void __attribute__((visibility(\"default\"))) test() {}
 int main(void){ return 0; }
 " WITH_VISIBILITY_HIDDEN)
-        set(CMAKE_REQUIRED_FLAGS "")
+        unset(CMAKE_REQUIRED_FLAGS)
     endif (NOT GNUCC_VERSION EQUAL 34)
 endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
 
 # HEADERS
 check_include_file(sys/types.h HAVE_SYS_TYPES_H)
 check_include_file(resolv.h HAVE_RESOLV_H)
+check_include_file(arpa/nameser.h HAVE_ARPA_NAMESER_H)
+
+# SYMBOLS
+set(CMAKE_REQUIRED_FLAGS -D_GNU_SOURCE)
+check_symbol_exists(program_invocation_short_name
+                    "errno.h"
+                    HAVE_PROGRAM_INVOCATION_SHORT_NAME)
+unset(CMAKE_REQUIRED_FLAGS)
 
 # FUNCTIONS
-set(CMAKE_REQUIRED_LIBRARIES)
+check_function_exists(getprogname HAVE_GETPROGNAME)
+check_function_exists(getexecname HAVE_GETEXECNAME)
 
 find_library(RESOLV_LIRBRARY resolv)
-
 if (RESOLV_LIRBRARY)
-    check_library_exists(${RESOLV_LIRBRARY} res_send "" RES_SEND_IN_LIBRESOLV)
-    check_library_exists(${RESOLV_LIRBRARY} __res_send "" __RES_SEND_IN_LIBRESOLV)
-    if (RES_SEND_IN_LIBRESOLV OR __RES_SEND_IN_LIBRESOLV)
-        set(HAVE_LIBRESOLV TRUE)
-        set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
-    endif()
+    set(HAVE_LIBRESOLV TRUE)
+
+    # If we have a libresolv, we need to check functions linking the library
+    list(APPEND _REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
+else()
+    message(STATUS "libresolv not found on ${CMAKE_SYSTEM_NAME}: Only dns faking will be available")
 endif()
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_init HAVE_RES_INIT)
 check_function_exists(__res_init HAVE___RES_INIT)
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_ninit HAVE_RES_NINIT)
 check_function_exists(__res_ninit HAVE___RES_NINIT)
-if (RESOLV_LIRBRARY)
-    check_library_exists(${RESOLV_LIRBRARY} res_ninit "" HAVE_RES_NINIT_IN_LIBRESOLV)
-endif()
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_close HAVE_RES_CLOSE)
 check_function_exists(__res_close HAVE___RES_CLOSE)
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_nclose HAVE_RES_NCLOSE)
 check_function_exists(__res_nclose HAVE___RES_NCLOSE)
-if (RESOLV_LIRBRARY)
-    check_library_exists(${RESOLV_LIRBRARY} res_nclose "" HAVE_RES_NCLOSE_IN_LIBRESOLV)
-endif()
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_query HAVE_RES_QUERY)
 check_function_exists(__res_query HAVE___RES_QUERY)
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_nquery HAVE_RES_NQUERY)
 check_function_exists(__res_nquery HAVE___RES_NQUERY)
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_search HAVE_RES_SEARCH)
 check_function_exists(__res_search HAVE___RES_SEARCH)
+unset(CMAKE_REQUIRED_LIBRARIES)
 
+set(CMAKE_REQUIRED_LIBRARIES ${RESOLV_LIRBRARY})
 check_function_exists(res_nsearch HAVE_RES_NSEARCH)
 check_function_exists(__res_nsearch HAVE___RES_NSEARCH)
+unset(CMAKE_REQUIRED_LIBRARIES)
+
+check_symbol_exists(ns_name_compress "sys/types.h;arpa/nameser.h" HAVE_NS_NAME_COMPRESS)
 
 if (UNIX)
     if (NOT LINUX)
         # libsocket (Solaris)
-        check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
-        if (HAVE_LIBSOCKET)
-          set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} socket)
-        endif (HAVE_LIBSOCKET)
+        find_library(SOCKET_LIBRARY socket)
+        if (SOCKET_LIBRARY)
+            check_library_exists(${SOCKET_LIBRARY} getaddrinfo "" HAVE_LIBSOCKET)
+            if (HAVE_LIBSOCKET)
+                list(APPEND _REQUIRED_LIBRARIES ${SOCKET_LIBRARY})
+            endif()
+        endif()
 
         # libnsl/inet_pton (Solaris)
-        check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
-        if (HAVE_LIBNSL)
-            set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} nsl)
-        endif (HAVE_LIBNSL)
+        find_library(NSL_LIBRARY nsl)
+        if (NSL_LIBRARY)
+            check_library_exists(${NSL_LIBRARY} inet_pton "" HAVE_LIBNSL)
+            if (HAVE_LIBNSL)
+                list(APPEND _REQUIRED_LIBRARIES ${NSL_LIBRARY})
+            endif()
+        endif()
     endif (NOT LINUX)
 
     check_function_exists(getaddrinfo HAVE_GETADDRINFO)
 endif (UNIX)
 
-check_library_exists(dl dlopen "" HAVE_LIBDL)
-if (HAVE_LIBDL)
-    find_library(DLFCN_LIBRARY dl)
-    set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${DLFCN_LIBRARY})
-endif (HAVE_LIBDL)
+find_library(DLFCN_LIBRARY dl)
+if (DLFCN_LIBRARY)
+    list(APPEND _REQUIRED_LIBRARIES ${DLFCN_LIBRARY})
+else()
+    check_function_exists(dlopen HAVE_DLOPEN)
+    if (NOT HAVE_DLOPEN)
+        message(FATAL_ERROR "FATAL: No dlopen() function detected")
+    endif()
+endif()
 
 # IPV6
 check_c_source_compiles("
@@ -150,7 +173,15 @@ int main(void) {
     return 0;
 }" HAVE_IPV6)
 
-check_struct_has_member("struct __res_state" _u._ext.nsaddrs resolv.h HAVE_RESOLV_IPV6_NSADDRS)
+check_struct_has_member("struct __res_state" _u._ext.nsaddrs
+                        "sys/socket.h;netinet/in.h;resolv.h"
+                        HAVE_RES_STATE_U_EXT_NSADDRS)
+check_struct_has_member("union res_sockaddr_union" sin
+                        "sys/socket.h;netinet/in.h;resolv.h"
+                        HAVE_RES_SOCKADDR_UNION_SIN)
+check_struct_has_member("union res_sockaddr_union" sin6
+                        "sys/socket.h;netinet/in.h;resolv.h"
+                        HAVE_RES_SOCKADDR_UNION_SIN6)
 
 check_c_source_compiles("
 void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
@@ -174,4 +205,4 @@ int main(void) {
 # ENDIAN
 test_big_endian(WORDS_BIGENDIAN)
 
-set(RWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "resolv_wrapper required system libraries")
+set(RWRAP_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL "resolv_wrapper required system libraries")