autoconf usando sh, necesito SHELL = BASH, ¿cómo puedo forzar autoconf para usar bash?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy ejecutando autoconf y configuro los conjuntos SHELL en '/ bin / sh'. Esto crea enormes problemas. ¿Cómo forzar SHELL a ser '/ bin / bash' para autoconf?

Estoy tratando de hacer que esto se ejecute en osx, está funcionando en Linux. Linux está utilizando SHELL = / bin / bash. osx por defecto es / bin / sh.

¿Fue útil?

Solución

Tengo problemas similares en Solaris con GCC, y uso la técnica 'estándar':

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

(O, en realidad, uso / bin / ksh, pero configurar CONFIG_SHELL env var le permite decirle a los scripts de autoconf qué shell usar).

Verifiqué el script de configuración para git y gd (se extrajeron) para comprobar que no se trataba de una variable de entorno peculiar de GCC.

Otros consejos

¿Cuáles son los " problemas enormes " ;? autoconf trabaja muy duro para generar un script de configuración que funcione con un gran porcentaje de shells. Si tiene un ejemplo de una construcción que autoconf está escribiendo que no es portátil, infórmelo a la lista de correo de autoconf. Por otro lado, si los problemas que experimenta son el resultado de su propio código de shell en configure.ac que no es portátil (por ejemplo, está usando bashismos), entonces la solución es dejar de usar un código no portátil o requerir la usuario para establecer explícitamente SHELL o CONFIG_SHELL en el momento de la configuración.

Parece que el problema que está experimentando está en el entorno del usuario que ejecuta configure. En Linux, su usuario tiene SHELL configurado en / bin / bash, pero en OS X está configurado en / bin / sh. El script de configuración generado por autoconf realiza algunas pruebas iniciales del shell en el que se está ejecutando e intenta re-ejecutarse utilizando un shell diferente si el shell proporcionado carece de ciertas características. Sin embargo, si está introduciendo un código de shell no portátil en configure.ac, entonces está violando una de las principales filosofías de autoconf: que los scripts de configuración deben ser portátiles. Si realmente desea usar bashismos en su código de shell, entonces está solicitando a su usuario que pase SHELL = / bin / bash como un argumento al script de configuración. Esto no es un error en autoconf, pero muchos lo considerarán un error en la construcción de su proyecto.

Se supone que Autoconf resuelve problemas de portabilidad al generar un script que puede ejecutarse en cualquier lugar. Es por eso que genera código extraño como:

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

en lugar de:

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

Ese tipo de código sin formato probablemente permitió que estos scripts se ejecutaran en algún antiguo sistema Ultrix o lo que sea.

Una secuencia de comandos de configuración que no se ejecuta debido a las diferencias de shell es como venir a una carrera de Fórmula 1 con 10 litros de gasolina y tres llantas de repuesto.

Si está desarrollando un script de configuración con Autoconf, y es sensible a si el shell es Bash o el shell OSX, está haciendo algo mal, o la gente de Autoconf rompió algo. Si es de usted, arregle las piezas de shell que está agregando al script haciéndolas portátiles.

¿Dónde se está configurando SHELL para eso? ¿Qué se está ejecutando con / bin / sh cuando quiere / bin / bash?

los scripts de configuración están diseñados para ejecutarse en cualquier lugar, incluso en los shells horriblemente rotos y sin Bash que existen en la naturaleza.

Editar : ¿Cuál es exactamente el problema?

Otra edición : tal vez le gustaría que el script se vuelva a ejecutar, algo como esto. Probablemente es buggy:

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

ln -f / bin / bash / bin / sh

:-P (No, no es una respuesta seria. ¡No apliques mangueras a tu sistema haciéndolo!)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top