
Я пытаюсь установить php-5.3
на Arch Linux, но bison
он слишком новый, поэтому я собрал более старую версию из bison
исходников. И, похоже, он устанавливается /usr/local
по умолчанию. (Это какая-то конвенция?) Поэтому теперь мне интересно, могу ли я установить больше одной версии bison
ie, бок о бок с системной по умолчанию и той, которую я только что установил. Такие вещи, скорее всего, редко понадобятся. Мне просто интересно. Сложно ли это сделать? Как мне это сделать?
решение1
Некоторое конкретное программное обеспечение можно настроить с помощью --program-suffix=-my-version-suffix
. Возможно, вам придется настроить некоторые другие каталоги, но если вы оставите значение --prefix
по умолчанию ( /usr/local
), это не будет конфликтовать с упакованным в дистрибутив /usr
.
вобщийОднако, единственный дистрибутив, который пытается разрешить совместную установку произвольных версий, этоНикс, хотяГентупытается поддерживать больше пакетов, чем большинство дистрибутивов (хотя для Bison он допускает только одну версию за раз — по крайней мере, он предлагает выбор).
Однако, обратите внимание, что если ваш исходный код ломается с новыми версиями bison, это обычно означает простую проблему с вашим исходным кодом. Обычно есть некоторые %option
(или --argument
), которые могут это исправить.
решение2
Одним из способов последовательного решения этой проблемы является использованиеmodules
package. Он работает путем изменения переменных окружения (например, путей к вашим исполняемым файлам).
Пакет 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. :)