autoconf usando sh, eu preciso SHELL = BASH, como faço para forçar autoconf para uso bash?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou correndo autoconf e configure define SHELL para '/ bin / sh'. Isso cria enormes problemas. Como forçar SHELL ser '/ bin / bash' para autoconf?

Eu estou tentando obter essa corrida no OSX, que está trabalhando em linux. Linux está usando SHELL = / bin / bash. defaults OSX para / bin / sh.

Foi útil?

Solução

Eu tenho problemas semelhantes em Solaris com GCC - e eu uso a técnica de 'standard':

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

(ou, na verdade, eu uso o / bin / ksh, mas definindo o CONFIG_SHELL env var lhe permite dizer autoconf scripts que Shell para uso.)

Eu verifiquei o script configure para git e gd (que passou a ser extraído) para verificar que este não era um var GCC peculiar env.

Outras dicas

O que são os "grandes problemas"? autoconf trabalha muito duro para gerar um script de configuração que funciona com uma grande percentagem de conchas. Se você tem um exemplo de uma construção que autoconf é escrita que não é portátil, por favor denuncie à lista autoconf discussão. Por outro lado, se os problemas que está enfrentando são o resultado de seu próprio código shell em configure.ac não ser portátil (por exemplo, você está usando bashisms), então a solução é ou parada utilizando o código não-portáteis ou exigir a usuário explicitamente definido SHELL ou CONFIG_SHELL em tempo de configuração.

Parece que o problema que você está enfrentando é no ambiente do configure correndo usuário. No Linux, o usuário tem SHELL conjunto para / bin / bash, mas no OS X é definido como / bin / sh. O script configure gerado pelo autoconf faz alguns testes iniciais do shell está rodando sob e faz tentativa de si re-exec usando um shell diferente se o shell fornecido carece de alguns recursos. No entanto, se você está introduzindo código shell não-portáteis em configure.ac, em seguida, você está violando um dos filosofia principal é de autoconf - ou seja, que scripts de configuração deve ser portátil. Se você realmente quiser usar bashisms em seu código shell, então você está exigindo seu usuário passar SHELL = / bin / bash como um argumento para o script configure. Este não é um bug no autoconf, mas seria considerado por muitos como um erro na construção do seu projeto.

Autoconf é suposto para resolver problemas de portabilidade, gerando um script que pode ser executado "em qualquer lugar". É por isso que gera o código bizarra como:

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

em vez de:

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

Esse tipo de código intrincada provavelmente uma vez permitiu que esses scripts para ser executado em um antigo sistema Ultrix ou o que quer.

Um script configure não funcionando por causa das diferenças de shell é como voltar a uma corrida de Fórmula-1 com 10 litros de gás, e três pneus de reposição.

Se você está desenvolvendo um script configure com Autoconf, e é sensível ao facto do shell é Bash ou o shell OSX, você está fazendo algo errado, ou as pessoas Autoconf quebrou alguma coisa. Se é de você, corrigir o que desembolsar peças que você está adicionando ao script, tornando-portátil.

Onde está SHELL sendo definido como aquele? O que está sendo executado com o / bin / sh quando quiser / bin / bash?

scripts de configuração são feitos para funcionar em qualquer lugar, mesmo nas conchas-Bash não horrivelmente quebrado e que existem na natureza.

Editar : O que é exatamente o problema

Outro edit : Talvez você gostaria que o script para re-executar-se, algo como isto. É provavelmente Buggy:

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

ln -f /bin/bash /bin/sh

:-P (Não, não é uma resposta séria. Por favor, não mangueira seu sistema por fazê-lo!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top