Por que o configure pega variáveis como argumentos?

9

VAR=value ./configure é igual ao ./configure VAR=value ?

No primeiro caso, o shell define a variável de ambiente e, no segundo, o script de configuração pega a string 'VAR=value' como argumento e, então, configura a variável. Gostaria de saber se o configure faz qualquer outra coisa com a variável (talvez ignore ou filtre alguns valores), e por que isso leva as variáveis como argumentos em primeiro lugar.

    
por spelufo 17.06.2016 / 13:14

1 resposta

10

Neste caso

VAR=value ./configure

o comportamento depende do seu shell atual, enquanto neste

./configure VAR=value

o comportamento depende do script configure. Alguns desenvolvedores preferem o último porque gostariam de escolher se deveriam definir variáveis dentro do script, em vez de fazer com que alguém definisse magicamente as variáveis do script de fora.

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

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

Por exemplo, a mensagem --help 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 forma de definir a variável funciona .

Mas tenha em mente as preferências do desenvolvedor, caso alguém decida "melhorar" as coisas.

Leitura adicional:

The AC_ARG_VAR macro is used to declare a particular (environment) variable as an argument for the script, giving it a description and a particular use. While this feature has been added relatively recently in the history of autoconf, it is really important. Reflecting its more recent presence, the macro does not need the AS_HELP_STRING helper, and only takes two parameters: the name of the variable and the string printed during ./configure --help:

AC_ARG_VAR(var-name, help-string)

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

By default, configure picks up the variables from the environment like any other sh script. Most of those are ignored. Those that are not should be declared through this macro. This way they are marked as a precious variable.

A variable marked as precious gets replaced in the Makefile.in without having to call an explicit AC_SUBST, but that's not the most important part of the definition. What is important is that the variable is cached.

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

    The value of variable when configure was launched is saved in the cache, including if it was not specified on the command line but via the environment. Indeed, while configure can notice the definition of CC in ‘./configure CC=bizarre-cc’, it is impossible to notice it in ‘CC=bizarre-cc ./configure’, which, unfortunately, is what most users do.

por 17.06.2016 / 13:29