[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