Оптимизация сборки AUR-пакетов в Arch Linux: сокращаем время компиляции вдвое

Сборка пакетов из AUR для многих пользователей Arch Linux превращается в перекур: запустил makepkg, налил кофе, проверил прогресс... и снова налил кофе. Для разработчиков, регулярно обновляющих зависимости или собирающих кастомные версии ПО, такие паузы становятся критичными. Разберем методики, которые помогут превратить часовую компиляцию в 10-минутный спринт без апгрейда железа.

Анатомия тормозов: откуда берутся задержки

Прежде чем оптимизировать сборку, стоит понять узкие места процесса. При стандартной настройке makepkg:

  1. Не использует кэш объектных файлов между сборками ("холодный старт" каждый раз)
  2. Ограничивает параллелизацию (-j$(nproc) часто неактивно)
  3. Не учитывает архитектурные особенности CPU
  4. Работает с субоптимальными флагами компилятора

Эксперимент с пакетом linux-zen (ядро 6.8.9):

bash
$ time makepkg -sri
Реальное время: 47 минут 12 секунд

Turbo-режим для makepkg

Шаг 1: Параллелизация на стероидах

Отредактируем /etc/makepkg.conf:

bash
MAKEFLAGS="-j$(($(nproc) * 2))"      # Удвоить потоки (оптимально для ZEN3/ZEN4)

Почему не nproc? Современные CPU с SMT (Hyper-Threading) эффективно обрабатывают больше потоков, чем физических ядер. Эмпирическое правило: ядра * 1.5-2.

Но параллелизация требует контроля:

bash
sudo pacman -S cpupower
sudo cpupower frequency-set -g performance

Фиксация частоты CPU на максимальной предотвращает троттлинг при продолжительной нагрузке.

Шаг 2: ccache — ваш новый лучший друг

Установка:

bash
sudo pacman -S ccache

Настройка /etc/makepkg.conf:

ini
BUILDENV=(... ccache)  # Раскомментировать ccache
CCACHE_DIR="/var/cache/ccache"  # Для глобального кэша
CCACHE_COMPRESS=1
CCACHE_COMPRESSLEVEL=6
CCACHE_MAXSIZE="20G"

Создаем системный кэш:

bash
sudo mkdir /var/cache/ccache
sudo chown build:build /var/cache/ccache  # Для отдельного пользователя сборки

После первой сборки проверяем эффективность:

bash
ccache -s
Cacheable calls:   7321 / 10655 (68.69%)
Hit rate:          84.3 %

Для headless-сборок добавляем в ~/.ccache/ccache.conf:

ini
sloppiness = clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,time_macros

Шаг 3: Профилирование флагов компилятора

В том же makepkg.conf находим секцию C/CXX/CPPFLAGS. Пример для AMD Zen 3:

bash
CFLAGS="-O3 -march=znver3 -mtune=znver3 -flto=auto -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection=full"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-Wl,-O3 -Wl,--as-needed -Wl,--hash-style=gnu -Wl,--sort-common"

Перевод флагов на русский:

  • -march=znver3: генерация кода точно под архитектуру CPU
  • flto=auto: межмодульная оптимизация
  • -pipe: исключает временные файлы, снижая I/O нагрузку
  • -fno-plt: убирает косвенные переходы через PLT

Важно: Для Intel CPU 12+ Gen используйте -march=alderlake, для Apple M1 — -march=native.

Шаг 4: Многопоточный кеширование исходников

Меняем зеркала в /etc/pacman.d/mirrorlist с помощью reflector:

bash
sudo reflector --latest 20 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

Устанавливаем параллельный загрузчик:

bash
sudo pacman -S aria2

В /etc/makepkg.conf:

ini
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
          'ftp::/usr/bin/curl -gqC - -o %o %u'
          'http::/usr/bin/aria2c -UWget -s4 -x4 -k1M -o %o %u'
          'https::/usr/bin/aria2c -UWget -s4 -x4 -k1M -o %o %u'
          'rsync::/usr/bin/rsync --no-motd -z %u %o'
          'scp::/usr/bin/scp -C %u %o')

Результаты: цифры не врут

Повторная сборка linux-zen с оптимизациями:

bash
$ time makepkg -sri
Реальное время: 9 минут 41 секунда (-79.4%)

ccache -s:
Cache directory          /var/cache/ccache
Primary config           /etc/ccache.conf
Hit rate                96.3 %

Пограничные случаи и нюансы

  1. Память ↔ потоки баланс: При 32 потоках и 32 ГБ RAM добавьте swap-файл:
bash
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
  1. Некорректная сборка с LTO: Если пакет падает с -flto, временно отключите его:
bash
CFLAGS="${CFLAGS/-flto=auto/}"
  1. Интерактивный мониторинг: Установите glances для отслеживания узких мест:
bash
sudo pacman -S glances
glances --disable-webui

Автоматизация профиля

Создайте конфигурационные сниппеты для разных сценариев в /etc/makepkg.d/:

  • production.conf – максимальная оптимизация
  • debug.conf – с отладочными символами
  • risky.conf – агрессивные флаги типа -Ofast

Активация через MAKEPKG_CONF=production.conf makepkg.

Оптимизация сборки — это не магия, а инженерная работа с измеримыми параметрами. Комбинируя кэширование, параллелизацию и архитектурно-ориентированные настройки, можно сократить время разработки на 70-85% даже без обновления железа. Но помните: экстремальные флаги требуют тестирования стабильности конечных бинарников.