<div dir="ltr">Hello!<br><br>Here is a new commit message(as discussed at telegram chat):<br><br>Author: HustonMmmavr <<a href="mailto:huston.mavr@gmail.com">huston.mavr@gmail.com</a>><br>Date:   Thu Sep 10 12:43:20 2020 +0300<br><br>build: refactor static build process<br><br>Refactored static build process to use static-build/CMakeLists.txt<br>instead of Dockerfile.staticbuild (this allows to support static<br>build on macOS). Following third-party dependencies for static build<br>are installed via cmake `ExternalProject_Add`:<br>    - OpenSSL<br>    - Zlib<br>    - Ncurses<br>    - Readline<br>    - Unwind<br>    - ICU<br><br>* Added support static build for macOS<br>* Fixed `CONFIGURE_COMMAND` while building bundled libcurl for static<br>    build at file cmake/BuildLibCURL.cmake:<br>    - disable building shared libcurl libraries (by setting<br>        `--disable-shared` option)<br>    - disable hiding libcurl symbols (by setting<br>        `--disable-symbol-hiding` option)<br>    - prevent linking libcurl with system libz (by setting<br>        `--with-zlib=${FOUND_ZLIB_ROOT_DIR}` option)<br>* Removed Dockerfile.staticbuild<br>* Added new <a href="http://gitlab.ci">gitlab.ci</a> jobs to test new style static build:<br>    - static_build_cmake_linux<br>    - static_build_cmake_osx_15<br>* Removed static_docker_build <a href="http://gitlab.ci">gitlab.ci</a> job<br><br>Closes #5095<br><br>Co-authored-by: Yaroslav Dynnikov <<a href="mailto:yaroslav.dynnikov@gmail.com">yaroslav.dynnikov@gmail.com</a>></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">ср, 9 сент. 2020 г. в 18:45, HustonMmmavr <<a href="mailto:huston.mavr@gmail.com">huston.mavr@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Yaroslav Dynnikov <<a href="mailto:yaroslav.dynnikov@gmail.com" target="_blank">yaroslav.dynnikov@gmail.com</a>><br>
<br>
Refactored static build process to use static-build/CMakeLists.txt<br>
instead of Dockerfile.staticbuild (this allows to support static<br>
build on macOS). Following third-party dependencies for static build<br>
are installed via cmake `ExternalProject_Add`:<br>
  - OpenSSL<br>
  - Zlib<br>
  - Ncurses<br>
  - Readline<br>
  - Unwind<br>
  - ICU<br>
<br>
* Added support static build for macOS<br>
* Fixed `CONFIGURE_COMMAND` while building bundled libcurl for static<br>
  build at file cmake/BuildLibCURL.cmake:<br>
    - disable building shared libcurl libraries (by setting<br>
      `--disable-shared` option)<br>
    - disable hiding libcurl symbols (by setting<br>
      `--disable-symbol-hiding` option)<br>
    - prevent linking libcurl with system libz (by setting<br>
      `--with-zlib=${FOUND_ZLIB_ROOT_DIR}` option)<br>
* Removed Dockerfile.staticbuild<br>
* Added new <a href="http://gitlab.ci" rel="noreferrer" target="_blank">gitlab.ci</a> jobs to test new style static build:<br>
  - static_build_cmake_linux<br>
  - static_build_cmake_osx_15<br>
* Removed static_docker_build <a href="http://gitlab.ci" rel="noreferrer" target="_blank">gitlab.ci</a> job<br>
<br>
Closes #5095<br>
---<br>
<br>
Branch: <a href="https://github.com/tarantool/tarantool/tree/rosik/refactor-static-build" rel="noreferrer" target="_blank">https://github.com/tarantool/tarantool/tree/rosik/refactor-static-build</a><br>
Issue: <a href="https://github.com/tarantool/tarantool/issues/5095" rel="noreferrer" target="_blank">https://github.com/tarantool/tarantool/issues/5095</a><br>
<br>
Changes in v3:<br>
1. Fixed typos at commit message<br>
2. Fixed commentaries at .<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a><br>
3. Fixed finding libz library at cmake/BuildLibCurl.cmake as at master<br>
   branch<br>
4. Instead of using static-build/.gitignore use the root .gitignore file<br>
5. Refactored static-build/CMakeLists.txt:<br>
   * Project name is set to tarantool-static<br>
   * Instead of explicitly finding of c/c++ compilers current version uses<br>
     cmake `project(tarantool-static C CXX)` command. This change requires<br>
     to manually set CFLAGS/CPPFLAGS/LDFLAGS for all static-build<br>
     dependencies (because building dependencies at macOS requires path<br>
     to macOS SDK) the idea was taken from cmake/BuildLibCurl.cmake<br>
   * Added commentaries about problem with libicu<br>
   * Removed unused TEST_COMMAND at ExternalProject_Add(zlib ...) also<br>
     removed unnecessary # STEP_TARGETS at ExternalProject_Add(readline ...)<br>
   * Deleted doubled whitespaces<br>
6. Fixed static-build/README.md:<br>
   * Added list of required tools<br>
   * Added example for ubuntu/debian<br>
   * Fixed indentation and typos<br>
7. Refactored tests:<br>
   * Got rid of test-run<br>
   * Deleted doubled whitespaces at exports.test.lua<br>
   * Fixed defining of RTLD_DEFAULT<br>
<br>
<br>
 .gitignore                                    |   8 +<br>
 .gitlab-ci.yml                                |  11 +-<br>
 .<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a>                                    |  56 +++-<br>
 Dockerfile.staticbuild                        |  98 ------<br>
 cmake/BuildLibCURL.cmake                      |  13 +-<br>
 cmake/compiler.cmake                          |  24 +-<br>
 cmake/os.cmake                                |   5 +-<br>
 static-build/CMakeLists.txt                   | 311 ++++++++++++++++++<br>
 static-build/README.md                        |  90 +++++<br>
 static-build/test/CheckDependencies.cmake     |  43 +++<br>
 .../test/static-build/exports.test.lua        | 142 ++++++++<br>
 .../test/static-build/traceback.test.lua      |  15 +<br>
 12 files changed, 692 insertions(+), 124 deletions(-)<br>
 delete mode 100644 Dockerfile.staticbuild<br>
 create mode 100644 static-build/CMakeLists.txt<br>
 create mode 100644 static-build/README.md<br>
 create mode 100644 static-build/test/CheckDependencies.cmake<br>
 create mode 100755 static-build/test/static-build/exports.test.lua<br>
 create mode 100755 static-build/test/static-build/traceback.test.lua<br>
