Hello, thank you for the review! Here are required fixes: 1. Fixed typos at commit message, here is a new: build: refactor static build process Refactored static build process to use static-build/CMakeLists.txt instead of Dockerfile.staticbuild (this allows to support static build on macOS). Following third-party dependencies for static build are installed via cmake `ExternalProject_Add`: - OpenSSL - Zlib - Ncurses - Readline - Unwind - ICU * Added support static build for macOS * Fixed `CONFIGURE_COMMAND` while building bundled libcurl for static build at file cmake/BuildLibCURL.cmake: - disable building shared libcurl libraries (by setting `--disable-shared` option) - disable hiding libcurl symbols (by setting `--disable-symbol-hiding` option) - prevent linking libcurl with system libz (by setting `--with-zlib=${FOUND_ZLIB_ROOT_DIR}` option) * Removed Dockerfile.staticbuild * Added new gitlab.ci jobs to test new style static build: - static_build_cmake_linux - static_build_cmake_osx_15 * Removed static_docker_build gitlab.ci job Closes #5095 2. Fixed commentaries at .travis.mk 3. Fixed finding libz library at cmake/BuildLibCurl.cmake as at master branch 4. Instead of using static-build/.gitignore use the root .gitignore file 5. Refactored static-build/CMakeLists.txt: * Project name is set to tarantool-static * Instead of explicitly finding of c/c++ compilers current version uses cmake `project(tarantool-static C CXX)` command. This change requires to manually set CFLAGS/CPPFLAGS/LDFLAGS for all static-build dependencies (because building dependencies at macOS requires path to macOS SDK) the idea was taken from cmake/BuildLibCurl.cmake * Added commentaries about problem with libicu * Removed unused TEST_COMMAND at ExternalProject_Add(zlib ...) also removed unnecessary # STEP_TARGETS at ExternalProject_Add(readline ...) * Deleted doubled whitespaces 6. Fixed static-build/README.md: * Added list of required tools * Added example for ubuntu/debian * Fixed indentation and typos 7. Refactored tests: * Got rid of test-run * Deleted whitespaces at exports.test.lua * Fixed defining of RTLD_DEFAULT Here is a diff: diff --git a/.gitignore b/.gitignore index a42c7db35..c6e261e18 100644 --- a/.gitignore +++ b/.gitignore @@ -151,3 +151,11 @@ src/box/sql/parse.h src/box/sql/parse.c src/box/sql/opcodes.h src/box/sql/opcodes.c + +# static-build +static-build/*-prefix +static-build/Makefile +static-build/build + +# macOS files +.DS_Store diff --git a/.travis.mk b/.travis.mk index ccd9d6db1..58d0c1596 100644 --- a/.travis.mk +++ b/.travis.mk @@ -149,7 +149,8 @@ test_static_build: deps_debian_static CMAKE_EXTRA_PARAMS=-DBUILD_STATIC=ON make -f .travis.mk test_debian_no_deps # New static build -# builddir used in this target - is a default build path from cmake ExternalProject_Add() +# builddir used in this target - is a default build path from cmake +# ExternalProject_Add() test_static_build_cmake_linux: cd static-build && cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo;-DENABLE_WERROR=ON" . && \ make -j && ctest -V @@ -233,7 +234,8 @@ base_deps_osx: brew install --force ${STATIC_OSX_PKGS} || brew upgrade ${STATIC_OSX_PKGS} pip install --force-reinstall -r test-run/requirements.txt -# builddir used in this target - is a default build path from cmake ExternalProject_Add() +# builddir used in this target - is a default build path from cmake +# ExternalProject_Add() test_static_build_cmake_osx: base_deps_osx cd static-build && cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo;-DENABLE_WERROR=ON" . && \ make -j && ctest -V diff --git a/cmake/BuildLibCURL.cmake b/cmake/BuildLibCURL.cmake index 365c14284..86fec39e9 100644 --- a/cmake/BuildLibCURL.cmake +++ b/cmake/BuildLibCURL.cmake @@ -8,10 +8,11 @@ macro(curl_build) find_path(ZLIB_INCLUDE_DIR zlib.h) message(STATUS "Looking for zlib.h - ${ZLIB_INCLUDE_DIR}") if (BUILD_STATIC) - find_library(LIBZ_LIBRARY NAMES libz.a) + set(LIBZ_LIB_NAME libz.a) else() - find_library(LIBZ_LIBRARY NAMES z) + set(LIBZ_LIB_NAME z) endif() + find_library(LIBZ_LIBRARY NAMES ${LIBZ_LIB_NAME}) message(STATUS "Looking for libz - ${LIBZ_LIBRARY}") if (NOT ZLIB_INCLUDE_DIR OR NOT LIBZ_LIBRARY) diff --git a/static-build/.gitignore b/static-build/.gitignore deleted file mode 100644 index c8028a870..000000000 --- a/static-build/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*-prefix -/Makefile -/test/var -/build diff --git a/static-build/CMakeLists.txt b/static-build/CMakeLists.txt index d07cae176..90029fdd8 100644 --- a/static-build/CMakeLists.txt +++ b/static-build/CMakeLists.txt @@ -1,6 +1,11 @@ cmake_minimum_required(VERSION 2.8) -project(tarantool-env NONE) +# Detect system compilers for further configuring dependencies to be +# builded with these compilers. This is used to build tarantool and +# it's dependencies by usign one compiler system (for example libicu +# by default uses clang if it exists when others uses gcc/g++ on +# linux machine). +project(tarantool-static C CXX) include(ExternalProject) set(OPENSSL_VERSION 1.1.1f) @@ -9,21 +14,24 @@ set(NCURSES_VERSION 6.2) set(READLINE_VERSION 8.0) set(UNWIND_VERSION 1.3-rc1) -# Set compilers explicitly for further configuring dependencies with -# these compilers. This gonna solve libicu building problem in case when -# at dependency configure stage no compiler specified and clang compiler -# exists on linux machine, libicu sources would be compiled with clang -# while for other dependencies (including tarantool) gcc would be used. -# This behaviour causes problem at tarantool linkage stage. +# Pass -isysroot= option on Mac OS to a preprocessor and a C +# compiler to find header files installed with an SDK. +# +# The idea is to set these (DEPENDENCY_*) variables to corresponding +# environment variables at each depenency configure script. +# +# Note: Passing of CPPFLAGS / CFLAGS explicitly discards using of +# corresponsing environment variables. So 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. +set(DEPENDENCY_CFLAGS "") +set(DEPENDENCY_CPPFLAGS "") +set(DEPENDENCY_LDFLAGS) if (APPLE) - find_program(C_COMPILER clang) - find_program(CXX_COMPILER clang++) -else() - find_program(C_COMPILER gcc) - find_program(CXX_COMPILER g++) + set(DEPENDENCY_CFLAGS "${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}") + set(DEPENDENCY_CPPFLAGS "${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT}") endif() -set(CMAKE_C_COMPILER ${C_COMPILER}) -set(CMAKE_CXX_COMPILER ${CXX_COMPILER}) # Install all libraries required by tarantool at current build dir @@ -32,9 +40,13 @@ set(CMAKE_CXX_COMPILER ${CXX_COMPILER}) # ExternalProject_Add(openssl URL https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} + CONFIGURE_COMMAND /config + CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} - /config + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} + --prefix= --libdir=lib no-shared @@ -46,9 +58,21 @@ ExternalProject_Add(openssl # ExternalProject_Add(icu URL https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} + # By default libicu is built by using clang/clang++ compiler (if it + # exists). Here is a link for detecting compilers at libicu configure + # script: https://github.com/unicode-org/icu/blob/7c7b8bd5702310b972f888299169bc3cc88bf0a6/icu4c/source/configure.ac#L135 + # This will cause the problem on linux machine: tarantool is built + # with gcc/g++ and libicu is built with clang/clang++ (if it exists) + # so at linking stage `rellocation` errors will occur. To solve this, + # we can set CC/CXX to CMAKE_C_COMPILER/CMAKE_CXX_COMPILER variables + # manually which are detected above (by cmake `project()` command) + CONFIGURE_COMMAND /source/configure + CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} - /source/configure + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} + --with-data-packaging=static --prefix= --disable-shared @@ -60,11 +84,14 @@ ExternalProject_Add(icu # ExternalProject_Add(zlib URL https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} + CONFIGURE_COMMAND env + CC=${CMAKE_C_COMPILER} + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} /configure --prefix= --static - TEST_COMMAND ${CMAKE_MAKE_PROGRAM} check ) # @@ -72,13 +99,17 @@ ExternalProject_Add(zlib # ExternalProject_Add(ncurses URL https://ftp.gnu.org/gnu/ncurses/ncurses-${NCURSES_VERSION}.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} + CONFIGURE_COMMAND /configure + CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} - /configure + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} + --prefix= # This flag enables creation of libcurses.a as a symlink to libncurses.a - # and disables subdir creation `ncurses` at /include. It is + # and disables subdir creation `ncurses` at /include. It is # necessary for correct work of FindCurses.cmake module (this module is # builtin at cmake package) which used in cmake/FindReadline.cmake --enable-overwrite @@ -101,11 +132,14 @@ ExternalProject_Add(ncurses # ExternalProject_Add(readline URL https://ftp.gnu.org/gnu/readline/readline-${READLINE_VERSION}.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} - /configure + CONFIGURE_COMMAND /configure + CC=${CMAKE_C_COMPILER} + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} + --prefix= --disable-shared - # STEP_TARGETS download ) # @@ -114,8 +148,12 @@ ExternalProject_Add(readline if (APPLE) ExternalProject_Add(iconv URL https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} - /configure + CONFIGURE_COMMAND /configure + CC=${CMAKE_C_COMPILER} + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} + --prefix= --disable-shared --enable-static @@ -203,9 +241,12 @@ if (APPLE) else() ExternalProject_Add(unwind URL https://download.savannah.nongnu.org/releases/libunwind/libunwind-${UNWIND_VERSION}.tar.gz - CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} + CONFIGURE_COMMAND /configure + CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} - /configure + CFLAGS=${DEPENDENCY_CFLAGS} + CPPFLAGS=${DEPENDENCY_CPPFLAGS} + LDFLAGS=${DEPENDENCY_LDFLAGS} --prefix= --disable-shared --enable-static @@ -258,7 +299,13 @@ add_test( ) add_test( - NAME test-run-static - COMMAND ./test-run.py --builddir ${TARANTOOL_BINARY_DIR} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test + NAME check-exports + COMMAND ${TARANTOOL_BINARY_DIR}/src/tarantool + ${CMAKE_CURRENT_SOURCE_DIR}/test/static-build/exports.test.lua +) + +add_test( + NAME check-traceback + COMMAND ${TARANTOOL_BINARY_DIR}/src/tarantool + ${CMAKE_CURRENT_SOURCE_DIR}/test/static-build/traceback.test.lua ) diff --git a/static-build/README.md b/static-build/README.md index 0019e963f..2219b5026 100644 --- a/static-build/README.md +++ b/static-build/README.md @@ -5,6 +5,29 @@ statically. And builds it. ## Prerequisites +Please install following tools and libraries that will +be necessary for building and testing: +* git +* A C/C++ compiler. + + Ordinarily, this is gcc and g++ version 4.6 or later. On Mac OS X, this + is Clang version 3.2+. +* cmake +* autoconf automake libtool +* make +* Python and modules. + + Python interpreter is not necessary for building Tarantool itself, unless you + intend to use the “Run the test suite". For all platforms, this is python + version 2.7+ (but not 3.x). You need the following Python modules: + * pyyaml + * argparse + * msgpack-python + * gevent + * six + +### Here is an examples for your OS: + CentOS: ```bash @@ -13,11 +36,20 @@ yum install -y \ python-msgpack python-yaml python-argparse python-six python-gevent ``` +Ubuntu/Debian: + +```bash +apt-get install -y \ + build-essential cmake make coreutils autoconf automake libtool sed \ + python python-pip python-setuptools python-dev \ + python-msgpack python-yaml python-argparse python-six python-gevent +``` + MacOS: Before you start please install default Xcode Tools by Apple: -``` +```bash sudo xcode-select --install sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer ``` @@ -28,11 +60,11 @@ Install brew using command from After that run next script: ```bash - brew install autoconf automake libtool cmake file://$${PWD}/tools/brew_taps/tntpython2.rbs - pip install --force-reinstall -r test-run/requirements.txt +brew install autoconf automake libtool cmake file://$${PWD}/tools/brew_taps/tntpython2.rbs +pip install --force-reinstall -r test-run/requirements.txt ``` -### Usage +## Usage ```bash cmake . @@ -46,7 +78,7 @@ If you want to customise build, you need to set `CMAKE_TARANTOOL_ARGS` variable ### Usage -There is three types of `CMAKE_BUILD_TYPE`: +There are three types of `CMAKE_BUILD_TYPE`: * Debug - default * Release * RelWithDebInfo diff --git a/static-build/test/static-build/exports.test.lua b/static-build/test/static-build/exports.test.lua index 63dc163a9..de54973d8 100755 --- a/static-build/test/static-build/exports.test.lua +++ b/static-build/test/static-build/exports.test.lua @@ -8,19 +8,13 @@ ffi.cdef([[ local test = tap.test('exports') - -local RTLD_DEFAULT -- See `man 3 dlsym`: -- RTLD_DEFAULT --- Find the first occurrence of the desired symbol using the default --- shared object search order. The search will include global symbols +-- Find the first occurrence of the desired symbol using the default +-- shared object search order. The search will include global symbols -- in the executable and its dependencies, as well as symbols in shared -- objects that were dynamically loaded with the RTLD_GLOBAL flag. -if jit.os == "OSX" then - RTLD_DEFAULT = ffi.cast("void *", -2LL) -else - RTLD_DEFAULT = ffi.cast("void *", 0LL) -end +local RTLD_DEFAULT = ffi.cast("void *", jit.os == "OSX" and -2LL or 0LL) local function check_symbol(sym) test:ok(ffi.C.dlsym(RTLD_DEFAULT, sym) ~= nil, ('Symbol %q found'):format(sym)) diff --git a/static-build/test/static-build/suite.ini b/static-build/test/static-build/suite.ini deleted file mode 100644 index 5aabadd92..000000000 --- a/static-build/test/static-build/suite.ini +++ /dev/null @@ -1,4 +0,0 @@ -[default] -core = app -description = Static build tests -is_parallel = True diff --git a/static-build/test/test-run.py b/static-build/test/test-run.py deleted file mode 120000 index 02187cdc5..000000000 --- a/static-build/test/test-run.py +++ /dev/null @@ -1 +0,0 @@ -../../test-run/test-run.py \ No newline at end of file пт, 4 сент. 2020 г. в 20:52, Igor Munkin : > Hello, > > Thanks for the patch! It's strange to me why this patch is not reviewed > by Sasha Ti., though there are many changes in the build and testing > infrastructure. Nevertheless, please consider my comments below. > > On 25.08.20, HustonMmmavr wrote: > > From: Yaroslav Dynnikov > > > > Refactored static build process to use static-build/CMakeLists.txt > > instead of Dockerfile.staticbuild (this allows to support static > > build on macOS). Following third-party dependencies for static build > > are installed via cmake `ExternalProject_Add`: > > - OpenSSL > > - Zlib > > - Ncurses > > - Readline > > - Unwind > > - ICU > > > > * Added support static build for macOS > > * Prevented linking tarantool binary with system libcurses (which is > > entire copy of libncurses) by setting flag `CURSES_NEED_NCURSES` > > to TRUE at file cmake/FindReadline.cmake. (This flag defined at > > FindCurses.cmake module and it's a workaround for linking with > > correct library) > > * Fixed `CONFIGURE_COMMAND` while building bundled libcurl for staic > > Typo: s/staic/static/. > > > build at file cmake/BuildLibCURL.cmake: > > - disable building shared libcurl libraries (by setting > > `--disable-shared` option) > > - disable hiding libcurl symbols (by setting > > `--disable-symbol-hiding` option) > > - prevent linking libcurl with system libz by settign > > Typo: s/settign/setting/. > > > `--with-zlib=${FOUND_ZLIB_ROOT_DIR}` option) > > * Removed Dockerfile.staticbuild > > * Added new gitlab.ci jobs to test new style static build: > > - static_build_cmake_linux > > - static_build_cmake_osx_15 > > * Removed static_docker_build gitlab.ci job > > > > Closes #5095 > > --- > > .gitlab-ci.yml | 11 +- > > .travis.mk | 52 +++- > > Dockerfile.staticbuild | 98 ------- > > cmake/BuildLibCURL.cmake | 18 +- > > cmake/FindReadline.cmake | 10 + > > cmake/compiler.cmake | 24 +- > > cmake/os.cmake | 5 +- > > static-build/.gitignore | 4 + > > static-build/CMakeLists.txt | 240 ++++++++++++++++++ > > static-build/README.md | 58 +++++ > > static-build/test/CheckDependencies.cmake | 43 ++++ > > static-build/test/static-build/box.lua | 3 + > > .../test/static-build/exports.test.lua | 148 +++++++++++ > > static-build/test/static-build/suite.ini | 5 + > > .../test/static-build/traceback.test.lua | 15 ++ > > static-build/test/test-run.py | 1 + > > 16 files changed, 608 insertions(+), 127 deletions(-) > > delete mode 100644 Dockerfile.staticbuild > > create mode 100644 static-build/.gitignore > > create mode 100644 static-build/CMakeLists.txt > > create mode 100644 static-build/README.md > > create mode 100644 static-build/test/CheckDependencies.cmake > > create mode 100755 static-build/test/static-build/box.lua > > create mode 100755 static-build/test/static-build/exports.test.lua > > create mode 100644 static-build/test/static-build/suite.ini > > create mode 100755 static-build/test/static-build/traceback.test.lua > > create mode 120000 static-build/test/test-run.py > > > > > > > diff --git a/.travis.mk b/.travis.mk > > index efc05cf05..482672429 100644 > > --- a/.travis.mk > > +++ b/.travis.mk > > @@ -148,8 +148,12 @@ deps_debian_static: > > test_static_build: deps_debian_static > > CMAKE_EXTRA_PARAMS=-DBUILD_STATIC=ON make -f .travis.mk > test_debian_no_deps > > > > -test_static_docker_build: > > - docker build --no-cache --network=host --build-arg RUN_TESTS=ON -f > Dockerfile.staticbuild . > > +# New static build > > +# builddir used in this target - is a default build path from cmake > ExternalProject_Add() > > The comment exceeds 80 symbols. > > > +test_static_build_cmake_linux: > > > > > diff --git a/cmake/BuildLibCURL.cmake b/cmake/BuildLibCURL.cmake > > index 5f8b15a63..365c14284 100644 > > --- a/cmake/BuildLibCURL.cmake > > +++ b/cmake/BuildLibCURL.cmake > > @@ -4,15 +4,20 @@ macro(curl_build) > > > > > if (BUILD_STATIC) > > - set(LIBZ_LIB_NAME libz.a) > > + find_library(LIBZ_LIBRARY NAMES libz.a) > > else() > > - set(LIBZ_LIB_NAME z) > > + find_library(LIBZ_LIBRARY NAMES z) > > endif() > > - find_library(LIBZ_LIBRARY NAMES ${LIBZ_LIB_NAME}) > > Well... What is the difference from the previous approach? > > > - if ("${LIBZ_LIBRARY}" STREQUAL "LIBZ_LIBRARY-NOTFOUND") > > + message(STATUS "Looking for libz - ${LIBZ_LIBRARY}") > > + > > > > > diff --git a/static-build/.gitignore b/static-build/.gitignore > > new file mode 100644 > > index 000000000..c8028a870 > > --- /dev/null > > +++ b/static-build/.gitignore > > Minor: Why did you introduce a separate .gitignore instead of adjusting > the root one? > > > @@ -0,0 +1,4 @@ > > > > > diff --git a/static-build/CMakeLists.txt b/static-build/CMakeLists.txt > > new file mode 100644 > > index 000000000..d90a642e6 > > --- /dev/null > > +++ b/static-build/CMakeLists.txt > > @@ -0,0 +1,240 @@ > > +cmake_minimum_required(VERSION 2.8) > > + > > +project(tarantool-env NONE) > > Minor: Why is the name tarantool-env and not e.g. tarantool-static? > > > + > > > > > + > > +if (APPLE) > > + find_program(C_COMPILER clang) > > + find_program(CXX_COMPILER clang++) > > +else() > > + find_program(C_COMPILER gcc) > > + find_program(CXX_COMPILER g++) > > +endif() > > +set(CMAKE_C_COMPILER ${C_COMPILER}) > > +set(CMAKE_CXX_COMPILER ${CXX_COMPILER}) > > I see you've added a comment for this passage, *but* at least for me > Sasha's comment is still left unaddressed. AFAICS Sasha asked whether we > can solve the linkage issue by explicitly setting CMAKE_C{,XX}_COMPILER > variables. If the problem isn't fixed this way, then I guess your > solution is fine. > > > + > > +# Install all libraries required by tarantool at current build dir > > + > > > > > +# > > +# ICU > > +# > > +ExternalProject_Add(icu > > + URL > https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz > > + CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} > > + CXX=${CMAKE_CXX_COMPILER} > > OK, I see, you've already set the variables I mentioned above. Anyway, > please mention this fact if it doesn't fix the linkage issue (maybe > refer the corresponding place in libicu configure / the issue / etc). > > > + /source/configure > > + --with-data-packaging=static > > + --prefix= > > + --disable-shared > > + --enable-static > > +) > > + > > +# > > +# ZLIB > > +# > > +ExternalProject_Add(zlib > > + URL https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz > > + CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} > > + /configure > > + --prefix= > > + --static > > + TEST_COMMAND ${CMAKE_MAKE_PROGRAM} check > > This TEST_COMMAND line looks odd and I guess it need some commenting > with the rationale, since other commands don't have it. > > > +) > > + > > > > > + > > +# > > +# ReadLine > > +# > > +ExternalProject_Add(readline > > + URL > https://ftp.gnu.org/gnu/readline/readline-${READLINE_VERSION}.tar.gz > > + CONFIGURE_COMMAND CC=${CMAKE_C_COMPILER} > > + /configure > > + --prefix= > > + --disable-shared > > + # STEP_TARGETS download > > Looks like this line can be dropped. > > > +) > > + > > > > > diff --git a/static-build/README.md b/static-build/README.md > > new file mode 100644 > > index 000000000..0019e963f > > --- /dev/null > > +++ b/static-build/README.md > > @@ -0,0 +1,58 @@ > > +# Tarantool static build tooling > > + > > +These files help to prepare environment for building Tarantool > > +statically. And builds it. > > + > > +## Prerequisites > > + > > +CentOS: > > Minor: Does this mean that other distros are not supported? > > > + > > +```bash > > +yum install -y \ > > + git perl gcc cmake make gcc-c++ libstdc++-static autoconf automake > libtool \ > > + python-msgpack python-yaml python-argparse python-six python-gevent > > +``` > > + > > +MacOS: > > + > > +Before you start please install default Xcode Tools by Apple: > > + > > +``` > > Typo: bash specifier is missing (considering verbatim blocks below). > > > +sudo xcode-select --install > > +sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer > > +``` > > + > > +Install brew using command from > > +[Homebrew repository instructions](https://github.com/Homebrew/inst) > > + > > +After that run next script: > > + > > +```bash > > + brew install autoconf automake libtool cmake > file://$${PWD}/tools/brew_taps/tntpython2.rbs > > + pip install --force-reinstall -r test-run/requirements.txt > > Typo: Looks like misindentation. > > > +``` > > + > > +### Usage > > Typo: I guess it should be h2, not h3. > > > + > > +```bash > > +cmake . > > +make -j > > +ctest -V > > +``` > > + > > +## Customize your build > > + > > +If you want to customise build, you need to set `CMAKE_TARANTOOL_ARGS` > variable > > + > > +### Usage > > + > > +There is three types of `CMAKE_BUILD_TYPE`: > > Typo: s/is/are/. > > > +* Debug - default > > +* Release > > +* RelWithDebInfo > > + > > +And you want to build tarantool with RelWithDebInfo: > > + > > +```bash > > +cmake -DCMAKE_TARANTOOL_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo" . > > +``` > > > > > diff --git a/static-build/test/static-build/exports.test.lua > b/static-build/test/static-build/exports.test.lua > > new file mode 100755 > > index 000000000..63dc163a9 > > --- /dev/null > > +++ b/static-build/test/static-build/exports.test.lua > > @@ -0,0 +1,148 @@ > > > > > + > > +local RTLD_DEFAULT > > +-- See `man 3 dlsym`: > > +-- RTLD_DEFAULT > > +-- Find the first occurrence of the desired symbol using the default > > +-- shared object search order. The search will include global symbols > > Typo: There are several places above with doubled whitespace. > > > +-- in the executable and its dependencies, as well as symbols in > shared > > +-- objects that were dynamically loaded with the RTLD_GLOBAL flag. > > +if jit.os == "OSX" then > > + RTLD_DEFAULT = ffi.cast("void *", -2LL) > > +else > > + RTLD_DEFAULT = ffi.cast("void *", 0LL) > > +end > > Minor: OK, since the difference is only in the constant value, the > following way looks more convenient to me: > | local RTLD_DEFAULT = ffi.cast("void *", jit.os == "OSX" and -2LL or 0LL) > > > + > > > > > -- > > 2.26.2 > > > > -- > Best regards, > IM >