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

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

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

5 ответов


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

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

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

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


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

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

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

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

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

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

ln -f /bin/bash /bin/sh

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