Почему configure принимает переменные в качестве аргументов?

10

Это так VAR=value ./configureже, как ./configure VAR=value?

В первом случае оболочка устанавливает переменную среды, а во втором сценарий configure принимает строку 'VAR=value'в качестве аргумента, а затем, предположительно, устанавливает переменную. Интересно, если configure что-то еще делает с переменной (может быть игнорирует или фильтрует некоторые значения), и почему он принимает переменные в качестве аргументов в первую очередь.

spelufo
источник

Ответы:

12

В этом случае

VAR=value ./configure

поведение зависит от вашей текущей оболочки, в то время как в этом

./configure VAR=value

поведение зависит от скрипта configure. Некоторые разработчики предпочитают последнее, потому что они хотели бы выбрать, устанавливать ли переменные в скрипте, а не заставлять кого-то волшебным образом устанавливать переменные скрипта извне.

На практике есть небольшая разница, потому что

  • большинство людей, выполняющих настройку, работают из оболочки POSIX, где прежнее поведение «просто работает», и
  • большинство скриптов configure не сбрасывают существующие переменные окружения, и
  • обычные переменные среды (за пределами automake) имеют давно установленное использование

Например, --helpсообщение скрипта bash configure показывает это:

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.

и в каждом случае любой способ установки переменной работает .

Но имейте в виду предпочтения разработчика на случай, если кто-то решит «улучшить» вещи.

Дальнейшее чтение:

AC_ARG_VARМакрокоманда используется , чтобы объявить конкретную (окружение) переменную в качестве аргумента для сценария, придавая ему описание и конкретного использования. Хотя эта функция была добавлена ​​относительно недавно в истории autoconf , она действительно важна. Отражая свое недавнее присутствие, макрос не нуждается в AS_HELP_STRINGпомощнике, а принимает только два параметра: имя переменной и строку, напечатанную во время ./configure --help:

AC_ARG_VAR(var-name, help-string)

и продолжает с комментарием о многолетней практике:

По умолчанию configure выбирает переменные из окружения, как и любой другой сценарий sh. Большинство из них игнорируются. Те, которые не должны быть объявлены через этот макрос. Таким образом, они отмечены как драгоценная переменная.

Переменная, помеченная как драгоценная, заменяется в Makefile.in без необходимости явного вызова AC_SUBST, но это не самая важная часть определения. Важно то, что переменная кэшируется.

  • 7.2 Настройка выходных переменных (документация autoconf)
    описывает AC_ARG_VAR, снова выражая предпочтения разработчика .:

    Значение переменной при запуске configure сохраняется в кеше, в том числе, если оно указано не в командной строке, а через среду. Действительно, хотя configure может заметить определение CC в «./configure CC = bizarre-cc», его невозможно заметить в «CC = bizarre-cc ./configure», что, к сожалению, делает большинство пользователей.

Томас Дики
источник
Вы также можете описать, как это env VAR=value ./configureотносится кVAR=value ./configure
Кусалананде