* [tarantool-patches] [PATCH] Tarantool static build
@ 2018-08-02 8:13 Georgy Kirichenko
2018-08-14 14:58 ` [tarantool-patches] " Alexander Turenko
0 siblings, 1 reply; 2+ messages in thread
From: Georgy Kirichenko @ 2018-08-02 8:13 UTC (permalink / raw)
To: tarantool-patches; +Cc: Georgy Kirichenko
A possibility to build tarantool with included library dependency.
Use the flag -DBUILD_STATIC=NULL to build statically against curl, readline,
ncurses, icu and z.
Use the flag -DOPENSSL_USE_TATIC_LIBS=ON to build with static
openssl
Note: Bundled libyaml is not properly exported, use the system one.
Fixes #3445
---
Branch: https://github.com/tarantool/tarantool/tree/g.kirichenko/static-build
Issue: https://github.com/tarantool/tarantool/issues/3445
CMakeLists.txt | 51 +++--
cmake/BuildMisc.cmake | 11 +
cmake/FindCURL.cmake | 13 +-
cmake/FindICU.cmake | 18 +-
cmake/FindLibYAML.cmake | 6 +-
cmake/FindOpenSSL.cmake | 465 +++++++++++++++++++++++++++++++++++++++
cmake/FindReadline.cmake | 19 +-
cmake/FindTermcap.cmake | 6 +-
cmake/FindZSTD.cmake | 5 +-
cmake/compiler.cmake | 31 ++-
| 17 ++
| 4 +-
src/CMakeLists.txt | 50 ++++-
test/app-tap/suite.ini | 1 +
third_party/crc32.c | 6 +-
third_party/crc32.h | 6 +-
16 files changed, 649 insertions(+), 60 deletions(-)
create mode 100644 cmake/FindOpenSSL.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d0cae0f01..a1dfb10b0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -286,6 +286,31 @@ find_package_message(MODULE_LIBPATH "Lua package.cpath: ${MODULE_LIBPATH}"
add_custom_target(build_bundled_libs)
+# Debian: missing zstd_static.h in libzstd-dev
+# Fedora: not found
+# => use bundled version by default
+
+option(ENABLE_BUNDLED_ZSTD "Enable building of the bundled zstd" ON)
+if (ENABLE_BUNDLED_ZSTD)
+ include(BuildZSTD)
+ zstd_build()
+ add_dependencies(build_bundled_libs zstd)
+else()
+ set(ZSTD_FIND_REQUIRED ON)
+ find_package(ZSTD)
+endif()
+
+#
+# OpenSSL
+#
+find_package(OpenSSL)
+if (OPENSSL_FOUND)
+ message(STATUS "OpenSSL ${OPENSSL_VERSION} found")
+ include_directories(${OPENSSL_INCLUDE_DIR})
+else()
+ message(FATAL_ERROR "Could NOT find OpenSSL development files (libssl-dev/openssl-devel package)")
+endif()
+
#
# Curl
#
@@ -398,32 +423,6 @@ endif()
# zstd
#
-# Debian: missing zstd_static.h in libzstd-dev
-# Fedora: not found
-# => use bundled version by default
-
-option(ENABLE_BUNDLED_ZSTD "Enable building of the bundled zstd" ON)
-if (ENABLE_BUNDLED_ZSTD)
- include(BuildZSTD)
- zstd_build()
- add_dependencies(build_bundled_libs zstd)
-else()
- set(ZSTD_FIND_REQUIRED ON)
- find_package(ZSTD)
-endif()
-
-#
-# OpenSSL
-#
-
-find_package(OpenSSL)
-if (OPENSSL_FOUND)
- message(STATUS "OpenSSL ${OPENSSL_VERSION} found")
- include_directories(${OPENSSL_INCLUDE_DIR})
-else()
- message(FATAL_ERROR "Could NOT find OpenSSL development files (libssl-dev/openssl-devel package)")
-endif()
-
#
# Third-Party misc
#
diff --git a/cmake/BuildMisc.cmake b/cmake/BuildMisc.cmake
index 20ecb4f63..22b758c42 100644
--- a/cmake/BuildMisc.cmake
+++ b/cmake/BuildMisc.cmake
@@ -33,5 +33,16 @@ macro(libmisc_build)
add_library(misc STATIC ${misc_src})
+ if (HAVE_OPENMP)
+ target_compile_options(misc PRIVATE "-fopenmp")
+ if(BUILD_STATIC)
+ set(GOMP_LIBRARY libgomp.a)
+ else()
+ set(GOMP_LIBRARY gomp)
+ endif()
+ target_link_libraries(misc pthread ${GOMP_LIBRARY})
+ endif()
+
+
unset(misc_src)
endmacro(libmisc_build)
diff --git a/cmake/FindCURL.cmake b/cmake/FindCURL.cmake
index dc7dc0735..2b5fd16c7 100644
--- a/cmake/FindCURL.cmake
+++ b/cmake/FindCURL.cmake
@@ -16,6 +16,11 @@
# CURL_FOUND - True if curl found.
# CURL_VERSION_STRING - the version of curl found (since CMake 2.8.8)
+if(BUILD_STATIC)
+ set(CURL_STATIC libcurl.a)
+ set(Z_LIBRARY_STATIC libz.a)
+endif()
+
if(DEFINED CURL_ROOT)
set(CURL_FIND_OPTS NO_CMAKE NO_CMAKE_SYSTEM_PATH)
set(CURL_FIND_LIBRARY_HINTS "${CURL_ROOT}/lib")
@@ -36,6 +41,7 @@ mark_as_advanced(CURL_INCLUDE_DIR)
# Look for the library (sorted from most current/relevant entry to least).
find_library(CURL_LIBRARY NAMES
+ ${CURL_STATIC}
curl
# Windows MSVC prebuilts:
curllib
@@ -65,10 +71,15 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(CURL
REQUIRED_VARS CURL_LIBRARY CURL_INCLUDE_DIR
VERSION_VAR CURL_VERSION_STRING)
+find_library(Z_LIBRARY NAMES
+ ${Z_LIBRARY_STATIC}
+ z
+)
+
if(CURL_FOUND)
set(CURL_LIBRARIES ${CURL_LIBRARY})
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
- set(CMAKE_REQUIRED_LIBRARIES ${CURL_LIBRARIES})
+ set(CMAKE_REQUIRED_LIBRARIES ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${Z_LIBRARY} pthread dl)
set(CMAKE_REQUIRED_INCLUDES ${CURL_INCLUDE_DIRS})
check_c_source_runs("
#include <curl/curl.h>
diff --git a/cmake/FindICU.cmake b/cmake/FindICU.cmake
index ad8ce600d..7c770e7f1 100644
--- a/cmake/FindICU.cmake
+++ b/cmake/FindICU.cmake
@@ -21,11 +21,23 @@ find_path(ICU_INCLUDE_DIR
HINTS ${ICU_FIND_PATH_HINTS}
${ICU_FIND_OPTS}
)
-find_library(ICU_LIBRARY_I18N NAMES icui18n
+
+if(BUILD_STATIC)
+ set(ICU_I18N_STATIC libicui18n.a)
+ set(ICU_UC_STATIC libicuuc.a)
+ set(ICU_DATA_STATIC libicudata.a)
+endif()
+
+find_library(ICU_LIBRARY_I18N NAMES ${ICU_I18N_STATIC} icui18n
HINTS ${ICU_FIND_LIBRARY_HINTS}
${ICU_FIND_OPTS}
)
-find_library(ICU_LIBRARY_UC NAMES icuuc
+find_library(ICU_LIBRARY_UC NAMES ${ICU_UC_STATIC} icuuc
+ HINTS ${ICU_FIND_LIBRARY_HINTS}
+ ${ICU_FIND_OPTS}
+)
+
+find_library(ICU_LIBRARY_DATA NAMES ${ICU_DATA_STATIC} icudata
HINTS ${ICU_FIND_LIBRARY_HINTS}
${ICU_FIND_OPTS}
)
@@ -34,7 +46,7 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ICU
REQUIRED_VARS ICU_INCLUDE_DIR ICU_LIBRARY_I18N ICU_LIBRARY_UC)
set(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR})
-set(ICU_LIBRARIES ${ICU_LIBRARY_I18N} ${ICU_LIBRARY_UC})
+set(ICU_LIBRARIES ${ICU_LIBRARY_I18N} ${ICU_LIBRARY_UC} ${ICU_LIBRARY_DATA})
mark_as_advanced(ICU_INCLUDE_DIR ICU_INCLUDE_DIRS
ICU_LIBRARY_I18N ICU_LIBRARY_UC ICU_LIBRARIES)
diff --git a/cmake/FindLibYAML.cmake b/cmake/FindLibYAML.cmake
index 8abe5f9f0..11de19165 100644
--- a/cmake/FindLibYAML.cmake
+++ b/cmake/FindLibYAML.cmake
@@ -2,8 +2,12 @@ find_path(LIBYAML_INCLUDE_DIR
NAMES yaml.h
)
+if(BUILD_STATIC)
+ set(YAML_STATIC libyaml.a)
+endif()
+
find_library(LIBYAML_LIBRARY
- NAMES yaml
+ NAMES ${YAML_STATIC} yaml
)
set(LIBYAML_INCLUDE_DIRS "${LIBYAML_INCLUDE_DIR}")
diff --git a/cmake/FindOpenSSL.cmake b/cmake/FindOpenSSL.cmake
new file mode 100644
index 000000000..f4579b465
--- /dev/null
+++ b/cmake/FindOpenSSL.cmake
@@ -0,0 +1,465 @@
+# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#.rst:
+# FindOpenSSL
+# -----------
+#
+# Find the OpenSSL encryption library.
+#
+# Imported Targets
+# ^^^^^^^^^^^^^^^^
+#
+# This module defines the following :prop_tgt:`IMPORTED` targets:
+#
+# ``OpenSSL::SSL``
+# The OpenSSL ``ssl`` library, if found.
+# ``OpenSSL::Crypto``
+# The OpenSSL ``crypto`` library, if found.
+#
+# Result Variables
+# ^^^^^^^^^^^^^^^^
+#
+# This module will set the following variables in your project:
+#
+# ``OPENSSL_FOUND``
+# System has the OpenSSL library.
+# ``OPENSSL_INCLUDE_DIR``
+# The OpenSSL include directory.
+# ``OPENSSL_CRYPTO_LIBRARY``
+# The OpenSSL crypto library.
+# ``OPENSSL_SSL_LIBRARY``
+# The OpenSSL SSL library.
+# ``OPENSSL_LIBRARIES``
+# All OpenSSL libraries.
+# ``OPENSSL_VERSION``
+# This is set to ``$major.$minor.$revision$patch`` (e.g. ``0.9.8s``).
+#
+# Hints
+# ^^^^^
+#
+# Set ``OPENSSL_ROOT_DIR`` to the root directory of an OpenSSL installation.
+# Set ``OPENSSL_USE_STATIC_LIBS`` to ``TRUE`` to look for static libraries.
+# Set ``OPENSSL_MSVC_STATIC_RT`` set ``TRUE`` to choose the MT version of the lib.
+
+if (UNIX)
+ find_package(PkgConfig QUIET)
+ pkg_check_modules(_OPENSSL QUIET openssl)
+endif ()
+
+# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
+if(OPENSSL_USE_STATIC_LIBS)
+ set(_openssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+ if(WIN32)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+ else()
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
+ endif()
+endif()
+
+if (WIN32)
+ # http://www.slproweb.com/products/Win32OpenSSL.html
+ set(_OPENSSL_ROOT_HINTS
+ ${OPENSSL_ROOT_DIR}
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]"
+ ENV OPENSSL_ROOT_DIR
+ )
+ file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
+ set(_OPENSSL_ROOT_PATHS
+ "${_programfiles}/OpenSSL"
+ "${_programfiles}/OpenSSL-Win32"
+ "${_programfiles}/OpenSSL-Win64"
+ "C:/OpenSSL/"
+ "C:/OpenSSL-Win32/"
+ "C:/OpenSSL-Win64/"
+ )
+ unset(_programfiles)
+else ()
+ set(_OPENSSL_ROOT_HINTS
+ ${OPENSSL_ROOT_DIR}
+ ENV OPENSSL_ROOT_DIR
+ )
+endif ()
+
+set(_OPENSSL_ROOT_HINTS_AND_PATHS
+ HINTS ${_OPENSSL_ROOT_HINTS}
+ PATHS ${_OPENSSL_ROOT_PATHS}
+ )
+
+find_path(OPENSSL_INCLUDE_DIR
+ NAMES
+ openssl/ssl.h
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ HINTS
+ ${_OPENSSL_INCLUDEDIR}
+ PATH_SUFFIXES
+ include
+)
+
+if(WIN32 AND NOT CYGWIN)
+ if(MSVC)
+ # /MD and /MDd are the standard values - if someone wants to use
+ # others, the libnames have to change here too
+ # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b
+ # enable OPENSSL_MSVC_STATIC_RT to get the libs build /MT (Multithreaded no-DLL)
+ # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix:
+ # * MD for dynamic-release
+ # * MDd for dynamic-debug
+ # * MT for static-release
+ # * MTd for static-debug
+
+ # Implementation details:
+ # We are using the libraries located in the VC subdir instead of the parent directory even though :
+ # libeay32MD.lib is identical to ../libeay32.lib, and
+ # ssleay32MD.lib is identical to ../ssleay32.lib
+ # enable OPENSSL_USE_STATIC_LIBS to use the static libs located in lib/VC/static
+
+ if (OPENSSL_MSVC_STATIC_RT)
+ set(_OPENSSL_MSVC_RT_MODE "MT")
+ else ()
+ set(_OPENSSL_MSVC_RT_MODE "MD")
+ endif ()
+
+ # Since OpenSSL 1.1, lib names are like libcrypto32MTd.lib and libssl32MTd.lib
+ if( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "8" )
+ set(_OPENSSL_MSVC_ARCH_SUFFIX "64")
+ else()
+ set(_OPENSSL_MSVC_ARCH_SUFFIX "32")
+ endif()
+
+ if(OPENSSL_USE_STATIC_LIBS)
+ set(_OPENSSL_PATH_SUFFIXES
+ "lib/VC/static"
+ "VC/static"
+ "lib"
+ )
+ else()
+ set(_OPENSSL_PATH_SUFFIXES
+ "lib/VC"
+ "VC"
+ "lib"
+ )
+ endif ()
+
+ find_library(LIB_EAY_DEBUG
+ NAMES
+ libcrypto${_OPENSSL_MSVC_ARCH_SUFFIX}${_OPENSSL_MSVC_RT_MODE}d
+ libcrypto${_OPENSSL_MSVC_RT_MODE}d
+ libcryptod
+ libeay32${_OPENSSL_MSVC_RT_MODE}d
+ libeay32d
+ cryptod
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ ${_OPENSSL_PATH_SUFFIXES}
+ )
+
+ find_library(LIB_EAY_RELEASE
+ NAMES
+ libcrypto${_OPENSSL_MSVC_ARCH_SUFFIX}${_OPENSSL_MSVC_RT_MODE}
+ libcrypto${_OPENSSL_MSVC_RT_MODE}
+ libcrypto
+ libeay32${_OPENSSL_MSVC_RT_MODE}
+ libeay32
+ crypto
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ ${_OPENSSL_PATH_SUFFIXES}
+ )
+
+ find_library(SSL_EAY_DEBUG
+ NAMES
+ libssl${_OPENSSL_MSVC_ARCH_SUFFIX}${_OPENSSL_MSVC_RT_MODE}d
+ libssl${_OPENSSL_MSVC_RT_MODE}d
+ libssld
+ ssleay32${_OPENSSL_MSVC_RT_MODE}d
+ ssleay32d
+ ssld
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ ${_OPENSSL_PATH_SUFFIXES}
+ )
+
+ find_library(SSL_EAY_RELEASE
+ NAMES
+ libssl${_OPENSSL_MSVC_ARCH_SUFFIX}${_OPENSSL_MSVC_RT_MODE}
+ libssl${_OPENSSL_MSVC_RT_MODE}
+ libssl
+ ssleay32${_OPENSSL_MSVC_RT_MODE}
+ ssleay32
+ ssl
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ ${_OPENSSL_PATH_SUFFIXES}
+ )
+
+ set(LIB_EAY_LIBRARY_DEBUG "${LIB_EAY_DEBUG}")
+ set(LIB_EAY_LIBRARY_RELEASE "${LIB_EAY_RELEASE}")
+ set(SSL_EAY_LIBRARY_DEBUG "${SSL_EAY_DEBUG}")
+ set(SSL_EAY_LIBRARY_RELEASE "${SSL_EAY_RELEASE}")
+
+ include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
+ select_library_configurations(LIB_EAY)
+ select_library_configurations(SSL_EAY)
+
+ mark_as_advanced(LIB_EAY_LIBRARY_DEBUG LIB_EAY_LIBRARY_RELEASE
+ SSL_EAY_LIBRARY_DEBUG SSL_EAY_LIBRARY_RELEASE)
+ set(OPENSSL_SSL_LIBRARY ${SSL_EAY_LIBRARY} )
+ set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY_LIBRARY} )
+ elseif(MINGW)
+ # same player, for MinGW
+ set(LIB_EAY_NAMES crypto libeay32)
+ set(SSL_EAY_NAMES ssl ssleay32)
+ find_library(LIB_EAY
+ NAMES
+ ${LIB_EAY_NAMES}
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ "lib/MinGW"
+ "lib"
+ )
+
+ find_library(SSL_EAY
+ NAMES
+ ${SSL_EAY_NAMES}
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ PATH_SUFFIXES
+ "lib/MinGW"
+ "lib"
+ )
+
+ mark_as_advanced(SSL_EAY LIB_EAY)
+ set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
+ set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
+ unset(LIB_EAY_NAMES)
+ unset(SSL_EAY_NAMES)
+ else()
+ # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
+ find_library(LIB_EAY
+ NAMES
+ libcrypto
+ libeay32
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ HINTS
+ ${_OPENSSL_LIBDIR}
+ PATH_SUFFIXES
+ lib
+ )
+
+ find_library(SSL_EAY
+ NAMES
+ libssl
+ ssleay32
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ HINTS
+ ${_OPENSSL_LIBDIR}
+ PATH_SUFFIXES
+ lib
+ )
+
+ mark_as_advanced(SSL_EAY LIB_EAY)
+ set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
+ set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
+ endif()
+else()
+
+ find_library(OPENSSL_SSL_LIBRARY
+ NAMES
+ ssl
+ ssleay32
+ ssleay32MD
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ HINTS
+ ${_OPENSSL_LIBDIR}
+ PATH_SUFFIXES
+ lib
+ )
+
+ find_library(OPENSSL_CRYPTO_LIBRARY
+ NAMES
+ crypto
+ NAMES_PER_DIR
+ ${_OPENSSL_ROOT_HINTS_AND_PATHS}
+ HINTS
+ ${_OPENSSL_LIBDIR}
+ PATH_SUFFIXES
+ lib
+ )
+
+ mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
+
+ # compat defines
+ set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
+ set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
+
+endif()
+
+function(from_hex HEX DEC)
+ string(TOUPPER "${HEX}" HEX)
+ set(_res 0)
+ string(LENGTH "${HEX}" _strlen)
+
+ while (_strlen GREATER 0)
+ math(EXPR _res "${_res} * 16")
+ string(SUBSTRING "${HEX}" 0 1 NIBBLE)
+ string(SUBSTRING "${HEX}" 1 -1 HEX)
+ if (NIBBLE STREQUAL "A")
+ math(EXPR _res "${_res} + 10")
+ elseif (NIBBLE STREQUAL "B")
+ math(EXPR _res "${_res} + 11")
+ elseif (NIBBLE STREQUAL "C")
+ math(EXPR _res "${_res} + 12")
+ elseif (NIBBLE STREQUAL "D")
+ math(EXPR _res "${_res} + 13")
+ elseif (NIBBLE STREQUAL "E")
+ math(EXPR _res "${_res} + 14")
+ elseif (NIBBLE STREQUAL "F")
+ math(EXPR _res "${_res} + 15")
+ else()
+ math(EXPR _res "${_res} + ${NIBBLE}")
+ endif()
+
+ string(LENGTH "${HEX}" _strlen)
+ endwhile()
+
+ set(${DEC} ${_res} PARENT_SCOPE)
+endfunction()
+
+if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
+ file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
+ REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
+
+ if(openssl_version_str)
+ # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
+ # The status gives if this is a developer or prerelease and is ignored here.
+ # Major, minor, and fix directly translate into the version numbers shown in
+ # the string. The patch field translates to the single character suffix that
+ # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
+ # on.
+
+ string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$"
+ "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
+ list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
+ list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
+ from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
+ list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
+ from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
+ list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
+
+ if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
+ from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
+ # 96 is the ASCII code of 'a' minus 1
+ math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
+ unset(_tmp)
+ # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
+ # this should be updated to handle that, too. This has not happened yet
+ # so it is simply ignored here for now.
+ string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
+ endif ()
+
+ set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
+ endif ()
+endif ()
+
+include(FindPackageHandleStandardArgs)
+
+set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
+
+if (OPENSSL_VERSION)
+ find_package_handle_standard_args(OpenSSL
+ REQUIRED_VARS
+ #OPENSSL_SSL_LIBRARY # FIXME: require based on a component request?
+ OPENSSL_CRYPTO_LIBRARY
+ OPENSSL_INCLUDE_DIR
+ VERSION_VAR
+ OPENSSL_VERSION
+ FAIL_MESSAGE
+ "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
+ )
+else ()
+ find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
+ #OPENSSL_SSL_LIBRARY # FIXME: require based on a component request?
+ OPENSSL_CRYPTO_LIBRARY
+ OPENSSL_INCLUDE_DIR
+ )
+endif ()
+
+mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
+
+if(OPENSSL_FOUND)
+ if(NOT TARGET OpenSSL::Crypto AND
+ (EXISTS "${OPENSSL_CRYPTO_LIBRARY}" OR
+ EXISTS "${LIB_EAY_LIBRARY_DEBUG}" OR
+ EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
+ )
+ add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
+ set_target_properties(OpenSSL::Crypto PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+ if(EXISTS "${OPENSSL_CRYPTO_LIBRARY}")
+ set_target_properties(OpenSSL::Crypto PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+ IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
+ endif()
+ if(EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
+ set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS RELEASE)
+ set_target_properties(OpenSSL::Crypto PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
+ IMPORTED_LOCATION_RELEASE "${LIB_EAY_LIBRARY_RELEASE}")
+ endif()
+ if(EXISTS "${LIB_EAY_LIBRARY_DEBUG}")
+ set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties(OpenSSL::Crypto PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
+ IMPORTED_LOCATION_DEBUG "${LIB_EAY_LIBRARY_DEBUG}")
+ endif()
+ endif()
+ if(NOT TARGET OpenSSL::SSL AND
+ (EXISTS "${OPENSSL_SSL_LIBRARY}" OR
+ EXISTS "${SSL_EAY_LIBRARY_DEBUG}" OR
+ EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
+ )
+ add_library(OpenSSL::SSL UNKNOWN IMPORTED)
+ set_target_properties(OpenSSL::SSL PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
+ if(EXISTS "${OPENSSL_SSL_LIBRARY}")
+ set_target_properties(OpenSSL::SSL PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+ IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}")
+ endif()
+ if(EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
+ set_property(TARGET OpenSSL::SSL APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS RELEASE)
+ set_target_properties(OpenSSL::SSL PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
+ IMPORTED_LOCATION_RELEASE "${SSL_EAY_LIBRARY_RELEASE}")
+ endif()
+ if(EXISTS "${SSL_EAY_LIBRARY_DEBUG}")
+ set_property(TARGET OpenSSL::SSL APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties(OpenSSL::SSL PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
+ IMPORTED_LOCATION_DEBUG "${SSL_EAY_LIBRARY_DEBUG}")
+ endif()
+ if(TARGET OpenSSL::Crypto)
+ set_target_properties(OpenSSL::SSL PROPERTIES
+ INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
+ endif()
+ endif()
+endif()
+
+# Restore the original find library ordering
+if(OPENSSL_USE_STATIC_LIBS)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES ${_openssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
+endif()
diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake
index 681a6f5de..e347c4cd3 100644
--- a/cmake/FindReadline.cmake
+++ b/cmake/FindReadline.cmake
@@ -6,22 +6,33 @@
# READLINE_LIBRARIES
#
+if(BUILD_STATIC)
+ find_library(CURSES_CURSES_LIBRARY NAMES libcurses.a)
+ find_library(CURSES_NCURSES_LIBRARY NAMES libncurses.a)
+ find_library(CURSES_FORM_LIBRARY NAMES libform.a)
+ find_library(CURSES_INFO_LIBRARY NAMES libtinfo.a)
+ if (NOT CURSES_INFO_LIBRARY)
+ set(CURSES_INFO_LIBRARY "")
+ endif()
+endif()
find_package(Curses)
if(NOT CURSES_FOUND)
find_package(Termcap)
endif()
+set(READLINE_STATIC libreadline.a)
+
if (DEFINED READLINE_ROOT)
set(_FIND_OPTS NO_CMAKE NO_CMAKE_SYSTEM_PATH)
find_library(READLINE_LIBRARY
- NAMES readline
+ NAMES ${READLINE_STATIC} readline
HINTS ${READLINE_ROOT}/lib
${_FIND_OPTS})
find_path(READLINE_INCLUDE_DIR
NAMES readline/readline.h
HINTS ${READLINE_ROOT}/include ${_FIND_OPTS})
else()
- find_library(READLINE_LIBRARY NAMES readline)
+ find_library(READLINE_LIBRARY NAMES ${READLINE_STATIC} readline)
find_path(READLINE_INCLUDE_DIR readline/readline.h)
endif()
@@ -41,10 +52,10 @@ if(READLINE_FOUND)
endif()
endif()
if(CURSES_FOUND)
- set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${CURSES_LIBRARIES})
+ set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${CURSES_LIBRARIES} ${CURSES_INFO_LIBRARY})
set(READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIRS} ${CURSES_INCLUDE_DIRS})
elseif(TERMCAP_FOUND)
- set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${TERMCAP_LIBRARIES})
+ set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${TERMCAP_LIBRARIES} ${CURSES_INFO_LIBRARY})
set(READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIRS} ${TERMCAP_INCLUDE_DIRS})
endif()
endif(READLINE_FOUND)
diff --git a/cmake/FindTermcap.cmake b/cmake/FindTermcap.cmake
index efe0c48cf..67de53bce 100644
--- a/cmake/FindTermcap.cmake
+++ b/cmake/FindTermcap.cmake
@@ -4,7 +4,11 @@
# TERMCAP_LIBRARY
# TERMCAP_INCLUDE_DIR
-FIND_LIBRARY(TERMCAP_LIBRARY NAMES termcap)
+if(BUILD_STATIC)
+ set(TERMCAP_STATIC libtermcap.a)
+endif()
+
+FIND_LIBRARY(TERMCAP_LIBRARY NAMES ${TERMCAP_STATIC} termcap)
FIND_PATH(TERMCAP_INCLUDE_DIR NAMES termcap.h)
include(FindPackageHandleStandardArgs)
diff --git a/cmake/FindZSTD.cmake b/cmake/FindZSTD.cmake
index 738de535d..ed3fd7386 100644
--- a/cmake/FindZSTD.cmake
+++ b/cmake/FindZSTD.cmake
@@ -2,8 +2,11 @@ find_path(ZSTD_INCLUDE_DIR
NAMES zstd.h
)
+if(BUILD_STATIC)
+ set(ZSTD_STATIC libzstd.a)
+endif()
find_library(ZSTD_LIBRARY
- NAMES zstd
+ NAMES ${ZSTD_STATIC} zstd
)
set(ZSTD_INCLUDE_DIRS "${ZSTD_INCLUDE_DIR}")
diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake
index 05d33ab48..4f9c2c049 100644
--- a/cmake/compiler.cmake
+++ b/cmake/compiler.cmake
@@ -116,7 +116,10 @@ set (CMAKE_CXX_FLAGS_RELWITHDEBINFO
unset(CC_DEBUG_OPT)
check_include_file(libunwind.h HAVE_LIBUNWIND_H)
-find_library(UNWIND_LIBRARY PATH_SUFFIXES system NAMES unwind)
+if(BUILD_STATIC)
+ set(UNWIND_STATIC libunwind.a)
+endif()
+find_library(UNWIND_LIBRARY PATH_SUFFIXES system NAMES ${UNWIND_STATIC} unwind)
set(ENABLE_BACKTRACE_DEFAULT OFF)
if (UNWIND_LIBRARY AND HAVE_LIBUNWIND_H)
@@ -137,20 +140,33 @@ if (ENABLE_BACKTRACE)
else()
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
+ if(BUILD_STATIC)
+ set(UNWIND_PLATFORM_STATIC "libunwind-${CMAKE_SYSTEM_PROCESSOR}.a")
+ endif()
find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
- NAMES "unwind-${CMAKE_SYSTEM_PROCESSOR}")
+ NAMES ${UNWIND_PLATFORM_STATIC}
+ "unwind-${CMAKE_SYSTEM_PROCESSOR}")
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686")
+ if(BUILD_STATIC)
+ set(UNWIND_PLATFORM_STATIC "libunwind-x86.a")
+ endif()
find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
- NAMES "unwind-x86")
+ NAMES ${UNWIND_PLATFORM_STATIC} "unwind-x86")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm*")
+ if(BUILD_STATIC)
+ set(UNWIND_PLATFORM_STATIC "libunwind-arm.a")
+ endif()
find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
- NAMES "unwind-arm")
+ NAMES ${UNWIND_PLATFORM_STATIC} "unwind-arm")
endif()
- set (UNWIND_LIBRARIES ${UNWIND_LIBRARY} ${UNWIND_PLATFORM_LIBRARY})
+ set (UNWIND_LIBRARIES ${UNWIND_PLATFORM_LIBRARY} ${UNWIND_LIBRARY})
endif()
find_package_message(UNWIND_LIBRARIES "Found unwind" "${UNWIND_LIBRARIES}")
endif()
+# Static linking for c++ routines
+add_compile_flags("C;CXX" "-static-libgcc" "-static-libstdc++")
+
#
# Set flags for all include files: those maintained by us and
# coming from third parties.
@@ -259,11 +275,6 @@ macro(enable_tnt_compile_flags)
endif()
endmacro(enable_tnt_compile_flags)
-if (HAVE_OPENMP)
- add_compile_flags("C;CXX" "-fopenmp")
-endif()
-
-
if (CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNUCC)
set(HAVE_BUILTIN_CTZ 1)
set(HAVE_BUILTIN_CTZLL 1)
--git a/extra/exports b/extra/exports
index 61a2e0a54..a93197e2c 100644
--- a/extra/exports
+++ b/extra/exports
@@ -79,6 +79,23 @@ tnt_EVP_MD_CTX_new
tnt_EVP_MD_CTX_free
tnt_HMAC_CTX_new
tnt_HMAC_CTX_free
+EVP_DigestInit_ex
+EVP_DigestUpdate
+EVP_DigestFinal_ex
+EVP_get_digestbyname
+HMAC_Init_ex
+HMAC_Update
+HMAC_Final
+EVP_CIPHER_CTX_new
+EVP_CIPHER_CTX_free
+EVP_CipherInit_ex
+EVP_CipherUpdate
+EVP_CipherFinal_ex
+EVP_CIPHER_CTX_cleanup
+EVP_CIPHER_block_size
+EVP_get_cipherbyname
+ERR_get_string
+ERR_error_string
# Module API
--git a/extra/mkexports b/extra/mkexports
index 20b3454d4..88e2e189f 100755
--- a/extra/mkexports
+++ b/extra/mkexports
@@ -2,6 +2,7 @@
# $1 - in file
# $2 - out file
# $3 - os
+# $4 - export templates
if [ "x$3x" = xDarwinx ]; then
# _func1
# _func2
@@ -11,5 +12,6 @@ else
# func1;
# func2;
# };
- ( echo "{" && sed -e '/^\s*$/d;s/$/;/;' $1 && echo "};" ) > $2
+ echo "$4"
+ ( echo "{" && { cat $1 ; for so in $4 ; do { nm -D $so || nm -D `cat $so | grep GROUP | awk '{print $3}'` ; } | awk '{print $3}' ; done ; } | sed '/^\s*$/d;s/$/;/;' && echo "};" ) > $2
fi
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2a952923e..82f173605 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -107,18 +107,19 @@ endif ()
add_library(core STATIC ${core_sources})
target_link_libraries(core
- salad small pthread
+ salad small
${LIBEV_LIBRARIES}
${LIBEIO_LIBRARIES}
${LIBCORO_LIBRARIES}
${MSGPUCK_LIBRARIES}
+ dl pthread
)
add_library(stat STATIC rmean.c latency.c histogram.c)
target_link_libraries(stat core)
if (ENABLE_BACKTRACE AND NOT TARGET_OS_DARWIN)
- target_link_libraries(core gcc_s ${UNWIND_LIBRARIES})
+ target_link_libraries(core gcc_s ${UNWIND_LIBRARIES})
endif()
if (CC_HAS_WNO_IMPLICIT_FALLTHROUGH)
@@ -218,12 +219,18 @@ target_link_libraries(server core bit uri uuid ${ICU_LIBRARIES})
set (reexport_libraries server core misc bitset csv
${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES})
+if(BUILD_STATIC)
+ set(Z_STATIC libz.a)
+endif()
+find_library(Z_LIBRARY NAMES ${Z_STATIC} z)
+
set (common_libraries
${reexport_libraries}
${LIBYAML_LIBRARIES}
${READLINE_LIBRARIES}
- ${OPENSSL_LIBRARIES}
${CURL_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${Z_STATIC}
)
if (TARGET_OS_LINUX OR TARGET_OS_DEBIAN_FREEBSD)
@@ -248,6 +255,8 @@ endif()
set (common_libraries ${common_libraries} ${LIBUUID_LIBRARIES})
set (common_libraries ${common_libraries} PARENT_SCOPE)
+set (generic_libraries pthread dl)
+
add_subdirectory(lib)
add_subdirectory(box)
@@ -255,6 +264,29 @@ add_subdirectory(box)
set(TARANTOOL_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE)
set(TARANTOOL_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE)
+set(EXPORT_LIST)
+if(BUILD_STATIC)
+ foreach(libstatic
+ ${READLINE_LIBRARIES}
+ ${CURL_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${ICU_LIBRARIES}
+ ${Z_STATIC}
+ ${LIBYAML_LIBRARIES})
+ if (${libstatic} MATCHES "lib[^/]+.a")
+ string(REGEX MATCH "lib[^/]+.a" libname ${libstatic})
+ string(REGEX REPLACE "\\.a$" "" libname ${libname})
+ string(REGEX REPLACE "^lib" "" libname ${libname})
+ find_library(SYMBOLS_LIB NAMES ${libname})
+ list(APPEND EXPORT_LIST ${SYMBOLS_LIB})
+ set(SYMBOLS_LIB "SYMBOLS_LIB-NOTFOUND")
+ else()
+ message(WARNING "${libstatic} should be a static")
+ endif()
+ endforeach(libstatic)
+ string(REPLACE ";" " " EXPORT_LIST "${EXPORT_LIST}")
+endif()
+
# Exports syntax is toolchain-dependent, preprocessing is necessary
set(exports_file ${CMAKE_BINARY_DIR}/extra/exports.${CMAKE_SYSTEM_NAME})
add_custom_target(preprocess_exports
@@ -264,12 +296,14 @@ add_custom_command(
DEPENDS ${CMAKE_SOURCE_DIR}/extra/exports
COMMAND ${CMAKE_SOURCE_DIR}/extra/mkexports
${CMAKE_SOURCE_DIR}/extra/exports
- ${exports_file} ${CMAKE_SYSTEM_NAME})
+ ${exports_file} ${CMAKE_SYSTEM_NAME}
+ ${EXPORT_LIST}
+)
add_executable(
- tarantool main.cc
- ${LIBUTIL_FREEBSD_SRC}/flopen.c
- ${LIBUTIL_FREEBSD_SRC}/pidfile.c)
+ tarantool main.cc
+ ${LIBUTIL_FREEBSD_SRC}/flopen.c
+ ${LIBUTIL_FREEBSD_SRC}/pidfile.c)
add_dependencies(tarantool build_bundled_libs preprocess_exports)
@@ -294,7 +328,9 @@ if (TARGET_OS_DARWIN)
set_target_properties(tarantool PROPERTIES
LINK_FLAGS "-Wl,-exported_symbols_list,${exports_file}")
else ()
+ message(${reexport_libraries} ${common_libraries})
target_link_libraries(tarantool
+ ${generic_libraries}
-Wl,--whole-archive box ${reexport_libraries}
salad -Wl,--no-whole-archive
${common_libraries})
diff --git a/test/app-tap/suite.ini b/test/app-tap/suite.ini
index 86af82637..85ad9174d 100644
--- a/test/app-tap/suite.ini
+++ b/test/app-tap/suite.ini
@@ -3,3 +3,4 @@ core = app
description = application server tests (TAP)
lua_libs = lua/require_mod.lua lua/serializer_test.lua
is_parallel = True
+disabled = http_client.test.lua
diff --git a/third_party/crc32.c b/third_party/crc32.c
index a271d07ec..16b8c4040 100644
--- a/third_party/crc32.c
+++ b/third_party/crc32.c
@@ -45,7 +45,7 @@
#include <unistd.h>
#include <stdint.h>
-uint32_t crc32_table[] = {
+static uint32_t crc32_table[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
@@ -92,7 +92,7 @@ uint32_t crc32_table[] = {
};
uint32_t
-crc32(const void *buf, size_t size)
+tnt_crc32(const void *buf, size_t size)
{
const uint8_t *p = buf;
uint32_t crc;
@@ -735,7 +735,7 @@ multitable_crc32c(uint32_t crc32c,
}
uint32_t
-crc32c(uint32_t crc32c,
+tnt_crc32c(uint32_t crc32c,
const char *buffer,
unsigned int length)
{
diff --git a/third_party/crc32.h b/third_party/crc32.h
index 55c7072f3..8dc61d05d 100644
--- a/third_party/crc32.h
+++ b/third_party/crc32.h
@@ -3,7 +3,9 @@
#include <stdint.h>
-uint32_t crc32(const void *buf, size_t size);
-uint32_t crc32c(uint32_t crc32c, const char *buffer, unsigned int length);
+#define crc32 tnt_crc32
+uint32_t tnt_crc32(const void *buf, size_t size);
+#define crc32c tnt_crc32c
+uint32_t tnt_crc32c(uint32_t crc32c, const char *buffer, unsigned int length);
#endif
--
2.18.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* [tarantool-patches] Re: [PATCH] Tarantool static build
2018-08-02 8:13 [tarantool-patches] [PATCH] Tarantool static build Georgy Kirichenko
@ 2018-08-14 14:58 ` Alexander Turenko
0 siblings, 0 replies; 2+ messages in thread
From: Alexander Turenko @ 2018-08-14 14:58 UTC (permalink / raw)
To: Georgy Kirichenko; +Cc: tarantool-patches
Hi!
Common note:
Can we wrap find_package to some macro that will pay attention to
BUILD_STATIC value. Even if not all cases will be covered with this
approach, it seems that most of them will do.
Inline comments are below. Mostly they are requests to describe used
approach. Some are questions or proposals I don't sure about. Please,
don't consider this as nitpicking.
WBR, Alexander Turenko.
On Thu, Aug 02, 2018 at 11:13:34AM +0300, Georgy Kirichenko wrote:
> A possibility to build tarantool with included library dependency.
> Use the flag -DBUILD_STATIC=NULL to build statically against curl, readline,
> ncurses, icu and z.
Why NULL? As I know such options usually are ON/OFF.
> Use the flag -DOPENSSL_USE_TATIC_LIBS=ON to build with static
> openssl
TATIC -> STATIC
>
> Note: Bundled libyaml is not properly exported, use the system one.
>
> Fixes #3445
> ---
> Branch: https://github.com/tarantool/tarantool/tree/g.kirichenko/static-build
> Issue: https://github.com/tarantool/tarantool/issues/3445
>
> CMakeLists.txt | 51 +++--
> cmake/BuildMisc.cmake | 11 +
> cmake/FindCURL.cmake | 13 +-
> cmake/FindICU.cmake | 18 +-
> cmake/FindLibYAML.cmake | 6 +-
> cmake/FindOpenSSL.cmake | 465 +++++++++++++++++++++++++++++++++++++++
> cmake/FindReadline.cmake | 19 +-
> cmake/FindTermcap.cmake | 6 +-
> cmake/FindZSTD.cmake | 5 +-
> cmake/compiler.cmake | 31 ++-
> extra/exports | 17 ++
> extra/mkexports | 4 +-
> src/CMakeLists.txt | 50 ++++-
> test/app-tap/suite.ini | 1 +
> third_party/crc32.c | 6 +-
> third_party/crc32.h | 6 +-
> 16 files changed, 649 insertions(+), 60 deletions(-)
> create mode 100644 cmake/FindOpenSSL.cmake
>
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index d0cae0f01..a1dfb10b0 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -286,6 +286,31 @@ find_package_message(MODULE_LIBPATH "Lua package.cpath: ${MODULE_LIBPATH}"
>
> add_custom_target(build_bundled_libs)
>
> +# Debian: missing zstd_static.h in libzstd-dev
> +# Fedora: not found
> +# => use bundled version by default
> +
> +option(ENABLE_BUNDLED_ZSTD "Enable building of the bundled zstd" ON)
> +if (ENABLE_BUNDLED_ZSTD)
> + include(BuildZSTD)
> + zstd_build()
> + add_dependencies(build_bundled_libs zstd)
> +else()
> + set(ZSTD_FIND_REQUIRED ON)
> + find_package(ZSTD)
> +endif()
> +
> +#
> +# OpenSSL
> +#
> +find_package(OpenSSL)
> +if (OPENSSL_FOUND)
> + message(STATUS "OpenSSL ${OPENSSL_VERSION} found")
> + include_directories(${OPENSSL_INCLUDE_DIR})
> +else()
> + message(FATAL_ERROR "Could NOT find OpenSSL development files (libssl-dev/openssl-devel package)")
> +endif()
> +
> #
> # Curl
> #
> @@ -398,32 +423,6 @@ endif()
> # zstd
> #
>
> -# Debian: missing zstd_static.h in libzstd-dev
> -# Fedora: not found
> -# => use bundled version by default
> -
> -option(ENABLE_BUNDLED_ZSTD "Enable building of the bundled zstd" ON)
> -if (ENABLE_BUNDLED_ZSTD)
> - include(BuildZSTD)
> - zstd_build()
> - add_dependencies(build_bundled_libs zstd)
> -else()
> - set(ZSTD_FIND_REQUIRED ON)
> - find_package(ZSTD)
> -endif()
> -
> -#
> -# OpenSSL
> -#
> -
> -find_package(OpenSSL)
> -if (OPENSSL_FOUND)
> - message(STATUS "OpenSSL ${OPENSSL_VERSION} found")
> - include_directories(${OPENSSL_INCLUDE_DIR})
> -else()
> - message(FATAL_ERROR "Could NOT find OpenSSL development files (libssl-dev/openssl-devel package)")
> -endif()
> -
Why do you need to change order of find_package? If there is some
specific order we should follow (say, because of curl depends on
openssl) it would be good to mention that in the commit message. And I
hope there is more proper way to handle dependencies in cmake (instead
of ordering).
> #
> # Third-Party misc
> #
> diff --git a/cmake/BuildMisc.cmake b/cmake/BuildMisc.cmake
> index 20ecb4f63..22b758c42 100644
> --- a/cmake/BuildMisc.cmake
> +++ b/cmake/BuildMisc.cmake
> @@ -33,5 +33,16 @@ macro(libmisc_build)
>
> add_library(misc STATIC ${misc_src})
>
> + if (HAVE_OPENMP)
> + target_compile_options(misc PRIVATE "-fopenmp")
> + if(BUILD_STATIC)
Tab symbol here instead of whitespaces.
> + set(GOMP_LIBRARY libgomp.a)
> + else()
> + set(GOMP_LIBRARY gomp)
> + endif()
> + target_link_libraries(misc pthread ${GOMP_LIBRARY})
> + endif()
> +
> +
> unset(misc_src)
> endmacro(libmisc_build)
> <...>
> diff --git a/cmake/FindLibYAML.cmake b/cmake/FindLibYAML.cmake
> index 8abe5f9f0..11de19165 100644
> --- a/cmake/FindLibYAML.cmake
> +++ b/cmake/FindLibYAML.cmake
> @@ -2,8 +2,12 @@ find_path(LIBYAML_INCLUDE_DIR
> NAMES yaml.h
> )
>
> +if(BUILD_STATIC)
> + set(YAML_STATIC libyaml.a)
> +endif()
> +
> find_library(LIBYAML_LIBRARY
> - NAMES yaml
> + NAMES ${YAML_STATIC} yaml
Tab symbol instead of whitespaces.
> )
>
> set(LIBYAML_INCLUDE_DIRS "${LIBYAML_INCLUDE_DIR}")
> diff --git a/cmake/FindOpenSSL.cmake b/cmake/FindOpenSSL.cmake
> new file mode 100644
> index 000000000..f4579b465
> --- /dev/null
> +++ b/cmake/FindOpenSSL.cmake
As I see it is copy of [1] with the following patch applied:
--- FindOpenSSL.cmake.prev 2018-08-02 20:45:11.023410550 +0300
+++ cmake/FindOpenSSL.cmake 2018-08-02 19:43:03.529563407 +0300
@@ -371,7 +371,7 @@
endif ()
endif ()
-include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+include(FindPackageHandleStandardArgs)
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
Note: it is not the last version of the file. The commit [2] was made
since that one.
I don't sure that copying files from cmake distribution is right way to
handle dependencies (I have the file on my system in the path [3]). But
it seems to be approach we already use for other packages and maybe is
worth to hold certain version of the cmake file.
[1]: https://gitlab.kitware.com/cmake/cmake/blob/c468b9a2314a67f9d697d27c12f9c39e1301f1aa/Modules/FindOpenSSL.cmake
[2]: https://gitlab.kitware.com/cmake/cmake/commit/912a6c1cb5949fafe8b17216f162a16261d59d0c
[3]: /usr/share/cmake/Modules/FindOpenSSL.cmake
> @@ -0,0 +1,465 @@
> +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
> +# file Copyright.txt or https://cmake.org/licensing for details.
> +
> <...>
> diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake
> index 681a6f5de..e347c4cd3 100644
> --- a/cmake/FindReadline.cmake
> +++ b/cmake/FindReadline.cmake
> @@ -6,22 +6,33 @@
> # READLINE_LIBRARIES
> #
>
> +if(BUILD_STATIC)
> + find_library(CURSES_CURSES_LIBRARY NAMES libcurses.a)
> + find_library(CURSES_NCURSES_LIBRARY NAMES libncurses.a)
> + find_library(CURSES_FORM_LIBRARY NAMES libform.a)
> + find_library(CURSES_INFO_LIBRARY NAMES libtinfo.a)
> + if (NOT CURSES_INFO_LIBRARY)
> + set(CURSES_INFO_LIBRARY "")
Tab symbol instead of whitespaces.
> + endif()
> +endif()
> find_package(Curses)
> if(NOT CURSES_FOUND)
> find_package(Termcap)
> endif()
>
> +set(READLINE_STATIC libreadline.a)
In other files you are set *_STATIC variables under if(BUILD_STATIC),
but here you don't. Is it intentional?
> +
> if (DEFINED READLINE_ROOT)
> set(_FIND_OPTS NO_CMAKE NO_CMAKE_SYSTEM_PATH)
> find_library(READLINE_LIBRARY
> - NAMES readline
> + NAMES ${READLINE_STATIC} readline
> HINTS ${READLINE_ROOT}/lib
> ${_FIND_OPTS})
> find_path(READLINE_INCLUDE_DIR
> NAMES readline/readline.h
> HINTS ${READLINE_ROOT}/include ${_FIND_OPTS})
> else()
> - find_library(READLINE_LIBRARY NAMES readline)
> + find_library(READLINE_LIBRARY NAMES ${READLINE_STATIC} readline)
> find_path(READLINE_INCLUDE_DIR readline/readline.h)
> endif()
>
> @@ -41,10 +52,10 @@ if(READLINE_FOUND)
> endif()
> endif()
> if(CURSES_FOUND)
> - set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${CURSES_LIBRARIES})
> + set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${CURSES_LIBRARIES} ${CURSES_INFO_LIBRARY})
> set(READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIRS} ${CURSES_INCLUDE_DIRS})
> elseif(TERMCAP_FOUND)
> - set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${TERMCAP_LIBRARIES})
> + set(READLINE_LIBRARIES ${READLINE_LIBRARIES} ${TERMCAP_LIBRARIES} ${CURSES_INFO_LIBRARY})
> set(READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIRS} ${TERMCAP_INCLUDE_DIRS})
> endif()
> endif(READLINE_FOUND)
> <...>
> diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake
> index 05d33ab48..4f9c2c049 100644
> --- a/cmake/compiler.cmake
> +++ b/cmake/compiler.cmake
> @@ -116,7 +116,10 @@ set (CMAKE_CXX_FLAGS_RELWITHDEBINFO
> unset(CC_DEBUG_OPT)
>
> check_include_file(libunwind.h HAVE_LIBUNWIND_H)
> -find_library(UNWIND_LIBRARY PATH_SUFFIXES system NAMES unwind)
> +if(BUILD_STATIC)
> + set(UNWIND_STATIC libunwind.a)
> +endif()
> +find_library(UNWIND_LIBRARY PATH_SUFFIXES system NAMES ${UNWIND_STATIC} unwind)
>
> set(ENABLE_BACKTRACE_DEFAULT OFF)
> if (UNWIND_LIBRARY AND HAVE_LIBUNWIND_H)
> @@ -137,20 +140,33 @@ if (ENABLE_BACKTRACE)
> else()
> if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
> CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
> + if(BUILD_STATIC)
> + set(UNWIND_PLATFORM_STATIC "libunwind-${CMAKE_SYSTEM_PROCESSOR}.a")
> + endif()
> find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
> - NAMES "unwind-${CMAKE_SYSTEM_PROCESSOR}")
> + NAMES ${UNWIND_PLATFORM_STATIC}
> + "unwind-${CMAKE_SYSTEM_PROCESSOR}")
Tabs instead of whitespaces.
> elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686")
> + if(BUILD_STATIC)
> + set(UNWIND_PLATFORM_STATIC "libunwind-x86.a")
> + endif()
> find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
> - NAMES "unwind-x86")
> + NAMES ${UNWIND_PLATFORM_STATIC} "unwind-x86")
> elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm*")
> + if(BUILD_STATIC)
> + set(UNWIND_PLATFORM_STATIC "libunwind-arm.a")
> + endif()
> find_library(UNWIND_PLATFORM_LIBRARY PATH_SUFFIXES system
> - NAMES "unwind-arm")
> + NAMES ${UNWIND_PLATFORM_STATIC} "unwind-arm")
> endif()
> - set (UNWIND_LIBRARIES ${UNWIND_LIBRARY} ${UNWIND_PLATFORM_LIBRARY})
> + set (UNWIND_LIBRARIES ${UNWIND_PLATFORM_LIBRARY} ${UNWIND_LIBRARY})
> endif()
> find_package_message(UNWIND_LIBRARIES "Found unwind" "${UNWIND_LIBRARIES}")
> endif()
>
> +# Static linking for c++ routines
> +add_compile_flags("C;CXX" "-static-libgcc" "-static-libstdc++")
> +
> #
> # Set flags for all include files: those maintained by us and
> # coming from third parties.
> @@ -259,11 +275,6 @@ macro(enable_tnt_compile_flags)
> endif()
> endmacro(enable_tnt_compile_flags)
>
> -if (HAVE_OPENMP)
> - add_compile_flags("C;CXX" "-fopenmp")
> -endif()
> -
> -
> if (CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNUCC)
> set(HAVE_BUILTIN_CTZ 1)
> set(HAVE_BUILTIN_CTZLL 1)
> diff --git a/extra/exports b/extra/exports
> index 61a2e0a54..a93197e2c 100644
> --- a/extra/exports
> +++ b/extra/exports
> @@ -79,6 +79,23 @@ tnt_EVP_MD_CTX_new
> tnt_EVP_MD_CTX_free
> tnt_HMAC_CTX_new
> tnt_HMAC_CTX_free
> +EVP_DigestInit_ex
> +EVP_DigestUpdate
> +EVP_DigestFinal_ex
> +EVP_get_digestbyname
> +HMAC_Init_ex
> +HMAC_Update
> +HMAC_Final
> +EVP_CIPHER_CTX_new
> +EVP_CIPHER_CTX_free
> +EVP_CipherInit_ex
> +EVP_CipherUpdate
> +EVP_CipherFinal_ex
> +EVP_CIPHER_CTX_cleanup
> +EVP_CIPHER_block_size
> +EVP_get_cipherbyname
> +ERR_get_string
> +ERR_error_string
>
> # Module API
>
> diff --git a/extra/mkexports b/extra/mkexports
> index 20b3454d4..88e2e189f 100755
> --- a/extra/mkexports
> +++ b/extra/mkexports
> @@ -2,6 +2,7 @@
> # $1 - in file
> # $2 - out file
> # $3 - os
> +# $4 - export templates
> if [ "x$3x" = xDarwinx ]; then
> # _func1
> # _func2
> @@ -11,5 +12,6 @@ else
> # func1;
> # func2;
> # };
> - ( echo "{" && sed -e '/^\s*$/d;s/$/;/;' $1 && echo "};" ) > $2
> + echo "$4"
> + ( echo "{" && { cat $1 ; for so in $4 ; do { nm -D $so || nm -D `cat $so | grep GROUP | awk '{print $3}'` ; } | awk '{print $3}' ; done ; } | sed '/^\s*$/d;s/$/;/;' && echo "};" ) > $2
What is the root of differences btw these variants?
1. nm -D $so
2. nm -D `cat $so | grep GROUP | awk '{print $3}'`
> fi
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index 2a952923e..82f173605 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -107,18 +107,19 @@ endif ()
>
> add_library(core STATIC ${core_sources})
> target_link_libraries(core
> - salad small pthread
> + salad small
> ${LIBEV_LIBRARIES}
> ${LIBEIO_LIBRARIES}
> ${LIBCORO_LIBRARIES}
> ${MSGPUCK_LIBRARIES}
> + dl pthread
> )
>
> add_library(stat STATIC rmean.c latency.c histogram.c)
> target_link_libraries(stat core)
>
> if (ENABLE_BACKTRACE AND NOT TARGET_OS_DARWIN)
> - target_link_libraries(core gcc_s ${UNWIND_LIBRARIES})
> + target_link_libraries(core gcc_s ${UNWIND_LIBRARIES})
> endif()
>
> if (CC_HAS_WNO_IMPLICIT_FALLTHROUGH)
> @@ -218,12 +219,18 @@ target_link_libraries(server core bit uri uuid ${ICU_LIBRARIES})
> set (reexport_libraries server core misc bitset csv
> ${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES})
>
> +if(BUILD_STATIC)
> + set(Z_STATIC libz.a)
> +endif()
> +find_library(Z_LIBRARY NAMES ${Z_STATIC} z)
> +
> set (common_libraries
> ${reexport_libraries}
> ${LIBYAML_LIBRARIES}
> ${READLINE_LIBRARIES}
> - ${OPENSSL_LIBRARIES}
> ${CURL_LIBRARIES}
> + ${OPENSSL_LIBRARIES}
> + ${Z_STATIC}
> )
>
> if (TARGET_OS_LINUX OR TARGET_OS_DEBIAN_FREEBSD)
> @@ -248,6 +255,8 @@ endif()
> set (common_libraries ${common_libraries} ${LIBUUID_LIBRARIES})
> set (common_libraries ${common_libraries} PARENT_SCOPE)
>
> +set (generic_libraries pthread dl)
> +
> add_subdirectory(lib)
> add_subdirectory(box)
>
> @@ -255,6 +264,29 @@ add_subdirectory(box)
> set(TARANTOOL_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE)
> set(TARANTOOL_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE)
>
> +set(EXPORT_LIST)
> +if(BUILD_STATIC)
> + foreach(libstatic
> + ${READLINE_LIBRARIES}
> + ${CURL_LIBRARIES}
> + ${OPENSSL_LIBRARIES}
> + ${ICU_LIBRARIES}
> + ${Z_STATIC}
> + ${LIBYAML_LIBRARIES})
> + if (${libstatic} MATCHES "lib[^/]+.a")
> + string(REGEX MATCH "lib[^/]+.a" libname ${libstatic})
> + string(REGEX REPLACE "\\.a$" "" libname ${libname})
> + string(REGEX REPLACE "^lib" "" libname ${libname})
> + find_library(SYMBOLS_LIB NAMES ${libname})
> + list(APPEND EXPORT_LIST ${SYMBOLS_LIB})
> + set(SYMBOLS_LIB "SYMBOLS_LIB-NOTFOUND")
Why do you set SYMBOLS_LIB manually?
> + else()
> + message(WARNING "${libstatic} should be a static")
> + endif()
> + endforeach(libstatic)
> + string(REPLACE ";" " " EXPORT_LIST "${EXPORT_LIST}")
> +endif()
> +
We discussed it verbally, but I think this way to export symbols from
libraries we depend need to be commented as well as motivation of
exporting.
> # Exports syntax is toolchain-dependent, preprocessing is necessary
> set(exports_file ${CMAKE_BINARY_DIR}/extra/exports.${CMAKE_SYSTEM_NAME})
> add_custom_target(preprocess_exports
> @@ -264,12 +296,14 @@ add_custom_command(
> DEPENDS ${CMAKE_SOURCE_DIR}/extra/exports
> COMMAND ${CMAKE_SOURCE_DIR}/extra/mkexports
> ${CMAKE_SOURCE_DIR}/extra/exports
> - ${exports_file} ${CMAKE_SYSTEM_NAME})
> + ${exports_file} ${CMAKE_SYSTEM_NAME}
> + ${EXPORT_LIST}
> +)
>
> add_executable(
> - tarantool main.cc
> - ${LIBUTIL_FREEBSD_SRC}/flopen.c
> - ${LIBUTIL_FREEBSD_SRC}/pidfile.c)
> + tarantool main.cc
> + ${LIBUTIL_FREEBSD_SRC}/flopen.c
> + ${LIBUTIL_FREEBSD_SRC}/pidfile.c)
>
> add_dependencies(tarantool build_bundled_libs preprocess_exports)
>
> @@ -294,7 +328,9 @@ if (TARGET_OS_DARWIN)
> set_target_properties(tarantool PROPERTIES
> LINK_FLAGS "-Wl,-exported_symbols_list,${exports_file}")
> else ()
> + message(${reexport_libraries} ${common_libraries})
Forgotten debug print?
> target_link_libraries(tarantool
> + ${generic_libraries}
Indent is strange here.
> -Wl,--whole-archive box ${reexport_libraries}
> salad -Wl,--no-whole-archive
> ${common_libraries})
> diff --git a/test/app-tap/suite.ini b/test/app-tap/suite.ini
> index 86af82637..85ad9174d 100644
> --- a/test/app-tap/suite.ini
> +++ b/test/app-tap/suite.ini
> @@ -3,3 +3,4 @@ core = app
> description = application server tests (TAP)
> lua_libs = lua/require_mod.lua lua/serializer_test.lua
> is_parallel = True
> +disabled = http_client.test.lua
Why it is part of this patch? There are no any mention of a reason in
the commit message.
> diff --git a/third_party/crc32.c b/third_party/crc32.c
> index a271d07ec..16b8c4040 100644
> --- a/third_party/crc32.c
> +++ b/third_party/crc32.c
> @@ -45,7 +45,7 @@
> #include <unistd.h>
> #include <stdint.h>
>
> -uint32_t crc32_table[] = {
> +static uint32_t crc32_table[] = {
> 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
> 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
> 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
> @@ -92,7 +92,7 @@ uint32_t crc32_table[] = {
> };
>
> uint32_t
> -crc32(const void *buf, size_t size)
> +tnt_crc32(const void *buf, size_t size)
> {
> const uint8_t *p = buf;
> uint32_t crc;
> @@ -735,7 +735,7 @@ multitable_crc32c(uint32_t crc32c,
> }
>
> uint32_t
> -crc32c(uint32_t crc32c,
> +tnt_crc32c(uint32_t crc32c,
> const char *buffer,
> unsigned int length)
> {
> diff --git a/third_party/crc32.h b/third_party/crc32.h
> index 55c7072f3..8dc61d05d 100644
> --- a/third_party/crc32.h
> +++ b/third_party/crc32.h
> @@ -3,7 +3,9 @@
>
> #include <stdint.h>
>
> -uint32_t crc32(const void *buf, size_t size);
> -uint32_t crc32c(uint32_t crc32c, const char *buffer, unsigned int length);
> +#define crc32 tnt_crc32
> +uint32_t tnt_crc32(const void *buf, size_t size);
> +#define crc32c tnt_crc32c
> +uint32_t tnt_crc32c(uint32_t crc32c, const char *buffer, unsigned int length);
>
> #endif
Some conflict that are not mentioned in the commit message?
> --
> 2.18.0
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-08-14 14:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-02 8:13 [tarantool-patches] [PATCH] Tarantool static build Georgy Kirichenko
2018-08-14 14:58 ` [tarantool-patches] " Alexander Turenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox