Blame ConfigureChecks.cmake

Packit ac4610
include(CheckIncludeFile)
Packit ac4610
include(CheckSymbolExists)
Packit ac4610
include(CheckFunctionExists)
Packit ac4610
include(CheckLibraryExists)
Packit ac4610
include(CheckTypeSize)
Packit ac4610
include(CheckStructHasMember)
Packit ac4610
include(CheckPrototypeDefinition)
Packit ac4610
include(TestBigEndian)
Packit ac4610
include(CheckCSourceRuns)
Packit ac4610
Packit ac4610
set(PACKAGE ${APPLICATION_NAME})
Packit ac4610
set(VERSION ${APPLICATION_VERSION})
Packit ac4610
set(DATADIR ${DATA_INSTALL_DIR})
Packit ac4610
set(LIBDIR ${LIB_INSTALL_DIR})
Packit ac4610
set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
Packit ac4610
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
Packit ac4610
Packit ac4610
set(BINARYDIR ${CMAKE_BINARY_DIR})
Packit ac4610
set(SOURCEDIR ${CMAKE_SOURCE_DIR})
Packit ac4610
Packit ac4610
function(COMPILER_DUMPVERSION _OUTPUT_VERSION)
Packit ac4610
    # Remove whitespaces from the argument.
Packit ac4610
    # This is needed for CC="ccache gcc" cmake ..
Packit ac4610
    string(REPLACE " " "" _C_COMPILER_ARG "${CMAKE_C_COMPILER_ARG1}")
Packit ac4610
Packit ac4610
    execute_process(
Packit ac4610
        COMMAND
Packit ac4610
            ${CMAKE_C_COMPILER} ${_C_COMPILER_ARG} -dumpversion
Packit ac4610
        OUTPUT_VARIABLE _COMPILER_VERSION
Packit ac4610
    )
Packit ac4610
Packit ac4610
    string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2"
Packit ac4610
           _COMPILER_VERSION "${_COMPILER_VERSION}")
Packit ac4610
Packit ac4610
    set(${_OUTPUT_VERSION} ${_COMPILER_VERSION} PARENT_SCOPE)
Packit ac4610
endfunction()
Packit ac4610
Packit ac4610
if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
Packit ac4610
    compiler_dumpversion(GNUCC_VERSION)
Packit ac4610
    if (NOT GNUCC_VERSION EQUAL 34)
Packit ac4610
        set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden")
Packit ac4610
        check_c_source_compiles(
Packit ac4610
"void __attribute__((visibility(\"default\"))) test() {}
Packit ac4610
int main(void){ return 0; }
Packit ac4610
" WITH_VISIBILITY_HIDDEN)
Packit ac4610
        set(CMAKE_REQUIRED_FLAGS "")
Packit ac4610
    endif (NOT GNUCC_VERSION EQUAL 34)
Packit ac4610
endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
Packit ac4610
Packit ac4610
# HEADERS
Packit ac4610
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
Packit ac4610
check_include_file(pwd.h HAVE_PWD_H)
Packit ac4610
check_include_file(shadow.h HAVE_SHADOW_H)
Packit ac4610
check_include_file(grp.h HAVE_GRP_H)
Packit ac4610
check_include_file(nss.h HAVE_NSS_H)
Packit ac4610
check_include_file(nss_common.h HAVE_NSS_COMMON_H)
Packit ac4610
Packit ac4610
# FUNCTIONS
Packit ac4610
check_function_exists(strncpy HAVE_STRNCPY)
Packit ac4610
check_function_exists(vsnprintf HAVE_VSNPRINTF)
Packit ac4610
check_function_exists(snprintf HAVE_SNPRINTF)
Packit ac4610
Packit ac4610
check_function_exists(getpwnam_r HAVE_GETPWNAM_R)
Packit ac4610
check_function_exists(getpwuid_r HAVE_GETPWUID_R)
Packit ac4610
check_function_exists(getpwent_r HAVE_GETPWENT_R)
Packit ac4610
Packit ac4610
check_function_exists(setspent HAVE_SETSPENT)
Packit ac4610
check_function_exists(getspnam HAVE_GETSPNAM)
Packit ac4610
Packit ac4610
check_function_exists(getgrnam_r HAVE_GETGRNAM_R)
Packit ac4610
check_function_exists(getgrgid_r HAVE_GETGRGID_R)
Packit ac4610
check_function_exists(getgrent_r HAVE_GETGRENT_R)
Packit ac4610
Packit ac4610
check_function_exists(getgrouplist HAVE_GETGROUPLIST)
Packit ac4610
Packit ac4610
check_function_exists(gethostbyaddr_r HAVE_GETHOSTBYADDR_R)
Packit ac4610
check_function_exists(gethostbyname_r HAVE_GETHOSTBYNAME_R)
Packit ac4610
Packit ac4610
check_function_exists(gethostbyname2 HAVE_GETHOSTBYNAME2)
Packit ac4610
Packit ac4610
if (WIN32)
Packit ac4610
    check_function_exists(_vsnprintf_s HAVE__VSNPRINTF_S)
Packit ac4610
    check_function_exists(_vsnprintf HAVE__VSNPRINTF)
Packit ac4610
    check_function_exists(_snprintf HAVE__SNPRINTF)
Packit ac4610
    check_function_exists(_snprintf_s HAVE__SNPRINTF_S)
Packit ac4610
endif (WIN32)
Packit ac4610
Packit ac4610
if (UNIX)
Packit ac4610
    if (NOT LINUX)
Packit ac4610
        # libsocket (Solaris)
Packit ac4610
        check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
Packit ac4610
        if (HAVE_LIBSOCKET)
Packit ac4610
          set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} socket)
