Blame ConfigureChecks.cmake

Packit Service 31306d
include(CheckIncludeFile)
Packit Service 31306d
include(CheckIncludeFiles)
Packit Service 31306d
include(CheckSymbolExists)
Packit Service 31306d
include(CheckFunctionExists)
Packit Service 31306d
include(CheckLibraryExists)
Packit Service 31306d
include(CheckTypeSize)
Packit Service 31306d
include(CheckStructHasMember)
Packit Service 31306d
include(TestBigEndian)
Packit Service 31306d
Packit Service 31306d
set(PACKAGE ${PROJECT_NAME})
Packit Service 31306d
set(VERSION ${PROJECT_VERSION})
Packit Service 31306d
set(SYSCONFDIR ${CMAKE_INSTALL_SYSCONFDIR})
Packit Service 31306d
Packit Service 31306d
set(BINARYDIR ${CMAKE_BINARY_DIR})
Packit Service 31306d
set(SOURCEDIR ${CMAKE_SOURCE_DIR})
Packit Service 31306d
Packit Service 31306d
function(COMPILER_DUMPVERSION _OUTPUT_VERSION)
Packit Service 31306d
    # Remove whitespaces from the argument.
Packit Service 31306d
    # This is needed for CC="ccache gcc" cmake ..
Packit Service 31306d
    string(REPLACE " " "" _C_COMPILER_ARG "${CMAKE_C_COMPILER_ARG1}")
Packit Service 31306d
Packit Service 31306d
    execute_process(
Packit Service 31306d
        COMMAND
Packit Service 31306d
            ${CMAKE_C_COMPILER} ${_C_COMPILER_ARG} -dumpversion
Packit Service 31306d
        OUTPUT_VARIABLE _COMPILER_VERSION
Packit Service 31306d
    )
Packit Service 31306d
Packit Service 31306d
    string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2"
Packit Service 31306d
           _COMPILER_VERSION "${_COMPILER_VERSION}")
Packit Service 31306d
Packit Service 31306d
    set(${_OUTPUT_VERSION} ${_COMPILER_VERSION} PARENT_SCOPE)
Packit Service 31306d
endfunction()
Packit Service 31306d
Packit Service 31306d
if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
Packit Service 31306d
    compiler_dumpversion(GNUCC_VERSION)
Packit Service 31306d
    if (NOT GNUCC_VERSION EQUAL 34)
Packit Service 31306d
        set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden")
Packit Service 31306d
        check_c_source_compiles(
Packit Service 31306d
"void __attribute__((visibility(\"default\"))) test() {}
Packit Service 31306d
int main(void){ return 0; }
Packit Service 31306d
" WITH_VISIBILITY_HIDDEN)
Packit Service 31306d
        unset(CMAKE_REQUIRED_FLAGS)
Packit Service 31306d
    endif (NOT GNUCC_VERSION EQUAL 34)
Packit Service 31306d
endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
Packit Service 31306d
Packit Service 31306d
# HEADER FILES
Packit Service 31306d
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ARGP_INCLUDE_DIR})
Packit Service 31306d
check_include_file(argp.h HAVE_ARGP_H)
Packit Service 31306d
unset(CMAKE_REQUIRED_INCLUDES)
Packit Service 31306d
Packit Service 31306d
check_include_file(pty.h HAVE_PTY_H)
Packit Service 31306d
check_include_file(utmp.h HAVE_UTMP_H)
Packit Service 31306d
check_include_file(termios.h HAVE_TERMIOS_H)
Packit Service 31306d
check_include_file(unistd.h HAVE_UNISTD_H)
Packit Service 31306d
check_include_file(stdint.h HAVE_STDINT_H)
Packit Service 31306d
check_include_file(util.h HAVE_UTIL_H)
Packit Service 31306d
check_include_file(libutil.h HAVE_LIBUTIL_H)
Packit Service 31306d
check_include_file(sys/time.h HAVE_SYS_TIME_H)
Packit Service 31306d
check_include_file(sys/utime.h HAVE_SYS_UTIME_H)
Packit Service 31306d
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
Packit Service 31306d
check_include_file(arpa/inet.h HAVE_ARPA_INET_H)
Packit Service 31306d
check_include_file(byteswap.h HAVE_BYTESWAP_H)
Packit Service 31306d
check_include_file(glob.h HAVE_GLOB_H)
Packit Service 31306d
check_include_file(valgrind/valgrind.h HAVE_VALGRIND_VALGRIND_H)
Packit Service 31306d
Packit Service 31306d
if (WIN32)
Packit Service 31306d
  check_include_file(io.h HAVE_IO_H)
