Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

makepkg: всё, что нужно знать — флаги, -e, -f, --cleanbuild

Сразу к делу: makepkg собирает пакет из PKGBUILD. Он скачивает исходники, компилирует их и упаковывает в архив .pkg.tar.zst, который потом ставит pacman. При повторной сборке главные флаги такие: -e продолжает работу с уже скачанных исходников, -f перезаписывает старый пакет, а --cleanbuild собирает всё с нуля в чистом окружении.

Что делает makepkg

makepkg входит в состав пакета pacman. Он читает файл PKGBUILD, где описано, откуда брать исходники, как их компилировать и какие файлы класть в пакет. Дальше makepkg делает всё сам: скачивает исходники, распаковывает их в каталог src/, запускает сборку, собирает готовые файлы в каталог pkg/ и упаковывает результат в архив .pkg.tar.zst.

Внутри PKGBUILD есть несколько функций, и makepkg вызывает их по очереди. prepare() готовит исходники, build() компилирует, check() запускает тесты, package() раскладывает файлы по местам. Если какой-то функции нет, makepkg просто пропускает её.

В процессе работы makepkg создаёт в текущем каталоге две служебные папки: src/ для исходников и pkg/ для собираемых файлов. После успешной сборки они остаются на месте, и следующая сборка использует их заново.

Получившийся архив ставится командой pacman -U. Именно так работают AUR-хелперы вроде yay и paru: они скачивают PKGBUILD, вызывают makepkg и передают результат pacman. Весь путь пакета из AUR разобран в статье «Установка пакетов из AUR».

Запускается makepkg из каталога, где лежит PKGBUILD. Обычно это клон репозитория AUR, но makepkg работает и с любым своим PKGBUILD, например из каталога ~/abs.

Как собрать пакет из AUR вручную

Весь процесс сводится к трём командам. Сначала клонируй репозиторий AUR:

git clone https://aur.archlinux.org/имя-пакета.git
cd имя-пакета

Потом собери и установи:

makepkg -si

makepkg сам скачает исходники, соберёт пакет и передаст его pacman. Если хочешь только собрать, без установки, убери -i. Если пакет уже стоит, а ты хочешь пересобрать его из свежего PKGBUILD, подтяни изменения и повтори сборку:

git pull
makepkg -si

При повторной сборке добавь -e, чтобы не скачивать исходники заново. Такой ручной способ полезен, когда AUR-хелпер ведёт себя странно: ты видишь каждый шаг и можешь вмешаться в любой момент.

Какие флаги нужны в повседневной работе

Самый частый запуск выглядит так:

makepkg -si          # -s: поставить зависимости, -i: установить пакет

Флаг -s (от sync) устанавливает зависимости, перечисленные в PKGBUILD. Флаг -i (install) ставит собранный пакет сразу после сборки. Вместе они дают полный цикл: собрал и поставил. Именно эту команду выполняют AUR-хелперы под капотом.

Если пакет уже собран, а ты хочешь пересобрать его с новыми правками, пригодится -f (force). Он перезаписывает существующий файл пакета. Без него makepkg остановится с ошибкой «package already exists».

makepkg -f           # перезаписать уже существующий файл пакета

Флаг -e (extract) пропускает скачивание и распаковку исходников. makepkg продолжает сборку с того, что уже лежит в каталоге src/. Это самый быстрый способ пересобрать пакет после мелкой правки PKGBUILD. Особенно заметно на больших исходниках: не нужно ждать, пока makepkg снова скачает десятки мегабайт.

makepkg -e           # продолжить сборку без скачивания исходников

