Игнорирование зависимостей при сборке
Порой автоматический анализ зависимостей упакечиваемых программ выдаёт заведомо лишние результаты, которых нет и не будет в альте (например, пути в /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