[Tarantool-patches] [PATCH v2 5/7] build: change autoconf to cmake in curl build

Alexander V. Tikhonov avtikhon at tarantool.org
Tue May 26 17:42:36 MSK 2020


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=<SDK_PATH> 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 <SOURCE_DIR> && ./buildconf &&
-                cd <BINARY_DIR> && <SOURCE_DIR>/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=<SDK_PATH> 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 <INSTALL_DIR>
-                    --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 <BINARY_DIR> && $(MAKE)
-            INSTALL_COMMAND cd <BINARY_DIR> && $(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 <BINARY_DIR> && cmake <SOURCE_DIR>
-                    -DCPPFLAGS=${LIBCURL_CPPFLAGS}
-                    -DCFLAGS=${LIBCURL_CFLAGS}
-                    -DLDFLAGS=
-                    -DCMAKE_INSTALL_LIBDIR=lib
-                    -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-                    -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 <BINARY_DIR> && $(MAKE) -j
-            INSTALL_COMMAND cd <BINARY_DIR> && $(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 <BINARY_DIR> && cmake <SOURCE_DIR>
+                ${LIBCURL_CMAKE_FLAGS}
+        BUILD_COMMAND cd <BINARY_DIR> && $(MAKE) -j
+        INSTALL_COMMAND cd <BINARY_DIR> && $(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



More information about the Tarantool-patches mailing list