Игнорирование зависимостей при сборке

Материал из ALT Linux Wiki

Порой автоматический анализ зависимостей упакечиваемых программ выдаёт заведомо лишние результаты, которых нет и не будет в альте (например, пути в /usr/xpg4 для Solaris или утилиты для Windows); в таких случаях следует замаскировать зависимости, отфильтровать ненужные -- а в некоторых случаях подавить поиск избирательно либо полностью.

Маскировка

%_findreq не обращает внимания на запуски команд, предваряемые выставлением переменных -- поэтому можно маскировать лишние вызовы так:

-      exec /usr/xpg4/bin/sh "$0" "$@"
+      a= exec /usr/xpg4/bin/sh "$0" "$@"

Подобный патч можно предложить в апстрим с внятным пояснением причины (скрытие от автоматического поиска зависимостей), но будьте готовы к тому, что предложение будет отклонено по причине непонятного со стороны загрязнения кода для одного узкого случая, а именно пакета в ALT -- в таком случае может оказаться предпочтительнее sed-"патч" в спеке с тщательно выверенным условием, чтобы в будущем не зацепило лишнего.

Фильтрование

%filter_from_requires позволяет определить регулярное выражение для удаления совпавших с шаблоном строк из списка зависимостей (существует и аналогичный макрос %filter_from_provides); пример применения в 389-ds-base.spec:

%filter_from_requires /python3(gdb\(\..*\)\?)/d

Подавление

Крайний метод, когда целевая программа должна всё-таки быть оставлена в пакете ради чего-то, но при этом может оказаться неработоспособной из-за нехватки чего-либо действительно нужного.

Если причиной является отсутствие мягких зависимостей Recommends:/Suggests: вместе с сильно избыточными зависимостями конкретной программы для основного пакета, может иметь смысл выделить такую программу в подпакет.

Как правило, достаточно частичного подавления поиска зависимостей с точностью до конкретного пути -- на примере того же 389-ds-base.spec:

%add_findreq_skiplist %_datadir/%pkgname/script-templates/* %_sbindir/*-%pkgname
%add_findreq_skiplist %_bindir/logconv.pl

Если необходимо подавить поиск зависимостей по подсистеме/языку -- можно воспользоваться следующим синтаксисом (существует симметричный AutoProv, а также объединённый AutoReqProv):

AutoReq: yes, noshell

Список "выключателей" см. в HOWTO, непосредственно как /usr/lib/rpm/*.req либо в метаданных зеркала репозитория:

$ grep '/usr/lib/rpm/.*\.req' */base/contents_index | sed -rn 's,^.*:/usr/lib/rpm/(.*\.req)\t.*$,\1,p' | sort -u
cpp.req
debuginfo.req
erlang.req
files.req
fpc.req
gir-js.req
gir-python.req
gir.req
golang.req
haskell.req
javadoc.req
kernel.req
lib.req
lua.req
maven.req
monolib.req
mono.req
nodejs_native.req
nodejs.req
ocaml.req
osgi-fc.req
osgi.req
pam.req
perl.req
pkgconfiglib.req
pkgconfig.req
python3.req
python.req
qml6.req
qml.req
rpmlib.req
ruby.req
shebang.req
shell.req
squeak-vm.req
static.req
symlinks.req
systemd-services.req
tcl.req
tex.req
typelib.req
vala.req

Для некоторых случаев вроде больших пакетов с данными, которым по определению ничего не требуется и которые ничего не предоставляют -- стоит применять следующую комбинацию ради некоторого сокращения времени сборки (архитектурнонезависимый пакет без автовыявляемых зависимостей и отладочной информации):

 BuildArch: noarch
 AutoReqProv: no
 %global __find_debuginfo_files %nil

Ссылки