autoconf использует sh, мне нужно SHELL = BASH, как заставить autoconf использовать bash? - PullRequest
8 голосов
/ 02 октября 2008

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

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

Ответы [ 5 ]

8 голосов
/ 02 октября 2008

У меня похожие проблемы в Solaris с GCC - и я использую «стандартную» технику:

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

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

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

4 голосов
/ 19 июля 2009

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

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

2 голосов
/ 08 марта 2012

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

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

вместо:

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

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

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

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

0 голосов
/ 02 октября 2008

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

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

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

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

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "$0" "$@"
fi
0 голосов
/ 02 октября 2008

ln -f /bin/bash /bin/sh

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

...