Рано или поздно вам понадобится софт, которого нет в репозитории, или нужна версия свежее той, что собрал майнтейнер, или сборка с нестандартными опциями. Тогда придётся брать исходники и собирать самому. В этом уроке разберём классическую цепочку configure - make - make install, поймём, что делает каждый шаг, как подкладывать заголовочные файлы из devel-пакетов, накладывать патчи и не превратить систему в свалку файлов, которые ничем потом не удалить.

Как это работает
Программа на C или C++ - это набор исходных файлов. Чтобы получить из них бинарник, нужно три вещи: узнать, что есть в системе (какие библиотеки, какой компилятор, где заголовки), скомпилировать код под эту конкретную систему и разложить результат по правильным каталогам. Этим и занимаются три классических шага.
configure - это обычно сгенерированный скрипт (Autotools, иногда руками). Он прощупывает систему десятками мелких тестовых компиляций: есть ли заголовок такой-то, поддерживает ли компилятор такой флаг, лежит ли библиотека там, где надо. На выходе он создаёт Makefile и config.h под вашу машину. Если чего-то не хватает - падает с ошибкой ещё до компиляции, и это хорошо: лучше узнать сразу.
make читает Makefile и запускает компилятор по правилам: какой файл из какого собирается, в каком порядке, что перекомпилировать при изменении. Make ленив - пересобирает только устаревшее, поэтому повторный make после правки одного файла быстрый.
make install копирует готовые бинарники, библиотеки, man-страницы и конфиги в систему. По умолчанию - в /usr/local, чтобы не конфликтовать с пакетным менеджером, который владеет /usr.
Ключевой момент про заголовки. Когда вы ставите библиотеку из пакета (например libssl), приходит только сам .so для запуска программ. Чтобы собирать что-то ПРОТИВ этой библиотеки, нужны заголовочные файлы (.h) и линковочные символы - они лежат в отдельном пакете с суффиксом -dev (Debian/Ubuntu) или -devel (RHEL/Fedora). Без них configure будет ругаться, что не нашёл библиотеку, хотя сама она стоит.
Современный нюанс: чистый Autotools встречается всё реже. Многие проекты в 2026 используют CMake (cmake .. - cmake --build .) или Meson с Ninja (meson setup build - ninja -C build). Логика та же - конфигурация, сборка, установка - но команды другие. Цель экзамена 206.1 завязана на классику Autotools, её и держим в фокусе.
Команды и примеры
Сначала ставим инструменты сборки. На Debian 13 / Ubuntu 24.04:
Код: Выделить всё
sudo apt update
sudo apt install build-essential autoconf automake pkg-config
# devel-пакет под пример: заголовки OpenSSL
sudo apt install libssl-dev zlib1g-dev
Код: Выделить всё
sudo dnf groupinstall "Development Tools"
# или явно:
sudo dnf install gcc make autoconf automake pkgconf-pkg-config
sudo dnf install openssl-devel zlib-devel
Код: Выделить всё
tar xzf foo-2.4.tar.gz
cd foo-2.4
./configure --prefix=/usr/local --enable-shared --disable-debug
make -j$(nproc)
sudo make install
Применение патчей. Патч - это diff, описывающий правки. Накладываем из корня дерева исходников:
Код: Выделить всё
# обычный формат, -p1 срезает один уровень пути (a/ b/)
patch -p1 < fix-build-gcc14.patch
# проверить, что наложится, ничего не меняя:
patch -p1 --dry-run < fix-build-gcc14.patch
# откатить:
patch -p1 -R < fix-build-gcc14.patch
checkinstall - перехватывает make install и собирает из него настоящий пакет (.deb или .rpm), который потом ставится и удаляется штатно:
Код: Выделить всё
sudo checkinstall --pkgname=foo --pkgversion=2.4 make install
# дальше удаляется как обычный пакет:
sudo apt remove foo # Debian/Ubuntu
sudo dnf remove foo # RHEL/Fedora
Код: Выделить всё
./configure --prefix=/usr/local/stow/foo-2.4
make && sudo make install
cd /usr/local/stow
sudo stow foo-2.4 # создать симлинки
sudo stow -D foo-2.4 # снять симлинки (удалить)
- configure не находит библиотеку, хотя она стоит - забыли поставить -dev/-devel пакет с заголовками. Читайте, какой именно заголовок он искал.
- Поставили в /usr (не /usr/local) и затёрли файлы пакетного менеджера - конфликт версий, который чинится только переустановкой пакета.
- make install без учёта (checkinstall/stow) - через год не вспомнить, что и откуда поставлено, а удалить нечем.
- Бинарник не запускается: error while loading shared libraries - библиотека легла в нестандартный prefix/lib, которого нет в путях. Добавьте каталог в /etc/ld.so.conf.d/ и выполните ldconfig.
- Патч не накладывается - не угадали уровень -pN. Сравните пути в diff с реальным деревом и подберите -p0 или -p1.
- Запустили configure от root в распакованном архиве из интернета - так делать опасно; собирайте от обычного пользователя, root только на make install.
- Поставьте инструменты сборки и devel-пакет zlib (zlib1g-dev или zlib-devel) на своём стенде.
- Скачайте исходники любой небольшой утилиты на Autotools (например GNU hello) и распакуйте.
- Запустите ./configure --prefix=/usr/local/stow/hello-X.Y и изучите вывод: что он нашёл, что нет.
- Соберите проект через make -j$(nproc), затем sudo make install.
- Через GNU Stow создайте симлинки и проверьте, что бинарник доступен в PATH.
- Снимите установку командой stow -D и убедитесь, что симлинки исчезли, а каталог hello-X.Y остался.
- Повторите установку, но через checkinstall, и удалите получившийся пакет штатным apt/dnf.
- Чем отличается пакет libssl от libssl-dev и зачем второй нужен при сборке?
- Что делает опция --prefix скрипта configure и почему по умолчанию это /usr/local, а не /usr?
- Как проверить, наложится ли патч, не меняя файлов, и как его откатить?
- Зачем нужны checkinstall и stow, если есть make install?
- Что означает ошибка error while loading shared libraries и как её устранить для софта из своего prefix?
- Когда установка из исходников оправдана, а когда лучше взять пакет из репозитория?