autoconf с использованием sh, мне нужно SHELL=BASH, как заставить autoconf использовать bash?

StackOverflow https://stackoverflow.com/questions/161064

  •  03-07-2019
  •  | 
  •  

Вопрос

Я запускаю autoconf и в настройках SHELL устанавливаю значение «/bin/sh».Это создает огромные проблемы.Как заставить SHELL быть «/bin/bash» для autoconf?

Я пытаюсь запустить это на OSX, на Linux оно работает.Linux использует SHELL=/bin/bash.osx по умолчанию — /bin/sh.

Это было полезно?

Решение

У меня аналогичные проблемы с GCC в Solaris, и я использую «стандартный» метод:

CONFIG_SHELL=/bin/bash ./configure ...

(Или, на самом деле, я использую /bin/ksh, но установка переменной env CONFIG_SHELL позволяет вам указать сценариям autoconf, какую оболочку использовать.)

Я проверил сценарий настройки для git и gd (они оказались извлечены), чтобы убедиться, что это не особая переменная окружения GCC.

Другие советы

В чем заключаются «огромные проблемы»?autoconf очень усердно работает над созданием сценария настройки, который работает с очень большим процентом оболочек.Если у вас есть пример конструкции, которую пишет autoconf и которая не является переносимой, сообщите об этом в список рассылки autoconf.С другой стороны, если проблемы, с которыми вы столкнулись, являются результатом того, что ваш собственный шелл-код в configure.ac не является переносимым (например, вы используете bashisms), тогда решение состоит в том, чтобы либо прекратить использование непереносимого кода, либо потребовать пользователь должен явно установить SHELL или CONFIG_SHELL во время настройки.

Похоже, проблема, с которой вы столкнулись, связана с средой пользователя, выполняющего настройку.В Linux для SHELL вашего пользователя установлено значение /bin/bash, но в OS X для него установлено значение /bin/sh.Сценарий настройки, сгенерированный autoconf, выполняет некоторые начальные тесты оболочки, под которой он работает, и пытается повторно запуститься с использованием другой оболочки, если в предоставленной оболочке отсутствуют определенные функции.Однако, если вы добавляете непереносимый шелл-код в configure.ac, вы нарушаете один из основных принципов autoconf, а именно то, что скрипты configure должны быть переносимыми.Если вы действительно хотите использовать bashisms в своем шелл-коде, вам необходимо, чтобы ваш пользователь передал SHELL=/bin/bash в качестве аргумента скрипту настройки.Это не ошибка в autoconf, но многие сочтут ее ошибкой в ​​сборке вашего проекта.

Предполагается, что Autoconf решает проблемы переносимости путем создания сценария, который может работать «где угодно».Вот почему он генерирует странный код вроде:

if test X$foo = X ; then ...   # check if foo is empty

скорее, чем:

if [ "$x" = "" ] ; then ...

Такой корявый код, вероятно, когда-то позволял этим сценариям запускаться в какой-нибудь древней системе Ultrix или где-то еще.

Сценарий конфигурации, который не запускается из-за различий в оболочках, — это все равно, что приехать на гонку Формулы-1 с 10 литрами бензина и тремя запасными шинами.

Если вы разрабатываете сценарий настройки с помощью Autoconf, и он чувствителен к тому, является ли оболочка Bash или оболочкой OSX, вы делаете что-то неправильно, или люди из Autoconf что-то сломали.Если это от вас, исправьте все части оболочки, которые вы добавляете в сценарий, сделав их переносимыми.

Где SHELL настроен на это?Что выполняется с /bin/sh, когда вам нужен /bin/bash?

Сценарии configure предназначены для запуска где угодно, даже в ужасно сломанных оболочках, отличных от Bash, которые существуют в дикой природе.

Редактировать:в чем именно проблема?:

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

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "$0" "$@"
fi

ln -f /bin/bash /bin/sh

:-P (Нет, это несерьёзный ответ.Пожалуйста, не засоряйте свою систему этим!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top