Packit Service 31306d
Packit Service 31306d
  check_include_files("winsock2.h;ws2tcpip.h;wspiapi.h" HAVE_WSPIAPI_H)
Packit Service 31306d
  if (NOT HAVE_WSPIAPI_H)
Packit Service 31306d
    message(STATUS "WARNING: Without wspiapi.h, this build will only work on Windows XP and newer versions")
Packit Service 31306d
  endif (NOT HAVE_WSPIAPI_H)
Packit Service 31306d
  check_include_files("winsock2.h;ws2tcpip.h" HAVE_WS2TCPIP_H)
Packit Service 31306d
endif (WIN32)
Packit Service 31306d
Packit Service 31306d
if (OPENSSL_FOUND)
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    check_include_file(openssl/des.h HAVE_OPENSSL_DES_H)
Packit Service 31306d
    if (NOT HAVE_OPENSSL_DES_H)
Packit Service 31306d
        message(FATAL_ERROR "Could not detect openssl/des.h")
Packit Service 31306d
    endif()
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    check_include_file(openssl/aes.h HAVE_OPENSSL_AES_H)
Packit Service 31306d
    if (NOT HAVE_OPENSSL_AES_H)
Packit Service 31306d
        message(FATAL_ERROR "Could not detect openssl/aes.h")
Packit Service 31306d
    endif()
Packit Service 31306d
Packit Service 31306d
    if (WITH_BLOWFISH_CIPHER)
Packit Service 31306d
        set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
        check_include_file(openssl/blowfish.h HAVE_OPENSSL_BLOWFISH_H)
Packit Service 31306d
    endif()
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    check_include_file(openssl/ecdh.h HAVE_OPENSSL_ECDH_H)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    check_include_file(openssl/ec.h HAVE_OPENSSL_EC_H)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    check_include_file(openssl/ecdsa.h HAVE_OPENSSL_ECDSA_H)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_aes_128_ctr HAVE_OPENSSL_EVP_AES_CTR)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_aes_128_cbc HAVE_OPENSSL_EVP_AES_CBC)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_aes_128_gcm HAVE_OPENSSL_EVP_AES_GCM)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(CRYPTO_THREADID_set_callback HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(CRYPTO_ctr128_encrypt HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_CIPHER_CTX_new HAVE_OPENSSL_EVP_CIPHER_CTX_NEW)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_KDF_CTX_new_id HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(FIPS_mode HAVE_OPENSSL_FIPS_MODE)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(RAND_priv_bytes HAVE_OPENSSL_RAND_PRIV_BYTES)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_DigestSign HAVE_OPENSSL_EVP_DIGESTSIGN)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_function_exists(EVP_DigestVerify HAVE_OPENSSL_EVP_DIGESTVERIFY)
Packit Service 31306d
Packit Service 31306d
    check_function_exists(OPENSSL_ia32cap_loc HAVE_OPENSSL_IA32CAP_LOC)
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_symbol_exists(EVP_PKEY_ED25519 "openssl/evp.h" FOUND_OPENSSL_ED25519)
Packit Service 31306d
Packit Service 31306d
    if (HAVE_OPENSSL_EVP_DIGESTSIGN AND HAVE_OPENSSL_EVP_DIGESTVERIFY AND
Packit Service 31306d
        FOUND_OPENSSL_ED25519)
Packit Service 31306d
        set(HAVE_OPENSSL_ED25519 1)
Packit Service 31306d
    endif()
Packit Service 31306d
Packit Service 31306d
    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Packit Service 31306d
    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
Packit Service 31306d
    check_symbol_exists(EVP_PKEY_X25519 "openssl/evp.h" HAVE_OPENSSL_X25519)
Packit Service 31306d
Packit Service 31306d
    unset(CMAKE_REQUIRED_INCLUDES)
Packit Service 31306d
    unset(CMAKE_REQUIRED_LIBRARIES)
Packit Service 31306d
endif()
Packit Service 31306d
Packit Service 31306d
if (CMAKE_HAVE_PTHREAD_H)
Packit Service 31306d
  set(HAVE_PTHREAD_H 1)
Packit Service 31306d
endif (CMAKE_HAVE_PTHREAD_H)
Packit Service 31306d
Packit Service 31306d
if (NOT WITH_GCRYPT AND NOT WITH_MBEDTLS)
Packit Service 31306d
    if (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
Packit Service 31306d
        set(HAVE_OPENSSL_ECC 1)
Packit Service 31306d
    endif (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
Packit Service 31306d
Packit Service 31306d
    if (HAVE_OPENSSL_ECC)
Packit Service 31306d
        set(HAVE_ECC 1)
Packit Service 31306d
    endif (HAVE_OPENSSL_ECC)
Packit Service 31306d
endif ()
Packit Service 31306d
Packit Service 31306d
if (NOT WITH_MBEDTLS)
Packit Service 31306d
    set(HAVE_DSA 1)
Packit Service 31306d
endif (NOT WITH_MBEDTLS)
Packit Service 31306d
Packit Service 31306d
# FUNCTIONS
Packit Service 31306d
Packit Service 31306d
check_function_exists(isblank HAVE_ISBLANK)
Packit Service 31306d
check_function_exists(strncpy HAVE_STRNCPY)
Packit Service 31306d
check_function_exists(strndup HAVE_STRNDUP)
Packit Service 31306d
check_function_exists(strtoull HAVE_STRTOULL)
Packit Service 31306d
check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
Packit Service 31306d
check_function_exists(memset_s HAVE_MEMSET_S)
Packit Service 31306d
Packit Service 31306d
if (HAVE_GLOB_H)
Packit Service 31306d
    check_struct_has_member(glob_t gl_flags glob.h HAVE_GLOB_GL_FLAGS_MEMBER)
Packit Service 31306d
    check_function_exists(glob HAVE_GLOB)
Packit Service 31306d
endif (HAVE_GLOB_H)
Packit Service 31306d
Packit Service 31306d
if (NOT WIN32)
Packit Service 31306d
  check_function_exists(vsnprintf HAVE_VSNPRINTF)
Packit Service 31306d
  check_function_exists(snprintf HAVE_SNPRINTF)
Packit Service 31306d
endif (NOT WIN32)
Packit Service 31306d
Packit Service 31306d
if (WIN32)
Packit Service 31306d
    check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF)
Packit Service 31306d
    check_symbol_exists(snprintf "stdio.h" HAVE_SNPRINTF)
Packit Service 31306d
Packit Service 31306d
    check_symbol_exists(_vsnprintf_s "stdio.h" HAVE__VSNPRINTF_S)
Packit Service 31306d
    check_symbol_exists(_vsnprintf "stdio.h" HAVE__VSNPRINTF)
Packit Service 31306d
    check_symbol_exists(_snprintf "stdio.h" HAVE__SNPRINTF)
Packit Service 31306d
    check_symbol_exists(_snprintf_s "stdio.h" HAVE__SNPRINTF_S)
Packit Service 31306d
Packit Service 31306d
    if (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
Packit Service 31306d
        check_symbol_exists(ntohll winsock2.h HAVE_NTOHLL)
Packit Service 31306d
        check_symbol_exists(htonll winsock2.h HAVE_HTONLL)
Packit Service 31306d
Packit Service 31306d
        set(CMAKE_REQUIRED_LIBRARIES ws2_32)
Packit Service 31306d
        check_symbol_exists(select "winsock2.h;ws2tcpip.h" HAVE_SELECT)
Packit Service 31306d
        check_symbol_exists(poll "winsock2.h;ws2tcpip.h" HAVE_SELECT)
Packit Service 31306d
        # The getaddrinfo function is defined to the WspiapiGetAddrInfo inline function
Packit Service 31306d
        check_symbol_exists(getaddrinfo "winsock2.h;ws2tcpip.h" HAVE_GETADDRINFO)
Packit Service 31306d
        unset(CMAKE_REQUIRED_LIBRARIES)
Packit Service 31306d
    endif (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
Packit Service 31306d
Packit Service 31306d
    check_function_exists(_strtoui64 HAVE__STRTOUI64)
Packit Service 31306d
Packit Service 31306d
    set(HAVE_SELECT TRUE)
Packit Service 31306d
Packit Service 31306d
    check_symbol_exists(SecureZeroMemory "windows.h" HAVE_SECURE_ZERO_MEMORY)
Packit Service 31306d
else (WIN32)
Packit Service 31306d
    check_function_exists(poll HAVE_POLL)
Packit Service 31306d
    check_function_exists(select HAVE_SELECT)
Packit Service 31306d
    check_function_exists(getaddrinfo HAVE_GETADDRINFO)
Packit Service 31306d
Packit Service 31306d
    check_symbol_exists(ntohll arpa/inet.h HAVE_NTOHLL)
Packit Service 31306d
    check_symbol_exists(htonll arpa/inet.h HAVE_HTONLL)
Packit Service 31306d
endif (WIN32)
Packit Service 31306d
Packit Service 31306d
Packit Service 31306d
if (UNIX)
Packit Service 31306d
    if (NOT LINUX)
Packit Service 31306d
        # libsocket (Solaris)
Packit Service 31306d
        check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
Packit Service 31306d
        if (HAVE_LIBSOCKET)
Packit Service 31306d
            set(HAVE_GETADDRINFO TRUE)
Packit Service 31306d
            set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} socket)
Packit Service 31306d
        endif (HAVE_LIBSOCKET)
Packit Service 31306d
Packit Service 31306d
        # libnsl/inet_pton (Solaris)
Packit Service 31306d
        check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
Packit Service 31306d
        if (HAVE_LIBNSL)
Packit Service 31306d
            set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} nsl)
