Сравниваем рецепты сборки пакетов в Haiku и Arch Linux.

Возьмем Audacity.

Haiku: https://github.com/haikuports/haikuports/blob/master/media-sound/audacity/audacity-2.1.2.recipe
Arch: https://git.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD?h=packages/audacity

В целом они похожи. Нас будет интересовать фунциональность обоих сборочных систем. Функциональность должна заключаться в гибкости выполнения команд и в автоматизации рутинных операций.

В обоих случаях для сборки выполняются консольные команды.
Но посмотрим на 76 строку рецепта из Haiku https://github.com/haikuports/haikuports/blob/master/media-sound/audacity/audacity-2.1.2.recipe#L76 и 26-ую строку рецепта из Arch https://git.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD?h=packages/audacity#n26

В Haiku команда:
runConfigure ./configure --disable-dynamic-loading --without-lv2 --without-portmixer --disable-nyquist

В Arch команда:
./configure --prefix="/usr" --with-libsndfile="system" <...>

Видим, что сборочная система Haiku способна автоматически подставить разные типовые параметры вызова ./configure, сборщику не нужно вручную задавать префикс и пр. В документации к Arch https://wiki.archlinux.org/index.php/creating_packages#build.28.29 убеждаемся, что это не автоматизируется.

Теперь посмотрим, в какую команду раскрывается макрос %configure в RPM (ALT Linux):

$ rpm --eval '%configure'

  CFLAGS="${CFLAGS:--pipe -Wall -g -O2}"; export CFLAGS; 
  CXXFLAGS="${CXXFLAGS:--pipe -Wall -g -O2}"; export CXXFLAGS; 
  FFLAGS="${FFLAGS:--pipe -Wall -g -O2}"; export FFLAGS; 
  [ -n "${ASFLAGS-}" ] || ASFLAGS="$(printf %s '-pipe -Wall -g -O2' |sed -r 's/(^|[[:space:]]+)-[^m][^[:space:]]*//g')"; export ASFLAGS; 
   
   
  export lt_cv_deplibs_check_method=pass_all ; 
  readlink -e -- './configure' |xargs -ri dirname -- '{}' |xargs -ri find '{}' -type f '(' -name config.sub -or -name config.guess ')' -printf '%h/\n' |sort -u |xargs -rn1 install -pm755 -- /usr/share/gnu-config/config.{sub,guess}; 
  ./configure --build=x86_64-alt-linux --host=x86_64-alt-linux \
 	--prefix=/usr \
	--exec-prefix=/usr \
	--bindir=/usr/bin \
	--sbindir=/usr/sbin \
	--sysconfdir=/etc \
	--datadir=/usr/share \
	--includedir=/usr/include \
	--libdir=/usr/lib64 \
	--libexecdir=/usr/lib \
	--localstatedir=/var/lib \
	--sharedstatedir=/var/lib \
	--mandir=/usr/share/man \
	--infodir=/usr/share/info \
	--disable-dependency-tracking \

Видите, сколько стандартных параметров автоматически подставилось? Это важно, поскольку сборочная система конкретной программы может содержать ошибки и автоматически угадывать их значения, если они вообще не заданы, неверно. В PKGBUILD Arch’a нужно вручную все прописывать. В Haiku runConfigure ./configure автоматически задаст нужные параметры запуска ./configure.

Это был лишь единичный пример, чтобы показать, что PKGBUILD-ы Arch’а нефункциональны в плане отсутствия автоматизации рутинных операций.

В целом, и в Haiku, и в PKGBUILD мало автоматизации.
Например, в обоих случаях вызывается make напрямую (в Haiku это make $jobArgs, а в Арче это make DESTDIR="${pkgdir}" install. В Haiku сборщик пакета должен сам не забыть учесть количество потоков компиляции ($jobArgs), а Arch надеется, что сборочная система конкретного проекта сама прочитает заданную в настройках makepkg переменную окружения, задающую число потоков.

В продвинутых системах сборки, например, RPM, есть макросы, например, %make, который автоматически раскрывается так:

$ rpm --eval '%make_build'
make -j${NPROCS:=4}

Конструкция ${NPROCS:=4} означает, что если значение переменной NPROCS не задано, то принять его равным 4, иначе принять такое, какое задано. При этом 4 — это количество ядер моего процессора, RPM автоматически это посчитало и подобрало число потоков компиляции.

Отправить ответ

avatar
  Subscribe  
Сообщать по почте