From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp16.mail.ru (smtp16.mail.ru [94.100.176.153]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id D03774696C2 for ; Tue, 26 May 2020 17:42:45 +0300 (MSK) From: "Alexander V. Tikhonov" Date: Tue, 26 May 2020 17:42:36 +0300 Message-Id: <51d102506cb8451ee4583ff9c6657f9a37e1aaaf.1590503508.git.avtikhon@tarantool.org> In-Reply-To: References: In-Reply-To: References: Subject: [Tarantool-patches] [PATCH v2 5/7] build: change autoconf to cmake in curl build List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Oleg Piskunov , Sergey Bronnikov Cc: tarantool-patches@dev.tarantool.org, Alexander Turenko Completely changed autoconf to cmake in curl build. After curl sources were changed to be able to be build since 2.8 version the old OS like CentOS 6/7 and Ubuntu 14.04 became available for curl build using cmake. Autoconf part completely removed and code cleaned up for cmake. 1. Found issue with building on CentOS 6: Linking C executable curl build/ares/dest/lib/libcares.a(ares__timeval.c.o): In function `ares__tvnow': ares__timeval.c:(.text+0x15): undefined reference to `clock_gettime' collect2: error: ld returned 1 exit status It was fixed with added "-lrt" flag to CMAKE_C_FLAGS and CMAKE_CXX_FLAGS build flags, when cmake version is lower than 3.0 and RT library had needed function. 2. Found issue with building FreeBSD 12: app/socket test failed. [035] --- app/socket.result Tue May 26 03:06:32 2020 [035] +++ app/socket.reject Fri May 8 08:26:16 2020 [035] @@ -836,7 +836,7 @@ [035] ... [035] s:recv() [035] --- [035] -- Hello, world [035] +- [035] ... [035] sc:sendto('127.0.0.1', s:name().port, 'Hello, world, 2') [035] --- It was fixed with added "-DLDFLAGS=" flag to cmake call. 3. Found issue with static build using CentOS 7, where SSL cmake rule failed. It was fixed in issue #5019. Closes #4968 Closes #5020 --- cmake/BuildLibCURL.cmake | 251 +++++++++++++-------------------------- 1 file changed, 80 insertions(+), 171 deletions(-) diff --git a/cmake/BuildLibCURL.cmake b/cmake/BuildLibCURL.cmake index 39566145e..b60e16ca2 100644 --- a/cmake/BuildLibCURL.cmake +++ b/cmake/BuildLibCURL.cmake @@ -3,6 +3,7 @@ macro(curl_build) set(LIBCURL_SOURCE_DIR ${PROJECT_SOURCE_DIR}/third_party/curl) set(LIBCURL_BINARY_DIR ${PROJECT_BINARY_DIR}/build/curl/work) set(LIBCURL_INSTALL_DIR ${PROJECT_BINARY_DIR}/build/curl/dest) + set(LIBCURL_CMAKE_FLAGS "") if (BUILD_STATIC) set(LIBZ_LIB_NAME libz.a) @@ -14,179 +15,94 @@ macro(curl_build) message(FATAL_ERROR "Unable to find zlib") endif() - # Use the same OpenSSL library for libcurl as is used for - # tarantool itself. + # add librt for clock_gettime function definition + if(${CMAKE_MAJOR_VERSION} VERSION_LESS "3") + CHECK_LIBRARY_EXISTS (rt clock_gettime "" HAVE_LIBRT) + if (HAVE_LIBRT) + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_CXX_FLAGS=-lrt") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_C_FLAGS=-lrt") + endif() + endif() + + # switch on the static build + list(APPEND LIBCURL_CMAKE_FLAGS "-DCURL_STATICLIB=ON") + + # switch off the shared build + list(APPEND LIBCURL_CMAKE_FLAGS "-DBUILD_SHARED_LIBS=OFF") + + # let's disable testing for curl to save build time + list(APPEND LIBCURL_CMAKE_FLAGS "-DBUILD_TESTING=OFF") + + # Setup use of openssl, use the same OpenSSL library + # for libcurl as is used for tarantool itself. get_filename_component(FOUND_OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} DIRECTORY) - set(LIBCURL_OPENSSL_OPT "--with-ssl=${FOUND_OPENSSL_ROOT_DIR}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_USE_OPENSSL=ON") + list(APPEND LIBCURL_CMAKE_FLAGS "-DOPENSSL_ROOT_DIR=${FOUND_OPENSSL_ROOT_DIR}") - # Use either c-ares bundled with tarantool or - # libcurl-default threaded resolver. + # Setup ARES and its library path, use either c-ares bundled + # with tarantool or libcurl-default threaded resolver. if(BUNDLED_LIBCURL_USE_ARES) - set(ASYN_DNS_USED "ares") - set(ASYN_DNS_UNUSED "threaded-resolver") - set(ASYN_DNS_PATH "=${ARES_INSTALL_DIR}") set(ENABLE_ARES "ON") - set(CMAKE_FIND_ROOT_PATH "${ARES_INSTALL_DIR}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_FIND_ROOT_PATH=${ARES_INSTALL_DIR}") else() - set(ASYN_DNS_USED "threaded-resolver") - set(ASYN_DNS_UNUSED "ares") - set(ASYN_DNS_PATH "") set(ENABLE_ARES "OFF") - set(CMAKE_FIND_ROOT_PATH "") - endif() - - set(ENABLED_DNS_OPT "--enable-${ASYN_DNS_USED}${ASYN_DNS_PATH}") - set(DISABLED_DNS_OPT "--disable-${ASYN_DSN_UNUSED}") - - # Pass -isysroot= option on Mac OS to a preprocessor - # and a C compiler to find header files installed with an SDK. - # - # The idea here is to don't pass all compiler/linker options - # that is set for tarantool, but only a subset that is - # necessary for choosen toolchain, and let curl's configure - # script set options that are appropriate for libcurl. - set(LIBCURL_CPPFLAGS "") - set(LIBCURL_CFLAGS "") - if (TARGET_OS_DARWIN AND NOT "${CMAKE_OSX_SYSROOT}" STREQUAL "") - set(LIBCURL_CPPFLAGS "${LIBCURL_CPPFLAGS} ${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}") - set(LIBCURL_CFLAGS "${LIBCURL_CFLAGS} ${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}") endif() + list(APPEND LIBCURL_CMAKE_FLAGS "-DENABLE_ARES=${ENABLE_ARES}") + + # switch off the group of protocols with special flag HTTP_ONLY: + # ftp, file, ldap, ldaps, rtsp, dict, telnet, tftp, pop3, imap, smtp + list(APPEND LIBCURL_CMAKE_FLAGS "-DHTTP_ONLY=ON") + + # additionaly disable some more protocols + list(APPEND LIBCURL_CMAKE_FLAGS "-DCURL_DISABLE_SMB=ON") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCURL_DISABLE_GOPHER=ON") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCURL_DISABLE_CRYPTO_AUTH=ON") + + # switch on ca-fallback feature + list(APPEND LIBCURL_CMAKE_FLAGS "-DCURL_CA_FALLBACK=ON") + + # Even though we set the external project's install dir + # below, we still need to pass the corresponding install + # prefix via cmake arguments. + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_INSTALL_PREFIX=${LIBCURL_INSTALL_DIR}") + + # The default values for the options below are not always + # "./lib", "./bin" and "./include", while curl expects them + # to be. + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_INSTALL_LIBDIR=lib") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_INSTALL_INCLUDEDIR=include") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_INSTALL_BINDIR=bin") + + # Pass the same toolchain as is used to build tarantool itself, + # because they can be incompatible. + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_LINKER=${CMAKE_LINKER}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_AR=${CMAKE_AR}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_RANLIB=${CMAKE_RANLIB}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_NM=${CMAKE_NM}") + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_STRIP=${CMAKE_STRIP}") + + # found that on FreeBSD 12 this setup is needed for app/socket.test.lua + list(APPEND LIBCURL_CMAKE_FLAGS "-DLDFLAGS=") + + # In hardened mode, which enables -fPIE by default, + # the cmake checks don't work without -fPIC. + list(APPEND LIBCURL_CMAKE_FLAGS "-DCMAKE_REQUIRED_FLAGS=-fPIC") include(ExternalProject) - if(${CMAKE_MAJOR_VERSION} VERSION_LESS "3") - ExternalProject_Add( - bundled-libcurl-project - SOURCE_DIR ${LIBCURL_SOURCE_DIR} - PREFIX ${LIBCURL_INSTALL_DIR} - DOWNLOAD_DIR ${LIBCURL_BINARY_DIR} - TMP_DIR ${LIBCURL_BINARY_DIR}/tmp - STAMP_DIR ${LIBCURL_BINARY_DIR}/stamp - BINARY_DIR ${LIBCURL_BINARY_DIR} - CONFIGURE_COMMAND - cd && ./buildconf && - cd && /configure - # Pass the same toolchain as is used to build - # tarantool itself, because they can be - # incompatible. - CC=${CMAKE_C_COMPILER} - LD=${CMAKE_LINKER} - AR=${CMAKE_AR} - RANLIB=${CMAKE_RANLIB} - NM=${CMAKE_NM} - STRIP=${CMAKE_STRIP} - - # Pass -isysroot= option on Mac OS, see - # above. - # Note: Passing of CPPFLAGS / CFLAGS explicitly - # discards using of corresponsing environment - # variables. - CPPFLAGS=${LIBCURL_CPPFLAGS} - CFLAGS=${LIBCURL_CFLAGS} - - # Pass empty LDFLAGS to discard using of - # corresponding environment variable. - # It is possible that a linker flag assumes that - # some compilation flag is set. We don't pass - # CFLAGS from environment, so we should not do it - # for LDFLAGS too. - LDFLAGS= - - --prefix - --enable-static - --enable-shared - - --with-zlib - ${LIBCURL_OPENSSL_OPT} - --with-ca-fallback - - --without-brotli - --without-gnutls - --without-mbedtls - --without-cyassl - --without-wolfssl - --without-mesalink - --without-nss - --without-ca-bundle - --without-ca-path - --without-libpsl - --without-libmetalink - --without-librtmp - --without-winidn - --without-libidn2 - --without-nghttp2 - --without-ngtcp2 - --without-nghttp3 - --without-quiche - --without-zsh-functions-dir - --without-fish-functions-dir - - ${ENABLED_DNS_OPT} - --enable-http - --enable-proxy - --enable-ipv6 - --enable-unix-sockets - --enable-cookies - --enable-http-auth - --enable-mime - --enable-dateparse - - ${DISABLED_DNS_OPT} - --disable-ftp - --disable-file - --disable-ldap - --disable-ldaps - --disable-rtsp - --disable-dict - --disable-telnet - --disable-tftp - --disable-pop3 - --disable-imap - --disable-smb - --disable-smtp - --disable-gopher - --disable-manual - --disable-sspi - --disable-crypto-auth - --disable-ntlm-wb - --disable-tls-srp - --disable-doh - --disable-netrc - --disable-progress-meter - --disable-dnsshuffle - --disable-alt-svc - BUILD_COMMAND cd && $(MAKE) - INSTALL_COMMAND cd && $(MAKE) install) - else() - ExternalProject_Add( - bundled-libcurl-project - SOURCE_DIR ${LIBCURL_SOURCE_DIR} - PREFIX ${LIBCURL_INSTALL_DIR} - DOWNLOAD_DIR ${LIBCURL_BINARY_DIR} - TMP_DIR ${LIBCURL_BINARY_DIR}/tmp - STAMP_DIR ${LIBCURL_BINARY_DIR}/stamp - BINARY_DIR ${LIBCURL_BINARY_DIR}/curl - CONFIGURE_COMMAND - cd && cmake - -DCPPFLAGS=${LIBCURL_CPPFLAGS} - -DCFLAGS=${LIBCURL_CFLAGS} - -DLDFLAGS= - -DCMAKE_INSTALL_LIBDIR=lib - -DCMAKE_INSTALL_PREFIX= - -DBUILD_TESTING=OFF - -DCURL_STATICLIB=ON - -DBUILD_SHARED_LIBS=OFF - -DCMAKE_USE_OPENSSL=ON - -DOPENSSL_ROOT_DIR=${FOUND_OPENSSL_ROOT_DIR} - -DCURL_CA_FALLBACK=ON - -DCMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH} - -DENABLE_ARES=${ENABLE_ARES} - -DHTTP_ONLY=ON - -DCURL_DISABLE_SMB=ON - -DCURL_DISABLE_GOPHER=ON - -DCURL_DISABLE_CRYPTO_AUTH=ON - BUILD_COMMAND cd && $(MAKE) -j - INSTALL_COMMAND cd && $(MAKE) install) - endif() + ExternalProject_Add( + bundled-libcurl-project + SOURCE_DIR ${LIBCURL_SOURCE_DIR} + PREFIX ${LIBCURL_INSTALL_DIR} + DOWNLOAD_DIR ${LIBCURL_BINARY_DIR} + TMP_DIR ${LIBCURL_BINARY_DIR}/tmp + STAMP_DIR ${LIBCURL_BINARY_DIR}/stamp + BINARY_DIR ${LIBCURL_BINARY_DIR}/curl + CONFIGURE_COMMAND + cd && cmake + ${LIBCURL_CMAKE_FLAGS} + BUILD_COMMAND cd && $(MAKE) -j + INSTALL_COMMAND cd && $(MAKE) install) add_library(bundled-libcurl STATIC IMPORTED GLOBAL) set_target_properties(bundled-libcurl PROPERTIES IMPORTED_LOCATION @@ -206,13 +122,6 @@ macro(curl_build) set(CURL_LIBRARIES ${CURL_LIBRARIES} rt) endif() - unset(ASYN_DNS_USED) - unset(ASYN_DNS_UNUSED) - unset(ASYN_DNS_PATH) - unset(ENABLED_DNS_OPT) - unset(DISABLED_DNS_OPT) - unset(LIBCURL_CPPFLAGS) - unset(LIBCURL_CFLAGS) unset(FOUND_OPENSSL_ROOT_DIR) unset(LIBCURL_INSTALL_DIR) unset(LIBCURL_BINARY_DIR) -- 2.17.1