Ещё несколько полезных флагов:

  • --nodeps: пропустить проверку зависимостей. Пригодится, когда зависимости уже стоят, а makepkg их не видит.
  • --nocheck: не запускать тесты из check(). Ускоряет сборку, но тесты пропускаются.
  • --skipinteg: пропустить проверку контрольных сумм. Используй осторожно, только когда уверен в источнике исходников.
  • -r: удалить временные зависимости после сборки. Работает вместе с -s.
  • --asdeps: установить пакет как зависимость. Тогда pacman -Rsc удалит его вместе с зависимостями, когда он станет не нужен.
  • --noconfirm: не спрашивать подтверждений при установке зависимостей.

Чем –cleanbuild отличается от –clean

Оба флага чистят мусор, но по-разному.

--clean удаляет лишние файлы из каталога src/ перед сборкой. Он не трогает скачанные исходники и не пересоздаёт окружение. Подходит для лёгкой уборки.

--cleanbuild удаляет каталоги src/ и pkg/ целиком и создаёт их заново. Исходники скачиваются заново, сборка идёт с чистого листа. Это лечит битые состояния: когда в src/ остались старые конфиги, обломки прошлых сборок или файлы с неверными правами.

makepkg --cleanbuild # собрать с нуля в чистом окружении

Разница видна на практике. Если сборка падает с ошибкой «file exists» или «permission denied» внутри src/, обычный --clean часто не помогает, а --cleanbuild решает проблему за один запуск. --clean хватает, когда сборка проходила успешно, а ты просто хочешь убрать лишнее перед повторным запуском. --cleanbuild выбирай при подозрении, что окружение сборки испорчено.

Когда использовать -e, а когда –cleanbuild

Три флага отвечают на три разных вопроса.

-e нужен, когда исходники уже скачаны и распакованы, а ты поменял что-то мелкое: версию в pkgver, флаги сборки, добавил патч. makepkg пропустит скачивание и сразу перейдёт к компиляции. Быстро, но если исходники повреждены, сборка упадёт снова.

-f нужен, когда файл пакета уже существует. Без него makepkg откажется перезаписывать результат. Часто -f используют вместе с -e:

makepkg -ef          # -e: без скачивания, -f: перезаписать результат

--cleanbuild нужен, когда сборка падает по непонятным причинам, а ошибка не меняется от запуска к запуску. Это признак битого состояния каталога src/. Полная пересборка в свежем окружении почти всегда чинит проблему. Типичный случай, когда без --cleanbuild не обойтись, разобран в статье «Сборка AUR падает: submodules и checksum».

Правило простое: для мелкой правки бери -e, для существующего пакета -f, для странных ошибок --cleanbuild. Комбинации тоже работают: makepkg --cleanbuild -f соберёт с нуля и перезапишет старый пакет. Такой запуск подходит, когда нужно гарантированно получить свежий результат.

Где оказывается собранный пакет

По умолчанию makepkg кладёт результат рядом с PKGBUILD, в тот же каталог. Имя файла выглядит так: имя-пакета-версия-архитектура.pkg.tar.zst.

Если хочешь складывать пакеты в одно место, задай переменную PKGDEST в /etc/makepkg.conf:

PKGDEST=/home/user/packages

Тогда все собранные пакеты попадут в этот каталог, а каталог с PKGBUILD останется чистым. Аналогично работают SRCDEST (куда складывать скачанные исходники) и LOGDEST (куда писать логи сборки).

Каталоги src/ и pkg/ при этом остаются в рабочем каталоге. Если они мешают, удали их вручную или собери с --cleanbuild.

Каталог pkg/ повторяет структуру корневой файловой системы: внутри лежат usr/, etc/, opt/ и так далее. makepkg упаковывает именно его содержимое, поэтому важно, чтобы функция package() раскладывала файлы по правильным путям.

Готовый пакет ставится так:

pacman -U имя-пакета-версия-архитектура.pkg.tar.zst

Что настраивать в /etc/makepkg.conf

Файл /etc/makepkg.conf задаёт поведение makepkg по умолчанию. Все переменные в нём уже есть, большинство закомментировано. Раскомментируй строку и подставь своё значение. Три переменные важнее остальных.

