Три уровня проверок:

  • brp-check-suse - build root policy scripts после %install, до упаковки RPM. Например, сжатие man pages, debug info, rpath checks.
  • post-build-checks - проверки build script-а как root по установленному результату.
  • rpmlint - комплексный linting RPM/spec/source package.

rpmlint выводит E (error), W (warning), I (information). Не все E одинаковы: часть имеет высокий badness и валит build, часть требует review.

Локальная проверка:

osc build openSUSE_Tumbleweed x86_64 foo.spec
rpmlint foo.spec /var/tmp/build-root/*/home/abuild/rpmbuild/RPMS/*/*.rpm

Правильный rpmlintrc - это не мусорная корзина для предупреждений. Каждый фильтр должен отвечать на вопрос "почему это false positive или осознанное исключение".

# foo embeds test fixtures with intentionally executable snippets; not installed into PATH.
addFilter("foo.* executable-docs .*/usr/share/doc/packages/foo/tests/.*")

Частые ошибки:

  • wrong-script-interpreter - исправь shebang на /usr/bin/python3, /usr/bin/bash, /usr/bin/env только если есть причина.
  • arch-dependent-file-in-usr-share - ELF/binary нельзя класть в /usr/share; используй %{_libexecdir}/%{name}.
  • no-packager-tag - не добавляй Packager:; openSUSE spec guidelines прямо не рекомендует этот tag.
  • hardlink-across-partition - не создавай hardlinks между разными top-level деревьями.
  • shlib-policy-name-error - runtime shared library package должен соответствовать SONAME.
  • invalid-spec-name - spec должен называться %{name}.spec.
  • suse-logrotate-log-dir-not-packaged - пакет обязан владеть log directory или зависеть от пакета, который им владеет.

Проверка bundling:

find . -type f \( -name '*.a' -o -name '*.so' -o -name '*.jar' -o -name 'vendor.tar*' \) -print
licensecheck -r .

Bundled libraries/software запрещены по умолчанию; исключения нужны только с документированным обоснованием. Rust vendor crates - практическое исключение, но оно не отменяет audit и воспроизводимость.

Где искать дополнительно