Как создать RPM с круговыми зависимостями?

Вопрос или проблема

Я пытаюсь собрать mesa-7.6-0.1.fc11.src из исходников.

$ yumdownloader --source mesa
$ cd rpmbuild/SPECS
$ rpmbuild -ba mesa.spec
ошибка: Не удалось удовлетворить зависимости сборки:
        freeglut-devel требуется для mesa-7.6-0.1.fc11.src

Нет проблем. Я загружу эту зависимость из исходников и соберу её сначала.

$ yumdownloader --source freeglut-devel
$ rpm -ivh freeglut-2.4.0-16.fc11.src.rpm
$ cd rpmbuild/SPECS
$ rpmbuild -ba freeglut.spec
ошибка: Не удалось удовлетворить зависимости сборки:
    libGLU-devel требуется для freeglut-2.4.0-16.fc11.src

Похоже, мне нужен ещё один пакет. Давайте посмотрим, какой исходный RPM нужен для его сборки.

$ yumdownloader --source mesa-libGLU-devel
Загруженные плагины: refresh-packagekit
mesa-7.6-0.1.fc11.src.rpm                       | 7.1 MB     00:00

Хорошо… значит, mesa требует freeglut-devel, который требует libGLU-devel, который собирается с помощью mesa. Это круговая зависимость.

Когда речь идет только о сборке из исходников и не о установке предварительно собранного пакета, как можно решить эту круговую зависимость сборки? libGLU-devel — это всего лишь один из нескольких RPM, который собирается с помощью mesa. Возможно ли собрать только этот RPM вместо всех остальных, чтобы увидеть, исчезает ли зависимость от freeglut?

Даже если я попытаюсь скачать пакет freeglut-devel, в итоге он всё равно разрешает зависимости для того же пакета, который я пытаюсь собрать.

Зависимости разрешены

======================================================================================================================================
 Пакет                                 Архитектура              Версия                             Репозиторий                   Размер
======================================================================================================================================
Установка:
 freeglut-devel                        i586                     2.4.0-16.fc11                       fedora                      111 k
Установка для зависимостей:
 freeglut                              i586                     2.4.0-16.fc11                       fedora                      148 k
 mesa-dri-drivers                      i586                     7.6-0.1.fc11                        updates                     2.2 M
 mesa-libGL                            i586                     7.6-0.1.fc11                        updates                     174 k
 mesa-libGL-devel                      i586                     7.6-0.1.fc11                        updates                     485 k
 mesa-libGLU                           i586                     7.6-0.1.fc11                        updates                     204 k
 mesa-libGLU-devel                     i586                     7.6-0.1.fc11                        updates                     108 k

Резюме транзакции
======================================================================================================================================
Установка       7 Пакетов
Обновление      0 Пакетов

Как правильно решить эту круговую зависимость сборки?

Для справки, я собираю пакеты из Fedora 11 из исходников для тестирования DRI-драйверов, которые существуют только на очень старых ядрах.

Ответ или решение

Для решения проблемы круговой зависимости при сборке RPM-пакетов, таких как mesa, freeglut и libGLU, необходимо предпринять несколько шагов. Круговые зависимости — это сложная проблема, особенно при работе со старыми версиями пакетов и когда требуется самостоятельно собирать их из исходного кода. Вот руководство по решению этой проблемы:

Шаг 1: Разделение сборки компонентов

Поскольку вы находитесь в ситуации, когда mesa требует freeglut-devel, а freeglut-devel требует libGLU-devel, который тоже предоставляется mesa, вам нужно рассмотреть возможность сборки только необходимых кусочков функциональности. Вам нужно будет настроить спецификацию пакета (.spec) таким образом, чтобы собирать libGLU-devel отдельно без сборки всей mesa.

  1. Измените файл .spec для mesa:

    • Откройте файл спецификации mesa.spec в rpmbuild/SPECS.
    • Найдите секцию Subpackages и выделите часть, относящуюся к libGLU-devel. Например, если там указаны все подпаки:
      %package libGLU-devel
      Summary: Development files for libGLU
    • Вы можете временно закомментировать или удалить другие подпаки, если вы хотите собрать только libGLU-devel.
  2. Сборка только libGLU-devel:
    После изменения файла спецификации выполните следующую команду:

    rpmbuild -bp mesa.spec

    Это здание скомпилирует только libGLU-devel и проигнорирует другие компоненты.

Шаг 2: Установка необходимых зависимостей

Теперь, когда у вас есть libGLU-devel, вам нужно будет установить все необходимые зависимости для freeglut-devel без установки зависимостей mesa, которые могут вызвать круговую зависимость.

  1. Проверьте зависимости для freeglut-devel:
    Загрузите исходный пакет freeglut и проверьте, какие зависимости требуются, выполнив:

    yum deplist freeglut-devel
  2. Убедитесь, что отсутствуют зависимости Mesa:
    Проверьте, что для сборки freeglut-devel не требуются другие компоненты mesa во время его сборки.

Шаг 3: Сборка freeglut

После успешной сборки libGLU-devel, выполните сборку freeglut:

  1. Вернитесь в директорию rpmbuild/SPECS и отредактируйте freeglut.spec, чтобы убедиться, что он ссылается на вашу уже собранную libGLU-devel.
  2. Соберите freeglut:
    rpmbuild -ba freeglut.spec

Шаг 4: Завершение

На последнем этапе, после успешной сборки freeglut, вы сможете вернуться к сборке основного пакета mesa. Убедитесь, что у вас есть все необходимые компоненты, которые требуют других зависимостей, и выполните команду сборки для mesa снова.

Заключение

Сборка RPM-пакетов с круговыми зависимостями может быть сложной задачей, однако с помощью временного исключения и поэтапного подхода можно решить эту проблему. Используйте настройки спецификаций для управления зависимостями и обеспечьте, чтобы нужные компоненты были собраны до начала следующей сборки.

Оцените материал
Добавить комментарий

Капча загружается...