Por que o configure aceita variáveis ​​como argumentos?

10

É VAR=value ./configureo mesmo que ./configure VAR=value?

No primeiro caso, o shell define a variável de ambiente e, no segundo, o script configure leva a string 'VAR=value'como argumento e, presumivelmente, define a variável. Gostaria de saber se o configure faz mais alguma coisa com a variável (talvez ignore ou filtre alguns valores), e por que leva variáveis ​​como argumentos em primeiro lugar.

spelufo
fonte

Respostas:

12

Nesse caso

VAR=value ./configure

o comportamento depende do seu shell atual, enquanto neste

./configure VAR=value

o comportamento depende do script de configuração. Alguns desenvolvedores preferem o último porque gostariam de escolher se deseja definir variáveis ​​dentro do script, em vez de ter alguém que magicamente defina as variáveis ​​do script de fora.

Na prática, há pouca diferença porque

  • a maioria das pessoas que faz a configuração está executando a partir de um shell POSIX, onde o comportamento anterior "simplesmente funciona" e
  • a maioria dos scripts de configuração não desativa as variáveis ​​de ambiente existentes e
  • as variáveis ​​de ambiente convencionais (fora da automake) têm uso estabelecido há muito tempo

Por exemplo, a --helpmensagem do script de configuração do bash mostra isso:

Some influential environment variables:
  DEBUGGER_START_FILE
              location of bash debugger initialization file
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor
  YACC        The `Yet Another C Compiler' implementation to use. Defaults to
              the first program found out of: `bison -y', `byacc', `yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of `-d' given by some make applications.

e em cada caso, qualquer uma das maneiras de definir a variável funciona .

Mas lembre-se das preferências do desenvolvedor, caso alguém decida "melhorar" as coisas.

Leitura adicional:

A AC_ARG_VARmacro é usada para declarar uma variável (ambiente) específica como argumento para o script, fornecendo uma descrição e um uso específico. Embora esse recurso tenha sido adicionado há relativamente pouco tempo na história do autoconf , é realmente importante. Refletindo sua presença mais recente, a macro não precisa do AS_HELP_STRINGauxiliar e usa apenas dois parâmetros: o nome da variável e a sequência impressa durante ./configure --help:

AC_ARG_VAR(var-name, help-string)

e continua com um comentário sobre práticas de longa data:

Por padrão, o configure seleciona as variáveis ​​do ambiente como qualquer outro script sh. A maioria deles é ignorada. Aqueles que não são devem ser declarados por meio dessa macro. Dessa forma, eles são marcados como uma variável preciosa.

Uma variável marcada como preciosa é substituída no Makefile.in sem precisar chamar um explícito AC_SUBST, mas essa não é a parte mais importante da definição. O importante é que a variável seja armazenada em cache.

  • 7.2 Configurando variáveis ​​de saída (documentação do autoconf)
    descreve AC_ARG_VAR, novamente expressando as preferências do desenvolvedor .:

    O valor da variável quando o configure foi iniciado é salvo no cache, incluindo se não foi especificado na linha de comandos, mas através do ambiente. De fato, enquanto o configure pode perceber a definição de CC em './configure CC = bizarre-cc', é impossível notar em 'CC = bizarre-cc ./configure', que, infelizmente, é o que a maioria dos usuários faz.

Thomas Dickey
fonte
Você também pode descrever como env VAR=value ./configurese relaciona com #VAR=value ./configure
Kusalananda