Всем привет!
Я повторно столкнулся с проблемой сборки 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
Надеюсь мои инструкции оказались кому-нибудь полезны :-)