[Tarantool-patches] [PATCH v2] static build: create new build w/o dockerfile

Alexander V. Tikhonov avtikhon at tarantool.org
Tue Dec 10 16:11:18 MSK 2019


Fixed static build with '-DBUILD_STATIC=ON' option:

 - installed liblzma-dev library for libunwind static, due to found that
   static libunwind library uses undefined lzma functions:
     nm -a /usr/lib/x86_64-linux-gnu/libunwind-x86_64.a | grep lzma
                 U lzma_index_buffer_decode
                 U lzma_index_end
                 U lzma_index_size
                 U lzma_index_uncompressed_size
                 U lzma_stream_buffer_decode
                 U lzma_stream_footer_decode
   while dynamic libunwind correctly sees liblzma installed:
     ldd /usr/lib/x86_64-linux-gnu/libunwind-x86_64.so | grep lzma
       liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f8fd1c23000)
   so to fix it the static library of lzma was needed.

 - added lzma library to unwind library for Tarantool build at file:
     cmake/compiler.cmake
   due to fail:
     /usr/lib/x86_64-linux-gnu/libunwind-x86_64.a(elf64.o):
       In function `xz_uncompressed_size':
     ./src/elfxx.c:194: undefined reference to `lzma_stream_footer_decode'
     ./src/elfxx.c:201: undefined reference to `lzma_index_buffer_decode'
     ./src/elfxx.c:205: undefined reference to `lzma_index_size'
     ./src/elfxx.c:210: undefined reference to `lzma_index_end'
     ./src/elfxx.c:207: undefined reference to `lzma_index_uncompressed_size'
     ./src/elfxx.c:210: undefined reference to `lzma_index_end'
     /usr/lib/x86_64-linux-gnu/libunwind-x86_64.a(elf64.o):
       In function `_Uelf64_extract_minidebuginfo':
     ./src/elfxx.c:278: undefined reference to `lzma_stream_buffer_decode'
     collect2: error: ld returned 1 exit status
     test/unit/CMakeFiles/luaL_iterator.test.dir/build.make:134:
       recipe for target 'test/unit/luaL_iterator.test' failed
     make[2]: *** [test/unit/luaL_iterator.test] Error 1

 - added dl library to gomp library for test/unit tests
   binaries builds at file:
     cmake/BuildMisc.cmake
   due to fail:
     /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.a(target.o):(.text+0x34d):
       more undefined references to `dlsym' follow
     /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.a(target.o): In function
       `gomp_target_init':
     (.text+0x9cc): undefined reference to `dlerror'
     collect2: error: ld returned 1 exit status

  - added dl library to icu library for test/unit tests
   binaries builds at file:
     cmake/FindICU.cmake
   due to fail:
     /usr/x86_64-linux-gnu/libicuuc.a(putil.ao):
       In function `uprv_dl_open_60':
     (.text+0x1ce2): undefined reference to `dlopen'
     /usr/x86_64-linux-gnu/libicuuc.a(putil.ao):
       In function `uprv_dlsym_func_60':
     (.text+0x1d3d): undefined reference to `dlsym'
     /usr/x86_64-linux-gnu/libicuuc.a(putil.ao):
       In function `uprv_dl_close_60':
     (.text+0x1d21): undefined reference to `dlclose'
     collect2: error: ld returned 1 exit status

Added static build to gitlab-ci in release check criteria named
as static_build job. Previously named static_build job renamed to
static_docker_build, due to it checks the build at Dockerfile.

Also moved static build make targets from .gitlab.mk to .travis.mk
to store it in common place with the other test/build make targets.
Moved environement from .gitlab-ci.yml file into make targets to
make this targets true building in static w/o additional setup.

Close #4551
---

Github: https://github.com/tarantool/tarantool/tree/avtikhon/gh-4551-static-build-full-ci
Issue: https://github.com/tarantool/tarantool/issues/4551

 .gitlab-ci.yml        | 12 +++++++++---
 .gitlab.mk            |  9 +--------
 .travis.mk            | 16 ++++++++++++++++
 cmake/BuildMisc.cmake |  2 +-
 cmake/FindICU.cmake   |  2 +-
 cmake/compiler.cmake  | 11 +++++++++++
 6 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3af5a3c8a..bc7baf8ff 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -236,9 +236,15 @@ debian_10:
     OS: 'debian'
     DIST: 'buster'
 
+# Static builds
+
 static_build:
+  <<: *release_only_definition
+  <<: *docker_test_definition
+  script:
+    - ${GITLAB_MAKE} test_static_build
+
+static_docker_build:
   <<: *deploy_test_definition
