Warum nimmt configure Variablen als Argumente?

10

Ist VAR=value ./configuredas gleiche wie ./configure VAR=value?

Im ersten Fall legt die Shell die Umgebungsvariable fest, und im zweiten Fall verwendet das Konfigurationsskript die Zeichenfolge 'VAR=value'als Argument und setzt dann vermutlich die Variable. Ich frage mich, ob configure etwas anderes mit der Variablen macht (vielleicht einige Werte ignorieren oder filtern) und warum Variablen überhaupt als Argumente verwendet werden.

spelufo
quelle

Antworten:

12

In diesem Fall

VAR=value ./configure

Das Verhalten hängt dabei von Ihrer aktuellen Shell ab

./configure VAR=value

Das Verhalten hängt vom Konfigurationsskript ab. Einige Entwickler bevorzugen Letzteres, weil sie entscheiden möchten, ob Variablen innerhalb des Skripts festgelegt werden sollen, anstatt dass jemand die Variablen des Skripts auf magische Weise von außen festlegt.

In der Praxis gibt es da kaum einen Unterschied

  • Die meisten Leute, die die Konfiguration durchführen, laufen von einer POSIX-Shell aus, in der das frühere Verhalten "nur funktioniert", und
  • Die meisten Konfigurationsskripte setzen vorhandene Umgebungsvariablen nicht zurück
  • Die herkömmlichen Umgebungsvariablen (außerhalb von Automake) werden seit langem verwendet

Die --helpMeldung des Bash-Konfigurationsskripts zeigt beispielsweise Folgendes :

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.

und in jedem Fall funktioniert jede Art der Einstellung der Variablen .

Beachten Sie jedoch die Vorlieben des Entwicklers, falls sich jemand entscheidet, Dinge zu "verbessern".

Weiterführende Literatur:

Das AC_ARG_VARMakro wird verwendet, um eine bestimmte (Umgebungs-) Variable als Argument für das Skript zu deklarieren und ihm eine Beschreibung und eine bestimmte Verwendung zu geben. Obwohl diese Funktion erst vor relativ kurzer Zeit in der Geschichte von Autoconf hinzugefügt wurde , ist sie wirklich wichtig. Aufgrund seiner neueren Präsenz benötigt das Makro keinen AS_HELP_STRINGHelfer und akzeptiert nur zwei Parameter: den Namen der Variablen und die Zeichenfolge, die während ./configure --help gedruckt wird:

AC_ARG_VAR(var-name, help-string)

und fährt mit einem Kommentar über langjährige Praxis fort:

Standardmäßig nimmt configure die Variablen wie jedes andere sh-Skript aus der Umgebung auf. Die meisten davon werden ignoriert. Diejenigen, die nicht sind, sollten über dieses Makro deklariert werden. Auf diese Weise werden sie als wertvolle Variable markiert.

Eine als wertvoll gekennzeichnete Variable wird in Makefile.in ersetzt, ohne dass eine explizite aufgerufen werden muss. Dies AC_SUBSTist jedoch nicht der wichtigste Teil der Definition. Wichtig ist, dass die Variable zwischengespeichert wird.

  • 7.2 Festlegen von Ausgabevariablen (Autoconf-Dokumentation)
    beschreibt AC_ARG_VAR, wobei wiederum die Präferenzen des Entwicklers zum Ausdruck gebracht werden:

    Der Wert der Variablen beim Start von configure wird im Cache gespeichert, auch wenn er nicht in der Befehlszeile, sondern über die Umgebung angegeben wurde. Während configure die Definition von CC in './configure CC = bizarr-cc' bemerken kann, ist es unmöglich, sie in 'CC = bizarr-cc ./configure' zu bemerken, was leider die meisten Benutzer tun.

Thomas Dickey
quelle
Vielleicht möchten Sie auch beschreiben, wie es env VAR=value ./configuresich aufVAR=value ./configure
Kusalananda