MAKEFLAGS включает параллельную сборку. Без неё makepkg компилирует одним потоком, и сборка больших пакетов тянется часами:

MAKEFLAGS="-j$(nproc)"

CFLAGS и CXXFLAGS задают оптимизацию для C и C++. Значения по умолчанию подходят почти всем, менять их стоит только с пониманием дела.

BUILDDIR переносит каталог сборки в другое место. По умолчанию makepkg собирает прямо в каталоге с PKGBUILD. Если он лежит на маленьком разделе, сборка упрётся в нехватку места. Перенеси сборку в /tmp или на отдельный диск:

BUILDDIR=/tmp/makepkg

Ещё полезно задать PACKAGER: твоё имя попадёт в метаданные пакета. Пригодится, если собираешь пакеты для своего репозитория. Переменные PKGDEST, SRCDEST и LOGDEST тоже можно прописать здесь, тогда не придётся передавать их каждый раз в командной строке.

Как правильно оформить сам PKGBUILD, чтобы makepkg не спотыкался, описано в статье «Свой PKGBUILD: полный гайд».

Что делать, если сборка падает

Сначала прочитай ошибку до конца. makepkg печатает причину в последних строках вывода, а полный лог лежит в makepkg.log рядом с PKGBUILD.

Частые причины и решения:

  • Не совпала контрольная сумма. Обнови суммы в PKGBUILD или, если уверен в источнике, собери с --skipinteg.
  • Не хватает зависимостей. Запусти makepkg -s, чтобы makepkg поставил их сам.
  • Ошибка в src/ при повторной сборке. Запусти makepkg --cleanbuild.
  • Сборка падает на тестах. Попробуй --nocheck, чтобы понять, дело в тестах или в коде.
  • Не находится библиотека или заголовочный файл. Скорее всего, не хватает пакета из makedepends. Добавь его в PKGBUILD и пересобери.
  • Ошибка компиляции в самом коде. Проверь, свежий ли PKGBUILD: возможно, автор уже исправил проблему, а ты собираешь старую версию.

Общая методика диагностики таких проблем описана в статье «Методика решения проблем в Arch Linux».

Частые вопросы

Можно ли запускать makepkg от root?

Нет. makepkg отказывается работать под root, и это защита: сборка выполняет произвольный код из PKGBUILD, а он может прийти из недоверенного источника. Запускай makepkg только от обычного пользователя.

Чем makepkg -f отличается от –cleanbuild?

-f перезаписывает уже собранный файл пакета. --cleanbuild удаляет каталоги src/ и pkg/ и собирает всё заново с нуля. Это разные вещи: -f про результат, --cleanbuild про окружение сборки.

Почему makepkg пересобирает всё заново?

Потому что makepkg не умеет инкрементальную сборку по умолчанию. Он всегда проходит весь цикл: скачивание, распаковка, компиляция, упаковка. Флаг -e пропускает только скачивание и распаковку, но компиляция всё равно идёт заново.

Можно ли прервать сборку и продолжить потом?

Можно. Останови makepkg по Ctrl+C, а при следующем запуске добавь -e. makepkg продолжит с того места, где остановился, если исходники уже распакованы. Полностью завершённые шаги он не повторяет.

Нужно ли удалять каталог src/ после сборки?

Не обязательно. Он нужен для повторной сборки с -e: makepkg возьмёт исходники оттуда и не будет скачивать их заново. Если место на диске дорого, удали каталог вручную или собери с --cleanbuild.

Полезные ресурсы

Заключение

makepkg собирает пакет из PKGBUILD и делает это по одному и тому же сценарию каждый раз. Для повседневной работы хватает makepkg -si, для повторной сборки -e и -f, а --cleanbuild спасает, когда сборка падает по непонятным причинам. Настрой MAKEFLAGS и BUILDDIR в /etc/makepkg.conf, и сборка станет быстрее и предсказуемее.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max