§ 15. Сборка пакетов

Введение

01 Сборка пакетов осуществляется с помощью специальных систем, позволяющих автоматизировать процесс, или же вручную. В сборку входят три основных этапа: конфигурация, сборка исходного кода, установка. Далее мы рассмотрим, как сделать вручную каждый из этих этапов.

02 На этапе конфигурации происходит анализ операционной системы на наличие необходимых библиотек, системных заголовочных файлов, проверяется их совместимость с исходным кодом приложения и определяются зависимости между сборочными файлами. Необходимость такой проверки обусловливается большим количеством операционных систем в семействе и их разнородностью: каждый разработчик стремится переделать или добавить новый функционал в свою версию системы, также не все системные вызовы, которые производятся одинаково в каждой из систем, включены в стандарт POSIX.

03 Наиболее часто используемым инструментом для конфигурации сборки приложений является Autotools. Это набор программ, позволяющий в автоматическом режиме конфигурировать, собирать и устанавливать программы, т.е. покрыть первые три этапа работы с приложением. Поскольку научные приложения слабо интегрированы в операционную систему и используют, в основном, стандартные системные вызовы для работы с файлами, а зависимые библиотеки часто поставляются вместе с исходным кодом приложения, то проверка на совместимость почти всегда дает положительный результат, и этап конфигурации опускается. Основные команды представлены в таблице ниже.

04 Используя зависимости, флаги компиляции и другие параметры, определенные на этапе конфигигурации, программа сборки запускает компиляцию всех исходных файлов приложения. Типичный сборочный файл описывает зависимости по данным между файлами, определяя таким образом порядок их компиляции. Современные программы делают это автоматически, однако, встречаются и файлы сборки, написанные вручную. В этом случае параметры сборки можно устанавливать либо в начале файла сборки, либо в отдельном файле с определениями переменных, который затем вставляется в основной файл с помощью директивы. Основные команды представлены в таблице ниже.

КомандаОписание
./configureзапуск конфигурации
./configure --helpопции конфигурации
./configure --enable-XXXконфигурация с компонентой XXX
./configure --disable-XXXконфигурация без XXX
CFLAGS=-ffast-math ./configureустановка флагов компилятора C
CXXFLAGS=-ffast-math ./configureустановка флагов компилятора C++
makeзапуск компиляции
make CFLAGS="-ffast-math"компиляция с флагом
make installустановка
Примеры конфигурации, сборки и установки с помощью Autotools.

Сборка в Autotools

05 В Autotools конфигурация проекта описывается в файле configure.ac С помощью команды autoreconf -vif из этого файла генерируется скрипт configure для настройки проекта. В некоторых проектах этот скрипт уже сгенерирован, в таком случае команду autoreconf можно опустить.

06 Скрипт configure используется для включения и выключения опций сборки. Список всех опций конкрентного проекта доступен при указании опции --help. Наиболее часто используемой опцией является --prefix: она задает директорию, в которую будет установлен проект. При сборке системного пакета это директория /usr, при сборке пакета вручную это директория /usr/local, а при сборке пакета только для текущего пользователя можно использовать любую поддиректорию домашней директории, например, $HOME/.local. Опции компилятора и линковщика задаются переменными среды CFLAGS, CXXFLAGS, FFLAGS и LDFLAGS. Нужная переменная выбирается в зависимости от языка программирования, на котором написан проект.

07 После того как скрипт configure завершился, в директории появляются файлы Makefile, которые можно использовать для сборки проекта. Для этого надо ввести команду make. Наиболее часто используется флаг -j N, который позволяет ускорить сборку, задействов сразу N процессорных ядер. В зависимости от сложности кода вам может понадобится до 2 Гб оперативной памяти на ядро для эффективной параллельной компиляции и гораздо больше памяти для линковки (но это не критично, поскольку линковка выполняется последовательно). Это значение эмпирическое. Во время сборки вы можете проверить, сколько на самом деле потребляет компилятор с помощью команды top.