-  variables:
-    RUN_TESTS: 'ON'
   script:
-    - ${GITLAB_MAKE} static_build
+    - ${GITLAB_MAKE} test_static_docker_build
diff --git a/.gitlab.mk b/.gitlab.mk
index 48a92e518..03f5fac94 100644
--- a/.gitlab.mk
+++ b/.gitlab.mk
@@ -14,7 +14,7 @@ git_submodule_update:
 		git submodule update --recursive --init
 
 # Pass *_no_deps goals to .travis.mk.
-test_%_no_deps: git_submodule_update
+test_%: git_submodule_update
 	${TRAVIS_MAKE} $@
 
 # #######################################################
@@ -105,10 +105,3 @@ vms_shutdown:
 package: git_submodule_update
 	git clone https://github.com/packpack/packpack.git packpack
 	PACKPACK_EXTRA_DOCKER_RUN_PARAMS='--network=host' ./packpack/packpack
-
-# ############
-# Static build
-# ############
-
-static_build:
-	docker build --network=host --build-arg RUN_TESTS="${RUN_TESTS}" -f Dockerfile.staticbuild .
diff --git a/.travis.mk b/.travis.mk
index 42969ff56..d01c6a99b 100644
--- a/.travis.mk
+++ b/.travis.mk
@@ -123,6 +123,22 @@ test_asan_debian_no_deps: build_asan_debian
 
 test_asan_debian: deps_debian deps_buster_clang_8 test_asan_debian_no_deps
 
+# Static build
+
+deps_debian_static:
+	# Found that in Debian OS libunwind library built with dependencies to
+	# liblzma library, but there is no liblzma static library installed,
+	# while liblzma dynamic library exists. So the build dynamicaly has no
+	# issues, while static build fails. To fix it we need to install
+	# liblzma-dev package with static library only for static build.
+	apt-get install -y -f liblzma-dev
+
+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 --network=host --build-arg RUN_TESTS=ON -f Dockerfile.staticbuild .
+
 #######
 # OSX #
 #######
diff --git a/cmake/BuildMisc.cmake b/cmake/BuildMisc.cmake
index b4a3ca1fc..0c571f326 100644
--- a/cmake/BuildMisc.cmake
+++ b/cmake/BuildMisc.cmake
@@ -39,7 +39,7 @@ macro(libmisc_build)
         else()
             set(GOMP_LIBRARY gomp)
         endif()
-        target_link_libraries(misc ${GOMP_LIBRARY} pthread)
+        target_link_libraries(misc ${GOMP_LIBRARY} pthread dl)
     endif()
 
     unset(misc_src)
diff --git a/cmake/FindICU.cmake b/cmake/FindICU.cmake
index 26f0683f3..2bb9a5d59 100644
--- a/cmake/FindICU.cmake
+++ b/cmake/FindICU.cmake
@@ -50,7 +50,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} ${ICU_LIBRARY_DATA})
+set(ICU_LIBRARIES ${ICU_LIBRARY_I18N} ${ICU_LIBRARY_UC} ${ICU_LIBRARY_DATA} dl)
 mark_as_advanced(ICU_INCLUDE_DIR ICU_INCLUDE_DIRS
         ICU_LIBRARY_I18N ICU_LIBRARY_UC ICU_LIBRARIES)
 
diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake
index c9ad2b092..56429dc20 100644
--- a/cmake/compiler.cmake
+++ b/cmake/compiler.cmake
@@ -171,6 +171,17 @@ if (ENABLE_BACKTRACE)
             NAMES ${UNWIND_PLATFORM_LIB_NAME})
         set(UNWIND_LIBRARIES ${UNWIND_PLATFORM_LIBRARY} ${UNWIND_LIBRARY})
     endif()
+    if (BUILD_STATIC)
+        # some versions of libunwind need liblzma, and we don't use pkg-config
+        # so we just look whether liblzma is installed, and add it if it is.
+        # It might not be actually needed, but doesn't hurt if it is not.
+        # We don't need any headers, just the lib, as it's privately needed.
+        find_library(LZMA_LIBRARY PATH_SUFFIXES system NAMES liblzma.a)
+        if (NOT LZMA_LIBRARY STREQUAL "LZMA_LIBRARY-NOTFOUND")
+            message(STATUS "liblzma found")
+            set(UNWIND_LIBRARIES ${UNWIND_LIBRARIES} ${LZMA_LIBRARY})
+        endif()
+    endif()
     find_package_message(UNWIND_LIBRARIES "Found unwind" "${UNWIND_LIBRARIES}")
 endif()
 
-- 
2.17.1



More information about the Tarantool-patches mailing list