Я работаю с очень загруженным макросами файлом спецификации 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
Я не вижу смысла ссылаться на эту конкретную ошибку, поскольку она на самом деле не объясняет проблему и не дает обходного пути.