Как стать автором
Обновить

Сборка C++ библиотеки Thrift под Ubuntu

Всем привет!

Я повторно столкнулся с проблемой сборки Thrift. Первый раз под Windows, теперь под Linux (Ubuntu 18.04). Поэтому данной статьей хочу сохранить:

  • свои старания

  • своё будущее время (если ещё раз придётся собирать Thrift)

  • время тех, кто читает эту статью

Заранее предупреждаю, что я собрал исключительно Thrift библиотеку. При случае я дособеру Thrift компилятор и дополню статью.

В отличие от Protobuf, Thrift не собирается просто по инструкции с сайта разработчиков. Сборка постоянно останавливается. Поэтому приходится часто гуглить, просматривать/исправлять исходники и перезапускать сборку. Этот процесс очень длительный и мучительный. Чтоб не повторять весь этот долгий путь предлагаю последовательность простых действий.

Я собирал версию Thrift 0.16.0, но думаю данная последовательность действий сгодится (с определённым успехом) плюс-минус ещё для 2-х версий Thrift.

Итак, далее просто по шагам:

0.1. Шаг не относится к сборке (поэтому пункт 0.1))). Установить зависимости консольной командой (просто скопирована с сайта разработчиков))):

sudo apt-get install automake bison flex g++ git libboost-all-dev libevent-dev libssl-dev libtool make pkg-config

0.2. Этот шаг тоже не относится к сборке. Получить исходники из гита:

git clone -b v0.16.0 https://github.com/apache/thrift.git thrift-0.16.0

Вместо версии 0.16.0 можете подставить свою в обоих местах данной команды.

0.3. Ну, естественно перейти в каталог Трифта ))) (ещё один несборочный пункт))):

cd thrift-0.16.0

1. Ну вот собственно и добрались до сборки ))). Запустить:

./bootstrap.sh

2. Запустить configure для сборки только C++ библиотеки, указывая опции компиляции максимальной оптимизации машинного кода (без нарушения логики алгоритмов) компилятору g++:

./configure --without-c_glib --without-java --without-erlang --without-nodejs --without-nodets --without-lua --without-python --without-py3 --without-perl --without-php --without-php_extension --without-dart --without-ruby --without-go --without-swift --without-rs --without-cl --without-haxe --without-netstd --without-d CXXFLAGS='-O3 -Wall -c -fmessage-length=0'

3. Найти рекурсивно и закомментировать во всех файлах config.h строки:

#define malloc rpl_malloc
#define realloc rpl_realloc

4. Найти рекурсивно и заменить во всех файлах config.h строку:

#define SIGNED_RIGHT_SHIFT_IS X

на:

#define SIGNED_RIGHT_SHIFT_IS 1

где X - значение, неравное 1.

5. Найти файл TOutput.cpp и заменить в нём строку:

::strerror_s(b_errbuf, sizeof(b_errbuf), errno_copy);

на:

::strerror_r(errno_copy, b_errbuf, sizeof(b_errbuf));

6. В корне Трифта, в файле libtool удалить во всех вхождениях параметр:

-nostdlib

7. Запустить сборку на всех ядрах/потоках процессора:

make -j$(nproc --all)

У меня сборка закончилась ошибкой мейка:

make[4]: вход в каталог «/home/valdev/for-dev/thrift-0.16.0/lib/cpp/test»
/home/valdev/for-dev/thrift-0.16.0/compiler/cpp/thrift --gen cpp ../../../test/AnnotationTest.thrift
/bin/bash: /home/valdev/for-dev/thrift-0.16.0/compiler/cpp/thrift: Нет такого файла или каталога

НО, как я и писал ранее, мне не нужен Thrift компилятор. Все нужные бинари либ успешно собрались в каталоге .../thrift-0.16.0/lib/cpp/.libs. Поэтому, считаю, что это успех!

8. Установить в систему собранную C++ библиотеку Thrift:

sudo make install

Надеюсь мои инструкции оказались кому-нибудь полезны :-)

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.