Packit ac4610
        endif (HAVE_LIBSOCKET)
Packit ac4610
Packit ac4610
        # libnsl/inet_pton (Solaris)
Packit ac4610
        check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
Packit ac4610
        if (HAVE_LIBNSL)
Packit ac4610
            set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} nsl)
Packit ac4610
        endif (HAVE_LIBNSL)
Packit ac4610
    endif (NOT LINUX)
Packit ac4610
Packit ac4610
    check_function_exists(getaddrinfo HAVE_GETADDRINFO)
Packit ac4610
endif (UNIX)
Packit ac4610
Packit ac4610
if (SOLARIS)
Packit ac4610
    check_function_exists(__posix_getpwnam_r HAVE___POSIX_GETPWNAM_R)
Packit ac4610
    check_function_exists(__posix_getpwuid_r HAVE___POSIX_GETPWUID_R)
Packit ac4610
Packit ac4610
    check_function_exists(__posix_getgrgid_r HAVE___POSIX_GETGRGID_R)
Packit ac4610
    check_function_exists(__posix_getgrnam_r HAVE___POSIX_GETGRNAM_R)
Packit ac4610
endif (SOLARIS)
Packit ac4610
Packit ac4610
check_function_exists(asprintf HAVE_ASPRINTF)
Packit ac4610
if (UNIX AND HAVE_ASPRINTF)
Packit ac4610
    add_definitions(-D_GNU_SOURCE)
Packit ac4610
endif (UNIX AND HAVE_ASPRINTF)
Packit ac4610
Packit ac4610
set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_PTHREAD_SEMANTICS)
Packit ac4610
check_prototype_definition(getpwent_r
Packit ac4610
    "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
Packit ac4610
    "NULL"
Packit ac4610
    "unistd.h;pwd.h"
Packit ac4610
    HAVE_SOLARIS_GETPWENT_R)
Packit ac4610
Packit ac4610
check_prototype_definition(getpwnam_r
Packit ac4610
    "int getpwnam_r(const char *name, struct passwd *pwd, char *buf, int buflen, struct passwd **ppwd)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;pwd.h"
Packit ac4610
    HAVE_SOLARIS_GETPWNAM_R)
Packit ac4610
Packit ac4610
check_prototype_definition(getpwuid_r
Packit ac4610
    "int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, int buflen, struct passwd **ppwd)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;pwd.h"
Packit ac4610
    HAVE_SOLARIS_GETPWUID_R)
Packit ac4610
Packit ac4610
check_prototype_definition(getgrent_r
Packit ac4610
    "struct group *getgrent_r(struct group *src, char *buf, int buflen)"
Packit ac4610
    "NULL"
Packit ac4610
    "unistd.h;grp.h"
Packit ac4610
    HAVE_SOLARIS_GETGRENT_R)
Packit ac4610
Packit ac4610
check_prototype_definition(getgrnam_r
Packit ac4610
    "int getgrnam_r(const char *name, struct group *grp, char *buf, int buflen, struct group **pgrp)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;grp.h"
Packit ac4610
    HAVE_SOLARIS_GETGRNAM_R)
Packit ac4610
Packit ac4610
check_prototype_definition(getgrgid_r
Packit ac4610
    "int getgrgid_r(gid_t gid, struct group *grp, char *buf, int buflen, struct group **pgrp)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;grp.h"
Packit ac4610
    HAVE_SOLARIS_GETGRGID_R)
Packit ac4610
Packit ac4610
check_prototype_definition(sethostent
Packit ac4610
    "int sethostent(int stayopen)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;netdb.h"
Packit ac4610
    HAVE_SOLARIS_SETHOSTENT)
Packit ac4610
Packit ac4610
check_prototype_definition(endhostent
Packit ac4610
    "int endhostent(void)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;netdb.h"
Packit ac4610
    HAVE_SOLARIS_ENDHOSTENT)
Packit ac4610
Packit ac4610
check_prototype_definition(gethostname
Packit ac4610
    "int gethostname(char *name, int len)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;netdb.h"
Packit ac4610
    HAVE_SOLARIS_GETHOSTNAME)
Packit ac4610
set(CMAKE_REQUIRED_DEFINITIONS)
Packit ac4610
Packit ac4610
check_prototype_definition(setgrent
Packit ac4610
    "int setgrent(void)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;grp.h"
Packit ac4610
    HAVE_BSD_SETGRENT)
Packit ac4610
Packit ac4610
check_prototype_definition(getnameinfo
Packit ac4610
    "int getnameinfo (const struct sockaddr *sa, socklen_t salen, char *host, socklen_t __hostlen, char *serv, socklen_t servlen, int flags)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;netdb.h"
Packit ac4610
    HAVE_LINUX_GETNAMEINFO)
Packit ac4610
Packit ac4610
check_prototype_definition(getnameinfo
Packit ac4610
    "int getnameinfo (const struct sockaddr *sa, socklen_t salen, char *host, socklen_t __hostlen, char *serv, socklen_t servlen, unsigned int flags)"
Packit ac4610
    "-1"
Packit ac4610
    "unistd.h;netdb.h"
Packit ac4610
    HAVE_LINUX_GETNAMEINFO_UNSIGNED)