Packit Service 31306d
        endif (HAVE_LIBNSL)
Packit Service 31306d
Packit Service 31306d
        # librt
Packit Service 31306d
        check_library_exists(rt nanosleep "" HAVE_LIBRT)
Packit Service 31306d
    endif (NOT LINUX)
Packit Service 31306d
Packit Service 31306d
    check_library_exists(rt clock_gettime "" HAVE_CLOCK_GETTIME)
Packit Service 31306d
    if (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
Packit Service 31306d
        set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} rt)
Packit Service 31306d
    endif (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
Packit Service 31306d
Packit Service 31306d
    check_library_exists(util forkpty "" HAVE_LIBUTIL)
Packit Service 31306d
    check_function_exists(cfmakeraw HAVE_CFMAKERAW)
Packit Service 31306d
    check_function_exists(__strtoull HAVE___STRTOULL)
Packit Service 31306d
endif (UNIX)
Packit Service 31306d
Packit Service 31306d
set(LIBSSH_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
Packit Service 31306d
Packit Service 31306d
# LIBRARIES
Packit Service 31306d
if (OPENSSL_FOUND)
Packit Service 31306d
  set(HAVE_LIBCRYPTO 1)
Packit Service 31306d
endif (OPENSSL_FOUND)
Packit Service 31306d
Packit Service 31306d
if (GCRYPT_FOUND)
Packit Service 31306d
    set(HAVE_LIBGCRYPT 1)
Packit Service 31306d
    if (GCRYPT_VERSION VERSION_GREATER "1.4.6")
Packit Service 31306d
        set(HAVE_GCRYPT_ECC 1)
Packit Service 31306d
        set(HAVE_ECC 1)
Packit Service 31306d
    endif (GCRYPT_VERSION VERSION_GREATER "1.4.6")
Packit Service 31306d
endif (GCRYPT_FOUND)
Packit Service 31306d
Packit Service 31306d
if (MBEDTLS_FOUND)
Packit Service 31306d
    set(HAVE_LIBMBEDCRYPTO 1)
Packit Service 31306d
    set(HAVE_ECC 1)
Packit Service 31306d
endif (MBEDTLS_FOUND)
Packit Service 31306d
Packit Service 31306d
if (CMAKE_USE_PTHREADS_INIT)
Packit Service 31306d
    set(HAVE_PTHREAD 1)
Packit Service 31306d
endif (CMAKE_USE_PTHREADS_INIT)
Packit Service 31306d
Packit Service 31306d
if (UNIT_TESTING)
Packit Service 31306d
    if (CMOCKA_FOUND)
Packit Service 31306d
        set(CMAKE_REQUIRED_LIBRARIES ${CMOCKA_LIBRARIES})
Packit Service 31306d
        check_function_exists(cmocka_set_test_filter HAVE_CMOCKA_SET_TEST_FILTER)
Packit Service 31306d
        unset(CMAKE_REQUIRED_LIBRARIES)
Packit Service 31306d
    endif ()
Packit Service 31306d
endif ()
Packit Service 31306d
Packit Service 31306d
# OPTIONS
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
__thread int tls;
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_GCC_THREAD_LOCAL_STORAGE)
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
__declspec(thread) int tls;
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_MSC_THREAD_LOCAL_STORAGE)
Packit Service 31306d
Packit Service 31306d
###########################################################
Packit Service 31306d
# For detecting attributes we need to treat warnings as
Packit Service 31306d
# errors
Packit Service 31306d
if (UNIX OR MINGW)
Packit Service 31306d
    # Get warnings for attributs