<br>
diff --git a/.gitignore b/.gitignore<br>
index a42c7db35..c6e261e18 100644<br>
--- a/.gitignore<br>
+++ b/.gitignore<br>
@@ -151,3 +151,11 @@ src/box/sql/parse.h<br>
 src/box/sql/parse.c<br>
 src/box/sql/opcodes.h<br>
 src/box/sql/opcodes.c<br>
+<br>
+# static-build<br>
+static-build/*-prefix<br>
+static-build/Makefile<br>
+static-build/build<br>
+<br>
+# macOS files<br>
+.DS_Store<br>
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml<br>
index 0ead08711..c9aef3dc7 100644<br>
--- a/.gitlab-ci.yml<br>
+++ b/.gitlab-ci.yml<br>
@@ -534,9 +534,14 @@ static_build:<br>
   script:<br>
     - ${GITLAB_MAKE} test_static_build<br>
<br>
-static_docker_build:<br>
+static_build_cmake_linux:<br>
+  <<: *docker_test_definition<br>
+  script:<br>
+    - ${GITLAB_MAKE} test_static_build_cmake_linux<br>
+<br>
+static_build_cmake_osx_15:<br>
   stage: test<br>
   tags:<br>
-    - deploy_test<br>
+    - osx_15<br>
   script:<br>
-    - ${GITLAB_MAKE} test_static_docker_build<br>
+    - ${GITLAB_MAKE} test_static_build_cmake_osx<br>
diff --git a/.<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a> b/.<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a><br>
index efc05cf05..58d0c1596 100644<br>
--- a/.<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a><br>
+++ b/.<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a><br>
@@ -148,8 +148,14 @@ deps_debian_static:<br>
 test_static_build: deps_debian_static<br>
        CMAKE_EXTRA_PARAMS=-DBUILD_STATIC=ON make -f .<a href="http://travis.mk" rel="noreferrer" target="_blank">travis.mk</a> test_debian_no_deps<br>
<br>
-test_static_docker_build:<br>
-       docker build --no-cache --network=host --build-arg RUN_TESTS=ON -f Dockerfile.staticbuild .<br>
+# New static build<br>
+# builddir used in this target - is a default build path from cmake<br>
+# ExternalProject_Add()<br>
+test_static_build_cmake_linux:<br>
+       cd static-build && cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo;-DENABLE_WERROR=ON" . && \<br>
+       make -j && ctest -V<br>
+       cd test && /usr/bin/python test-run.py --force \<br>
+               --builddir ${PWD}/static-build/tarantool-prefix/src/tarantool-build $(TEST_RUN_EXTRA_PARAMS)<br>
<br>
 # ###################<br>
 # Static Analysis<br>
@@ -193,15 +199,16 @@ build_osx:<br>
        cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_WERROR=ON ${CMAKE_EXTRA_PARAMS}<br>
        make -j<br>
<br>
-test_osx_no_deps: build_osx<br>
-       # Limits: Increase the maximum number of open file descriptors on macOS:<br>
-       #   Travis-ci needs the "ulimit -n <value>" call<br>
-       #   Gitlab-ci needs the "launchctl limit maxfiles <value>" call<br>
-       # Also gitlib-ci needs the password to change the limits, while<br>
-       # travis-ci runs under root user. Limit setup must be in the same<br>
-       # call as tests runs call.<br>
-       # Tests: Temporary excluded replication/ suite with some tests<br>
-       #        from other suites by issues #4357 and #4370<br>
+<br>
+# Limits: Increase the maximum number of open file descriptors on macOS:<br>
+#   Travis-ci needs the "ulimit -n <value>" call<br>
+#   Gitlab-ci needs the "launchctl limit maxfiles <value>" call<br>
+# Also gitlib-ci needs the password to change the limits, while<br>
+# travis-ci runs under root user. Limit setup must be in the same<br>
+# call as tests runs call.<br>
+# Tests: Temporary excluded replication/ suite with some tests<br>
+#        from other suites by issues #4357 and #4370<br>
+INIT_TEST_ENV_OSX=\<br>
        sudo -S launchctl limit maxfiles ${MAX_FILES} || : ; \<br>
                launchctl limit maxfiles || : ; \<br>
                ulimit -n ${MAX_FILES} || : ; \<br>
@@ -210,11 +217,34 @@ test_osx_no_deps: build_osx<br>
                launchctl limit maxproc || : ; \<br>
                ulimit -u ${MAX_PROC} || : ; \<br>
                ulimit -u ; \<br>
-               rm -rf /tmp/tnt ; \<br>
-               cd test && ./test-run.py --vardir /tmp/tnt --force $(TEST_RUN_EXTRA_PARAMS)<br>
+               rm -rf /tmp/tnt<br>
+<br>
+test_osx_no_deps: build_osx<br>
+       ${INIT_TEST_ENV_OSX}; \<br>
+       cd test && ./test-run.py --vardir /tmp/tnt --force $(TEST_RUN_EXTRA_PARAMS)<br>
<br>
 test_osx: deps_osx test_osx_no_deps<br>
<br>
+# Static macOS build<br>
+<br>
+STATIC_OSX_PKGS=autoconf automake libtool cmake file://$${PWD}/tools/brew_taps/tntpython2.rb<br>
+base_deps_osx:<br>
+       brew update || echo | /usr/bin/ruby -e \<br>
+               "$$(curl -fsSL <a href="https://raw.githubusercontent.com/Homebrew/install/master/install" rel="noreferrer" target="_blank">https://raw.githubusercontent.com/Homebrew/install/master/install</a>)"<br>
+       brew install --force ${STATIC_OSX_PKGS} || brew upgrade ${STATIC_OSX_PKGS}<br>
+       pip install --force-reinstall -r test-run/requirements.txt<br>
+<br>
+# builddir used in this target - is a default build path from cmake<br>
+# ExternalProject_Add()<br>
+test_static_build_cmake_osx: base_deps_osx<br>
+       cd static-build && cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo;-DENABLE_WERROR=ON" . && \<br>
+       make -j && ctest -V<br>
+       ${INIT_TEST_ENV_OSX}; \<br>
+       cd test && ./test-run.py --vardir /tmp/tnt \<br>
+               --builddir ${PWD}/static-build/tarantool-prefix/src/tarantool-build \<br>
+               --force $(TEST_RUN_EXTRA_PARAMS)<br>
+<br>
+<br>
 ###########<br>
 # FreeBSD #<br>
 ###########<br>
diff --git a/Dockerfile.staticbuild b/Dockerfile.staticbuild<br>
deleted file mode 100644<br>
index f67f46f5e..000000000<br>
--- a/Dockerfile.staticbuild<br>
+++ /dev/null<br>
@@ -1,98 +0,0 @@<br>
-FROM centos:7<br>
-<br>
-RUN yum install -y epel-release<br>
-RUN yum install -y yum install <a href="https://centos7.iuscommunity.org/ius-release.rpm" rel="noreferrer" target="_blank">https://centos7.iuscommunity.org/ius-release.rpm</a><br>
-<br>
-RUN set -x \<br>
-    && yum -y install \<br>
-        libstdc++ \<br>
-        libstdc++-static \<br>
-        readline \<br>
-        openssl \<br>
-        lz4 \<br>
-        binutils \<br>
-        ncurses \<br>
-        libgomp \<br>
-        lua \<br>
-        curl \<br>
-        tar \<br>
-        zip \<br>
-        unzip \<br>
-        libunwind \<br>
-        zlib \<br>
-    && yum -y install \<br>
-        perl \<br>
-        gcc-c++ \<br>
-        cmake \<br>
-        lz4-devel \<br>
-        binutils-devel \<br>
-        lua-devel \<br>
-        make \<br>
-        git \<br>
-        autoconf \<br>
-        automake \<br>
-        libtool \<br>
-        wget<br>
-<br>
-RUN yum -y install ncurses-static readline-static zlib-static pcre-static glibc-static<br>
-<br>
-RUN yum -y install python-devel python-pip<br>
-<br>
-RUN set -x && \<br>
-    cd / && \<br>
-    curl -O -L <a href="https://www.openssl.org/source/openssl-1.1.1f.tar.gz" rel="noreferrer" target="_blank">https://www.openssl.org/source/openssl-1.1.1f.tar.gz</a> && \<br>
-    tar -xvf openssl-1.1.1f.tar.gz && \<br>
-    cd openssl-1.1.1f && \<br>
-    ./config --libdir=lib && \<br>
-    make -j && make install<br>
-<br>
-RUN set -x && \<br>
-    cd / && \<br>
-    curl -O -L <a href="https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz" rel="noreferrer" target="_blank">https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz</a> && \<br>
-    tar -xvf icu4c-62_1-src.tgz && \<br>
-    cd icu/source && \<br>
-    ./configure --with-data-packaging=static --enable-static --enable-shared && \<br>
-    make -j && make install<br>
-<br>
-RUN set -x && \<br>
-    cd / && \<br>
-    curl -O -L <a href="http://download.savannah.nongnu.org/releases/libunwind/libunwind-1.3-rc1.tar.gz" rel="noreferrer" target="_blank">http://download.savannah.nongnu.org/releases/libunwind/libunwind-1.3-rc1.tar.gz</a> && \<br>
-    tar -xvf libunwind-1.3-rc1.tar.gz && \<br>
-    cd libunwind-1.3-rc1 && \<br>
-    ./configure --enable-static --enable-shared && \<br>
-    make -j && make install<br>
-<br>
-COPY . /tarantool<br>
-<br>
-WORKDIR /tarantool<br>
-<br>
-RUN set -x && \<br>
-    git submodule init && \<br>
-    git submodule update<br>
-<br>
-# Cleanup for 'build' directory added, because it purges all artefacts<br>
-# produced for curl build, including the old configuration in build/curl<br>
-RUN set -x && \<br>
-    find . -name 'CMakeFiles' -type d -exec rm -rf {} + && \<br>
-    find . -name 'CMakeCache.txt' -type f -delete && \<br>
-    rm -rf build test/small test/luajit-tap<br>
-<br>
-RUN pip install -r /tarantool/test-run/requirements.txt<br>
-<br>
-RUN set -x && \<br>
-    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \<br>
-         -DENABLE_DIST:BOOL=ON \<br>
-         -DBUILD_STATIC=ON \<br>
-         -DOPENSSL_USE_STATIC_LIBS=ON \<br>
-         -DOPENSSL_ROOT_DIR=/usr/local \<br>
-         . && \<br>
-    make -j && make install<br>
-<br>
-ARG RUN_TESTS<br>
-RUN if [ -n "${RUN_TESTS}" ]; then \<br>
-        set -x && \<br>
-        cd test && \<br>
-        /usr/bin/python test-run.py --force; \<br>
-    fi<br>
-<br>
-ENTRYPOINT ["/bin/bash"]<br>
diff --git a/cmake/BuildLibCURL.cmake b/cmake/BuildLibCURL.cmake<br>
index 5f8b15a63..86fec39e9 100644<br>
--- a/cmake/BuildLibCURL.cmake<br>
+++ b/cmake/BuildLibCURL.cmake<br>
@@ -4,15 +4,21 @@ macro(curl_build)<br>
     set(LIBCURL_BINARY_DIR ${PROJECT_BINARY_DIR}/build/curl/work)<br>
     set(LIBCURL_INSTALL_DIR ${PROJECT_BINARY_DIR}/build/curl/dest)<br>
<br>
+    message(STATUS "Looking for zlib")<br>
+    find_path(ZLIB_INCLUDE_DIR zlib.h)<br>
+    message(STATUS "Looking for zlib.h - ${ZLIB_INCLUDE_DIR}")<br>
     if (BUILD_STATIC)<br>
         set(LIBZ_LIB_NAME libz.a)<br>
     else()<br>
         set(LIBZ_LIB_NAME z)<br>
     endif()<br>
     find_library(LIBZ_LIBRARY NAMES ${LIBZ_LIB_NAME})<br>
-    if ("${LIBZ_LIBRARY}" STREQUAL "LIBZ_LIBRARY-NOTFOUND")<br>
+    message(STATUS "Looking for libz - ${LIBZ_LIBRARY}")<br>
+<br>
+    if (NOT ZLIB_INCLUDE_DIR OR NOT LIBZ_LIBRARY)<br>
         message(FATAL_ERROR "Unable to find zlib")<br>
     endif()<br>
+    get_filename_component(FOUND_ZLIB_ROOT_DIR ${ZLIB_INCLUDE_DIR} DIRECTORY)<br>
<br>
     # Use the same OpenSSL library for libcurl as is used for<br>
     # tarantool itself.<br>
@@ -88,9 +94,10 @@ macro(curl_build)<br>
<br>
                 --prefix <INSTALL_DIR><br>
                 --enable-static<br>
-                --enable-shared<br>
+                --disable-shared<br>
+                --disable-symbol-hiding<br>
<br>
-                --with-zlib<br>
+                --with-zlib=${FOUND_ZLIB_ROOT_DIR}<br>
                 ${LIBCURL_OPENSSL_OPT}<br>
                 --with-ca-fallback<br>
<br>
diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake<br>
index 5a1141ebd..db2ae6227 100644<br>
--- a/cmake/compiler.cmake<br>
+++ b/cmake/compiler.cmake<br>
@@ -33,10 +33,6 @@ if (CMAKE_COMPILER_IS_GNUCC)<br>
            Your GCC version is ${CMAKE_CXX_COMPILER_VERSION}, please update<br>
                    ")<br>
        endif()<br>
-else()<br>
-     if (BUILD_STATIC)<br>
-           message(FATAL_ERROR "Static build is supported for GCC only")<br>
-     endif()<br>
 endif()<br>
<br>
 #<br>
@@ -120,10 +116,23 @@ set (CMAKE_CXX_FLAGS_RELWITHDEBINFO<br>
<br>
 unset(CC_DEBUG_OPT)<br>
<br>
+message(STATUS "Looking for libunwind.h")<br>
+find_path(UNWIND_INCLUDE_DIR libunwind.h)<br>
+message(STATUS "Looking for libunwind.h - ${UNWIND_INCLUDE_DIR}")<br>
+<br>
+if (UNWIND_INCLUDE_DIR)<br>
+    include_directories(${UNWIND_INCLUDE_DIR})<br>
+endif()<br>
+<br>
+set(CMAKE_REQUIRED_INCLUDES ${UNWIND_INCLUDE_DIR})<br>
 check_include_file(libunwind.h HAVE_LIBUNWIND_H)<br>
-if(BUILD_STATIC)<br>
+set(CMAKE_REQUIRED_INCLUDES "")<br>
+<br>
+if(BUILD_STATIC AND NOT TARGET_OS_DARWIN)<br>
     set(UNWIND_LIB_NAME libunwind.a)<br>
 else()<br>
+    # libunwind can't be compiled on macOS.<br>
+    # But there exists libunwind.dylib as a part of MacOSSDK<br>
     set(UNWIND_LIB_NAME unwind)<br>
 endif()<br>
 find_library(UNWIND_LIBRARY PATH_SUFFIXES system NAMES ${UNWIND_LIB_NAME})<br>
@@ -185,7 +194,10 @@ if (ENABLE_BACKTRACE)<br>
     find_package_message(UNWIND_LIBRARIES "Found unwind" "${UNWIND_LIBRARIES}")<br>
 endif()<br>
<br>
-if(BUILD_STATIC)<br>
+# On macOS there is no '-static-libstdc++' flag and it's use will<br>
+# raise following error:<br>
+# error: argument unused during compilation: '-static-libstdc++'<br>
+if(BUILD_STATIC AND NOT TARGET_OS_DARWIN)<br>
     # Static linking for c++ routines<br>
     add_compile_flags("C;CXX" "-static-libstdc++")<br>
 endif()<br>
diff --git a/cmake/os.cmake b/cmake/os.cmake<br>
index 905be61df..276a79b42 100644<br>
--- a/cmake/os.cmake<br>
+++ b/cmake/os.cmake<br>
@@ -107,7 +107,10 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")<br>
<br>
     # Latest versions of Homebrew wont 'link --force' for libraries, that were<br>
     # preinstalled in system. So we'll use this dirty hack<br>
-    find_program(HOMEBREW_EXECUTABLE brew)<br>
+<br>
+    if (NOT BUILD_STATIC)<br>
+        find_program(HOMEBREW_EXECUTABLE brew)<br>
+    endif()<br>
     if(EXISTS ${HOMEBREW_EXECUTABLE})<br>
         execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix<br>
                         OUTPUT_VARIABLE HOMEBREW_PREFIX<br>
diff --git a/static-build/CMakeLists.txt b/static-build/CMakeLists.txt<br>
new file mode 100644<br>
index 000000000..90029fdd8<br>
--- /dev/null<br>
+++ b/static-build/CMakeLists.txt<br>
@@ -0,0 +1,311 @@<br>
+cmake_minimum_required(VERSION 2.8)<br>
+<br>
+# Detect system compilers for further configuring dependencies to be<br>
+# builded with these compilers. This is used to build tarantool and<br>
+# it's dependencies by usign one compiler system (for example libicu<br>
+# by default uses clang if it exists when others uses gcc/g++ on<br>
+# linux machine).<br>
+project(tarantool-static C CXX)<br>
+<br>
+include(ExternalProject)<br>
+set(OPENSSL_VERSION 1.1.1f)<br>
+set(ZLIB_VERSION 1.2.11)<br>
+set(NCURSES_VERSION 6.2)<br>
+set(READLINE_VERSION 8.0)<br>
+set(UNWIND_VERSION 1.3-rc1)<br>
+<br>
+# Pass -isysroot=<SDK_PATH> option on Mac OS to a preprocessor and a C<br>
+# compiler to find header files installed with an SDK.<br>
+#<br>
+# The idea is to set these (DEPENDENCY_*) variables to corresponding<br>
+# environment variables at each depenency configure script.<br>
+#<br>
+# Note: Passing of CPPFLAGS / CFLAGS explicitly discards using of<br>
+# corresponsing environment variables. So pass empty LDFLAGS to discard<br>
+# using of corresponding environment variable. It is possible that a<br>
+# linker flag assumes that some compilation flag is set. We don't pass<br>
+# CFLAGS from environment, so we should not do it for LDFLAGS too.<br>
+set(DEPENDENCY_CFLAGS "")<br>
+set(DEPENDENCY_CPPFLAGS "")<br>
+set(DEPENDENCY_LDFLAGS)<br>
+if (APPLE)<br>
+    set(DEPENDENCY_CFLAGS   "${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}")<br>
+    set(DEPENDENCY_CPPFLAGS "${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}")<br>
+endif()<br>
+<br>
+# Install all libraries required by tarantool at current build dir<br>
+<br>
+#<br>
+# OpenSSL<br>
+#<br>
+ExternalProject_Add(openssl<br>
+    URL <a href="https://www.openssl.org/source/openssl-$%7BOPENSSL_VERSION%7D.tar.gz" rel="noreferrer" target="_blank">https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz</a><br>
+    CONFIGURE_COMMAND <SOURCE_DIR>/config<br>
+        CC=${CMAKE_C_COMPILER}<br>
+        CXX=${CMAKE_CXX_COMPILER}<br>
+        CFLAGS=${DEPENDENCY_CFLAGS}<br>
+        CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+        LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+<br>
+        --prefix=<INSTALL_DIR><br>
+        --libdir=lib<br>
+        no-shared<br>
+    INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} install_sw<br>
+)<br>
+<br>
+#<br>
+# ICU<br>
+#<br>
+ExternalProject_Add(icu<br>
+    URL <a href="https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz" rel="noreferrer" target="_blank">https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz</a><br>
+    # By default libicu is built by using clang/clang++ compiler (if it<br>
+    # exists). Here is a link for detecting compilers at libicu configure<br>
+    # script: <a href="https://github.com/unicode-org/icu/blob/7c7b8bd5702310b972f888299169bc3cc88bf0a6/icu4c/source/configure.ac#L135" rel="noreferrer" target="_blank">https://github.com/unicode-org/icu/blob/7c7b8bd5702310b972f888299169bc3cc88bf0a6/icu4c/source/configure.ac#L135</a><br>
+    # This will cause the problem on linux machine: tarantool is built<br>
+    # with gcc/g++ and libicu is built with clang/clang++ (if it exists)<br>
+    # so at linking stage `rellocation` errors will occur. To solve this,<br>
+    # we can set CC/CXX to CMAKE_C_COMPILER/CMAKE_CXX_COMPILER variables<br>
+    # manually which are detected above (by cmake `project()` command)<br>
+    CONFIGURE_COMMAND <SOURCE_DIR>/source/configure<br>
+        CC=${CMAKE_C_COMPILER}<br>
+        CXX=${CMAKE_CXX_COMPILER}<br>
+        CFLAGS=${DEPENDENCY_CFLAGS}<br>
+        CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+        LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+<br>
+        --with-data-packaging=static<br>
+        --prefix=<INSTALL_DIR><br>
+        --disable-shared<br>
+        --enable-static<br>
+)<br>
+<br>
+#<br>
+# ZLIB<br>
+#<br>
+ExternalProject_Add(zlib<br>
+    URL <a href="https://zlib.net/zlib-$%7BZLIB_VERSION%7D.tar.gz" rel="noreferrer" target="_blank">https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz</a><br>
+    CONFIGURE_COMMAND env<br>
+        CC=${CMAKE_C_COMPILER}<br>
+        CFLAGS=${DEPENDENCY_CFLAGS}<br>
+        CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+        LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+        <SOURCE_DIR>/configure<br>
+        --prefix=<INSTALL_DIR><br>
+        --static<br>
+)<br>
+<br>
+#<br>
+# Ncurses<br>
+#<br>
+ExternalProject_Add(ncurses<br>
+    URL <a href="https://ftp.gnu.org/gnu/ncurses/ncurses-$%7BNCURSES_VERSION%7D.tar.gz" rel="noreferrer" target="_blank">https://ftp.gnu.org/gnu/ncurses/ncurses-${NCURSES_VERSION}.tar.gz</a><br>
+    CONFIGURE_COMMAND <SOURCE_DIR>/configure<br>
+        CC=${CMAKE_C_COMPILER}<br>
+        CXX=${CMAKE_CXX_COMPILER}<br>
+        CFLAGS=${DEPENDENCY_CFLAGS}<br>
+        CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+        LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+<br>
+        --prefix=<INSTALL_DIR><br>
+<br>
+        # This flag enables creation of libcurses.a as a symlink to libncurses.a<br>
+        # and disables subdir creation `ncurses` at <install_dir>/include. It is<br>
+        # necessary for correct work of FindCurses.cmake module (this module is<br>
+        # builtin at cmake package) which used in cmake/FindReadline.cmake<br>
+        --enable-overwrite<br>
+<br>
+        # enable building libtinfo to prevent linking with libtinfo from system<br>
+        # directories<br>
+        --with-termlib<br>
+<br>
+        # set search paths for terminfo db<br>
+        --with-terminfo-dirs=/lib/terminfo:/usr/share/terminfo:/etc/terminfo<br>
+<br>
+        # disable install created terminfo db, use db from system<br>
+        --disable-db-install<br>
+        --without-progs<br>
+        --without-manpages<br>
+)<br>
+<br>
+#<br>
+# ReadLine<br>
+#<br>
+ExternalProject_Add(readline<br>
+    URL <a href="https://ftp.gnu.org/gnu/readline/readline-$%7BREADLINE_VERSION%7D.tar.gz" rel="noreferrer" target="_blank">https://ftp.gnu.org/gnu/readline/readline-${READLINE_VERSION}.tar.gz</a><br>
+    CONFIGURE_COMMAND <SOURCE_DIR>/configure<br>
+        CC=${CMAKE_C_COMPILER}<br>
+        CFLAGS=${DEPENDENCY_CFLAGS}<br>
+        CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+        LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+<br>
+        --prefix=<INSTALL_DIR><br>
+        --disable-shared<br>
+)<br>
+<br>
+#<br>
+# ICONV<br>
+#<br>
+if (APPLE)<br>
+    ExternalProject_Add(iconv<br>
+        URL <a href="https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz" rel="noreferrer" target="_blank">https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz</a><br>
+        CONFIGURE_COMMAND <SOURCE_DIR>/configure<br>
+            CC=${CMAKE_C_COMPILER}<br>
+            CFLAGS=${DEPENDENCY_CFLAGS}<br>
+            CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+            LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+<br>
+            --prefix=<INSTALL_DIR><br>
+            --disable-shared<br>
+            --enable-static<br>
+            --with-gnu-ld<br>
+        STEP_TARGETS download<br>
+    )<br>
+else()<br>
+    # In linux iconv is embedded into glibc<br>
+    # So we find system header and copy it locally<br>
+    find_path(ICONV_INCLUDE_DIR iconv.h)<br>
+    if(NOT ICONV_INCLUDE_DIR)<br>
+        message(FATAL_ERROR "iconv include header not found")<br>
+    endif()<br>
+<br>
+    set(ICONV_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/iconv-prefix")<br>
+<br>
+    add_custom_command(<br>
+        OUTPUT "${ICONV_INSTALL_PREFIX}/include/iconv.h"<br>
+        COMMAND ${CMAKE_COMMAND} -E make_directory<br>
+            "${ICONV_INSTALL_PREFIX}/include"<br>
+        COMMAND ${CMAKE_COMMAND} -E copy<br>
+            "${ICONV_INCLUDE_DIR}/iconv.h"<br>
+            "${ICONV_INSTALL_PREFIX}/include/iconv.h"<br>
+    )<br>
+    add_custom_target(iconv<br>
+        DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/iconv-prefix/include/iconv.h"<br>
+    )<br>
+    # This is a hack for further getting install directory of library<br>
+    # by ExternalProject_Get_Property<br>
+    set_target_properties(iconv<br>
+        PROPERTIES _EP_INSTALL_DIR ${ICONV_INSTALL_PREFIX}<br>
+    )<br>
+endif()<br>
+<br>
+#<br>
+# Unwind<br>
+#<br>
+if (APPLE)<br>
+    # On macOS libunwind is a part of MacOSX.sdk<br>
+    # So we need to find library and header and<br>
+    # copy it locally<br>
+    find_path(UNWIND_INCLUDE_DIR libunwind.h)<br>
+    find_library(UNWIND_LIBRARY libunwind.dylib<br>
+        PATH_SUFFIXES system<br>
+    )<br>
+<br>
+    set(UNWIND_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/unwind-prefix")<br>
+<br>
+    set(UNWIND_DEPENDENCIES)<br>
+<br>
+    if (UNWIND_INCLUDE_DIR AND UNWIND_LIBRARY)<br>
+        add_custom_command(<br>
+            OUTPUT "${UNWIND_INSTALL_PREFIX}/include/unwind.h"<br>
+            OUTPUT "${UNWIND_INSTALL_PREFIX}/include/libunwind.h"<br>
+            COMMAND ${CMAKE_COMMAND} -E make_directory<br>
+                "${UNWIND_INSTALL_PREFIX}/include"<br>
+            COMMAND ${CMAKE_COMMAND} -E copy<br>
+                "${UNWIND_INCLUDE_DIR}/libunwind.h"<br>
+                "${UNWIND_INCLUDE_DIR}/unwind.h"<br>
+                "${UNWIND_INSTALL_PREFIX}/include/"<br>
+        )<br>
+        add_custom_command(<br>
+            OUTPUT "${UNWIND_INSTALL_PREFIX}/lib/libunwind.dylib"<br>
+            COMMAND ${CMAKE_COMMAND} -E make_directory<br>
+                "${UNWIND_INSTALL_PREFIX}/lib"<br>
+            COMMAND ${CMAKE_COMMAND} -E copy<br>
+                "${UNWIND_LIBRARY}"<br>
+                "${UNWIND_INSTALL_PREFIX}/lib/"<br>
+        )<br>
+        set(UNWIND_DEPENDENCIES<br>
+            ${UNWIND_DEPENDENCIES}<br>
+            "${UNWIND_INSTALL_PREFIX}/lib/libunwind.dylib"<br>
+            "${UNWIND_INSTALL_PREFIX}/include/libunwind.h"<br>
+        )<br>
+    else()<br>
+        message(STATUS "Unwind not found")<br>
+    endif()<br>
+<br>
+    add_custom_target(unwind DEPENDS ${UNWIND_DEPENDENCIES})<br>
+    # This is a hack for further getting install directory of library<br>
+    # by ExternalProject_Get_Property<br>
+    set_target_properties(unwind<br>
+        PROPERTIES _EP_INSTALL_DIR ${UNWIND_INSTALL_PREFIX}<br>
+    )<br>
+else()<br>
+    ExternalProject_Add(unwind<br>
+        URL <a href="https://download.savannah.nongnu.org/releases/libunwind/libunwind-$%7BUNWIND_VERSION%7D.tar.gz" rel="noreferrer" target="_blank">https://download.savannah.nongnu.org/releases/libunwind/libunwind-${UNWIND_VERSION}.tar.gz</a><br>
+        CONFIGURE_COMMAND <SOURCE_DIR>/configure<br>
+            CC=${CMAKE_C_COMPILER}<br>
+            CXX=${CMAKE_CXX_COMPILER}<br>
+            CFLAGS=${DEPENDENCY_CFLAGS}<br>
+            CPPFLAGS=${DEPENDENCY_CPPFLAGS}<br>
+            LDFLAGS=${DEPENDENCY_LDFLAGS}<br>
+            --prefix=<INSTALL_DIR><br>
+            --disable-shared<br>
+            --enable-static<br>
+            --disable-minidebuginfo # to prevent linking with liblzma<br>
+        STEP_TARGETS download<br>
+    )<br>
+endif()<br>
+<br>
+# Get install directories of builded libraries for building<br>
+# tarantool with custon CMAKE_PREFIX_PATH<br>
+foreach(PROJ openssl icu zlib ncurses readline iconv unwind)<br>
+    ExternalProject_Get_Property(${PROJ} install_dir)<br>
+    set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}:${install_dir})<br>
+    set(TARANTOOL_DEPENDS ${PROJ} ${TARANTOOL_DEPENDS})<br>
+    message(STATUS "Add external project ${PROJ} in ${install_dir}")<br>
+endforeach()<br>
+<br>
+ExternalProject_Add(tarantool<br>
+    DEPENDS ${TARANTOOL_DEPENDS}<br>
+    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..<br>
+    LIST_SEPARATOR :<br>
+    CMAKE_ARGS<br>
+        # Override LOCALSTATEDIR to avoid cmake "special" cases:<br>
+        # <a href="https://cmake.org/cmake/help/v3.4/module/GNUInstallDirs.html#special-cases" rel="noreferrer" target="_blank">https://cmake.org/cmake/help/v3.4/module/GNUInstallDirs.html#special-cases</a><br>
+        -DCMAKE_INSTALL_LOCALSTATEDIR=<INSTALL_DIR>/var<br>
+        -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR><br>
+        -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}<br>
+        -DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH=FALSE<br>
+        -DOPENSSL_USE_STATIC_LIBS=TRUE<br>
+        -DBUILD_STATIC=TRUE<br>
+        -DENABLE_DIST=TRUE<br>
+        -DENABLE_BACKTRACE=TRUE<br>
+        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}<br>
+        -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}<br>
+        ${CMAKE_TARANTOOL_ARGS}<br>
+    STEP_TARGETS build<br>
+    BUILD_COMMAND $(MAKE)<br>
+)<br>
+<br>
+enable_testing()<br>
+ExternalProject_Get_Property(tarantool binary_dir)<br>
+SET(TARANTOOL_BINARY_DIR ${binary_dir})<br>
+<br>
+add_test(<br>
+    NAME check-dependencies<br>
+    COMMAND ${CMAKE_COMMAND}<br>
+        -D FILE=${TARANTOOL_BINARY_DIR}/src/tarantool<br>
+        -P CheckDependencies.cmake<br>
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test<br>
+)<br>
+<br>
+add_test(<br>
+    NAME check-exports<br>
+    COMMAND ${TARANTOOL_BINARY_DIR}/src/tarantool<br>
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/static-build/exports.test.lua<br>
+)<br>
+<br>
+add_test(<br>
+    NAME check-traceback<br>
+    COMMAND ${TARANTOOL_BINARY_DIR}/src/tarantool<br>
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/static-build/traceback.test.lua<br>
+)<br>
diff --git a/static-build/README.md b/static-build/README.md<br>
new file mode 100644<br>
index 000000000..2219b5026<br>
--- /dev/null<br>
+++ b/static-build/README.md<br>
@@ -0,0 +1,90 @@<br>
+# Tarantool static build tooling<br>
+<br>
+These files help to prepare environment for building Tarantool<br>
+statically. And builds it.<br>
+<br>
+## Prerequisites<br>
+<br>
+Please install following tools and libraries that will<br>
+be necessary for building and testing:<br>
+* git<br>
+* A C/C++ compiler.<br>
+<br>
+  Ordinarily, this is gcc and g++ version 4.6 or later. On Mac OS X, this<br>
+  is Clang version 3.2+.<br>
+* cmake<br>
+* autoconf automake libtool<br>
+* make<br>
+* Python and modules.<br>
+<br>
+  Python interpreter is not necessary for building Tarantool itself, unless you<br>
+  intend to use the “Run the test suite". For all platforms, this is python<br>
+  version 2.7+ (but not 3.x). You need the following Python modules:<br>
+  * pyyaml<br>
+  * argparse<br>
+  * msgpack-python<br>
+  * gevent<br>
+  * six<br>
+<br>
+### Here is an examples for your OS:<br>
+<br>
+CentOS:<br>
+<br>
+```bash<br>
+yum install -y \<br>
+    git perl gcc cmake make gcc-c++ libstdc++-static autoconf automake libtool \<br>
+    python-msgpack python-yaml python-argparse python-six python-gevent<br>
+```<br>
+<br>
+Ubuntu/Debian:<br>
+<br>
+```bash<br>
+apt-get install -y \<br>
+    build-essential cmake make coreutils autoconf automake libtool sed \<br>
+    python python-pip python-setuptools python-dev \<br>
+    python-msgpack python-yaml python-argparse python-six python-gevent<br>
+```<br>
+<br>
+MacOS:<br>
+<br>
+Before you start please install default Xcode Tools by Apple:<br>
+<br>
+```bash<br>
+sudo xcode-select --install<br>
+sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer<br>
+```<br>
+<br>
+Install brew using command from<br>
+[Homebrew repository instructions](<a href="https://github.com/Homebrew/inst" rel="noreferrer" target="_blank">https://github.com/Homebrew/inst</a>)<br>
+<br>
+After that run next script:<br>
+<br>
+```bash<br>
+brew install autoconf automake libtool cmake file://$${PWD}/tools/brew_taps/tntpython2.rbs<br>
+pip install --force-reinstall -r test-run/requirements.txt<br>
+```<br>
+<br>
+## Usage<br>
+<br>
+```bash<br>
+cmake .<br>
+make -j<br>
+ctest -V<br>
+```<br>
+<br>
+## Customize your build<br>
+<br>
+If you want to customise build, you need to set `CMAKE_TARANTOOL_ARGS` variable<br>
+<br>
+### Usage<br>
+<br>
+There are three types of `CMAKE_BUILD_TYPE`:<br>
+* Debug - default<br>
+* Release<br>
+* RelWithDebInfo<br>
+<br>
+And you want to build tarantool with RelWithDebInfo:<br>
+<br>
+```bash<br>
+cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo" .<br>
+```<br>
diff --git a/static-build/test/CheckDependencies.cmake b/static-build/test/CheckDependencies.cmake<br>
new file mode 100644<br>
index 000000000..49e91e7fa<br>
--- /dev/null<br>
+++ b/static-build/test/CheckDependencies.cmake<br>
@@ -0,0 +1,43 @@<br>
+## This is a cmake-based test, it checks that tarantool static binary<br>
+# has no dependencies except allowed ones.<br>
+<br>
+include(GetPrerequisites)<br>
+if(NOT FILE)<br>
+    message(FATAL_ERROR "Usage: "<br>
+        "${CMAKE_COMMAND} -DFILE=<FILENAME> -P CheckDependencies.cmake")<br>
+elseif(NOT EXISTS ${FILE})<br>
+    message(FATAL_ERROR "${FILE}: No such file")<br>
+endif()<br>
+<br>
+get_prerequisites(${FILE} DEPENDENCIES 0 0 "" "")<br>
+<br>
+if (APPLE)<br>
+    set(ALLOWLIST<br>
+        libSystem<br>
+        CoreFoundation<br>
+        libc++<br>
+    )<br>
+elseif(UNIX)<br>
+    set(ALLOWLIST<br>
+        libdl<br>
+        librt<br>
+        libc<br>
+        libm<br>
+        libgcc_s<br>
+        libpthread<br>
+    )<br>
+else()<br>
+    message(FATAL_ERROR "Unknown platform")<br>
+endif()<br>
+<br>
+foreach(DEPENDENCY_FILE ${DEPENDENCIES})<br>
+    message("Dependency: ${DEPENDENCY_FILE}")<br>
+endforeach()<br>
+<br>
+foreach(DEPENDENCY_FILE ${DEPENDENCIES})<br>
+    get_filename_component(libname ${DEPENDENCY_FILE} NAME_WE)<br>
+    list (FIND ALLOWLIST ${libname} _index)<br>
+    if (_index EQUAL -1)<br>
+        message(FATAL_ERROR "Blocklisted dependency: ${DEPENDENCY_FILE}")<br>
+    endif()<br>
+endforeach()<br>
diff --git a/static-build/test/static-build/exports.test.lua b/static-build/test/static-build/exports.test.lua<br>
new file mode 100755<br>
index 000000000..de54973d8<br>
--- /dev/null<br>
+++ b/static-build/test/static-build/exports.test.lua<br>
@@ -0,0 +1,142 @@<br>
+#!/usr/bin/env tarantool<br>
+<br>
+local tap = require('tap')<br>
+local ffi = require('ffi')<br>
+ffi.cdef([[<br>
+    void *dlsym(void *handle, const char *symbol);<br>
+]])<br>
+<br>
+local test = tap.test('exports')<br>
+<br>
+-- See `man 3 dlsym`:<br>
+-- RTLD_DEFAULT<br>
+--   Find the first occurrence of the desired symbol using the default<br>
+--   shared object search order. The search will include global symbols<br>
+--   in the executable and its dependencies, as well as symbols in shared<br>
+--   objects that were dynamically loaded with the RTLD_GLOBAL flag.<br>
+local RTLD_DEFAULT = ffi.cast("void *", jit.os == "OSX" and -2LL or 0LL)<br>
+<br>
+local function check_symbol(sym)<br>
+    test:ok(ffi.C.dlsym(RTLD_DEFAULT, sym) ~= nil, ('Symbol %q found'):format(sym))<br>
+end<br>
+<br>
+local check_symbols = {<br>
+    -- FFI<br>
+<br>
+    'guava',<br>
+    'base64_decode',<br>
+    'base64_encode',<br>
+    'SHA1internal',<br>
+    'random_bytes',<br>
+    'fiber_time',<br>
+    'ibuf_create',<br>
+    'ibuf_destroy',<br>
+    'port_destroy',<br>
+    'csv_create',<br>
+    'csv_destroy',<br>
+    'title_get',<br>
+    'title_update',<br>
+    'tnt_iconv',<br>
+    'tnt_iconv_open',<br>
+    'tnt_iconv_close',<br>
+    'exception_get_int',<br>
+    'exception_get_string',<br>
+<br>
+    'tarantool_lua_ibuf',<br>
+    'uuid_nil',<br>
+    'tt_uuid_create',<br>
+    'tt_uuid_str',<br>
+    'tt_uuid_is_equal',<br>
+    'tt_uuid_is_nil',<br>
+    'tt_uuid_bswap',<br>
+    'tt_uuid_from_string',<br>
+    'log_level',<br>
+    'log_format',<br>
+    'uri_parse',<br>
+    'uri_format',<br>
+    'PMurHash32',<br>
+    'PMurHash32_Process',<br>
+    'PMurHash32_Result',<br>
+    'crc32_calc',<br>
+    'mp_encode_double',<br>
+    'mp_encode_float',<br>
+    'mp_encode_decimal',<br>
+    'mp_decode_double',<br>
+    'mp_decode_float',<br>
+    'mp_decode_extl',<br>
+    'mp_sizeof_decimal',<br>
+    'decimal_unpack',<br>
+<br>
+    'log_type',<br>
+    'say_set_log_level',<br>
+    'say_logrotate',<br>
+    'say_set_log_format',<br>
+    'tarantool_uptime',<br>
+    'tarantool_exit',<br>
+    'log_pid',<br>
+    'space_by_id',<br>
+    'space_run_triggers',<br>
+    'space_bsize',<br>
+    'box_schema_version',<br>
+<br>
+    'crypto_EVP_MD_CTX_new',<br>
+    'crypto_EVP_MD_CTX_free',<br>
+    'crypto_HMAC_CTX_new',<br>
+    'crypto_HMAC_CTX_free',<br>
+    'crypto_stream_new',<br>
+    'crypto_stream_begin',<br>
+    'crypto_stream_append',<br>
+    'crypto_stream_commit',<br>
+    'crypto_stream_delete',<br>
+<br>
+    -- Module API<br>
+<br>
+    '_say',<br>
+    'swim_cfg',<br>
+    'swim_quit',<br>
+    'fiber_new',<br>
+    'fiber_cancel',<br>
+    'coio_wait',<br>
+    'coio_close',<br>
+    'coio_call',<br>
+    'coio_getaddrinfo',<br>
+    'luaT_call',<br>
+    'box_txn',<br>
+    'box_select',<br>
+    'clock_realtime',<br>
+    'string_strip_helper',<br>
+<br>
+    -- Lua / LuaJIT<br>
+<br>
+    'lua_newstate',<br>
+    'lua_close',<br>
+    'luaL_loadstring',<br>
+    'luaJIT_profile_start',<br>
+    'luaJIT_profile_stop',<br>
+    'luaJIT_profile_dumpstack',<br>
+<br>
+    'ERR_error_string',<br>
+    'ERR_get_error',<br>
+<br>
+    'EVP_get_digestbyname',<br>
+    'EVP_get_cipherbyname',<br>
+    'EVP_CIPHER_CTX_new',<br>
+    'EVP_CIPHER_CTX_free',<br>
+    'EVP_CIPHER_block_size',<br>
+    'HMAC_Init_ex',<br>
+    'HMAC_Update',<br>
+    'HMAC_Final',<br>
+<br>
+    'ZSTD_compress',<br>
+    'ZSTD_decompress',<br>
+    'ZSTD_free',<br>
+    'ZSTD_malloc',<br>
+    'ZSTD_versionString',<br>
+}<br>
+<br>
+test:plan(#check_symbols)<br>
+for _, sym in ipairs(check_symbols) do<br>
+    check_symbol(sym)<br>
+end<br>
+<br>
+os.exit(test:check() and 0 or 1)<br>
diff --git a/static-build/test/static-build/traceback.test.lua b/static-build/test/static-build/traceback.test.lua<br>
new file mode 100755<br>
index 000000000..32e1ed8b5<br>
--- /dev/null<br>
+++ b/static-build/test/static-build/traceback.test.lua<br>
@@ -0,0 +1,15 @@<br>
+#!/usr/bin/env tarantool<br>
+<br>
+local tap = require('tap')<br>
+local fiber = require('fiber')<br>
+<br>
+local test = tap.test('traceback')<br>
+test:plan(1)<br>
+<br>
+local info = <a href="http://fiber.info" rel="noreferrer" target="_blank">fiber.info</a>()[<a href="http://fiber.id" rel="noreferrer" target="_blank">fiber.id</a>()]<br>
+test:ok(info.backtrace ~= nil, '<a href="http://fiber.info" rel="noreferrer" target="_blank">fiber.info</a>() has backtrace')<br>
+for _, l in pairs(info.backtrace or {}) do<br>
+    test:diag('%s: %s', next(l))<br>
+end<br>
+<br>
+os.exit(test:check() and 0 or 1)<br>
-- <br>
2.26.2<br>
<br>
</blockquote></div>