Packit ac4610
Packit ac4610
# STRUCT MEMBERS
Packit ac4610
check_struct_has_member("struct sockaddr" sa_len "sys/socket.h netinet/in.h" HAVE_STRUCT_SOCKADDR_SA_LEN)
Packit ac4610
check_struct_has_member("struct passwd" pw_class "pwd.h" HAVE_STRUCT_PASSWD_PW_CLASS)
Packit ac4610
check_struct_has_member("struct passwd" pw_change "pwd.h" HAVE_STRUCT_PASSWD_PW_CHANGE)
Packit ac4610
check_struct_has_member("struct passwd" pw_expire "pwd.h" HAVE_STRUCT_PASSWD_PW_EXPIRE)
Packit ac4610
Packit ac4610
# IPV6
Packit ac4610
check_c_source_compiles("
Packit ac4610
    #include <stdlib.h>
Packit ac4610
    #include <sys/socket.h>
Packit ac4610
    #include <netdb.h>
Packit ac4610
    #include <netinet/in.h>
Packit ac4610
    #include <net/if.h>
Packit ac4610
Packit ac4610
int main(void) {
Packit ac4610
    struct sockaddr_storage sa_store;
Packit ac4610
    struct addrinfo *ai = NULL;
Packit ac4610
    struct in6_addr in6addr;
Packit ac4610
    int idx = if_nametoindex(\"iface1\");
Packit ac4610
    int s = socket(AF_INET6, SOCK_STREAM, 0);
Packit ac4610
    int ret = getaddrinfo(NULL, NULL, NULL, &ai;;
Packit ac4610
    if (ret != 0) {
Packit ac4610
        const char *es = gai_strerror(ret);
Packit ac4610
    }
Packit ac4610
Packit ac4610
    freeaddrinfo(ai);
Packit ac4610
    {
Packit ac4610
        int val = 1;
Packit ac4610
#ifdef HAVE_LINUX_IPV6_V6ONLY_26
Packit ac4610
#define IPV6_V6ONLY 26
Packit ac4610
#endif
Packit ac4610
        ret = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
Packit ac4610
                         (const void *)&val, sizeof(val));
Packit ac4610
    }
Packit ac4610
Packit ac4610
    return 0;
Packit ac4610
}" HAVE_IPV6)
Packit ac4610
Packit ac4610
check_c_source_compiles("
Packit ac4610
void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
Packit ac4610
Packit ac4610
int main(void) {
Packit ac4610
    return 0;
Packit ac4610
}" HAVE_ATTRIBUTE_PRINTF_FORMAT)
Packit ac4610
Packit ac4610
check_c_source_compiles("
Packit ac4610
void test_constructor_attribute(void) __attribute__ ((constructor));
Packit ac4610
Packit ac4610
void test_constructor_attribute(void)
Packit ac4610
{
Packit ac4610
     return;
Packit ac4610
}
Packit ac4610
Packit ac4610
int main(void) {
Packit ac4610
     return 0;
Packit ac4610
}" HAVE_CONSTRUCTOR_ATTRIBUTE)
Packit ac4610
Packit ac4610
check_c_source_compiles("
Packit ac4610
void test_destructor_attribute(void) __attribute__ ((destructor));
Packit ac4610
Packit ac4610
void test_destructor_attribute(void)
Packit ac4610
{
Packit ac4610
    return;
Packit ac4610
}
Packit ac4610
Packit ac4610
int main(void) {
Packit ac4610
    return 0;
Packit ac4610
}" HAVE_DESTRUCTOR_ATTRIBUTE)
Packit ac4610
Packit ac4610
check_library_exists(dl dlopen "" HAVE_LIBDL)
Packit ac4610
if (HAVE_LIBDL)
Packit ac4610
    find_library(DLFCN_LIBRARY dl)
Packit ac4610
    set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${DLFCN_LIBRARY})
Packit ac4610
endif (HAVE_LIBDL)
Packit ac4610
Packit ac4610
# ENDIAN
Packit ac4610
if (NOT WIN32)
Packit ac4610
    test_big_endian(WORDS_BIGENDIAN)
Packit ac4610
endif (NOT WIN32)
Packit ac4610
Packit ac4610
set(NWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "nss_wrapper required system libraries")
Packit ac4610
Packit ac4610
# check whether getaddrinfo() returns "node" in "ai_canonname" for IP-addresses
Packit ac4610
check_c_source_runs("#include <stddef.h>
Packit ac4610
#include <string.h>
Packit ac4610
#include <sys/types.h>
Packit ac4610
#include <sys/socket.h>
Packit ac4610
#include <netdb.h>
Packit ac4610
int main(void) {
Packit ac4610
    struct addrinfo hints;
Packit ac4610
    struct addrinfo *res = NULL;
Packit ac4610
Packit ac4610
    memset(&hints, 0, sizeof(struct addrinfo));
Packit ac4610
    hints.ai_family = AF_INET;
Packit ac4610
    hints.ai_socktype = SOCK_STREAM;
Packit ac4610
    hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
Packit ac4610
Packit ac4610
    if (getaddrinfo(\"0.0.0.0\", \"389\", &hints, &res) != 0) {
Packit ac4610
        return 2;
Packit ac4610
    }
Packit ac4610
Packit ac4610
    if (res == NULL) {
Packit ac4610
        return 3;
Packit ac4610
    }
Packit ac4610
Packit ac4610
    return strncmp(res->ai_canonname, \"0.0.0.0\", sizeof(\"0.0.0.0\")) != 0;
Packit ac4610
}" HAVE_GETADDRINFO_SETS_CANONNAME_FOR_IPADDRESSES)
Packit ac4610
if (HAVE_GETADDRINFO_SETS_CANONNAME_FOR_IPADDRESSES)
Packit ac4610
    add_definitions(-DHAVE_GETADDRINFO_SETS_CANONNAME_FOR_IPADDRESSES)
Packit ac4610
endif (HAVE_GETADDRINFO_SETS_CANONNAME_FOR_IPADDRESSES)
Packit ac4610
Packit ac4610
# check whether getaddrinfo() returns EAI_SERVICE when the requested service is not available for the requested socket type.
Packit ac4610
check_c_source_runs("#include <stddef.h>
Packit ac4610
#include <string.h>
Packit ac4610
#include <sys/types.h>
Packit ac4610
#include <sys/socket.h>
Packit ac4610
#include <netdb.h>
Packit ac4610
int main(void) {
Packit ac4610
    struct addrinfo hints;
Packit ac4610
    struct addrinfo *res = NULL;
Packit ac4610
    int rc;
Packit ac4610
Packit ac4610
    memset(&hints, 0, sizeof(struct addrinfo));
Packit ac4610
    hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
Packit ac4610
    hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
Packit ac4610
    hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV;    /* For wildcard IP address */
Packit ac4610
    hints.ai_protocol = 0;          /* Any protocol */
Packit ac4610
    hints.ai_canonname = NULL;
Packit ac4610
Packit ac4610
    rc = getaddrinfo(NULL, \"echo\", &hints, &res;;
Packit ac4610
    return rc != EAI_SERVICE;
Packit ac4610
}" HAVE_GETADDRINFO_USES_EAI_SERVICE)
Packit ac4610
if (HAVE_GETADDRINFO_USES_EAI_SERVICE)
Packit ac4610
    add_definitions(-DHAVE_GETADDRINFO_USES_EAI_SERVICE)
Packit ac4610
endif (HAVE_GETADDRINFO_USES_EAI_SERVICE)
Packit ac4610
Packit ac4610
# check for non-NULL gethostent()
Packit ac4610
check_c_source_runs("#include <stddef.h>
Packit ac4610
#include <netdb.h>
Packit ac4610
int main(void) {
Packit ac4610
    struct hostent *hostent = NULL;
Packit ac4610
    sethostent(0);
Packit ac4610
    hostent = gethostent();
Packit ac4610
    endhostent();
Packit ac4610
    return hostent == NULL;
Packit ac4610
}" HAVE_NONNULL_GETHOSTENT)
Packit ac4610
if (HAVE_NONNULL_GETHOSTENT)
Packit ac4610
    add_definitions(-DHAVE_NONNULL_GETHOSTENT)
Packit ac4610
endif (HAVE_NONNULL_GETHOSTENT)