Сразу к делу: makepkg собирает пакет из PKGBUILD. Он скачивает исходники, компилирует их и упаковывает в архив .pkg.tar.zst, который потом ставит pacman. При повторной сборке главные флаги такие: -e продолжает работу с уже скачанных исходников, -f перезаписывает старый пакет, а --cleanbuild собирает всё с нуля в чистом окружении.
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:
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: не спрашивать подтверждений при установке зависимостей.Оба флага чистят мусор, но по-разному.
--clean удаляет лишние файлы из каталога src/ перед сборкой. Он не трогает скачанные исходники и не пересоздаёт окружение. Подходит для лёгкой уборки.
--cleanbuild удаляет каталоги src/ и pkg/ целиком и создаёт их заново. Исходники скачиваются заново, сборка идёт с чистого листа. Это лечит битые состояния: когда в src/ остались старые конфиги, обломки прошлых сборок или файлы с неверными правами.
makepkg --cleanbuild # собрать с нуля в чистом окружении
Разница видна на практике. Если сборка падает с ошибкой «file exists» или «permission denied» внутри src/, обычный --clean часто не помогает, а --cleanbuild решает проблему за один запуск. --clean хватает, когда сборка проходила успешно, а ты просто хочешь убрать лишнее перед повторным запуском. --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 задаёт поведение 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.
Частые причины и решения:
--skipinteg.makepkg -s, чтобы makepkg поставил их сам.src/ при повторной сборке. Запусти makepkg --cleanbuild.--nocheck, чтобы понять, дело в тестах или в коде.makedepends. Добавь его в PKGBUILD и пересобери.Общая методика диагностики таких проблем описана в статье «Методика решения проблем в Arch Linux».
Нет. makepkg отказывается работать под root, и это защита: сборка выполняет произвольный код из PKGBUILD, а он может прийти из недоверенного источника. Запускай makepkg только от обычного пользователя.
-f перезаписывает уже собранный файл пакета. --cleanbuild удаляет каталоги src/ и pkg/ и собирает всё заново с нуля. Это разные вещи: -f про результат, --cleanbuild про окружение сборки.
Потому что makepkg не умеет инкрементальную сборку по умолчанию. Он всегда проходит весь цикл: скачивание, распаковка, компиляция, упаковка. Флаг -e пропускает только скачивание и распаковку, но компиляция всё равно идёт заново.
Можно. Останови makepkg по Ctrl+C, а при следующем запуске добавь -e. makepkg продолжит с того места, где остановился, если исходники уже распакованы. Полностью завершённые шаги он не повторяет.
Не обязательно. Он нужен для повторной сборки с -e: makepkg возьмёт исходники оттуда и не будет скачивать их заново. Если место на диске дорого, удали каталог вручную или собери с --cleanbuild.
pacman -U.makepkg собирает пакет из PKGBUILD и делает это по одному и тому же сценарию каждый раз. Для повседневной работы хватает makepkg -si, для повторной сборки -e и -f, а --cleanbuild спасает, когда сборка падает по непонятным причинам. Настрой MAKEFLAGS и BUILDDIR в /etc/makepkg.conf, и сборка станет быстрее и предсказуемее.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии