§ 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
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
, либо в отдельный файл.
Сборка в CMake
Сборка в 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
.