Configure

為什麼 configure 將變數作為參數?

  • June 17, 2016

VAR=value ./configure一樣的./configure VAR=value嗎?

在第一種情況下,shell 設置環境變數,而在第二種情況下,配置腳本將字元串'VAR=value'作為參數,然後可能會設置變數。我想知道 configure 是否對變數做任何其他事情(可能忽略或過濾某些值),以及為什麼它首先將變數作為參數。

在這種情況下

VAR=value ./configure

行為取決於您目前的外殼,而在此

./configure VAR=value

行為取決於配置腳本。一些開發人員更喜歡後者,因為他們想選擇是否在腳本中設置變數,而不是讓某人從外部神奇地設置腳本的變數。

在實踐中,幾乎沒有區別,因為

  • 大多數進行配置的人都是從 POSIX shell 執行的,前者的行為“正常工作”,並且
  • 大多數配置腳本不會取消設置現有的環境變數,並且
  • 傳統的環境變數(在 automake 之外)已被長期使用

例如,bash 配置腳本的--help消息顯示如下:

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,但這不是定義中最重要的部分。重要的是變數被記憶體。

啟動 configure 時變數的值保存在記憶體中,包括如果它不是在命令行上指定而是通過環境指定的。事實上,雖然 configure 可以注意到 ‘./configure CC=bizarre-cc’ 中的 CC 定義,但在 ‘CC=bizarre-cc ./configure’ 中是不可能注意到它的,不幸的是,大多數使用者都是這樣做的。

引用自:https://unix.stackexchange.com/questions/290381