Вопрос или проблема
Я пытаюсь собрать 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
.
-
Измените файл
.spec
дляmesa
:- Откройте файл спецификации
mesa.spec
вrpmbuild/SPECS
. - Найдите секцию
Subpackages
и выделите часть, относящуюся кlibGLU-devel
. Например, если там указаны все подпаки:%package libGLU-devel Summary: Development files for libGLU
- Вы можете временно закомментировать или удалить другие подпаки, если вы хотите собрать только
libGLU-devel
.
- Откройте файл спецификации
-
Сборка только
libGLU-devel
:
После изменения файла спецификации выполните следующую команду:rpmbuild -bp mesa.spec
Это здание скомпилирует только
libGLU-devel
и проигнорирует другие компоненты.
Шаг 2: Установка необходимых зависимостей
Теперь, когда у вас есть libGLU-devel
, вам нужно будет установить все необходимые зависимости для freeglut-devel
без установки зависимостей mesa
, которые могут вызвать круговую зависимость.
-
Проверьте зависимости для
freeglut-devel
:
Загрузите исходный пакетfreeglut
и проверьте, какие зависимости требуются, выполнив:yum deplist freeglut-devel
-
Убедитесь, что отсутствуют зависимости Mesa:
Проверьте, что для сборкиfreeglut-devel
не требуются другие компонентыmesa
во время его сборки.
Шаг 3: Сборка freeglut
После успешной сборки libGLU-devel
, выполните сборку freeglut
:
- Вернитесь в директорию
rpmbuild/SPECS
и отредактируйтеfreeglut.spec
, чтобы убедиться, что он ссылается на вашу уже собраннуюlibGLU-devel
. - Соберите
freeglut
:rpmbuild -ba freeglut.spec
Шаг 4: Завершение
На последнем этапе, после успешной сборки freeglut
, вы сможете вернуться к сборке основного пакета mesa
. Убедитесь, что у вас есть все необходимые компоненты, которые требуют других зависимостей, и выполните команду сборки для mesa
снова.
Заключение
Сборка RPM-пакетов с круговыми зависимостями может быть сложной задачей, однако с помощью временного исключения и поэтапного подхода можно решить эту проблему. Используйте настройки спецификаций для управления зависимостями и обеспечьте, чтобы нужные компоненты были собраны до начала следующей сборки.