08 Для установки проекта после сборки надо ввести команду make install. Она скопирует нужные файлы в директорию, указанную на этапе конфигурации. Также она автоматически создаст поддиректории в соответствии со стандартном на иерархияю файловой системы hier. После установки в системную директорию проект уже доступен для испольования в виде исполняемого файла или в виде библиотеки (зависит от проекта). При установке в нестандартную директорию вам надо добавить директорию с исполняемыми файлами в переменную среды PATH, а директорию с библиотеками в переменную среды LD_LIBRARY_PATH. Обычно эти команды добавляют либо в .bashrc, либо в отдельный файл.

autoreconf -vif # генерация configure из configure.ac
./configure --prefix=$HOME/.local # генерация Makefile с инструкциями для установки в указанную директорию
make -j4 # параллельная сборка в четырех процессах
make install # копирование собранных файлов в директорию, указанную в configure
export PATH=$PATH:$HOME/.local/bin # задание переменных среды для доступа к исполняемым файлам
export LD_LIBRARY_PATH=$HOME/.local/lib # задание переменных среды для доступа к библиотекам
make uninstall # удаление установленных файлов
make clean # удаление скомпилированных файлов (для пересборки с нуля)
Команды сборки проекта, использующего Autotools.

Сборка в CMake

mkdir build # создаем директорию для выходных файлов
cd build
cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local .. # генерируем Makefile
make -j4 # собираем параллельно в четырех процессах
make install # копирование собранных файлов в директорию, указанную в cmake
export PATH=$PATH:$HOME/.local/bin # задание переменных среды для доступа к исполняемым файлам
export LD_LIBRARY_PATH=$HOME/.local/lib # задание переменных среды для доступа к библиотекам
make uninstall # удаление установленных файлов
make clean # удаление скомпилированных файлов (для пересборки с нуля)
Команды сборки проекта, использующего CMake.

Сборка в Meson

meson -Dprefix=$HOME/.local build # генерируем build.ninja
cd build
ninja # собираем параллельно
ninja install # копирование собранных файлов в директорию, указанную в cmake
export PATH=$PATH:$HOME/.local/bin # задание переменных среды для доступа к исполняемым файлам
export LD_LIBRARY_PATH=$HOME/.local/lib # задание переменных среды для доступа к библиотекам
ninja uninstall # удаление установленных файлов
ninja clean # удаление скомпилированных файлов (для пересборки с нуля)
Команды сборки проекта, использующего Meson.

Заключение

09 Все системы сборки используют три этапа: конфигурация, сборка, установка. Вариации не бывают, но они незначительны. Сложность в сборке проектов с открытым исходным кодом заключается в желании авторов сделать порядок сборки уникальным для своих проектов:

Со всеми этими сложностями сборщикам пакетов приходится справляться вручную. Чтобы они полюбили ваш проект, достаточно не отклоняться от стандартных способов сборки.

Задания

Stubby2 балла

10 Соберите и установите в домашнюю директорию stubby. Для сборки проекту понадобятся зависимости: getdns и другие, которые вам нужно найти и установить через системный менеджер пакетов или вручную. Проверьте себя с помощью команды stubby -V.

Dashh1 балл

11 Соберите и установите в домашнюю директорию dashh. Проверьте себя с помощью команды g++ -L$HOME/.local/lib -ldashh: команда должна выдать ошибку об отсутствии функции main. На некоторых системах вместо директории lib может быть другая директория.

Task spooler2 балла

12 Соберите и установите в домашнюю директорию task-spooler. В проекте отсутствует скрипт configure, и вам надо разобраться, как без него установить проект в нужную директорию. Проверьте себя с помощью команды ts --version.

Nullmailer1 балл

13 Соберите и установите в домашнюю директорию nullmailer. Проверьте себя с помощью команды nullmailer-dsn --help.

Видео

Запись лекции 11.12.2021.