Есть ли способ установить несколько версий программы на Linux?

Есть ли способ установить несколько версий программы на Linux?

Я пытаюсь установить php-5.3на Arch Linux, но bisonон слишком новый, поэтому я собрал более старую версию из bisonисходников. И, похоже, он устанавливается /usr/localпо умолчанию. (Это какая-то конвенция?) Поэтому теперь мне интересно, могу ли я установить больше одной версии bisonie, бок о бок с системной по умолчанию и той, которую я только что установил. Такие вещи, скорее всего, редко понадобятся. Мне просто интересно. Сложно ли это сделать? Как мне это сделать?

решение1

Некоторое конкретное программное обеспечение можно настроить с помощью --program-suffix=-my-version-suffix. Возможно, вам придется настроить некоторые другие каталоги, но если вы оставите значение --prefixпо умолчанию ( /usr/local), это не будет конфликтовать с упакованным в дистрибутив /usr.

вобщийОднако, единственный дистрибутив, который пытается разрешить совместную установку произвольных версий, этоНикс, хотяГентупытается поддерживать больше пакетов, чем большинство дистрибутивов (хотя для Bison он допускает только одну версию за раз — по крайней мере, он предлагает выбор).

Однако, обратите внимание, что если ваш исходный код ломается с новыми версиями bison, это обычно означает простую проблему с вашим исходным кодом. Обычно есть некоторые %option(или --argument), которые могут это исправить.

решение2

Одним из способов последовательного решения этой проблемы является использованиеmodulespackage. Он работает путем изменения переменных окружения (например, путей к вашим исполняемым файлам).

Пакет Environment Modules обеспечивает динамическую модификацию пользовательской среды через modulefiles. Модули могут загружаться и выгружаться динамически и атомарно, в чистом виде

например

$ module load gcc/3.1.1 
$ which gcc 
/usr/local/gcc/3.1.1/linux/bin/gcc 

$ module switch gcc gcc/3.2.0 
$ which gcc 
/usr/local/gcc/3.2.0/linux/bin/gcc 

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

$ echo $PATH
 ....

приоритизировать /opt/bin, _предварительно_добавив его в PATH:

$ export PATH="/opt/bin:$PATH"

или добавить /opt/bin/к PATH(он выбирается только в том случае, если в другом месте в PATH)

$ export PATH="$PATH:/opt/bin"

решение3

Просто чтобы дать более актуальный ответ:

Да, в наши дни это определенно возможно.
Ад зависимостей остался в прошлом, если только дистрибуция тоже. :)

Arch, однако, не подходит. Вам нужен дистрибутив на основе исходного кода. В противном случае зависимости были бы жестко закодированы (для определенных определений жестко закодированных), и обе установки указывали бы на одни и те же библиотеки и т. д.
Но при сборке из исходного кода вы можете собирать его каждый раз с разными путями.

В Gentoo для этого уже давно есть функция под названием «слотирование», которая делает все тривиальным. Зависимости версии пакета можно указать как определенный «слот» другого пакета. Слот — это диапазон версий, которые не конфликтуют ни с одним другим слотом. (Для большинства пакетов, которые я видел, любая версия может быть своим собственным слотом. Особенно для библиотек. Но иногда пакет не может с этим справиться, потому что он сам зависит от вещей, которых всего одна. Или потому что это требует некоторой работы от менеджера пакетов [например, для изменения установленных файлов конфигурации при установке])

Но я уверен, что в любом другом дистрибутиве с полным исходным кодом будет что-то похожее.

В противном случае, всегда можно обойти эту проблему, настроив ту же систему сборки, с помощью которой пакеты вашего дистрибутива собираются сопровождающими, клонировать требуемые пакеты под новым именем и изменить процесс сборки так, чтобы он указывал на разные версии зависимостей, а затем просто собрать это в новый пакет без исходного кода, как это сделали бы сопровождающие пакетов вашего дистрибутива. (Честно говоря, мне было проще установить Gentoo. :)

Связанный контент