Назад | Перейти на главную страницу

Если в файле спецификации RPM файл не найден, как узнать, какая строка% files неисправна?

Я работаю с очень загруженным макросами файлом спецификации RPM, и при его создании возникает ошибка, которую я не могу отследить:

File not found: /var/tmp/pkgnamehere/mockbuild/usr/com/pgsql

(Я заменил полный путь к каталогу сборки пакета на «pkgnamehere» выше, но в остальном он не редактировался).

Нет никаких /usr/com/pgsql где угодно в% файлах, ни на самом деле /com/ вообще.

Предположительно это результат макрорасширения. Проблема в том ... как узнать, какой %files строка соответствует заданному отсутствующему файлу? Он не говорит «Файл из% files в строке 554 не найден:» или что-то подобное.

Многие из актуальных %files линии выглядят так:

%config(noreplace) %{_initrddir}/%{oname}-%{majorversion}

поэтому простой текстовый поиск здесь бесполезен.

Возможно rpm --eval каждая строка, но это довольно болезненно, учитывая более 300 строк файлов и необходимость определения всех входных макросов.

Подсказки?

$ rpm --version
RPM version 4.11.2
$ lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-ia32:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-ia32:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-ia32:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: Fedora
Description:    Fedora release 20 (Heisenbug)
Release:        20
Codename:       Heisenbug
$ mock --version
1.1.41

Любезно предоставлено этот ТАК ответ, rpmspec -P развернет и распечатает спецификацию. Однако это не пролило свет:

$ rpmspec -P unified-rpm/postgresql94.spec | grep '/com/'
$ 

в этом, кажется, здесь есть загадочный файл.


Любезно предоставлено этот ТАК ответ, rpmspec -P развернет и распечатает спецификацию.

На машине сборки это выглядело нормально - потом я понял, что это действительно проблема в CentOS 5. mock песочница.

Там нет rpmspec, поэтому нелегко сказать, что случилось. тем не мение Я наткнулся на эту ошибку что предполагает, что это проблема с RPM на RHEL5. Конечно же, в песочнице:

<mock-chroot>[root@ayaki BUILD]# rpm --eval '%_sharedstatedir'
/usr/com

на что я говорю .... что !?

Таким образом, непосредственную проблему можно решить с помощью:

%if 0%{rhel5}
%define _sharedstatedir /var/lib
%endif

или возможно:

%if "%{_sharedstatedir}" == "/usr/com"
# See https://bugzilla.redhat.com/show_bug.cgi?id=894903
%define _sharedstatedir /var/lib
%endif

... но в любом случае остается главный вопрос: как заставить RPM сообщать вам, какие %files строка соответствует отсутствующему файлу?

Проблема не в Fedora 20 и не в Mock. Это RHEL 5.

Макрос RPM %{_sharedstatedir} был установлен на %{prefix}/com И в RHEL 4, и в RHEL 5. Проблема в том, что макрос никогда не использовался для построения этих дистрибутивов, поэтому никто не обращал внимания на его значение. Это стало проблемой когда люди начали переносить пакеты из более поздней Fedora, в которой использовался макрос.

И, конечно же, поскольку RHEL является «стабильным» корпоративным дистрибутивом, который стремится не нарушать совместимость в течение своего жизненного цикла, это никогда не изменится.

Макрос работает так, как вы ожидаете, в RHEL 6 и 7.

Если вам все еще нужно поддерживать блоки RHEL 5, вы (и все остальные) застряли в обходных путях, подобных тем, которые вы уже предложили. Самый простой и понятный - это первое, что вы предложили:

%if 0%{rhel5}
%define _sharedstatedir /var/lib
%endif

Я не вижу смысла ссылаться на эту конкретную ошибку, поскольку она на самом деле не объясняет проблему и не дает обходного пути.