Packit Service 31306d
    check_c_compiler_flag("-Wattributes" REQUIRED_FLAGS_WERROR)
Packit Service 31306d
    if (REQUIRED_FLAGS_WERROR)
Packit Service 31306d
        string(APPEND CMAKE_REQUIRED_FLAGS "-Wattributes ")
Packit Service 31306d
    endif()
Packit Service 31306d
Packit Service 31306d
    # Turn warnings into errors
Packit Service 31306d
    check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
Packit Service 31306d
    if (REQUIRED_FLAGS_WERROR)
Packit Service 31306d
        string(APPEND CMAKE_REQUIRED_FLAGS "-Werror ")
Packit Service 31306d
    endif()
Packit Service 31306d
endif ()
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
void test_constructor_attribute(void) __attribute__ ((constructor));
Packit Service 31306d
Packit Service 31306d
void test_constructor_attribute(void)
Packit Service 31306d
{
Packit Service 31306d
    return;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_CONSTRUCTOR_ATTRIBUTE)
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
void test_destructor_attribute(void) __attribute__ ((destructor));
Packit Service 31306d
Packit Service 31306d
void test_destructor_attribute(void)
Packit Service 31306d
{
Packit Service 31306d
    return;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_DESTRUCTOR_ATTRIBUTE)
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
#define FALL_THROUGH __attribute__((fallthrough))
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    int i = 2;
Packit Service 31306d
Packit Service 31306d
    switch (i) {
Packit Service 31306d
    case 0:
Packit Service 31306d
        FALL_THROUGH;
Packit Service 31306d
    case 1:
Packit Service 31306d
        break;
Packit Service 31306d
    default:
Packit Service 31306d
        break;
Packit Service 31306d
    }
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_FALLTHROUGH_ATTRIBUTE)
Packit Service 31306d
Packit Service 31306d
if (NOT WIN32)
Packit Service 31306d
    check_c_source_compiles("
Packit Service 31306d
    #define __unused __attribute__((unused))
Packit Service 31306d
Packit Service 31306d
    static int do_nothing(int i __unused)
Packit Service 31306d
    {
Packit Service 31306d
        return 0;
Packit Service 31306d
    }
Packit Service 31306d
Packit Service 31306d
    int main(void)
Packit Service 31306d
    {
Packit Service 31306d
        int i;
Packit Service 31306d
Packit Service 31306d
        i = do_nothing(5);
Packit Service 31306d
        if (i > 5) {
Packit Service 31306d
            return 1;
Packit Service 31306d
        }
Packit Service 31306d
Packit Service 31306d
        return 0;
Packit Service 31306d
    }" HAVE_UNUSED_ATTRIBUTE)
Packit Service 31306d
endif()
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
#include <string.h>
Packit Service 31306d
Packit Service 31306d
int main(void)
Packit Service 31306d
{
Packit Service 31306d
    char buf[] = \"This is some content\";
Packit Service 31306d
Packit Service 31306d
    memset(buf, '\\\\0', sizeof(buf)); __asm__ volatile(\"\" : : \"g\"(&buf) : \"memory\");
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
#include <stdio.h>
Packit Service 31306d
int main(void) {
Packit Service 31306d
    printf(\"%s\", __func__);
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_COMPILER__FUNC__)
Packit Service 31306d
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
#include <stdio.h>
Packit Service 31306d
int main(void) {
Packit Service 31306d
    printf(\"%s\", __FUNCTION__);
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_COMPILER__FUNCTION__)
Packit Service 31306d
Packit Service 31306d
# This is only available with OpenBSD's gcc implementation */
Packit Service 31306d
if (OPENBSD)
Packit Service 31306d
check_c_source_compiles("
Packit Service 31306d
#define ARRAY_LEN 16
Packit Service 31306d
void test_attr(const unsigned char *k)
Packit Service 31306d
    __attribute__((__bounded__(__minbytes__, 2, 16)));
Packit Service 31306d
Packit Service 31306d
int main(void) {
Packit Service 31306d
    return 0;
Packit Service 31306d
}" HAVE_GCC_BOUNDED_ATTRIBUTE)
Packit Service 31306d
endif(OPENBSD)
Packit Service 31306d
Packit Service 31306d
# Stop treating warnings as errors
Packit Service 31306d
unset(CMAKE_REQUIRED_FLAGS)
Packit Service 31306d
Packit Service 31306d
# Check for version script support
Packit Service 31306d
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
Packit Service 31306d
        global: sym;
Packit Service 31306d
};
Packit Service 31306d
VERS_2 {
Packit Service 31306d
        global: sym;
Packit Service 31306d
} VERS_1;
Packit Service 31306d
")
Packit Service 31306d
Packit Service 31306d
set(CMAKE_REQUIRED_FLAGS "-Wl,--version-script=\"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\"")
Packit Service 31306d
check_c_source_compiles("int main(void) { return 0; }" HAVE_LD_VERSION_SCRIPT)
Packit Service 31306d
unset(CMAKE_REQUIRED_FLAGS)
Packit Service 31306d
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
Packit Service 31306d
Packit Service 31306d
if (WITH_DEBUG_CRYPTO)
Packit Service 31306d
  set(DEBUG_CRYPTO 1)
Packit Service 31306d
endif (WITH_DEBUG_CRYPTO)
Packit Service 31306d
Packit Service 31306d
if (WITH_DEBUG_PACKET)
Packit Service 31306d
  set(DEBUG_PACKET 1)
Packit Service 31306d
endif (WITH_DEBUG_PACKET)
Packit Service 31306d
Packit Service 31306d
if (WITH_DEBUG_CALLTRACE)
Packit Service 31306d
  set(DEBUG_CALLTRACE 1)
Packit Service 31306d
endif (WITH_DEBUG_CALLTRACE)
Packit Service 31306d
Packit Service 31306d
if (WITH_GSSAPI AND NOT GSSAPI_FOUND)
Packit Service 31306d
    set(WITH_GSSAPI 0)
Packit Service 31306d
endif (WITH_GSSAPI AND NOT GSSAPI_FOUND)
Packit Service 31306d
Packit Service 31306d
# ENDIAN
Packit Service 31306d
if (NOT WIN32)
Packit Service 31306d
    test_big_endian(WORDS_BIGENDIAN)
Packit Service 31306d
endif (NOT WIN32)