Perché configure accetta le variabili come argomenti?


10

È VAR=value ./configurelo stesso di ./configure VAR=value?

Nel primo caso, la shell imposta la variabile di ambiente e nel secondo lo script di configurazione accetta la stringa 'VAR=value'come argomento, quindi presumibilmente imposta la variabile. Mi chiedo se configure faccia qualcos'altro con la variabile (forse ignora o filtra alcuni valori), e perché in primo luogo prende le variabili come argomenti.

Risposte:


12

In questo caso

VAR=value ./configure

il comportamento dipende dalla shell corrente, mentre in questo

./configure VAR=value

il comportamento dipende dallo script di configurazione. Alcuni sviluppatori preferiscono quest'ultimo perché vorrebbero scegliere se impostare variabili all'interno dello script, piuttosto che avere qualcuno che imposta magicamente le variabili dello script dall'esterno.

In pratica, c'è poca differenza perché

  • la maggior parte delle persone che eseguono la configurazione sono in esecuzione da una shell POSIX, in cui il comportamento precedente "funziona" e
  • la maggior parte degli script di configurazione non disinserisce le variabili di ambiente esistenti e
  • le variabili d'ambiente convenzionali (al di fuori di automake) hanno un uso consolidato

Ad esempio, il --helpmessaggio dello script bash configure mostra questo:

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 in ogni caso, in entrambi i casi di impostazione delle variabili opere .

Ma tieni presente le preferenze dello sviluppatore, nel caso in cui qualcuno decida di "migliorare" le cose.

Ulteriori letture:

La AC_ARG_VARmacro viene utilizzata per dichiarare una particolare variabile (ambiente) come argomento per lo script, dandogli una descrizione e un uso particolare. Sebbene questa funzione sia stata aggiunta relativamente di recente nella storia di autoconf , è davvero importante. Riflettendo la sua presenza più recente, la macro non ha bisogno AS_HELP_STRINGdell'helper e accetta solo due parametri: il nome della variabile e la stringa stampata durante ./configure --help:

AC_ARG_VAR(var-name, help-string)

e continua con un commento sulla pratica di lunga data:

Per impostazione predefinita, configura raccoglie le variabili dall'ambiente come qualsiasi altro script sh. Molti di questi vengono ignorati. Quelli che non lo sono dovrebbero essere dichiarati attraverso questa macro. In questo modo sono contrassegnati come una variabile preziosa.

Una variabile contrassegnata come preziosa viene sostituita in Makefile.in senza dover chiamare un esplicito AC_SUBST, ma questa non è la parte più importante della definizione. Ciò che è importante è che la variabile sia memorizzata nella cache.

  • 7.2 Impostazione delle variabili di output (documentazione di autoconf)
    descrive AC_ARG_VAR, esprimendo nuovamente le preferenze dello sviluppatore .:

    Il valore della variabile all'avvio di configure viene salvato nella cache, anche se non è stato specificato sulla riga di comando ma tramite l'ambiente. Infatti, mentre configure può notare la definizione di CC in './configure CC = bizarre-cc', è impossibile notarlo in 'CC = bizarre-cc ./configure', che, sfortunatamente, è ciò che fanno la maggior parte degli utenti.


Potresti anche voler descrivere come si env VAR=value ./configureriferisce aVAR=value ./configure
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.