3

В настоящее время я использую сервис сборки OpenSUSE (https://build.opensuse.org/) для сборки ArangoDB. Однако для некоторых новых функций C++ мне нужен довольно актуальный компилятор C++. Для некоторых более старых дистрибутивов (например, Debian6 или CentOS) компилятор по умолчанию слишком стар.

Я почти уверен, что должен быть способ использовать более новый компилятор с OBS, но я заблудился в документации OBS. Кто-нибудь может указать мне правильное направление?

2 ответа2

1

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

Я сделал это, включив пакет (в вашем случае GCC) в мой проект и установив его сборку / использование в сборке (в репозиториях) только для тех архитектур, у которых недостаточно новой версии.

Я бы также BuildRequires: gcc >= 4.8 в вашу спецификацию, чтобы убедиться, что выбрана более новая версия, но в этом нет необходимости.

Пример можно найти в https://build.opensuse.org/project/monitor/X11:Enlightenment:Factory пакет luajit доступен только в репозитории openSUSE:Factory , поэтому у меня есть копия в репозитории, которая собирается для всего но openSUSE: Фабрика, которая использует ту, которая предоставлена в исходном репозитории.

В вашем репозитории вы можете разветвлять существующий пакет, что означает, что вы можете найти версию gcc, которая уже доступна на obs, и использовать ее вместо создания своей собственной.

0

Да, вы правы, OpenSUSE Build Service позволяет вам собирать пакеты для ряда дистрибутивов Linux, но НЕТ, вы ошибаетесь, полагая, что используете последнюю версию компилятора C++ для всех дистрибутивов. Ваше приложение должно использовать предоставляемый дистрибутивом компилятор и библиотеки, а OBS позволяет вам тестировать совместимость вашего приложения с большинством основных дистрибутивов, не устанавливая их все. Итак, у вас есть два варианта:

  1. делайте все как положено - проверяйте дистрибутивы, которые вы хотите поддерживать, и адаптируйте свой код к их версии компилятора и библиотек - скрывайте "новые функции" с блоками препроцессора для нового компилятора и пишите код совместимости для старого компилятора / библиотеки. OBS может автоматически построить ваше приложение и показать вам проблемы, и вы можете легко исправить это.
  2. используйте последний компилятор и статически связывайте все необходимые библиотеки, включая текущие libgcc и зависимые библиотеки, чтобы не зависеть от версий компилятора / библиотек дистрибутива, и размещайте их в одном большом пакете. Этот способ используется в основном проприетарными приложениями, а пользователи linux ненавидят их - эти приложения приносят в систему несколько копий одних и тех же библиотек, и никому нет дела до того, как они будут обновляться - представьте, вы используете OpenSSL и связываете свое приложение статически с OpenSSL 1.0.1e, в котором есть ошибка Heartbleed - поставщик распространения отправляет обновление безопасности, и все приложения, использующие предоставляемую дистрибутивом библиотеку, будут безопасны при установке обновления пользователем, но ваше приложение будет продолжать использовать вашу статически связанную небезопасную библиотеку. Да, вы можете поддерживать все необходимые библиотеки самостоятельно и обновлять свое приложение, когда обновления безопасности будут готовы, но это задача поставщика дистрибутива, и вы повторите свою тяжелую работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .