27 марта 2021

Как в сборках с libboost место экономил.

 
Уже довольно давно пользуюсь несколькими программами, которые для своей сборки требуют libboost. Если подобные их репозиториев дистрибутива, то проблем обычно нет, потому что поставится только небольшой кусок из всего набора Boost. А вот для сборки в Debian надо качать много dev-пакетов под 300 МБ суммарным размером.

Вот со вторым я и попытался разобраться, потому что очень не хочется, чтобы весь этот dev-набор постоянно висел в системе. Под систему у меня выделено 20 ГБ, а сборку я провожу на другом разделе, где места намного больше.
 
Способ я применял для сборки ZNC и I2PD. Для сборки их используется система cmake и программа ccmake в качестве интерфейса для настройки сборки.
 
Я подразумеваю, что все необходимые программы и библиотеки для сборки уже установлены в системе.
 
Чтобы сэкономить место на системном разделе, надо потратить место на разделе для сборки.

Сначала надо скачать и распаковать архив с исходными текстами libboost со страницы https://www.boost.org/users/download/.

wget https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.bz2
tar xvf boost_1_75_0.tar.bz2

После этого надо собрать и установить библиотеки в специальный каталог, из которого они и будут браться для сборки других программ:
cd boost_1_75_0/
./bootstrap.sh
./b2 --prefix=/data/build/libboost --build-dir=./build link=static runtime-link=static install
Тут используются следующие параметры:
--prefix= - каталог, в который будут установлены собранные библиотеки и заголовочные файлы.
--build-dir= - каталог, используемый в процессе сборки, чтобы не засорят дерево исходников.
link=static runtime-link=static - задание метода сборки. В данном случае указывается статическая компиляция, а не в виде динамических библиотек.
install - установка в указанный каталог после сборки.

Сборка даже на Intel Atom не займёт много времени.

Теперь можно переходить к сборке программ.

Конфигуратору необходимо указать путь до каталога с библиотеками и ключ для использования статической сборки:
# на примере ZNC
cd znc
mkdir -p build
cd build
BOOST_ROOT=/data/build/libboost ccmake -D Boost_USE_STATIC_RUNTIME=ON ..
Если до этого производилась сборка с динамическими библиотеками, то в интерфейсе ccmake с помощью клавиши "D" необходимо удалить все строки с упоминанием "Boost" и повторно запустить конфигурацию клавишей "C" и генерацию файлов сборки клавишей "G".

Если всё сделано правильно, то конфигурация завершится без ошибок, а в списке параметров не будет упоминания путей до динамических библиотек из состава Boost.

После сборки исполняемый файл программы стал примерно на 0,5 МБ больше, а из зависимостей пропали библиотеки Boost, потому что всё нужное теперь внутри.

Сборку I2PD выполнял аналогичным способом, но с использованием GCC 10.2.1 из состава Debian bullseye (testing) вместо GCC 8.3.0 из состава Debian buster (stable).

-->